Private
Public Access
1
0

Merge branch 'release/v18.7.6'

This commit is contained in:
Sander Roosendaal
2022-10-25 05:10:32 +02:00
7 changed files with 58 additions and 9 deletions
+14 -2
View File
@@ -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
+13 -2
View File
@@ -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
)
+6 -1
View File
@@ -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
@@ -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)
+7 -1
View File
@@ -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,
@@ -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 > (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)
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(
+10 -2
View File
@@ -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:
+3
View File
@@ -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,
+5 -1
View File
@@ -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)