Merge branch 'feature/metricalerts' into develop
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user