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 %} - Import + Import {{ workout|lookuplong:'name' }} {{ workout|lookuplong:'starttime' }} {{ workout|lookup:'duration' }} diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index b481530e..11cf5a61 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals from .statements import * from rowers.mytypes import rowtypes +from rowers.utils import allmonths,allsundays nu = datetime.datetime.now() @@ -12,8 +13,11 @@ nu = datetime.datetime.now() # interactive plots from rowers import interactiveplots from rowers import dataprep +from rowers import plannedsessions from rowers.views.workoutviews import get_video_id + + class OtherUnitTests(TestCase): def test_get_video_id(self): url1 = 'http://youtu.be/_lOT2p_FCvA' @@ -49,6 +53,249 @@ class OtherUnitTests(TestCase): self.assertEqual(result,expected) +class PlannedSessionTests(TestCase): + def setUp(self): + self.u = UserFactory() + + self.r = Rower.objects.create(user=self.u, + birthdate=faker.profile()['birthdate'], + gdproptin=True,surveydone=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + self.c = Client() + self.user_workouts = WorkoutFactory.create_batch(5, user=self.r) + self.factory = RequestFactory() + self.password = faker.word() + self.u.set_password(self.password) + self.u.save() + + self.u2 = UserFactory(username='testbasicuser') + self.r2 = Rower.objects.create(user=self.u2, + birthdate=faker.profile()['birthdate'], + gdproptin=True,surveydone=True, + gdproptindate=timezone.now(), + rowerplan='basic') + + self.password2 = faker.word() + self.u2.set_password(self.password2) + self.u2.save() + + self.team = Team.objects.create( + name = faker.word(), + notes = faker.text(), + manager = self.u, + ) + + self.team.save() + + self.r.team.add(self.team) + self.r2.team.add(self.team) + self.r.save() + self.r2.save() + + + result = get_random_file(filename='rowers/tests/testdata/2019-01-13_session.csv',name='sprintervals') + + + self.factory = RequestFactory() + self.password = faker.word() + self.u.set_password(self.password) + self.u.save() + + self.w1 = Workout.objects.create( + name='sprintervals', + notes=faker.text(), + startdatetime = result['startdatetime'], + starttime = result['starttime'], + workouttype='rower', + date=result['date'], + duration=result['duration'], + distance=result['totaldist'], + csvfilename=result['filename'], + trimp = 77, + rscore = 69, + hrtss = 43, + normp = 236, + user=self.r, + ) + + # plan + self.target = TrainingTarget.objects.create( + name = faker.word(), + manager = self.u.rower, + notes = faker.text() + ) + self.target.rowers.add(self.u.rower) + self.target.save() + + self.plan = TrainingPlan.objects.create( + manager = self.u.rower, + name = faker.word(), + status=True, + target = self.target, + startdate=timezone.now().date(), + enddate = self.target.date, + ) + + self.plan.rowers.add(self.u.rower) + self.plan.save() + + # cycles + self.macro = TrainingMacroCycle.objects.create( + plan=self.plan, + name=faker.word(), + type='userdefined', + notes = faker.text(), + startdate = self.plan.startdate, + enddate = self.plan.enddate, + ) + + mesos = TrainingMesoCycle.objects.filter(plan=self.macro) + for m in mesos: + m.delete() + + monthstarts = [d for d in allmonths(self.macro.startdate,self.macro.enddate)] + monthstarts.append(self.macro.enddate) + + for i in range(len(monthstarts)-1): + firstday = monthstarts[i] + lastday = monthstarts[i+1]-datetime.timedelta(days=1) + if lastday < self.macro.enddate and i == len(monthstarts)-2: + lastday = self.macro.enddate + + meso = TrainingMesoCycle(startdate=firstday, + enddate=lastday, + plan=self.macro, + name = '%s' % firstday.strftime("%B"), + type = 'userdefined') + meso.save() + + mesos = TrainingMesoCycle.objects.filter(plan=self.macro) + + for cycle in mesos: + micros = TrainingMicroCycle.objects.filter(plan=cycle) + for m in micros: + m.delete() + + sundays = [s for s in allsundays(cycle.startdate,cycle.enddate)] + + if sundays and sundays[-1] < cycle.enddate: + sundays = sundays+[cycle.enddate] + elif not sundays: + sundays = [cycle.enddate] + + for i in range(len(sundays)): + if i==0: + monday = cycle.startdate + else: + monday = sundays[i]-datetime.timedelta(days=6) + if monday < cycle.startdate: + monday = cycle.startdate + + nextsunday = sundays[i] + + micro = TrainingMicroCycle(startdate=monday, + enddate=nextsunday, + plan=cycle, + name = 'Week %s' % monday.isocalendar()[1], + type='userdefined') + micro.save() + + + # sessions + startdatetime = self.w1.startdatetime + + startdate = (startdatetime-datetime.timedelta(days=1)).date() + enddate = (startdatetime+datetime.timedelta(days=1)).date() + preferreddate = startdatetime.date() + + self.startdate = startdate + self.enddate = enddate + + self.ps_rscore = SessionFactory( + startdate=startdate,enddate=enddate, + sessiontype='test', + sessionmode = 'rScore', + criterium = 'none', + sessionvalue = 69, + sessionunit='None', + preferreddate=preferreddate, + manager=self.u, + ) + + + self.ps_rscore.save() + added = plannedsessions.add_rower_session(self.u.rower,self.ps_rscore) + + self.ps_dist = SessionFactory( + startdate=startdate,enddate=enddate, + sessiontype='test', + sessionmode = 'distance', + criterium = 'none', + sessionvalue = result['totaldist'], + sessionunit='m', + preferreddate=preferreddate, + manager=self.u, + ) + + + self.ps_dist.save() + added = plannedsessions.add_rower_session(self.u.rower,self.ps_dist) + + self.ps_time = SessionFactory( + startdate=startdate,enddate=enddate, + sessiontype='test', + sessionmode = 'time', + criterium = 'none', + sessionvalue = 38, + sessionunit='min', + preferreddate=preferreddate, + manager=self.u, + ) + + + self.ps_time.save() + added = plannedsessions.add_rower_session(self.u.rower,self.ps_time) + + self.ps_trimp = SessionFactory( + startdate=startdate,enddate=enddate, + sessiontype='test', + sessionmode = 'TRIMP', + criterium = 'none', + sessionvalue = 77, + sessionunit='none', + preferreddate=preferreddate, + manager=self.u, + ) + + + self.ps_trimp.save() + added = plannedsessions.add_rower_session(self.u.rower,self.ps_trimp) + added = plannedsessions.add_team_session(self.team,self.ps_trimp) + self.ps_trimp.save() + + + def tearDown(self): + pass + + def test_to_time(self): + calculatedTime = plannedsessions.to_time(8100000) + expectedTime = datetime.time(2,15,0,0) + + def test_checkscores(self): + macrocycles = TrainingMacroCycle.objects.filter(plan=self.plan) + plannedsessions.checkscores(self.r,macrocycles) + + def test_executionreport(self): + data, ok = plannedsessions.get_execution_report(self.r,self.plan.startdate,self.plan.enddate) + self.assertEqual(ok,'ok') + + def test_todays_micro(self): + micro1 = plannedsessions.get_todays_micro(self.plan) + micro2 = plannedsessions.get_todays_micro(self.plan,thedate=datetime.date.today()) + self.assertEqual(micro1.id,micro2.id) + class DataPrepTests(TestCase): def setUp(self): self.u = UserFactory()