diff --git a/rowers/models.py b/rowers/models.py index c0718c93..022e2d96 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -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): diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index ae06c6ed..66698eaa 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -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", " "); 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() diff --git a/rowers/serializers.py b/rowers/serializers.py index 27b7e3ae..5ef818ad 100644 --- a/rowers/serializers.py +++ b/rowers/serializers.py @@ -147,7 +147,7 @@ class PlannedSessionSerializer(serializers.ModelSerializer): 'course', 'approximate_distance', 'approximate_duration', - 'json_string', + 'steps_json', 'fitfile' ) diff --git a/rowers/templates/plannedsession_multicreate.html b/rowers/templates/plannedsession_multicreate.html index 581e8a85..66c761be 100644 --- a/rowers/templates/plannedsession_multicreate.html +++ b/rowers/templates/plannedsession_multicreate.html @@ -91,7 +91,7 @@ - + @@ -169,9 +169,9 @@ } }); - - + + }); diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index 1c881598..4f5b52ef 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -40,7 +40,7 @@ {{ form.as_table }} {% csrf_token %} - +