diff --git a/rowers/models.py b/rowers/models.py index 1ce31758..f1b367aa 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -109,7 +109,7 @@ def a_week_from_now(): def current_day(): return (datetime.datetime.now(tz=timezone.utc)).date() -def current_time(): +def current_time(): # pragma: no cover return datetime.datetime.now(tz=timezone.utc) @@ -132,7 +132,7 @@ class TemplateListField(models.TextField): self.token = kwargs.pop('token',',') super(TemplateListField, self).__init__(*args, **kwargs) - def to_python(self, value): + def to_python(self, value): # pragma: no cover if not value: return if isinstance(value, list): return value @@ -152,9 +152,9 @@ class TemplateListField(models.TextField): return value.split(self.token) def from_db_value(self,value, expression, connection): - if value is None: + if value is None: # pragma: no cover return value - if isinstance(value, list): + if isinstance(value, list): # pragma: no cover return value return value.split(self.token) @@ -163,7 +163,7 @@ class TemplateListField(models.TextField): assert(isinstance(value, list) or isinstance(value, tuple)) return self.token.join([str(s) for s in value]) - def value_to_string(self, obj): + def value_to_string(self, obj): # pragma: no cover value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) @@ -173,7 +173,7 @@ class AlternativeEmails(models.TextField): self.token = kwargs.pop('token',',') super(AlternativeEmails, self).__init__(*args,**kwargs) - def to_python(self, value): + def to_python(self, value): # pragma: no cover if not value: return if isinstance(value, list): return value @@ -195,7 +195,7 @@ class AlternativeEmails(models.TextField): def from_db_value(self,value, expression, connection): if value is None: return value - if isinstance(value, list): + if isinstance(value, list): # pragma: no cover return value return value.split(self.token) @@ -208,12 +208,12 @@ class AlternativeEmails(models.TextField): try: validate_email(s) newlist.append(s) - except ValidationError: + except ValidationError: # pragma: no cover pass return self.token.join([str(s) for s in newlist]) - def value_to_string(self, obj): + def value_to_string(self, obj): # pragma: no cover value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) @@ -222,7 +222,7 @@ class PlannedSessionStepField(models.TextField): def __init__(self, *args, **kwargs): super(PlannedSessionStepField, self).__init__(*args, **kwargs) - def to_python(self, value): + def to_python(self, value): # pragma: no cover if not value: return return json.loads(value) @@ -234,7 +234,7 @@ class PlannedSessionStepField(models.TextField): if not value: return return json.dumps(value) - def value_to_string(self, obj): + def value_to_string(self, obj): # pragma: no cover value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) @@ -246,7 +246,7 @@ class PowerZonesField(models.TextField): self.token = kwargs.pop('token',',') super(PowerZonesField, self).__init__(*args, **kwargs) - def to_python(self, value): + def to_python(self, value): # pragma: no cover if not value: return if isinstance(value, list): return value @@ -266,9 +266,9 @@ class PowerZonesField(models.TextField): return value.split(self.token) def from_db_value(self,value, expression, connection): - if value is None: + if value is None: # pragma: no cover return value - if isinstance(value, list): + if isinstance(value, list): # pragma: no cover return value return value.split(self.token) @@ -277,7 +277,7 @@ class PowerZonesField(models.TextField): assert(isinstance(value, list) or isinstance(value, tuple)) return self.token.join([str(s) for s in value]) - def value_to_string(self, obj): + def value_to_string(self, obj): # pragma: no cover value = self._get_val_from_obj(obj) return self.get_deb_prep_value(value) @@ -290,7 +290,7 @@ def update_records(url=c2url,verbose=True): df = dfs[0] df.columns = df.columns.str.strip() success = 1 - except: + except: # pragma: no cover df = pd.DataFrame() if not df.empty: @@ -339,11 +339,11 @@ def update_records(url=c2url,verbose=True): name = name, ) try: - if verbose: + if verbose: # pragma: no cover print(record) record.save() except: - if verbose: + if verbose: # pragma: no cover print(record,'*') else: pass @@ -371,7 +371,7 @@ class CalcAgePerformance(models.Model): class Meta: db_table = 'calcagegrouprecords' - def __str_(self): + def __str_(self): # pragma: no cover stri = 'Calculated World Class Performance for {s}, {a}, {d} secs, {p} Watts'.format( s = self.sex, a = self.age, @@ -425,7 +425,7 @@ class C2WorldClassAgePerformance(models.Model): class Meta: unique_together = ('age','sex','weightcategory','distance') - def __str__(self): + def __str__(self): # pragma: no cover thestring = '{s} {w} {n} age {a} ({season}) {distance}m {duration} seconds'.format( s = self.sex, w = self.weightcategory, @@ -560,7 +560,7 @@ def course_spline(coordinates): #lonnew = CubicSpline(t,longitudes,bc_type='not-a-knot')(tnew) latnew = interp1d(t,latitudes)(tnew) lonnew = interp1d(t,longitudes)(tnew) - except ValueError: + except ValueError: # pragma: no cover latnew = latitudes lonnew = longitudes @@ -660,18 +660,18 @@ def get_delta(vector,polygon): if len(df[b==2]): return 1.0e3*df[b==2]['dist'].min() - else: + else: # pragma: no cover return 0 -def get_delta_start(course): +def get_delta_start(course): # pragma: no cover polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") vector = get_dir_vector(polygons[0],polygons[1]) delta = get_delta(vector,polygons[0]) return delta -def get_delta_finish(course): +def get_delta_finish(course): # pragma: no cover polygons = GeoPolygon.objects.filter(course=course).order_by("-order_in_course") vector = get_dir_vector(polygons[0],polygons[1]) delta = get_delta(vector,polygons[0]) @@ -683,7 +683,7 @@ def course_length(course): totaldist = 0 - if not polygons: + if not polygons: # pragma: no cover return 0 for i in range(polygons.count()-1): @@ -702,7 +702,7 @@ def course_length(course): polygons = polygons.reverse() vector = get_dir_vector(polygons[0],polygons[1]) deltafinish = get_delta(vector,polygons[0]) - except IndexError: + except IndexError: # pragma: no cover deltastart = 0 deltafinish = 0 @@ -767,7 +767,7 @@ class PaidPlan(models.Model): class CoachingGroup(models.Model): name = models.CharField(default='group',max_length=30,null=True,blank=True) - def __str__(self): + def __str__(self): # pragma: no cover return 'Coaching Group {id}: {name}'.format( id = self.pk, name = self.name @@ -1095,7 +1095,7 @@ class Rower(models.Model): def __str__(self): return self.user.first_name+' '+self.user.last_name - def clean_email(self): + def clean_email(self): # pragma: no cover return self.user.email.lower() def save(self, *args, **kwargs): @@ -1103,9 +1103,9 @@ class Rower(models.Model): for group in self.coachinggroups.all(): try: coach = Rower.objects.get(mycoachgroup=group) - if coach.rowerplan == 'freecoach': + if coach.rowerplan == 'freecoach': # pragma: no cover self.coachinggroups.remove(group) - except Rower.DoesNotExist: + except Rower.DoesNotExist: # pragma: no cover pass except ValueError: pass @@ -1121,7 +1121,7 @@ class Rower(models.Model): try: coach = Rower.objects.get(mycoachgroup=group) coaches.append(coach) - except Rower.DoesNotExist: + except Rower.DoesNotExist: # pragma: no cover pass return coaches @@ -1132,13 +1132,13 @@ class Rower(models.Model): rs = Rower.objects.filter(coachinggroups__in=[self.mycoachgroup]) rekwests = CoachOffer.objects.filter(coach=self) - if len(rs)+len(rekwests) < self.clubsize and self.offercoaching: + if len(rs)+len(rekwests) < self.clubsize and self.offercoaching: # pragma: no cover return True return False @property - def ispaid(self): + def ispaid(self): # pragma: no cover return self.rowerplan in ['pro','plan','coach'] class DeactivateUserForm(forms.ModelForm): @@ -1247,7 +1247,7 @@ class FavoriteForm(ModelForm): # To generate favorite chart forms on the fly class BaseFavoriteFormSet(BaseFormSet): - def clean(self): + def clean(self): # pragma: no cover if any(self.errors): return @@ -1296,14 +1296,14 @@ class ConditionEditForm(ModelForm): def clean(self): cd = self.cleaned_data try: - if cd['condition'] == 'between' and cd['value2'] is None: + if cd['condition'] == 'between' and cd['value2'] is None: # pragma: no cover raise forms.ValidationError('When using between, you must fill value 1 and value 2') - except KeyError: + except KeyError: # pragma: no cover pass class BaseConditionFormSet(BaseFormSet): def clean(self): - if any(self.errors): + if any(self.errors): # pragma: no cover return for form in self.forms: @@ -1352,12 +1352,12 @@ class Alert(models.Model): return stri - def metricname(self): + def metricname(self): # pragma: no cover metricdict = {key:value for (key,value) in parchoicesy1} return metricdict[self.measured.metric] - def description(self): + def description(self): # pragma: no cover metricdict = {key:value for (key,value) in parchoicesy1} if self.measured.condition == 'between': @@ -1379,7 +1379,7 @@ class Alert(models.Model): return description - def shortdescription(self): + def shortdescription(self): # pragma: no cover metricdict = {key:value for (key,value) in parchoicesy1} if self.measured.condition == 'between': @@ -1407,7 +1407,7 @@ class AlertEditForm(ModelForm): } class BasePlannedSessionFormSet(BaseFormSet): - def clean(self): + def clean(self): # pragma: no cover if any(self.serrors): return @@ -1432,7 +1432,7 @@ class GeoCourse(models.Model): name = self.name country = self.country d = self.distance - if d == 0: + if d == 0: # pragma: no cover self.distance = course_length(self) self.save() d = self.distance @@ -1462,7 +1462,7 @@ class GeoPolygon(models.Model): course = models.ForeignKey(GeoCourse, blank=True,on_delete=models.CASCADE,related_name='polygons') order_in_course = models.IntegerField(default=0) - def __str__(self): + def __str__(self): # pragma: no cover name = self.name coursename = self.course.name @@ -1504,7 +1504,7 @@ class TrainingTarget(models.Model): try: ownerfirst = self.manager.user.first_name ownerlast = self.manager.user.last_name - except AttributeError: + except AttributeError: # pragma: no cover ownerfirst = '' ownerlast = '' @@ -1525,7 +1525,7 @@ def check_trainingtarget_on_change(sender,**kwargs): if action == 'pre_add': for id in pk_set: rower = Rower.objects.get(id=id) - if not can_plan_user(instance.manager.user,rower): + if not can_plan_user(instance.manager.user,rower): # pragma: no cover raise ValidationError("You cannot add this rower. Not your coachee") m2m_changed.connect(check_trainingtarget_on_change, sender=TrainingTarget.rowers.through) @@ -1548,7 +1548,7 @@ class TrainingTargetForm(ModelForm): except AttributeError: if user: teams = Team.objects.filter(manager=user) - else: + else: # pragma: no cover teams = [] if not teams: @@ -1573,7 +1573,7 @@ class InstantPlan(models.Model): price = models.IntegerField(default=0,verbose_name="Price in EURO") url = models.CharField(max_length=250,blank=True,verbose_name="Link to page with more information") - def __str__(self): + def __str__(self): # pragma: no cover return self.name def save(self, *args, **kwargs): @@ -1647,14 +1647,14 @@ class TrainingPlan(models.Model): def save(self, *args, **kwargs): manager = self.manager - if not can_add_plan(manager.user): + if not can_add_plan(manager.user): # pragma: no cover raise ValidationError( "Basic user cannot have a training plan" ) - if self.enddate < self.startdate: + if self.enddate < self.startdate: # pragma: no cover startdate = self.startdate enddate = self.enddate self.startdate = enddate @@ -1667,7 +1667,7 @@ class TrainingPlan(models.Model): for rower in self.rowers.all(): if can_plan_user(manager.user,rower): self.rowers.add(rower) - else: + else: # pragma: no cover self.rowers.remove(rower) if self.status: @@ -1677,9 +1677,9 @@ class TrainingPlan(models.Model): "-startdate") - for otherplan in otherplans: + for otherplan in otherplans: # pragma: no cover if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate: - for rower in self.rowers.all(): + for rower in self.rowers.all(): # pragma: no cover if rower in otherplan.rowers.all(): self.status = False self.save() @@ -1713,7 +1713,7 @@ def check_trainingplan_on_change(sender, **kwargs): if action == 'pre_add': for id in pk_set: rower = Rower.objects.get(id=id) - if not can_plan_user(instance.manager.user,rower): + if not can_plan_user(instance.manager.user,rower): # pragma: no cover raise ValidationError("You cannot add this rower. Not your coachee") m2m_changed.connect(check_trainingplan_on_change, sender=TrainingPlan.rowers.through) @@ -1739,7 +1739,7 @@ class TrainingPlanForm(ModelForm): targetchoices = [(x.id,x) for x in targets] targetchoices.append((None,'---')) self.fields['target'].choices = targetchoices - elif self.instance.pk is not None: + elif self.instance.pk is not None: # pragma: no cover self.fields['target'].queryset = TrainingTarget.objects.filter( manager=self.instance.manager, date__gte=current_day()).order_by("date") @@ -1751,7 +1751,7 @@ class TrainingPlanForm(ModelForm): except AttributeError: if user: teams = Team.objects.filter(manager=user) - else: + else: # pragma: no cover teams = [] if not teams: @@ -1789,7 +1789,7 @@ def createmacrofillers(plan): macr.save() thedate = plan.enddate - while cycles: + while cycles: # pragma: no cover if cycles[0].enddate < thedate: macr = TrainingMacroCycle( plan=plan, @@ -1806,7 +1806,7 @@ def createmacrofillers(plan): plan = plan ).order_by("startdate") - if cycles[0].startdate > plan.startdate: + if cycles[0].startdate > plan.startdate: # pragma: no cover macr = TrainingMacroCycle( plan=plan, startdate = plan.startdate, @@ -1839,7 +1839,7 @@ def createmesofillers(plan): macr.save() thedate = plan.enddate - while cycles: + while cycles: # pragma: no cover if cycles[0].enddate < thedate: macr = TrainingMesoCycle( plan=plan, @@ -1856,7 +1856,7 @@ def createmesofillers(plan): plan = plan ).order_by("startdate") - if cycles[0].startdate > plan.startdate: + if cycles[0].startdate > plan.startdate: # pragma: no cover macr = TrainingMesoCycle( plan=plan, startdate = plan.startdate, @@ -1890,7 +1890,7 @@ def createmicrofillers(plan): macr.save() thedate = plan.enddate - while cycles: + while cycles: # pragma: no cover if cycles[0].enddate < thedate: macr = TrainingMicroCycle( plan=plan, @@ -1908,7 +1908,7 @@ def createmicrofillers(plan): ).order_by("startdate") - if cycles and cycles[0].startdate > plan.startdate: + if cycles and cycles[0].startdate > plan.startdate: # pragma: no cover macr = TrainingMicroCycle( plan=plan, startdate = plan.startdate, @@ -1918,7 +1918,7 @@ def createmicrofillers(plan): ) macr.save() -def microcyclecheckdates(plan): +def microcyclecheckdates(plan): # pragma: no cover cycles = TrainingMicroCycle.objects.filter( plan=plan ).order_by("-startdate") @@ -1950,7 +1950,7 @@ def microcyclecheckdates(plan): pass cycles = cycles[1:] -def mesocyclecheckdates(plan): +def mesocyclecheckdates(plan): # pragma: no cover cycles = TrainingMesoCycle.objects.filter( plan=plan ).order_by("-startdate") @@ -1982,7 +1982,7 @@ def mesocyclecheckdates(plan): pass cycles = cycles[1:] -def macrocyclecheckdates(plan): +def macrocyclecheckdates(plan): # pragma: no cover cycles = TrainingMacroCycle.objects.filter( plan=plan ).order_by("-startdate") @@ -2037,7 +2037,7 @@ class TrainingMacroCycle(models.Model): actualrscore = models.IntegerField(default=0,verbose_name='Actual rScore') actualtrimp = models.IntegerField(default=0,verbose_name='Actual TRIMP') - def __str__(self): + def __str__(self): # pragma: no cover stri = 'Macro Cycle - {n} ({sd} - {ed})'.format( n = self.name, sd = self.startdate, @@ -2047,7 +2047,7 @@ class TrainingMacroCycle(models.Model): return stri def save(self, *args, **kwargs): - if self.enddate < self.startdate: + if self.enddate < self.startdate: # pragma: no cover startdate = self.startdate enddate = self.enddate self.startdate = enddate @@ -2058,16 +2058,16 @@ class TrainingMacroCycle(models.Model): for f in fillers: f.delete() - if self.enddate > self.plan.enddate: + if self.enddate > self.plan.enddate: # pragma: no cover self.enddate = self.plan.enddate - if self.startdate < self.plan.startdate: + if self.startdate < self.plan.startdate: # pragma: no cover self.startdate = self.plan.startdate othercycles = TrainingMacroCycle.objects.filter( plan=self.plan).exclude(pk=self.pk).order_by("-startdate") - for othercycle in othercycles: + for othercycle in othercycles: # pragma: no cover if othercycle.startdate <= self.enddate and othercycle.startdate >= self.startdate: self.enddate = othercycle.startdate-datetime.timedelta(days=1) @@ -2088,7 +2088,7 @@ class TrainingMacroCycle(models.Model): ) meso.save() - else: + else: # pragma: no cover createmesofillers(self) @@ -2126,7 +2126,7 @@ class TrainingMesoCycle(models.Model): actualtrimp = models.IntegerField(default=0,verbose_name='Actual TRIMP') - def __str__(self): + def __str__(self): # pragma: no cover stri = 'Meso Cycle - {n} ({sd} - {ed})'.format( n = self.name, sd = self.startdate, @@ -2136,7 +2136,7 @@ class TrainingMesoCycle(models.Model): return stri def save(self, *args, **kwargs): - if self.enddate < self.startdate: + if self.enddate < self.startdate: # pragma: no cover startdate = self.startdate enddate = self.enddate self.startdate = enddate @@ -2144,19 +2144,19 @@ class TrainingMesoCycle(models.Model): fillers = TrainingMesoCycle.objects.filter( plan=self.plan,type='filler') - for f in fillers: + for f in fillers: # pragma: no cover f.delete() - if self.enddate > self.plan.enddate: + if self.enddate > self.plan.enddate: # pragma: no cover self.enddate = self.plan.enddate - if self.startdate < self.plan.startdate: + if self.startdate < self.plan.startdate: # pragma: no cover self.startdate = self.plan.startdate othercycles = TrainingMesoCycle.objects.filter( plan=self.plan).exclude(pk=self.pk).order_by("-startdate") - for othercycle in othercycles: + for othercycle in othercycles: # pragma: no cover if othercycle.startdate <= self.enddate and othercycle.startdate >= self.startdate: self.enddate = othercycle.startdate-datetime.timedelta(days=1) @@ -2176,7 +2176,7 @@ class TrainingMesoCycle(models.Model): ) micro.save() - else: + else: # pragma: no cover createmicrofillers(self) @@ -2205,7 +2205,7 @@ class TrainingMicroCycle(models.Model): - def __str__(self): + def __str__(self): # pragma: no cover stri = 'Micro Cycle - {n} ({sd} - {ed})'.format( n = self.name, sd = self.startdate, @@ -2215,7 +2215,7 @@ class TrainingMicroCycle(models.Model): return stri def save(self, *args, **kwargs): - if self.enddate < self.startdate: + if self.enddate < self.startdate: # pragma: no cover startdate = self.startdate enddate = self.enddate self.startdate = enddate @@ -2223,19 +2223,19 @@ class TrainingMicroCycle(models.Model): fillers = TrainingMicroCycle.objects.filter( plan=self.plan,type='filler') - for f in fillers: + for f in fillers: # pragma: no cover f.delete() - if self.enddate > self.plan.enddate: + if self.enddate > self.plan.enddate: # pragma: no cover self.enddate = self.plan.enddate - if self.startdate < self.plan.startdate: + if self.startdate < self.plan.startdate: # pragma: no cover self.startdate = self.plan.startdate othercycles = TrainingMicroCycle.objects.filter( plan=self.plan).exclude(pk=self.pk).order_by("-startdate") - for othercycle in othercycles: + for othercycle in othercycles: # pragma: no cover if othercycle.startdate <= self.enddate and othercycle.startdate >= self.startdate: self.enddate = othercycle.startdate-datetime.timedelta(days=1) @@ -2417,7 +2417,7 @@ class PlannedSession(models.Model): return stri - def update_steps(self): + def update_steps(self): # pragma: no cover # read file if self.fitfile: steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name) @@ -2427,7 +2427,7 @@ class PlannedSession(models.Model): def save(self, *args, **kwargs): - if self.sessionvalue <= 0: + if self.sessionvalue <= 0: # pragma: no cover self.sessionvalue = 1 @@ -2439,7 +2439,7 @@ class PlannedSession(models.Model): ) # interval string - if self.interval_string: + if self.interval_string: # pragma: no cover try: dct = trainingparser.parsetodict(self.interval_string) dct = [item for item in dct if item['value'] != 0] @@ -2458,7 +2458,7 @@ class PlannedSession(models.Model): # sort units if self.sessionmode == 'distance': - if self.sessionunit not in ['m','km']: + if self.sessionunit not in ['m','km']: # pragma: no cover self.sessionunit = 'm' elif self.sessionmode == 'time': self.sessionunit = 'min' @@ -2470,7 +2470,7 @@ class PlannedSession(models.Model): if self.sessionvalue < 100: self.sessionmode = 'time' self.sessionunit = 'min' - else: + else: # pragma: no cover self.sessionmode = 'distance' self.sessionunit = 'm' self.criterium = 'exact' @@ -2478,7 +2478,7 @@ class PlannedSession(models.Model): self.sessionmode = 'distance' self.sessionunit = 'm' self.criterium = 'none' - if self.course == None: + if self.course == None: # pragma: no cover self.course = GeoCourse.objects.all()[0] self.sessionvalue = self.course.distance elif self.sessiontype != 'coursetest' and self.sessiontype != 'race': @@ -2516,7 +2516,7 @@ class PlannedSession(models.Model): self.criterium = 'none' if self.sessionmode == 'time': self.sessionvalue = self.approximate_duration - elif self.sessionmode == 'distance': + elif self.sessionmode == 'distance': # pragma: no cover self.sessionvalue = self.approximate_distance @@ -2525,7 +2525,7 @@ class PlannedSession(models.Model): @receiver(models.signals.post_delete,sender=PlannedSession) def auto_delete_fitfile_on_delete(sender, instance, **kwargs): # delete CSV file - if instance.fitfile: + if instance.fitfile: # pragma: no cover filename = os.path.join(settings.MEDIA_ROOT,instance.fitfile.name) if os.path.isfile(filename): os.remove(filename) @@ -2635,7 +2635,7 @@ class VirtualRace(PlannedSession): enddatetime ) - if startdatetime > enddatetime: + if startdatetime > enddatetime: # pragma: no cover self.start_time = end_time self.startdate = end_date self.end_time = start_time @@ -2643,7 +2643,7 @@ class VirtualRace(PlannedSession): enddatetime = startdatetime - if self.evaluation_closure < enddatetime: + if self.evaluation_closure < enddatetime: # pragma: no cover self.evaluation_closure = enddatetime + timezone.timedelta(days=1) super(VirtualRace,self).save(*args, **kwargs) @@ -2656,12 +2656,12 @@ class RaceLogo(models.Model): height = models.IntegerField(default=600) race = models.ManyToManyField(VirtualRace,related_name='logos') - def __str__(self): + def __str__(self): # pragma: no cover return self.filename - def delete(self, *args, **kwargs): + def delete(self, *args, **kwargs): # pragma: no cover os.remove(self.filename) - print('file deleted') + super(RaceLogo,self).delete(*args, **kwargs) # Date input utility @@ -2768,10 +2768,10 @@ def get_course_timezone(course): tf = TimezoneFinder() try: timezone_str = tf.timezone_at(lng=lon,lat=lat) - except ValueError: + except ValueError: # pragma: no cover timezone_str = 'UTC' - if timezone_str is None: + if timezone_str is None: # pragma: no cover timezone_str = tf.closest_timezone_at(lng=lon,lat=lat) if timezone_str is None: timezone_str = 'UTC' @@ -2841,15 +2841,15 @@ class IndoorVirtualRaceForm(ModelForm): timezone_str = cd['timezone'] value = cd['sessionvalue'] - if value <= 0: + if value <= 0: # pragma: no cover raise forms.ValidationError('The Value must be a positive, non-zero value') unit = cd['sessionunit'] - if unit == 'm' and value < 100: + if unit == 'm' and value < 100: # pragma: no cover raise forms.ValidationError('Minimum distance is 100m') start_time = cd['start_time'] - if start_time is None: + if start_time is None: # pragma: no cover raise forms.ValidationError( 'Must have start time', code='missing_yparam1' @@ -2862,7 +2862,7 @@ class IndoorVirtualRaceForm(ModelForm): ) end_time = cd['end_time'] - if end_time is None: + if end_time is None: # pragma: no cover raise forms.ValidationError( 'Must have end time', code='missing endtime' @@ -2880,11 +2880,11 @@ class IndoorVirtualRaceForm(ModelForm): try: evaluation_closure = cd['evaluation_closure'] - except KeyError: + except KeyError: # pragma: no cover evaluation_closure = enddatetime+datetime.timedelta(days=1) cd['evaluation_closure'] = evaluation_closure - if registration_form == 'manual': + if registration_form == 'manual': # pragma: no cover try: registration_closure = pytz.timezone( timezone_str @@ -2893,26 +2893,26 @@ class IndoorVirtualRaceForm(ModelForm): ) except AttributeError: registration_closure = startdatetime - elif registration_form == 'windowstart': + elif registration_form == 'windowstart': # pragma: no cover registration_closure = startdatetime - elif registration_form == 'windowend': + elif registration_form == 'windowend': # pragma: no cover registration_closure = enddatetime else: registration_closure = evaluation_closure - if registration_closure <= timezone.now(): + if registration_closure <= timezone.now(): # pragma: no cover raise forms.ValidationError("Registration Closure cannot be in the past") - if startdatetime > enddatetime: + if startdatetime > enddatetime: # pragma: no cover raise forms.ValidationError("The Start of the challenge Window should be before the End of the challenge Window") - if cd['evaluation_closure'] <= enddatetime: + if cd['evaluation_closure'] <= enddatetime: # pragma: no cover raise forms.ValidationError("Evaluation closure deadline should be after the challenge Window closes") - if cd['evaluation_closure'] <= timezone.now(): + if cd['evaluation_closure'] <= timezone.now(): # pragma: no cover raise forms.ValidationError("Evaluation closure cannot be in the past") @@ -2974,7 +2974,7 @@ class VirtualRaceForm(ModelForm): timezone_str = get_course_timezone(geocourse) start_time = cd['start_time'] - if start_time is None: + if start_time is None: # pragma: no cover raise forms.ValidationError( 'Must have start time', code='missing_yparam1' @@ -2988,14 +2988,14 @@ class VirtualRaceForm(ModelForm): try: end_time = cd['end_time'] - except KeyError: + except KeyError: # pragma: no cover raise forms.ValidationError( 'Must have end time', code='missing endtime' ) - if end_time is None: + if end_time is None: # pragma: no cover raise forms.ValidationError( 'Must have end time', code='missing endtime' @@ -3003,7 +3003,7 @@ class VirtualRaceForm(ModelForm): try: end_date = cd['enddate'] - except KeyError: + except KeyError: # pragma: no cover raise forms.ValidationError( 'Missing or invalid end date', code='missing end date' @@ -3018,7 +3018,7 @@ class VirtualRaceForm(ModelForm): try: registration_closure = cd['registration_closure'] - except KeyError: + except KeyError: # pragma: no cover registration_closure = enddatetime+datetime.timedelta(days=1) cd['registration_closure'] = registration_closure @@ -3026,11 +3026,11 @@ class VirtualRaceForm(ModelForm): try: evaluation_closure = cd['evaluation_closure'] - except KeyError: + except KeyError: # pragma: no cover evaluation_closure = enddatetime+datetime.timedelta(days=1) cd['evaluation_closure'] = evaluation_closure - if registration_form == 'manual': + if registration_form == 'manual': # pragma: no cover try: registration_closure = pytz.timezone( timezone_str @@ -3039,26 +3039,26 @@ class VirtualRaceForm(ModelForm): ) except AttributeError: registration_closure = startdatetime - elif registration_form == 'windowstart': + elif registration_form == 'windowstart': # pragma: no cover registration_closure = startdatetime - elif registration_form == 'windowend': + elif registration_form == 'windowend': # pragma: no cover registration_closure = enddatetime else: registration_closure = evaluation_closure - if registration_closure <= timezone.now(): + if registration_closure <= timezone.now(): # pragma: no cover raise forms.ValidationError("Registration Closure cannot be in the past") - if startdatetime > enddatetime: + if startdatetime > enddatetime: # pragma: no cover raise forms.ValidationError("The Start of the challenge Window should be before the End of the challenge Window") - if cd['evaluation_closure'] <= enddatetime: + if cd['evaluation_closure'] <= enddatetime: # pragma: no cover raise forms.ValidationError("Evaluation closure deadline should be after the challenge Window closes") - if cd['evaluation_closure'] <= timezone.now(): + if cd['evaluation_closure'] <= timezone.now(): # pragma: no cover raise forms.ValidationError("Evaluation closure cannot be in the past") @@ -3218,7 +3218,7 @@ class Workout(models.Model): def save(self, *args, **kwargs): user = self.user - if self.notes is not None and len(self.notes)>1000: + if self.notes is not None and len(self.notes)>1000: # pragma: no cover self.notes = self.notes[0:950] if not can_add_workout(user.user): raise forms.ValidationError("Free Coach User cannot have any workouts") @@ -3319,7 +3319,7 @@ def update_duplicates_on_delete(sender, instance, **kwargs): user=instance.user,date=instance.date, duplicate=True) - for d in duplicates: + for d in duplicates: # pragma: no cover t = d.duration delta = datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second) workoutenddatetime = d.startdatetime+delta @@ -3421,7 +3421,7 @@ class VirtualRaceResult(models.Model): acceptsocialmedia = models.BooleanField(default=True, verbose_name = 'I agree with sharing my name in challenge related social media posts (unchecking this does not prevent you from participation)') - def isduplicate(self,other): + def isduplicate(self,other): # pragma: no cover if self.userid != other.userid: return False if self.weightcategory != other.weightcategory: @@ -3472,7 +3472,7 @@ class VirtualRaceResult(models.Model): t = self.teamname, s = self.sex, ) - else: + else: # pragma: no cover if self.entrycategory: return u'Entry for {n} for "{r}" in {g}'.format( n = name, @@ -3535,7 +3535,7 @@ class IndoorVirtualRaceResult(models.Model): startsecond = models.FloatField(default=0) endsecond = models.FloatField(default=0) - def isduplicate(self,other): + def isduplicate(self,other): # pragma: no cover if self.userid != other.userid: return False if self.weightcategory != other.weightcategory: @@ -3567,7 +3567,7 @@ class IndoorVirtualRaceResult(models.Model): u2 = rr.user.last_name, ) if self.teamname: - if self.entrycategory: + if self.entrycategory: # pragma: no cover return u'Entry for {n} for "{r}" in {g} with {t}'.format( n = name, r = self.race, @@ -3581,7 +3581,7 @@ class IndoorVirtualRaceResult(models.Model): c = self.boatclass, s = self.sex, ) - else: + else: # pragma: no cover if self.entrycategory: return u'Entry for {n} for "{r}" in {g}'.format( n = name, @@ -3618,7 +3618,7 @@ class IndoorVirtualRaceResultForm(ModelForm): def __init__(self, *args, **kwargs): categories = kwargs.pop('categories',None) super(IndoorVirtualRaceResultForm, self).__init__(*args, **kwargs) - if categories is not None: + if categories is not None: # pragma: no cover self.fields['entrycategory'].queryset = categories self.fields['entrycategory'].empty_label = None else: @@ -3638,7 +3638,7 @@ class VirtualRaceResultForm(ModelForm): categories = kwargs.pop('categories',None) super(VirtualRaceResultForm, self).__init__(*args, **kwargs) - if boattypes: + if boattypes: # pragma: no cover self.fields['boattype'].choices = boattypes self.fields['mix'] = forms.BooleanField(initial=False, @@ -3757,7 +3757,7 @@ class GraphImage(models.Model): width = models.IntegerField(default=1200) height = models.IntegerField(default=600) - def __str__(self): + def __str__(self): # pragma: no cover return self.filename @@ -3765,7 +3765,7 @@ class GraphImage(models.Model): @receiver(models.signals.post_delete,sender=GraphImage) def auto_delete_image_on_delete(sender,instance, **kwargs): if instance.filename: - if os.path.isfile(instance.filename): + if os.path.isfile(instance.filename): # pragma: no cover others = GraphImage.objects.filter(filename=instance.filename) if others.count() == 0: os.remove(instance.filename) @@ -3817,7 +3817,7 @@ class WorkoutForm(ModelForm): if 'instance' in kwargs: if kwargs['instance'].privacy == 'visible': self.fields['private'].initial = False - else: + else: # pragma: no cover self.fields['private'].initial = True workout = self.instance @@ -3830,7 +3830,7 @@ class WorkoutForm(ModelForm): if not sps: del self.fields['plannedsession'] - else: + else: # pragma: no cover self.fields['plannedsession'].queryset = sps else: del self.fields['plannedsession'] @@ -3907,7 +3907,7 @@ class RowerHRZonesForm(ModelForm): model = Rower fields = ['rest','ut2','ut1','at','tr','an','max'] - def clean(self): + def clean(self): # pragma: no cover cleaned_data = super(RowerHRZonesForm, self).clean() try: @@ -4064,7 +4064,7 @@ class RowerPowerZonesForm(ModelForm): model = Rower fields = ['pw_ut2','pw_ut1','pw_at','pw_tr','pw_an'] - def clean(self): + def clean(self): # pragma: no cover cleaned_data = super(RowerPowerZonesForm, self).clean() try: @@ -4257,7 +4257,7 @@ class AccountRowerForm(ModelForm): z = "".join(cd['emailalternatives'].split()).split(',') emailalternatives = [] for addr in z: - try: + try: # pragma: no cover validate_email(addr) match = User.objects.filter(email__iexact=addr) if match.count() == 0: @@ -4293,14 +4293,14 @@ class UserForm(ModelForm): if len(first_name): return first_name - raise forms.ValidationError('Please fill in your first name') + raise forms.ValidationError('Please fill in your first name') # pragma: no cover def clean_email(self): email = self.cleaned_data.get('email') try: validate_email(email) - except ValidationError: + except ValidationError: # pragma: no cover raise forms.ValidationError( 'Please enter a valid email address') @@ -4308,10 +4308,10 @@ class UserForm(ModelForm): match = User.objects.filter(email__iexact=email).exclude(id=self.instance.id) if match.count() == 0: return email - except User.DoesNotExist: + except User.DoesNotExist: # pragma: no cover return email - raise forms.ValidationError('This email address is not allowed') + raise forms.ValidationError('This email address is not allowed') # pragma: no cover # Form to set rower's Heart Rate zones, including test routines @@ -4330,7 +4330,7 @@ class RowerForm(ModelForm): raise forms.ValidationError("Resting heart rate should be higher than 10 bpm") - if rest>250: + if rest>250: # pragma: no cover self.data['rest'] = 250 raise forms.ValidationError("Resting heart rate should be lower than 250 bpm") @@ -4340,10 +4340,10 @@ class RowerForm(ModelForm): def clean_ut2(self): ut2 = self.cleaned_data['ut2'] - if ut2<10: + if ut2<10: # pragma: no cover raise forms.ValidationError("UT2 heart rate should be higher than 10 bpm") - if ut2>250: + if ut2>250: # pragma: no cover raise forms.ValidationError("UT2 heart rate should be lower than 250 bpm") return ut2 @@ -4351,10 +4351,10 @@ class RowerForm(ModelForm): def clean_ut1(self): ut1 = self.cleaned_data['ut1'] - if ut1<10: + if ut1<10: # pragma: no cover raise forms.ValidationError("UT1 heart rate should be higher than 10 bpm") - if ut1>250: + if ut1>250: # pragma: no cover raise forms.ValidationError("Resting heart rate should be lower than 250 bpm") return ut1 @@ -4362,10 +4362,10 @@ class RowerForm(ModelForm): def clean_at(self): at = self.cleaned_data['at'] - if at<10: + if at<10: # pragma: no cover raise forms.ValidationError("AT heart rate should be higher than 10 bpm") - if at>250: + if at>250: # pragma: no cover raise forms.ValidationError("AT heart rate should be lower than 250 bpm") return at @@ -4373,10 +4373,10 @@ class RowerForm(ModelForm): def clean_tr(self): tr = self.cleaned_data['tr'] - if tr<10: + if tr<10: # pragma: no cover raise forms.ValidationError("TR heart rate should be higher than 10 bpm") - if tr>250: + if tr>250: # pragma: no cover raise forms.ValidationError("TR heart rate should be lower than 250 bpm") return tr @@ -4384,10 +4384,10 @@ class RowerForm(ModelForm): def clean_an(self): an = self.cleaned_data['an'] - if an<10: + if an<10: # pragma: no cover raise forms.ValidationError("AN heart rate should be higher than 10 bpm") - if an>250: + if an>250: # pragma: no cover raise forms.ValidationError("AN heart rate should be lower than 250 bpm") return an @@ -4395,10 +4395,10 @@ class RowerForm(ModelForm): def clean_max(self): max = int(self.cleaned_data['max']) - if max<10: + if max<10: # pragma: no cover raise forms.ValidationError("Max heart rate should be higher than 10 bpm") - if max>250: + if max>250: # pragma: no cover raise forms.ValidationError("Max heart rate should be lower than 250 bpm") return max @@ -4412,12 +4412,12 @@ class RowerForm(ModelForm): except: try: rest = int(self.data['rest']) - except ValueError: + except ValueError: # pragma: no cover rest = 0 try: ut2 = self.cleaned_data['ut2'] - except: + except: # pragma: no cover try: ut2 = int(self.data['ut2']) except ValueError: @@ -4425,7 +4425,7 @@ class RowerForm(ModelForm): try: ut1 = self.cleaned_data['ut1'] - except: + except: # pragma: no cover try: ut1 = int(self.data['ut1']) except ValueError: @@ -4433,15 +4433,15 @@ class RowerForm(ModelForm): try: at = self.cleaned_data['at'] - except: + except: # pragma: no cover try: at = int(self.data['at']) except ValueError: at = 0 - try: + try: # pragma: no cover an = self.cleaned_data['an'] - except: + except: # pragma: no cover try: an = int(self.data['an']) except ValueError: @@ -4449,7 +4449,7 @@ class RowerForm(ModelForm): try: tr = self.cleaned_data['tr'] - except: + except: # pragma: no cover try: tr = int(self.data['tr']) except ValueError: @@ -4457,7 +4457,7 @@ class RowerForm(ModelForm): try: max = self.cleaned_data['max'] - except: + except: # pragma: no cover try: max = int(self.data['max']) except ValueError: @@ -4467,15 +4467,15 @@ class RowerForm(ModelForm): raise forms.ValidationError("Resting heart rate should be lower than UT2") if ut2>=ut1: raise forms.ValidationError("UT2 should be lower than UT1") - if ut2>=ut1: + if ut2>=ut1: # pragma: no cover raise forms.ValidationError("UT2 should be lower than UT1") - if ut1>=at: + if ut1>=at: # pragma: no cover raise forms.ValidationError("UT1 should be lower than AT") - if at>=tr: + if at>=tr: # pragma: no cover raise forms.ValidationError("AT should be lower than TR") - if tr>=an: + if tr>=an: # pragma: no cover raise forms.ValidationError("TR should be lower than AN") - if an>=max: + if an>=max: # pragma: no cover raise forms.ValidationError("AN should be lower than Max") @@ -4493,7 +4493,7 @@ class SiteAnnouncement(models.Model): self.created = timezone.now() self.expires = timezone.now()+datetime.timedelta(days=10) self.modified = timezone.now() - if self.dotweet: + if self.dotweet: # pragma: no cover try: status = tweetapi.PostUpdate(self.announcement) except: @@ -4513,7 +4513,7 @@ class WorkoutComment(models.Model): user = models.ForeignKey(User,on_delete=models.PROTECT) workout = models.ForeignKey(Workout,on_delete=models.CASCADE) - def __str__(self): + def __str__(self): # pragma: no cover return u'Comment to: {w} by {u1} {u2}'.format( w=self.workout, u1 = self.user.first_name, @@ -4540,7 +4540,7 @@ class PlannedSessionComment(models.Model): plannedsession = models.ForeignKey(PlannedSession,on_delete=models.CASCADE) - def __str__(self): + def __str__(self): # pragma: no cover return u'Comment to: {w} by {u1} {u2}'.format( w=self.workout, u1 = self.user.first_name, @@ -4574,7 +4574,7 @@ class VideoAnalysis(models.Model): class Meta: unique_together = ('video_id','workout') - def __str__(self): + def __str__(self): # pragma: no cover return self.name @@ -4587,9 +4587,9 @@ class ShareKey(models.Model): @property - def expired(self): + def expired(self): # pragma: no cover return self.creation_date + datetime.timedelta(self.expiration_seconds) < timezone.now() @property - def expiration_date(self): + def expiration_date(self): # pragma: no cover return self.creation_date + datetime.timedelta(self.expiration_seconds) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 176d8cc9..434f0418 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -50,7 +50,7 @@ def to_time(milliseconds): def rdata(file,rower=rrower()): try: res = rrdata(csvfile=file,rower=rower) - except (IOError, IndexError, EOFError,FileNotFoundError): + except (IOError, IndexError, EOFError,FileNotFoundError): # pragma: no cover try: res = rrdata(csvfile=file+'.gz',rower=rower) except (IOError, IndexError, EOFError,FileNotFoundError): @@ -85,16 +85,7 @@ from rowers.tasks import ( ) from rowers.utils import totaltime_sec_to_string -# nog niet af -def ps_dict_get_durationdistance(d): - sdict = ps_dict_order(d) - return sdict - - - - - -def ps_dict_get_description(d,short=False): +def ps_dict_get_description(d,short=False): # pragma: no cover sdict,totalmeters,totalseconds = ps_dict_order(d,short=short) s = '' for item in sdict: @@ -115,35 +106,6 @@ def ps_dict_get_description_html(d,short=False): return s - -class FitWorkoutSteps(object): - 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 - - def to_json(self): - d = self.get_dict() - - return json.dumps(d) - - def get_dict(self): - return self.steps - - - def get_description(self): - s = '' - for step in self.steps: - s += step_to_string(step) - s += '\n' - - return s - - def checkscores(r,macrocycles): for m in macrocycles: createmesofillers(m) @@ -246,7 +208,7 @@ def get_execution_report(rower,startdate,enddate,plan=None): mesos = TrainingMesoCycle.objects.filter(plan__in=macros).order_by("startdate") micros = TrainingMicroCycle.objects.filter(plan__in=mesos).order_by("startdate") micros = micros.exclude(enddate__lte=startdate).exclude(startdate__gte=enddate) - else: + else: # pragma: no cover plans = TrainingPlan.objects.filter(startdate__lte=startdate,enddate__gte=startdate) plans2 = TrainingPlan.objects.filter(enddate__lte=enddate,startdate__lte=enddate) plans = plans | plans2 diff --git a/rowers/templates/nk_list_import.html b/rowers/templates/nk_list_import.html index e97d711b..0c5f4505 100644 --- a/rowers/templates/nk_list_import.html +++ b/rowers/templates/nk_list_import.html @@ -33,7 +33,7 @@ {% for workout in workouts %}