From 04f823578f14c1b5962620eea6449328bad9001b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 2 Mar 2021 14:06:15 +0100 Subject: [PATCH] all a bit neater and now working --- rowers/models.py | 66 +++++++++---------------- rowers/views/planviews.py | 101 +++++--------------------------------- 2 files changed, 34 insertions(+), 133 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index ecf5e2bb..43b8c3dc 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3,7 +3,7 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals from __future__ import unicode_literals, absolute_import - +import uuid from django.utils.encoding import python_2_unicode_compatible from django.db import models,IntegrityError @@ -119,6 +119,12 @@ class UserFullnameChoiceField(forms.ModelChoiceField): class PlannedSessionStepField(models.TextField): pass +def get_file_path(instance, filename): + ext = filename.split('.')[-1] + filename = "%s.%s" % (uuid.uuid4(), ext) + return filename +# return os.path.join(settings.MEDIA_ROOT, filename) + # model for configurable template field class TemplateListField(models.TextField): def __init__(self, *args, **kwargs): @@ -2311,7 +2317,7 @@ class PlannedSession(models.Model): is_template = models.BooleanField(default=False) - fitfile = models.FileField(blank=True,null=True) + fitfile = models.FileField(upload_to=get_file_path,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, @@ -2354,8 +2360,6 @@ 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(self.interval_string) @@ -2363,9 +2367,6 @@ class PlannedSession(models.Model): dct = trainingparser.tofitdict(dct) self.steps = dct - - - # sort units if self.sessionmode == 'distance': if self.sessionunit not in ['m','km']: @@ -2403,42 +2404,19 @@ class PlannedSession(models.Model): 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 = steps + steps = steps_read_fit(os.path.join(settings.MEDIA_ROOT,self.fitfile.name)) + self.steps = steps if self.steps and not self.fitfile: - if self.pk is not None: - filename = 'session'+encoder.encode_hex(self.pk)+'.fit' - else: - file = tempfile.NamedTemporaryFile(mode='w+b',suffix='.fit',dir=settings.MEDIA_ROOT) - filename = file - - + filename = 'aap.fit' + filename = get_file_path(self,filename) steps = self.steps - - try: - steps['filename'] = settings.MEDIA_ROOT+'/'+filename - except TypeError: - try: - steps['filename'] = filename.name - except TypeError: - steps = json.loads(steps) - steps['filename'] = filename.name - self.steps = steps + steps['filename'] = os.path.join(settings.MEDIA_ROOT,filename) fitfile = steps_write_fit(steps) - - - filelist = fitfile.split('/media/') - - self.fitfile.name = filelist[-1] - + self.fitfile.name = filename + self.steps = steps + print(self.fitfile.name,filename) # calculate approximate distance if self.steps: @@ -2454,11 +2432,13 @@ class PlannedSession(models.Model): super(PlannedSession,self).save(*args, **kwargs) -#@receiver(models.signals.pre_delete,sender=PlannedSession) -#def auto_delete_fitfile_on_delete(send, instance, **kwargs): -# if instance.fitfile: -# if os.path.isfile(instance.fitfile): -# os.remove(instance.fitfile) +@receiver(models.signals.post_delete,sender=PlannedSession) +def auto_delete_fitfile_on_delete(sender, instance, **kwargs): + # delete CSV file + if instance.fitfile: + filename = os.path.join(settings.MEDIA_ROOT,instance.fitfile.name) + if os.path.isfile(filename): + os.remove(filename) from django.core.validators import RegexValidator,validate_email diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 40f9fd6a..14c60855 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -431,57 +431,18 @@ def plannedsession_create_view(request, if request.method == 'POST': sessioncreateform = PlannedSessionForm(request.POST, request.FILES) if sessioncreateform.is_valid(): - cd = sessioncreateform.cleaned_data - startdate = cd['startdate'] - enddate = cd['enddate'] - preferreddate = cd['preferreddate'] - sessiontype = cd['sessiontype'] - sessionmode = cd['sessionmode'] - criterium = cd['criterium'] - sessionsport = cd['sessionsport'] - sessionvalue = cd['sessionvalue'] - sessionunit = cd['sessionunit'] - comment = cd['comment'] - course = cd['course'] - name = cd['name'] - interval_string = cd['interval_string'] - fitfile = cd['fitfile'] - - if sessionunit == 'min': - sessionmode = 'time' - elif sessionunit in ['km','m']: - sessionmode = 'distance' - - ps = PlannedSession( - name=name, - startdate=startdate, - enddate=enddate, - preferreddate=preferreddate, - course=course, - sessiontype=sessiontype, - sessionmode=sessionmode, - sessionvalue=sessionvalue, - sessionunit=sessionunit, - sessionsport=sessionsport, - comment=comment, - criterium=criterium, - interval_string=interval_string, - manager=request.user) - + ps = sessioncreateform.save(commit=False) + ps.manager = request.user ps.save() - if sessioncreateform.cleaned_data['fitfile']: - f = sessioncreateform.cleaned_data['fitfile'] - filename, path_and_filename = handle_uploaded_file(f) - ps.fitfile = filename - ps.save() + + add_rower_session(r,ps) - - request.session['fstartdate'] = str(arrow.get(startdate)) - request.session['fenddate'] = str(arrow.get(enddate)) - request.session['fprefdate'] = str(arrow.get(preferreddate)) + request.session['fstartdate'] = str(arrow.get(ps.startdate)) + request.session['fenddate'] = str(arrow.get(ps.enddate)) + request.session['fprefdate'] = str(arrow.get(ps.preferreddate)) else: if 'fstartdate' in request.session: @@ -765,50 +726,10 @@ def plannedsession_teamcreate_view(request, if sessioncreateform.is_valid() and sessionteamselectform.is_valid(): cd = sessioncreateform.cleaned_data - startdate = cd['startdate'] - enddate = cd['enddate'] - preferreddate = cd['preferreddate'] - sessiontype = cd['sessiontype'] - sessionmode = cd['sessionmode'] - criterium = cd['criterium'] - sessionvalue = cd['sessionvalue'] - sessionunit = cd['sessionunit'] - sessionsport = cd['sessionsport'] - comment = cd['comment'] - course = cd['course'] - name = cd['name'] - interval_string = cd['interval_string'] - fitfile = cd['fitfile'] - - - if sessionunit == 'min': - sessionmode = 'time' - elif sessionunit in ['km','m']: - sessionmode = 'distance' - - ps = PlannedSession( - name=name, - startdate=startdate, - enddate=enddate, - preferreddate=preferreddate, - sessiontype=sessiontype, - sessionmode=sessionmode, - sessionsport=sessionsport, - sessionvalue=sessionvalue, - sessionunit=sessionunit, - comment=comment, - criterium=criterium, - course=course, - interval_string=interval_string, - fitfile=fitfile, - manager=request.user) - + ps = sessioncreateform.save(commit=False) + ps.manager = request.user ps.save() - if fitfile: - f = sessioncreateform.cleaned_data['fitfile'] - filename, path_and_filename = handle_uploaded_file(f) - ps.fitfile.name = filename - ps.save() + cd = sessionteamselectform.cleaned_data teams = cd['team'] @@ -2235,7 +2156,7 @@ class PlannedSessionDelete(DeleteView): w.plannedsession = None w.save() - + url = reverse(plannedsessions_view) next = self.request.GET.get('next',url)