Private
Public Access
1
0

better steps serializer

This commit is contained in:
Sander Roosendaal
2021-03-01 08:19:16 +01:00
parent fa42d313b0
commit dffaacc5a3
4 changed files with 36 additions and 15 deletions

View File

@@ -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)

View File

@@ -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

View File

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

View File

@@ -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)