form create changes
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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", "
");
|
value.replace("\r\n", "
");
|
||||||
value.replace("\n", "
");
|
value.replace("\n", "
");
|
||||||
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()
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ class PlannedSessionSerializer(serializers.ModelSerializer):
|
|||||||
'course',
|
'course',
|
||||||
'approximate_distance',
|
'approximate_distance',
|
||||||
'approximate_duration',
|
'approximate_duration',
|
||||||
'json_string',
|
'steps_json',
|
||||||
'fitfile'
|
'fitfile'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user