Private
Public Access
1
0

form create changes

This commit is contained in:
Sander Roosendaal
2021-02-13 14:35:55 +01:00
parent 050c31a5c1
commit 3efcc8d042
8 changed files with 112 additions and 77 deletions

View File

@@ -20,6 +20,7 @@ from datetimewidget.widgets import DateTimeWidget
from django.contrib.admin.widgets import AdminDateWidget,AdminTimeWidget,AdminSplitDateTime from django.contrib.admin.widgets import AdminDateWidget,AdminTimeWidget,AdminSplitDateTime
from django.core.validators import validate_email from django.core.validators import validate_email
import os import os
import json
import twitter import twitter
import re import re
import pytz import pytz
@@ -31,6 +32,8 @@ import numpy as np
import shutil import shutil
from rowingdata import trainingparser
from django.conf import settings from django.conf import settings
from sqlalchemy import create_engine from sqlalchemy import create_engine
import sqlalchemy as sa import sqlalchemy as sa
@@ -478,7 +481,8 @@ class TeamRequest(models.Model):
from rowers.utils import ( from rowers.utils import (
workflowleftpanel,workflowmiddlepanel, workflowleftpanel,workflowmiddlepanel,
defaultleft,defaultmiddle,landingpages defaultleft,defaultmiddle,landingpages,
steps_read_fit
) )
from rowers.utils import geo_distance from rowers.utils import geo_distance
@@ -2279,7 +2283,7 @@ class PlannedSession(models.Model):
is_template = models.BooleanField(default=False) is_template = models.BooleanField(default=False)
fitfile = models.FileField(blank=True,null=True) fitfile = models.FileField(blank=True,null=True)
json_string = models.TextField(max_length=10000,default=None,blank=True,null=True) steps_json = models.TextField(max_length=10000,default=None,blank=True,null=True)
interval_string = models.TextField(max_length=1000,default=None,blank=True,null=True, interval_string = models.TextField(max_length=1000,default=None,blank=True,null=True,
verbose_name='Interval String (optional)') verbose_name='Interval String (optional)')
@@ -2309,6 +2313,15 @@ class PlannedSession(models.Model):
"You must be a Self-Coach user or higher to create a planned session" "You must be a Self-Coach user or higher to create a planned session"
) )
# interval string
if self.interval_string:
dct = trainingparser.parsetodict(interval_string)
dct = [item for item in dct if item['value'] != 0]
dct = trainingparser.tofitdict(dct)
ps.steps_json = json.dumps(dct)
# sort units # sort units
if self.sessionmode == 'distance': if self.sessionmode == 'distance':
@@ -2346,8 +2359,21 @@ class PlannedSession(models.Model):
if self.preferreddate < self.startdate: if self.preferreddate < self.startdate:
self.preferreddate = self.startdate self.preferreddate = self.startdate
super(PlannedSession,self).save(*args, **kwargs) super(PlannedSession,self).save(*args, **kwargs)
# read file
if self.fitfile:
if self.fitfile.name == 'False':
self.fitfile = None
else:
steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name)
self.steps_json = json.dumps(steps)
super(PlannedSession,self).save(*args, **kwargs)
from django.core.validators import RegexValidator,validate_email from django.core.validators import RegexValidator,validate_email
class StandardCollection(models.Model): class StandardCollection(models.Model):
@@ -2515,7 +2541,8 @@ class PlannedSessionForm(ModelForm):
'startdate': AdminDateWidget(), 'startdate': AdminDateWidget(),
'enddate': AdminDateWidget(), 'enddate': AdminDateWidget(),
'preferreddate': AdminDateWidget(), 'preferreddate': AdminDateWidget(),
'interval_string': forms.Textarea(attrs={'rows':2,'cols':50}) 'interval_string': forms.Textarea(attrs={'rows':2,'cols':50}),
#'sessiontype': forms.Select(attrs={'style':'width:50px'})
} }
def __init__(self,*args,**kwargs): def __init__(self,*args,**kwargs):

View File

