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.core.validators import validate_email
import os
import json
import twitter
import re
import pytz
@@ -31,6 +32,8 @@ import numpy as np
import shutil
from rowingdata import trainingparser
from django.conf import settings
from sqlalchemy import create_engine
import sqlalchemy as sa
@@ -478,7 +481,8 @@ class TeamRequest(models.Model):
from rowers.utils import (
workflowleftpanel,workflowmiddlepanel,
defaultleft,defaultmiddle,landingpages
defaultleft,defaultmiddle,landingpages,
steps_read_fit
)
from rowers.utils import geo_distance
@@ -2279,7 +2283,7 @@ class PlannedSession(models.Model):
is_template = models.BooleanField(default=False)
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,
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"
)
# 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
if self.sessionmode == 'distance':
@@ -2346,8 +2359,21 @@ class PlannedSession(models.Model):
if self.preferreddate < self.startdate:
self.preferreddate = self.startdate
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
class StandardCollection(models.Model):
@@ -2515,7 +2541,8 @@ class PlannedSessionForm(ModelForm):
'startdate': AdminDateWidget(),
'enddate': 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):

View File

@@ -16,8 +16,7 @@ from django.conf import settings
import pytz
from dateutil import parser
from rowers.utils import myqueue,calculate_age,totaltime_sec_to_string
from fitparse import FitFile
from rowers.rows import handle_uploaded_file
import re
import django_rq
@@ -190,42 +189,17 @@ def ps_dict_get_description(d):
return s
class FitWorkoutSteps(object):
def __init__(self,readfile):
self.readfile = readfile
self.fitfile = FitFile(readfile, check_crc=False)
self.records = self.fitfile.messages
self.name = ''
self.sport = 'Custom'
def __init__(self,json_string,name='',sport='Custom'):
self.json = json_string
self.steps = json.loads(json_string)
self.name = name
self.sport = sport
# message 0 is file id
# 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):
d = self.get_dict()
@@ -233,13 +207,7 @@ class FitWorkoutSteps(object):
return json.dumps(d)
def get_dict(self):
d = {}
d['filename'] = self.readfile
d['name'] = self.name
d['steps'] = self.steps
d['sport'] = self.sport
return d
return self.steps
def get_description(self):
@@ -1155,7 +1123,14 @@ def update_plannedsession(ps,cd):
if attr == 'comment':
value.replace("\r\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()

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,6 +14,8 @@ import datetime
import json
from fitparse import FitFile
from django.http import HttpResponse
import requests
@@ -540,3 +542,42 @@ def allsundays(startdate,enddate):
while d<=enddate:
yield d
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']
name = cd['name']
interval_string = cd['interval_string']
fitfile = cd['fitfile']
@@ -467,25 +468,11 @@ def plannedsession_create_view(request,
ps.save()
if interval_string:
dct = trainingparser.parsetodict(interval_string)
dct = [item for item in dct if item['value'] != 0]
dct = trainingparser.tofitdict(dct)
ps.json_string = json.dumps(dct)
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()
#if sessioncreateform.cleaned_data['fitfile']:
# f = sessioncreateform.cleaned_data['fitfile']
# filename, path_and_filename = handle_uploaded_file(f)
# ps.fitfile.name = filename
# ps.save()
add_rower_session(r,ps)
@@ -759,7 +746,7 @@ def plannedsession_teamcreate_view(request,
sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True)
if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST)
sessioncreateform = PlannedSessionForm(request.POST, request.FILES)
sessionteamselectform = PlannedSessionTeamForm(
request.user,request.POST
)
@@ -777,6 +764,9 @@ def plannedsession_teamcreate_view(request,
comment = cd['comment']
course = cd['course']
name = cd['name']
interval_string = cd['interval_string']
fitfile = cd['fitfile']
if sessionunit == 'min':
sessionmode = 'time'
@@ -795,6 +785,8 @@ def plannedsession_teamcreate_view(request,
comment=comment,
criterium=criterium,
course=course,
interval_string=interval_string,
fitfile=fitfile,
manager=request.user)
ps.save()
@@ -940,7 +932,7 @@ def plannedsession_teamedit_view(request,
"preferreddate","startdate","enddate")
if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST,instance=ps)
sessioncreateform = PlannedSessionForm(request.POST,request.FILES,instance=ps)
sessionteamselectform = PlannedSessionTeamForm(
request.user,request.POST
)
@@ -1792,7 +1784,7 @@ def plannedsession_edit_view(request,id=0,userid=0):
return HttpResponseRedirect(url)
if request.method == 'POST':
sessioncreateform = PlannedSessionForm(request.POST,instance=ps)
sessioncreateform = PlannedSessionForm(request.POST, request.FILES,instance=ps)
if sessioncreateform.is_valid():
cd = sessioncreateform.cleaned_data