diff --git a/rowers/models.py b/rowers/models.py index 78f15530..a15370a9 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -207,6 +207,27 @@ class AlternativeEmails(models.TextField): value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) +# model for Planned Session Steps +class PlannedSessionStepField(models.TextField): + def __init__(self, *args, **kwargs): + super(PlannedSessionStepField, self).__init__(*args, **kwargs) + + def to_python(self, value): + if not value: return + return json.loads(value) + + def from_db_value(self, value, expression, connection): + if not value: return + return json.loads(value) + + def get_db_prep_value(self, value, connection, prepared=False): + if not value: return + return json.dumps(value) + + def value_to_string(self, obj): + value = self._get_val_from_obj(obj) + return self.get_deb_prep_value(value) + # model for Power Zone names class PowerZonesField(models.TextField): # __metaclass__ = models.SubfieldBase @@ -2288,7 +2309,8 @@ class PlannedSession(models.Model): is_template = models.BooleanField(default=False) fitfile = models.FileField(blank=True,null=True) - steps_json = models.TextField(max_length=10000,default=None,blank=True,null=True) + #steps_json = models.TextField(max_length=10000,default=None,blank=True,null=True) + steps = PlannedSessionStepField(default={},null=True) interval_string = models.TextField(max_length=1000,default=None,blank=True,null=True, verbose_name='Interval String (optional)') @@ -2308,11 +2330,11 @@ class PlannedSession(models.Model): return stri - def update_json(self): + def update_steps(self): # read file if self.fitfile: steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name) - self.steps_json = json.dumps(steps) + self.steps = steps self.save() @@ -2336,7 +2358,8 @@ class PlannedSession(models.Model): dct = trainingparser.parsetodict(self.interval_string) dct = [item for item in dct if item['value'] != 0] dct = trainingparser.tofitdict(dct) - self.steps_json = json.dumps(dct) + print(dct) + self.steps = dct @@ -2386,20 +2409,18 @@ class PlannedSession(models.Model): self.fitfile = None else: steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name) - self.steps_json = json.dumps(steps) + self.steps = steps - if self.steps_json and not self.fitfile: + if self.steps and not self.fitfile: if self.pk is not None: filename = settings.MEDIA_ROOT+'/session'+encoder.encode_hex(self.pk)+'.fit' else: file = tempfile.NamedTemporaryFile(mode='w+b',suffix='.fit',dir=settings.MEDIA_ROOT) filename = file.name - steps = json.loads(self.steps_json) + steps = self.steps steps['filename'] = filename fitfile = steps_write_fit(steps) self.fitfile = fitfile - self.steps_json = json.dumps(steps) - super(PlannedSession,self).save(*args, **kwargs) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 4797ef69..2b342bc9 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -1281,7 +1281,7 @@ def update_plannedsession(ps,cd): try: filename, path_and_filename = handle_uploaded_file(f) ps.fitfile.name = filename - ps.steps_json = '' + ps.steps = {} except FileNotFoundError: pass diff --git a/rowers/serializers.py b/rowers/serializers.py index 5ef818ad..5806ed88 100644 --- a/rowers/serializers.py +++ b/rowers/serializers.py @@ -147,7 +147,7 @@ class PlannedSessionSerializer(serializers.ModelSerializer): 'course', 'approximate_distance', 'approximate_duration', - 'steps_json', + 'steps', 'fitfile' ) diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 622cbb5f..286f23a6 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -1927,8 +1927,8 @@ def plannedsession_view(request,id=0,userid=0): r = getrequestplanrower(request,userid=userid) ps = get_object_or_404(PlannedSession,pk=id) - if ps.steps_json is not None: - jsons = json.loads(ps.steps_json) + if ps.steps is not None: + jsons = ps.steps else: jsons = {} @@ -2143,8 +2143,8 @@ def plannedsession_view(request,id=0,userid=0): comments = PlannedSessionComment.objects.filter(plannedsession=ps).order_by("created") steps = '' - if ps.steps_json: - d = json.loads(ps.steps_json) + if ps.steps: + d = ps.steps steps = ps_dict_get_description_html(d)