diff --git a/rowers/models.py b/rowers/models.py index cb6cd912..4cc47bc3 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2244,6 +2244,9 @@ class PlannedSession(models.Model): max_length=150, verbose_name='Session Type') + sessionsport = models.CharField(default='water',choices=mytypes.workouttypes, + max_length=50,verbose_name='Sport') + sessionvalue = models.IntegerField(default=60,verbose_name='Value') approximate_distance = models.IntegerField(default=10000,verbose_name='Approximate Distance') @@ -2322,12 +2325,14 @@ 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 = trainingparser.parsetodict(self.interval_string) dct = [item for item in dct if item['value'] != 0] dct = trainingparser.tofitdict(dct) - ps.steps_json = json.dumps(dct) + self.steps_json = json.dumps(dct) @@ -2370,6 +2375,7 @@ class PlannedSession(models.Model): #super(PlannedSession,self).save(*args, **kwargs) + # read file if self.fitfile: if self.fitfile.name == 'False': @@ -2379,8 +2385,12 @@ class PlannedSession(models.Model): self.steps_json = json.dumps(steps) if self.steps_json and not self.fitfile: - fitfile = steps_write_fit(settings.MEDIA_ROOT+'/session_'+str(self.id)+'.fit',json.loads(self.steps_json)) + filename = settings.MEDIA_ROOT+'/session'+encoder.encode_hex(self.id)+'.fit' + steps = json.loads(self.steps_json) + steps['filename'] = filename + fitfile = steps_write_fit(steps) self.fitfile = fitfile + self.steps_json = json.dumps(steps) super(PlannedSession,self).save(*args, **kwargs) @@ -2532,6 +2542,7 @@ class PlannedSessionForm(ModelForm): 'enddate', 'preferreddate', 'name', + 'sessionsport', 'sessiontype', 'sessionmode', 'criterium', diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 64142b46..0b88d793 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -81,7 +81,6 @@ from rowers.tasks import ( from rowers.utils import totaltime_sec_to_string def step_to_string(step): - target_dict = { 'heart_rate': { 'name':'Heart Rate between', @@ -136,24 +135,30 @@ def step_to_string(step): t = dd['name'] l = '' h = '' - if dd['low']: - v = step[dd['low']] - if value == 'heart_rate': - if v<100: - v = '{v} \%'.format(v=v) - else: - v = v-100 - v = '{v}'.format(v=v) - l = '{v}'.format(v=v) - if dd['high']: - v = step[dd['high']] - if value == 'heart_rate': - if v<100: - v = '{v} \%'.format(v=v) - else: - v = v-100 - v = '{v}'.format(v=v) - h = 'and {v}'.format(v=v) + try: + if dd['low']: + v = step[dd['low']] + if value == 'heart_rate': + if v<100: + v = '{v} \%'.format(v=v) + else: + v = v-100 + v = '{v}'.format(v=v) + l = '{v}'.format(v=v) + except KeyError: + pass + try: + if dd['high']: + v = step[dd['high']] + if value == 'heart_rate': + if v<100: + v = '{v} \%'.format(v=v) + else: + v = v-100 + v = '{v}'.format(v=v) + h = 'and {v}'.format(v=v) + except KeyError: + pass target = '{t} {l} {h}'.format( t = t, @@ -1137,9 +1142,12 @@ def update_plannedsession(ps,cd): if cd['fitfile']: f = cd['fitfile'] - filename, path_and_filename = handle_uploaded_file(f) - ps.fitfile.name = filename - + try: + filename, path_and_filename = handle_uploaded_file(f) + ps.fitfile.name = filename + ps.steps_json = '' + except FileNotFoundError: + pass ps.save() diff --git a/rowers/utils.py b/rowers/utils.py index c7255283..017ed6f5 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -562,7 +562,7 @@ def steps_read_fit(filename,name='',sport='Custom'): return d -def steps_write_fit(filename,steps): +def steps_write_fit(steps): authorizationstring = 'Bearer '+settings.WORKOUTS_FIT_TOKEN url = settings.WORKOUTS_FIT_URL+"/tofit" headers = {'Authorization':authorizationstring} diff --git a/rowers/views/otherviews.py b/rowers/views/otherviews.py index aa28d89b..eea64b87 100644 --- a/rowers/views/otherviews.py +++ b/rowers/views/otherviews.py @@ -9,6 +9,32 @@ from rq import Queue from redis import Redis from rq.job import Job +@login_required() +def download_fit(request,filename=''): + r = getrower(request.user) + + + + pss = PlannedSession.objects.filter(fitfile=filename) + print(filename,pss) + if len(pss) != 1: + raise Http404("Could not find the required file") + + ps = pss[0] + owns = False + if ps.manager == request.user or request.user.rower in ps.rower.all(): + owns = True + + if not owns: + raise PermissionDenied("You are not allowed to download this file") + + fitfile = ps.fitfile + response = HttpResponse(fitfile) + response['Content-Disposition'] = 'attachment; filename="%s"' % filename + response['Content-Type'] = 'application/octet-stream' + + return response + @login_required() def failed_queue_view(request): if not request.user.is_staff: diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 6ec7be5d..e5eda7fa 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -435,6 +435,7 @@ def plannedsession_create_view(request, sessiontype = cd['sessiontype'] sessionmode = cd['sessionmode'] criterium = cd['criterium'] + sessionsport = cd['sessionsport'] sessionvalue = cd['sessionvalue'] sessionunit = cd['sessionunit'] comment = cd['comment'] @@ -461,6 +462,7 @@ def plannedsession_create_view(request, sessionmode=sessionmode, sessionvalue=sessionvalue, sessionunit=sessionunit, + sessionsport=sessionsport, comment=comment, criterium=criterium, interval_string=interval_string, @@ -761,6 +763,7 @@ def plannedsession_teamcreate_view(request, criterium = cd['criterium'] sessionvalue = cd['sessionvalue'] sessionunit = cd['sessionunit'] + sessionsport = cd['sessionsport'] comment = cd['comment'] course = cd['course'] name = cd['name'] @@ -780,6 +783,7 @@ def plannedsession_teamcreate_view(request, preferreddate=preferreddate, sessiontype=sessiontype, sessionmode=sessionmode, + sessionsport=sessionsport, sessionvalue=sessionvalue, sessionunit=sessionunit, comment=comment, @@ -2125,6 +2129,7 @@ def plannedsession_view(request,id=0,userid=0): 'psdict': psdict, 'attrs':[ 'name','startdate','enddate','preferreddate', + 'sessionsport', 'sessiontype', 'sessionmode','criterium', 'sessionvalue','sessionunit','comment', diff --git a/rowsandall_app/urls.py b/rowsandall_app/urls.py index e7ff383f..935b3332 100644 --- a/rowsandall_app/urls.py +++ b/rowsandall_app/urls.py @@ -82,6 +82,7 @@ urlpatterns += [ re_path(r'^i18n/', include('django.conf.urls.i18n')), re_path(r'^tz_detect/', include('tz_detect.urls')), re_path(r'^logo/',logoview), + re_path(r'^media/(?P.*\.fit)$',rowersviews.download_fit), path('django-rq/', include('django_rq.urls')), # path('500/', rowersviews.error500_view), # re_path(r'^jsi18n/', django.views.i18n.javascript_catalog,name='jsi18n'),