@@ -16,8 +16,7 @@ from django.conf import settings
import pytz import pytz
from dateutil import parser from dateutil import parser
from rowers.utils import myqueue,calculate_age,totaltime_sec_to_string from rowers.utils import myqueue,calculate_age,totaltime_sec_to_string
from rowers.rows import handle_uploaded_file
from fitparse import FitFile
import re import re
import django_rq import django_rq
@@ -190,42 +189,17 @@ def ps_dict_get_description(d):
return s return s
class FitWorkoutSteps(object): class FitWorkoutSteps(object):
def __init__(self,readfile): def __init__(self,json_string,name='',sport='Custom'):
self.readfile = readfile self.json = json_string
self.fitfile = FitFile(readfile, check_crc=False) self.steps = json.loads(json_string)
self.records = self.fitfile.messages
self.name = '' self.name = name
self.sport = 'Custom' self.sport = sport
# message 0 is file id # message 0 is file id
# message 1 must be workout description # message 1 must be workout description
m0 = self.records[0]
typ = m0.fields[0].value
if typ != 'workout':
raise TypeError("Wrong FIT file type")
steps = []
stepmessages = self.fitfile.get_messages('workout_step')
for msg in stepmessages:
if msg.name == 'workout_step':
step = {}
for field in msg.fields:
ff = field.as_dict()
step[ff['name']] = ff['value']
steps.append(step)
for msg in self.fitfile.get_messages('workout'):
if msg.name == 'workout':
for field in msg.fields:
ff = field.as_dict()
if ff['name'] == 'wkt_name':
self.name = ff['value']
if ff['name'] == 'sport':
self.sport = ff['value']
self.steps = steps
def to_json(self): def to_json(self):
d = self.get_dict() d = self.get_dict()
@@ -233,13 +207,7 @@ class FitWorkoutSteps(object):
return json.dumps(d) return json.dumps(d)
def get_dict(self): def get_dict(self):
d = {} return self.steps
d['filename'] = self.readfile
d['name'] = self.name
d['steps'] = self.steps
d['sport'] = self.sport
return d
def get_description(self): def get_description(self):
@@ -1155,7 +1123,14 @@ def update_plannedsession(ps,cd):
if attr == 'comment': if attr == 'comment':
value.replace("\r\n", "&#10"); value.replace("\r\n", "&#10");
value.replace("\n", "&#10"); value.replace("\n", "&#10");
setattr(ps, attr, value) if attr != 'fitfile':
setattr(ps, attr, value)
if cd['fitfile']:
f = cd['fitfile']
filename, path_and_filename = handle_uploaded_file(f)
ps.fitfile.name = filename
ps.save() ps.save()

View File

@@ -147,7 +147,7 @@ class PlannedSessionSerializer(serializers.ModelSerializer):
'course', 'course',
'approximate_distance', 'approximate_distance',
'approximate_duration', 'approximate_duration',
'json_string', 'steps_json',
'fitfile' 'fitfile'
) )

View File

@@ -91,7 +91,7 @@
</li> </li>
</ul> </ul>
<script src="/static/js/jquery-3.1.0.js"> <script src="/static/js/jquery-3.1.0.js">
</script> </script>
<script src="/static/js/jquery.formset.js"></script> <script src="/static/js/jquery.formset.js"></script>
@@ -169,9 +169,9 @@
} }
}); });
}); });

View File

@@ -40,7 +40,7 @@
{{ form.as_table }} {{ form.as_table }}
</table> </table>
{% csrf_token %} {% csrf_token %}
<input class="button green" type="submit" value="Save"> <input class="button" type="submit" value="Save">
</form> </form>
<div class="padded" id="id_guidance"> <div class="padded" id="id_guidance">
</li> </li>

View File

