Private
Public Access
1
0

Merge branch 'feature/metricalerts' into develop

This commit is contained in:
Sander Roosendaal
2019-08-19 16:53:46 +02:00
14 changed files with 971 additions and 2 deletions

View File

@@ -4314,3 +4314,319 @@ def agegrouprecordview(request,sex='male',weightcategory='hwt',
'active':'nav-analysis',
'the_div':div,
})
# alert overview view
@user_passes_test(ispromember, login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher",
redirect_field_name=None)
def alerts_view(request,userid=0):
r = getrequestrower(request,userid=userid)
alerts = Alert.objects.filter(rower=r).order_by('next_run')
breadcrumbs = [
{
'url':'/rowers/analysis',
'name': 'Analysis'
},
{
'url': reverse('alerts_view'),
'name': 'Alerts',
},
]
return render(request,'alerts.html',
{
'breadcrumbs':breadcrumbs,
'alerts':alerts,
'rower':r,
})
# alert create view
@user_passes_test(ispromember, login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher",
redirect_field_name=None)
def alert_create_view(request,userid=0):
r = getrequestrower(request,userid=userid)
FilterFormSet = formset_factory(ConditionEditForm, formset=BaseConditionFormSet,extra=1)
filter_formset = FilterFormSet()
if request.method == 'POST':
form = AlertEditForm(request.POST)
measuredform = ConditionEditForm(request.POST)
filter_formset = FilterFormSet(request.POST)
if form.is_valid() and measuredform.is_valid() and filter_formset.is_valid():
ad = form.cleaned_data
measured = measuredform.cleaned_data
period = ad['period']
emailalert = ad['emailalert']
reststrokes = ad['reststrokes']
workouttype = ad['workouttype']
name = ad['name']
filters = []
for filter_form in filter_formset:
metric = filter_form.cleaned_data.get('metric')
condition = filter_form.cleaned_data.get('condition')
value1 = filter_form.cleaned_data.get('value1')
value2 = filter_form.cleaned_data.get('value2')
filters.append(
{
'metric':metric,
'condition':condition,
'value1':value1,
'value2':value2,
}
)
result,message = create_alert(request.user,r,measured,period=period,emailalert=emailalert,
reststrokes=reststrokes,workouttype=workouttype,
filter = filters,
name=name)
if result:
messages.info(request,message)
url = reverse('alert_edit_view',kwargs={'id':result})
return HttpResponseRedirect(url)
else:
form = AlertEditForm()
measuredform = ConditionEditForm()
breadcrumbs = [
{
'url':'/rowers/analysis',
'name': 'Analysis'
},
{
'url': reverse('alerts_view'),
'name': 'Alerts',
},
{
'url': reverse('alert_create_view'),
'name': 'Create'
}
]
return render(request,'alert_create.html',
{
'breadcrumbs':breadcrumbs,
'formset': filter_formset,
'rower':r,
'form':form,
'measuredform':measuredform,
})
# alert report view
@user_passes_test(ispromember, login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher",
redirect_field_name=None)
def alert_report_view(request,id=0,userid=0,nperiod=0):
r = getrequestrower(request,userid=userid)
if userid == 0:
userid = request.user.id
alert = Alert.objects.get(id=id)
nperiod = int(nperiod)
try:
alert = Alert.objects.get(id=id)
except Alert.DoesNotExist:
raise Http404("This alert doesn't exist")
if alert.manager != request.user:
raise PermissionDenied('You are not allowed to edit this Alert')
stats = alert_get_stats(alert,nperiod=nperiod)
breadcrumbs = [
{
'url':'/rowers/analysis',
'name': 'Analysis'
},
{
'url':reverse('alerts_view'),
'name':'Alerts',
},
{
'url': reverse('alert_edit_view',
kwargs={'userid':userid,'id':alert.id}),
'name': alert.name,
},
{
'url': reverse('alert_report_view',
kwargs={'userid':userid,'id':alert.id}),
'name': 'Report',
},
]
return render(request,'alert_stats.html',
{
'breadcrumbs':breadcrumbs,
'stats':stats,
'rower':r,
'alert':alert,
'nperiod':nperiod,
})
# alert edit view
@user_passes_test(ispromember, login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher",
redirect_field_name=None)
def alert_edit_view(request,id=0,userid=0):
r = getrequestrower(request,userid=userid)
try:
alert = Alert.objects.get(id=id)
except Alert.DoesNotExist:
raise Http404("This alert doesn't exist")
if alert.manager != request.user:
raise PermissionDenied('You are not allowed to edit this Alert')
FilterFormSet = formset_factory(ConditionEditForm, formset=BaseConditionFormSet,extra=0)
if len(alert.filter.all()) == 0:
FilterFormSet = formset_factory(ConditionEditForm, formset=BaseConditionFormSet, extra=1)
filter_data = [{'metric':m.metric,
'value1':m.value1,
'value2':m.value2,
'condition':m.condition}
for m in alert.filter.all()]
if request.method == 'POST':
form = AlertEditForm(request.POST)
measuredform = ConditionEditForm(request.POST)
filter_formset = FilterFormSet(request.POST)
if form.is_valid() and measuredform.is_valid() and filter_formset.is_valid():
ad = form.cleaned_data
measured = measuredform.cleaned_data
period = ad['period']
emailalert = ad['emailalert']
reststrokes = ad['reststrokes']
workouttype = ad['workouttype']
name = ad['name']
m = alert.measured
m.metric = measured['metric']
m.value1 = measured['value1']
m.value2 = measured['value2']
m.condition = measured['condition']
m.save()
alert.period = period
alert.emailalert = emailalert
alert.reststrokes = reststrokes
alert.workouttype = workouttype
alert.name = name
alert.save()
filters = []
for filter_form in filter_formset:
metric = filter_form.cleaned_data.get('metric')
condition = filter_form.cleaned_data.get('condition')
value1 = filter_form.cleaned_data.get('value1')
value2 = filter_form.cleaned_data.get('value2')
filters.append(
{
'metric':metric,
'condition':condition,
'value1':value1,
'value2':value2,
}
)
res = alert_add_filters(alert, filters)
messages.info(request,'Alert was changed')
else:
form = AlertEditForm(instance=alert)
measuredform = ConditionEditForm(instance=alert.measured)
filter_formset = FilterFormSet(initial=filter_data)
breadcrumbs = [
{
'url':'/rowers/analysis',
'name': 'Analysis'
},
{
'url':reverse('alerts_view'),
'name':'Alerts',
},
{
'url': reverse('alert_edit_view',
kwargs={'userid':userid,'id':alert.id}),
'name': alert.name,
},
]
return render(request,'alert_edit.html',
{
'breadcrumbs':breadcrumbs,
'rower':r,
'form':form,
'measuredform':measuredform,
'formset':filter_formset,
})
# alert delete view
class AlertDelete(DeleteView):
login_requird = True
model = Alert
template_name = 'alert_delete_confirm.html'
# extra parameters
def get_context_data(self, **kwargs):
context = super(AlertDelete, self).get_context_data(**kwargs)
if 'userid' in kwargs:
userid = kwargs['userid']
else:
userid = 0
context['rower'] = getrequestrower(self.request,userid=userid)
context['alert'] = self.object
breadcrumbs = [
{
'url':'/rowers/analysis',
'name': 'Analysis'
},
{
'url':reverse('alerts_view'),
'name':'Alerts',
},
{
'url': reverse('alert_edit_view',
kwargs={'userid':userid,'id':self.object.pk}),
'name': 'Alert',
},
{
'url': reverse('alert_delete_view',kwargs={'pk':self.object.pk}),
'name': 'Delete'
}
]
context['breadcrumbs'] = breadcrumbs
return context
def get_success_url(self):
return reverse('alerts_view')
def get_object(self, *args, **kwargs):
obj = super(AlertDelete, self).get_object(*args, **kwargs)
# some checks
return obj

View File

@@ -94,6 +94,7 @@ from rowers.models import (
microcyclecheckdates,mesocyclecheckdates,macrocyclecheckdates,
TrainingMesoCycleForm, TrainingMicroCycleForm,
RaceLogo,RowerBillingAddressForm,PaidPlan,
AlertEditForm, ConditionEditForm,
PlannedSessionComment,CoachRequest,CoachOffer,checkaccessplanuser
)
from rowers.models import (
@@ -108,10 +109,11 @@ from rowers.models import (
VirtualRaceForm,VirtualRaceResultForm,RowerImportExportForm,
IndoorVirtualRaceResultForm,IndoorVirtualRaceResult,
IndoorVirtualRaceForm,PlannedSessionCommentForm,
Alert, Condition
)
from rowers.models import (
FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet,
get_course_timezone
get_course_timezone,BaseConditionFormSet,
)
from rowers.metrics import rowingmetrics,defaultfavoritecharts,nometrics
from rowers import metrics as metrics
@@ -206,6 +208,7 @@ import numpy as np
import matplotlib.pyplot as plt
from rowers.emails import send_template_email,htmlstrip
from rowers.alerts import *
from pytz import timezone as tz,utc
from timezonefinder import TimezoneFinder