From 88c3cb36e24b766469f34d97a8c9df64b70dc708 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 24 Oct 2022 19:55:33 +0200 Subject: [PATCH 1/4] fix alerts --- rowers/alerts.py | 16 ++++++++++++++-- rowers/tasks.py | 12 ++++++++++-- rowers/views/statements.py | 6 +++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/rowers/alerts.py b/rowers/alerts.py index 86a1716f..ef74ddf0 100644 --- a/rowers/alerts.py +++ b/rowers/alerts.py @@ -3,7 +3,7 @@ from rowers.teams import coach_getcoachees from rowers.dataprep import getsmallrowdata_db, getrowdata_db import datetime import numpy as np - +import math def create_alert(manager, rower, measured, period=7, emailalert=True, reststrokes=False, workouttype='water', boattype='1x', @@ -195,7 +195,7 @@ def alert_get_stats(alert, nperiod=0): # pragma: no cover median = df[alert.measured.metric].median() std = df[alert.measured.metric].std() - return { + data = { 'workouts': workouts.count(), 'startdate': startdate, 'enddate': enddate, @@ -208,6 +208,18 @@ def alert_get_stats(alert, nperiod=0): # pragma: no cover 'standard_dev': std, } + data_clean = {} + + for k in data: + data_clean[k] = data[k] + try: + if math.isnan(data[k]): + data_clean[k] = 0 + except TypeError: + pass + + return data_clean + # run alert report # check alert permission diff --git a/rowers/tasks.py b/rowers/tasks.py index b6236ac4..521e0467 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -408,7 +408,11 @@ def handle_c2_sync(workoutid, url, headers, data, debug=False, **kwargs): s = response.json() c2id = s['data']['id'] - workout = Workout.objects.get(id=workoutid) + try: + workout = Workout.objects.get(id=workoutid) + except Workout.DoesNotExist: + return 0 + workout.uploadedtoc2 = c2id workout.save() @@ -492,7 +496,11 @@ def handle_strava_sync(stravatoken, workoutid, filename, name, activity_type, de failed = True if not failed: - workout = Workout.objects.get(id=workoutid) + try: + workout = Workout.objects.get(id=workoutid) + except Workout.DoesNotExist: + return 0 + workout.uploadedtostrava = res.id workout.save() try: diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 4a1e3f01..f52cfac7 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -380,7 +380,11 @@ def createShareModel(request, model_id): # pragma: no cover class JSONResponse(HttpResponse): def __init__(self, data, **kwargs): - content = JSONRenderer().render(data) + try: + content = JSONRenderer().render(data) + except ValueError: + content = '' + kwargs['content_type'] = 'application/json' super(JSONResponse, self).__init__(content, **kwargs) From 8d8e12315e78b1722a4a4eca33541bcd05d3b130 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 24 Oct 2022 21:03:15 +0200 Subject: [PATCH 2/4] fix date sorting strava --- rowers/interactiveplots.py | 15 +++++++++++++-- rowers/management/commands/processalerts.py | 9 +++++++-- rowers/views/importviews.py | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index cdf5060a..1bb56563 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -4082,6 +4082,9 @@ def instroke_multi_interactive_chart(selected): df_plot = pd.DataFrame() ids = [analysis.id for analysis in selected] metrics = list(set([analysis.metric for analysis in selected])) + maximum_values = {} + for metric in metrics: + maximum_values[metric] = 0 for analysis in selected: #start_second, end_second, spm_min, spm_max, name activeminutesmin = int(analysis.start_second/60.) @@ -4095,14 +4098,22 @@ def instroke_multi_interactive_chart(selected): activeminutesmax=activeminutesmax, ) mean_vals = data.mean() - if len(metrics)>1: - mean_vals = mean_vals/mean_vals.max() + if analysis.metric == 'boat accelerator curve': + mean_vals[0] = (mean_vals[1]+ mean_vals[len(mean_vals)-1])/2. + if len(metrics) > 1: + if mean_vals.max() > maximum_values[analysis.metric]: + maximum_values[analysis.metric] = mean_vals.max() xvals = np.arange(len(mean_vals)) xname = 'x_'+str(analysis.id) yname = 'y_'+str(analysis.id) df_plot[xname] = xvals df_plot[yname] = mean_vals + if len(metrics) > 1: + for analysis in selected: + yname = 'y_'+str(analysis.id) + df_plot[yname] = df_plot[yname] / maximum_values[analysis.metric] + source = ColumnDataSource( df_plot ) diff --git a/rowers/management/commands/processalerts.py b/rowers/management/commands/processalerts.py index 04ca937c..d63de7c2 100644 --- a/rowers/management/commands/processalerts.py +++ b/rowers/management/commands/processalerts.py @@ -9,7 +9,7 @@ from rowers.tasks import handle_send_email_alert from rowers import alerts -from rowers.utils import myqueue +from rowers.utils import myqueue, dologging import datetime @@ -38,7 +38,7 @@ class Command(BaseCommand): testing = False todaysalerts = Alert.objects.filter( - next_run__lt=datetime.date.today(), emailalert=True) + next_run__lte=datetime.date.today(), emailalert=True) for alert in todaysalerts: stats = alerts.alert_get_stats(alert) @@ -57,6 +57,11 @@ class Command(BaseCommand): stats, debug=True, othertexts=othertexts) + dologging('alerts.log', 'Sent alert {id} to {email}'.format( + id = alert.id, + email = alert.manager.email, + )) + # advance next_run if not testing: alert.next_run = datetime.date.today() + datetime.timedelta(days=alert.period-1) diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index ab767784..0dea2569 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1289,6 +1289,9 @@ def workout_stravaimport_view(request, message="", userid=0): checknew = request.GET.get('selectallnew', False) + # 2022-10-24 sorting the results + workouts = sorted(workouts, key = lambda d:d['starttime'], reverse=True) + return render(request, 'strava_list_import.html', {'workouts': workouts, 'rower': rower, From e908aa1ea64e413af0722f55b903c93eb7785332 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 24 Oct 2022 22:18:39 +0200 Subject: [PATCH 3/4] fix alerts --- rowers/management/commands/processalerts.py | 2 +- rowers/models.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rowers/management/commands/processalerts.py b/rowers/management/commands/processalerts.py index d63de7c2..184246fe 100644 --- a/rowers/management/commands/processalerts.py +++ b/rowers/management/commands/processalerts.py @@ -38,7 +38,7 @@ class Command(BaseCommand): testing = False todaysalerts = Alert.objects.filter( - next_run__lte=datetime.date.today(), emailalert=True) + next_run__lt=datetime.date.today(), emailalert=True) for alert in todaysalerts: stats = alerts.alert_get_stats(alert) diff --git a/rowers/models.py b/rowers/models.py index a9475f73..7c73793d 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1452,6 +1452,12 @@ class Alert(models.Model): boattype = models.CharField(choices=mytypes.boattypes, max_length=50, verbose_name='Boat Type', default='1x') + def save(self, *args, **kwargs): + if self.next_run > datetime.date.today()+datetime.timedelta(days=self.period): + self.next_run = datetime.date.today()+datetime.timedelta(days=self.period) + super(Alert, self).save(*args, **kwargs) + + def __str__(self): metricdict = {key: value for (key, value) in parchoicesy1} stri = u'Alert {name} on {metric} for {workouttype} - running on {first_name} every {period} days'.format( From 521e10459af523ad4c1936bf75613ee6f4f678b3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 24 Oct 2022 22:27:24 +0200 Subject: [PATCH 4/4] fix --- rowers/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 7c73793d..6c03718a 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1444,7 +1444,7 @@ class Alert(models.Model): default=False, null=True, verbose_name='Include Rest Strokes') period = models.IntegerField( default=7, verbose_name='Reporting Period (days)') - next_run = models.DateField(default=timezone.now) + next_run = models.DateField(default=current_day) emailalert = models.BooleanField( default=True, verbose_name='Send email alerts') workouttype = models.CharField(choices=rowchoices, max_length=50, @@ -1453,8 +1453,8 @@ class Alert(models.Model): verbose_name='Boat Type', default='1x') def save(self, *args, **kwargs): - if self.next_run > datetime.date.today()+datetime.timedelta(days=self.period): - self.next_run = datetime.date.today()+datetime.timedelta(days=self.period) + if self.next_run > (timezone.now()+datetime.timedelta(days=self.period)).date(): + self.next_run = (timezone.now()+datetime.timedelta(days=self.period)).date() super(Alert, self).save(*args, **kwargs)