@@ -50,13 +50,13 @@
</p> </p>
{% csrf_token %} {% csrf_token %}
<div id="id_guidance"> <div id="id_guidance">
</div> </div>
<p> <p>
<a href="/rowers/sessions/{{ thesession.id }}/deleteconfirm">Delete</a> <a href="/rowers/sessions/{{ thesession.id }}/deleteconfirm">Delete</a>
<a href="/rowers/sessions/{{ thesession.id }}/clone/?when={{ timeperiod }}">Clone</a> <a href="/rowers/sessions/{{ thesession.id }}/clone/?when={{ timeperiod }}">Clone</a>
</p> </p>
<input class="button green" <input class="button"
action="/rowers/sessions/{{ thesession.id }}/edit/user/{{ rower.user.id }}/" type="submit" value="Save"> action="/rowers/sessions/{{ thesession.id }}/edit/user/{{ rower.user.id }}/" type="submit" value="Save">
</form> </form>
@@ -161,7 +161,7 @@
$(document).ready(function(){ $(document).ready(function(){
var o = $("td #id_sessiontype").find(":selected").val(); var o = $("td #id_sessiontype").find(":selected").val();
if (o != 'coursetest') { if (o != 'coursetest') {
$("td #id_course").hide(); $("td #id_course").hide();
$("th label[for='id_course']").hide(); $("th label[for='id_course']").hide();
@@ -257,7 +257,7 @@
} }
); );

View File

@@ -14,6 +14,8 @@ import datetime
import json import json
from fitparse import FitFile
from django.http import HttpResponse from django.http import HttpResponse
import requests import requests
@@ -540,3 +542,42 @@ def allsundays(startdate,enddate):
while d<=enddate: while d<=enddate:
yield d yield d
d += datetime.timedelta(days=7) d += datetime.timedelta(days=7)
def steps_read_fit(filename,name='',sport='Custom'):
fitfile = FitFile(filename,check_crc=False)
records = fitfile.messages
m0 = records[0]
typ = m0.fields[0].value
if typ != 'workout':
raise TypeError("Wrong FIT file type")
steps = []
stepmessages = fitfile.get_messages('workout_step')
steps = []
stepmessages = fitfile.get_messages('workout_step')
for msg in stepmessages:
if msg.name == 'workout_step':
step = {}
for field in msg.fields:
ff = field.as_dict()
step[ff['name']] = ff['value']
steps.append(step)
for msg in fitfile.get_messages('workout'):
if msg.name == 'workout':
for field in msg.fields:
ff = field.as_dict()
if ff['name'] == 'wkt_name':
name = ff['value']
if ff['name'] == 'sport':
sport = ff['value']
d = {}
d['filename'] = filename
d['name'] = name
d['steps'] = steps
d['sport'] = sport
return d

View File

@@ -441,6 +441,7 @@ def plannedsession_create_view(request,
course = cd['course'] course = cd['course']
name = cd['name'] name = cd['name']
interval_string = cd['interval_string'] interval_string = cd['interval_string']
fitfile = cd['fitfile']
@@ -467,25 +468,11 @@ def plannedsession_create_view(request,
ps.save() ps.save()
if interval_string: #if sessioncreateform.cleaned_data['fitfile']:
dct = trainingparser.parsetodict(interval_string) # f = sessioncreateform.cleaned_data['fitfile']
dct = [item for item in dct if item['value'] != 0] # filename, path_and_filename = handle_uploaded_file(f)
dct = trainingparser.tofitdict(dct) # ps.fitfile.name = filename
ps.json_string = json.dumps(dct) # ps.save()
txt = ps_dict_get_description(dct)
ps.comment += '\n'+txt
ps.save()
if sessioncreateform.cleaned_data['fitfile']:
f = sessioncreateform.cleaned_data['fitfile']
filename, path_and_filename = handle_uploaded_file(f)
ps.fitfile.name = filename
structured_workout = FitWorkoutSteps(path_and_filename)
dct = structured_workout.get_dict()
ps.comment += '\n'+structured_workout.get_description()
ps.json_string = json.dumps(dct)
ps.save()
add_rower_session(r,ps) add_rower_session(r,ps)
@@ -759,7 +746,7 @@ def plannedsession_teamcreate_view(request,
sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True) sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True)
if request.method == 'POST': if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST) sessioncreateform = PlannedSessionForm(request.POST, request.FILES)
sessionteamselectform = PlannedSessionTeamForm( sessionteamselectform = PlannedSessionTeamForm(
request.user,request.POST request.user,request.POST
) )
@@ -777,6 +764,9 @@ def plannedsession_teamcreate_view(request,
comment = cd['comment'] comment = cd['comment']
course = cd['course'] course = cd['course']
name = cd['name'] name = cd['name']
interval_string = cd['interval_string']
fitfile = cd['fitfile']
if sessionunit == 'min': if sessionunit == 'min':
sessionmode = 'time' sessionmode = 'time'
@@ -795,6 +785,8 @@ def plannedsession_teamcreate_view(request,
comment=comment, comment=comment,
criterium=criterium, criterium=criterium,
course=course, course=course,
interval_string=interval_string,
fitfile=fitfile,
manager=request.user) manager=request.user)
ps.save() ps.save()
@@ -940,7 +932,7 @@ def plannedsession_teamedit_view(request,
"preferreddate","startdate","enddate") "preferreddate","startdate","enddate")
if request.method == 'POST': if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST,instance=ps) sessioncreateform = PlannedSessionForm(request.POST,request.FILES,instance=ps)
sessionteamselectform = PlannedSessionTeamForm( sessionteamselectform = PlannedSessionTeamForm(
request.user,request.POST request.user,request.POST
) )
@@ -1792,7 +1784,7 @@ def plannedsession_edit_view(request,id=0,userid=0):
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
if request.method == 'POST': if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST,instance=ps) sessioncreateform = PlannedSessionForm(request.POST, request.FILES,instance=ps)
if sessioncreateform.is_valid(): if sessioncreateform.is_valid():
cd = sessioncreateform.cleaned_data cd = sessioncreateform.cleaned_data