diff --git a/rowers/alerts.py b/rowers/alerts.py index fdf00366..6e9fcd12 100644 --- a/rowers/alerts.py +++ b/rowers/alerts.py @@ -108,6 +108,7 @@ def alert_get_stats(alert,nperiod=0): 'nr_strokes':0, 'nr_strokes_qualifying':0, 'percentage':0, + 'nperiod':nperiod, } # check if filters are in columns list @@ -139,6 +140,7 @@ def alert_get_stats(alert,nperiod=0): 'nr_strokes':0, 'nr_strokes_qualifying':0, 'percentage':0, + 'nperiod':nperiod, } @@ -167,6 +169,10 @@ def alert_get_stats(alert,nperiod=0): percentage = int(100.*nr_strokes_qualifying/nr_strokes) else: percentage = 0 + + median_q = df2[alert.measured.metric].median() + median = df[alert.measured.metric].median() + std = df[alert.measured.metric].std() return { 'workouts':len(workouts), @@ -175,6 +181,10 @@ def alert_get_stats(alert,nperiod=0): 'nr_strokes':nr_strokes, 'nr_strokes_qualifying':nr_strokes_qualifying, 'percentage': percentage, + 'nperiod':nperiod, + 'median':median, + 'median_q':median_q, + 'standard_dev':std, } # run alert report diff --git a/rowers/middleware.py b/rowers/middleware.py index c1b968f2..7b9abb86 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -136,6 +136,8 @@ class RowerPlanMiddleWare(object): paymentprocessor='braintree') r.paidplan = basicplans[0] r.save() + # remove from Free Coach groups + # send email job = myqueue(queue, handle_sendemail_expired, diff --git a/rowers/models.py b/rowers/models.py index ec2f772e..3028d064 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -878,7 +878,20 @@ class Rower(models.Model): def clean_email(self): return self.user.email.lower() - + def save(self, *args, **kwargs): + try: + for group in self.coachinggroups.all(): + try: + coach = Rower.objects.get(mycoachgroup=group) + if coach.rowerplan == 'freecoach': + self.coachinggroups.remove(group) + except Rower.DoesNotExist: + pass + except ValueError: + pass + + super(Rower, self).save(*args, **kwargs) + class DeactivateUserForm(forms.ModelForm): class Meta: model = User @@ -1083,6 +1096,11 @@ class Alert(models.Model): return stri + def metricname(self): + metricdict = {key:value for (key,value) in parchoicesy1} + + return metricdict[self.measured.metric] + def description(self): metricdict = {key:value for (key,value) in parchoicesy1} @@ -1105,6 +1123,24 @@ class Alert(models.Model): return description + def shortdescription(self): + metricdict = {key:value for (key,value) in parchoicesy1} + + if self.measured.condition == 'between': + description = '{value1} < {metric} < {value2}'.format( + metric = self.measured.metric, + value1 = self.measured.value1, + value2 = self.measured.value2, + ) + else: + description = '{metric} {condition} {value1}'.format( + metric = self.measured.metric, + value1 = self.measured.value1, + condition = self.measured.condition + ) + + return description + class AlertEditForm(ModelForm): class Meta: diff --git a/rowers/tasks.py b/rowers/tasks.py index 3aab4fbe..cf0bae49 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -756,6 +756,26 @@ def handle_updatedps(useremail, workoutids, debug=False,**kwargs): return 1 +import math +def sigdig(value, digits = 3): + try: + order = int(math.floor(math.log10(math.fabs(value)))) + except (ValueError,TypeError): + return value + + # return integers as is + if value % 1 == 0: + return value + + places = digits - order - 1 + if places > 0: + fmtstr = "%%.%df" % (places) + else: + fmtstr = "%.0f" + return fmtstr % (round(value, places)) + + + @app.task def handle_send_email_alert( useremail, userfirstname, userlastname, rowerfirstname, alertname, stats, **kwargs): @@ -770,15 +790,26 @@ def handle_send_email_alert( else: othertexts = None - subject = "Your rowing performance on rowsandall.com ({startdate} to {enddate})".format( + report = {} + report['Percentage'] = int(stats['percentage']) + report['Number of workouts'] = int(stats['workouts']) + report['Data set'] = "{a} strokes out of {b}".format( + a = stats['nr_strokes_qualifying'], + b = stats['nr_strokes'] + ) + report['Median'] = sigdig(stats['median']) + report['Median of qualifying strokes'] = sigdig(stats['median_q']) + + subject = "Rowsandall.com: {alertname} ({startdate} to {enddate})".format( startdate = stats['startdate'], enddate = stats['enddate'], + alertname=alertname, ) from_email = 'Rowsandall ' d = { - 'report':stats, + 'report':report, 'first_name':userfirstname, 'last_name':userlastname, 'siteurl':siteurl, diff --git a/rowers/teams.py b/rowers/teams.py index a11cbdae..4c8ee0a4 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -135,8 +135,8 @@ def add_member(id,rower): t= Team.objects.get(id=id) try: rower.team.add(t) - except ValidationError: - return(0,"Couldn't add member") + except ValidationError as e: + return(0,"Couldn't add member: "+str(e.message)) # code to add all workouts ws = Workout.objects.filter(user=rower) diff --git a/rowers/templates/alert_stats.html b/rowers/templates/alert_stats.html index fb950332..400a8dd3 100644 --- a/rowers/templates/alert_stats.html +++ b/rowers/templates/alert_stats.html @@ -1,5 +1,6 @@ {% extends "newbase.html" %} {% load staticfiles %} +{% load rowerfilters %} {% block title %}Metric Alert{% endblock %} @@ -13,19 +14,33 @@

diff --git a/rowers/templates/alerts.html b/rowers/templates/alerts.html index e0cad516..2cc3c6d4 100644 --- a/rowers/templates/alerts.html +++ b/rowers/templates/alerts.html @@ -13,7 +13,7 @@