From 451d2a419b9211847efe3477719efd015594d7e3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 16 Aug 2019 19:38:42 +0200 Subject: [PATCH] more progress on alerts --- rowers/alerts.py | 2 +- rowers/models.py | 16 ++++-- rowers/templates/alert_create.html | 1 + rowers/templates/alert_edit.html | 1 + rowers/views/analysisviews.py | 82 +++++++++++++++++++++++++++++- rowers/views/statements.py | 3 +- 6 files changed, 98 insertions(+), 7 deletions(-) diff --git a/rowers/alerts.py b/rowers/alerts.py index 2bbb0e81..fcd7468b 100644 --- a/rowers/alerts.py +++ b/rowers/alerts.py @@ -49,7 +49,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, alert.filter.add(m) - return 1 + return m.id diff --git a/rowers/models.py b/rowers/models.py index 1d0fcc42..7b6d824e 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1025,21 +1025,28 @@ class Condition(models.Model): value2 = models.FloatField(default=0) condition = models.CharField(max_length=20,choices=conditionchoices,null=True) +class ConditionEditForm(ModelForm): + class Meta: + model = Condition + fields = ['metric','condition','value1','value2'] + + rowchoices = [] for key,value in mytypes.workouttypes: if key in mytypes.rowtypes: rowchoices.append((key,value)) + class Alert(models.Model): - name = models.CharField(max_length=150,verbose_name='Name',null=True,blank=True) + name = models.CharField(max_length=150,verbose_name='Alert Name',null=True,blank=True) manager = models.ForeignKey(User, on_delete=models.CASCADE) rower = models.ForeignKey(Rower, on_delete=models.CASCADE) measured = models.OneToOneField(Condition,verbose_name='Measuring',on_delete=models.CASCADE, related_name='measured') filter = models.ManyToManyField(Condition, related_name='filters',verbose_name='Filters') reststrokes = models.BooleanField(default=False,null=True,verbose_name='Include Rest Strokes') - period = models.IntegerField(default=7,verbose_name='Reporting Period') + period = models.IntegerField(default=7,verbose_name='Reporting Period (days)') next_run = models.DateField(default=timezone.now) emailalert = models.BooleanField(default=True,verbose_name='Send email alerts') workouttype = models.CharField(choices=rowchoices,max_length=50, @@ -1058,7 +1065,10 @@ class Alert(models.Model): class AlertEditForm(ModelForm): class Meta: model = Alert - fields = ['name','measured','reststrokes','period','emailalert','workouttype'] + fields = ['name','reststrokes','period','emailalert','workouttype'] + widgets = { + 'reststrokes':forms.CheckboxInput() + } class BasePlannedSessionFormSet(BaseFormSet): def clean(self): diff --git a/rowers/templates/alert_create.html b/rowers/templates/alert_create.html index a637b3bd..267abf40 100644 --- a/rowers/templates/alert_create.html +++ b/rowers/templates/alert_create.html @@ -13,6 +13,7 @@ {% csrf_token %} {{ form.as_table }} + {{ measuredform.as_table }}
diff --git a/rowers/templates/alert_edit.html b/rowers/templates/alert_edit.html index a637b3bd..267abf40 100644 --- a/rowers/templates/alert_edit.html +++ b/rowers/templates/alert_edit.html @@ -13,6 +13,7 @@ {% csrf_token %} {{ form.as_table }} + {{ measuredform.as_table }}
diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 035946cc..7aee9332 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -4324,8 +4324,20 @@ def alerts_view(request,userid=0): 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, }) @@ -4337,12 +4349,51 @@ def alerts_view(request,userid=0): def alert_create_view(request,userid=0): r = getrequestrower(request,userid=userid) - form = AlertEditForm() + if request.method == 'POST': + form = AlertEditForm(request.POST) + measuredform = ConditionEditForm(request.POST) + if form.is_valid() and measuredform.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'] + + result = create_alert(request.user,r,measured,period=period,emailalert=emailalert, + reststrokes=reststrokes,workouttype=workouttype, + name=name) + + if result: + 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, 'rower':r, 'form':form, + 'measuredform':measuredform, }) # alert report view @@ -4354,12 +4405,35 @@ def alert_create_view(request,userid=0): def alert_edit_view(request,id=0,userid=0): r = getrequestrower(request,userid=userid) - form = AlertEditForm() + alert = Alert.objects.get(id=id) + + + form = AlertEditForm(instance=alert) + measuredform = ConditionEditForm(instance=alert.measured) + + 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, }) # alert delete view @@ -4385,6 +4459,10 @@ class AlertDelete(DeleteView): 'url':'/rowers/analysis', 'name': 'Analysis' }, + { + 'url':reverse('alerts_view'), + 'name':'Alerts', + }, { 'url': reverse('alert_edit_view', kwargs={'userid':userid,'id':self.object.pk}), diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 2f62d5c1..5392e757 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -94,7 +94,7 @@ from rowers.models import ( microcyclecheckdates,mesocyclecheckdates,macrocyclecheckdates, TrainingMesoCycleForm, TrainingMicroCycleForm, RaceLogo,RowerBillingAddressForm,PaidPlan, - AlertEditForm, + AlertEditForm, ConditionEditForm, PlannedSessionComment,CoachRequest,CoachOffer,checkaccessplanuser ) from rowers.models import ( @@ -208,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