diff --git a/rowers/alerts.py b/rowers/alerts.py index fcd7468b..688600fc 100644 --- a/rowers/alerts.py +++ b/rowers/alerts.py @@ -12,7 +12,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, # check if manager is coach of rower. If not return 0 if manager.rower != rower: if rower not in coach_getcoachees(manager.rower): - return 0 + return 0,'You are not allowed to create this alert' m = Condition( metric = measured['metric'], @@ -36,7 +36,8 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, alert.save() if 'filter' in kwargs: - for f in filter: + filters = kwargs['filter'] + for f in filters: m = Condition( metric = f['metric'], value1 = f['value1'], @@ -49,7 +50,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, alert.filter.add(m) - return m.id + return alert.id,'Your alert was created' @@ -71,7 +72,7 @@ def alert_add_filters(alert,filter): alert.filter.add(m) - + return 1 # get alert stats # nperiod = 0: current period, i.e. next_run - n days to today diff --git a/rowers/models.py b/rowers/models.py index 7b6d824e..06bfb562 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1030,7 +1030,20 @@ class ConditionEditForm(ModelForm): model = Condition fields = ['metric','condition','value1','value2'] - +class BaseConditionFormSet(BaseFormSet): + def clean(self): + if any(self.errors): + return + + for form in self.forms: + if form.cleaned_data: + metric = form.cleaned_data['metric'] + condition = form.cleaned_data['condition'] + value1 = form.cleaned_data['value1'] + value2 = form.cleaned_data['value2'] + + + rowchoices = [] for key,value in mytypes.workouttypes: if key in mytypes.rowtypes: diff --git a/rowers/templates/.#laboratory.html b/rowers/templates/.#laboratory.html deleted file mode 100644 index 25889a2a..00000000 --- a/rowers/templates/.#laboratory.html +++ /dev/null @@ -1 +0,0 @@ -E408191@CZ27LT9RCGN72.13140:1565793987 \ No newline at end of file diff --git a/rowers/templates/alert_create.html b/rowers/templates/alert_create.html index 267abf40..24099c36 100644 --- a/rowers/templates/alert_create.html +++ b/rowers/templates/alert_create.html @@ -5,23 +5,64 @@ {% block main %}
+ Alerts are useful to give you a regular update on how you are doing. For example, if you are + worried about rowing too short, you can set an alert on drive length, and the site will automatically + tell you how well you are doing. +
+ ++ To set an alert on a minimum drive length, you would select "Drive Length (degree)" as the metric in the + form below, then set the condition to ">" (greater than), and value 1 to the minimum drive length + that you find acceptable. The value 2 is only relevant for alerts where you want to have a metric + between two values. Set the workout type to "Standard Racing Shell", or whatever boat class you + want this metric to run for, select the period over which you want to monitor and get regular + reports (7 days). +
+ ++ Optionally, you can add filters. With filters, the alert considers only those strokes that + fulfill all filters. For example, you could set a filter on power between 200 and 300 Watt, + to only look at drive length in that power zone. +
--
- -Rower: {{ rower.user.first_name }}
- ++ Try out Alerts +
{% endblock %} diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 7aee9332..5d099933 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -4348,11 +4348,14 @@ def alerts_view(request,userid=0): 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) - if form.is_valid() and measuredform.is_valid(): + 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 @@ -4362,11 +4365,31 @@ def alert_create_view(request,userid=0): workouttype = ad['workouttype'] name = ad['name'] - result = create_alert(request.user,r,measured,period=period,emailalert=emailalert, - reststrokes=reststrokes,workouttype=workouttype, - name=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: @@ -4391,6 +4414,7 @@ def alert_create_view(request,userid=0): return render(request,'alert_create.html', { 'breadcrumbs':breadcrumbs, + 'formset': filter_formset, 'rower':r, 'form':form, 'measuredform':measuredform, @@ -4411,6 +4435,8 @@ def alert_edit_view(request,id=0,userid=0): form = AlertEditForm(instance=alert) measuredform = ConditionEditForm(instance=alert.measured) + + breadcrumbs = [ { 'url':'/rowers/analysis', diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 5392e757..06c33325 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -113,7 +113,7 @@ from rowers.models import ( ) 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