Merge branch 'release/v18.7.6'
This commit is contained in:
+14
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user