more progress on alerts
This commit is contained in:
@@ -49,7 +49,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True,
|
|||||||
alert.filter.add(m)
|
alert.filter.add(m)
|
||||||
|
|
||||||
|
|
||||||
return 1
|
return m.id
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1025,21 +1025,28 @@ class Condition(models.Model):
|
|||||||
value2 = models.FloatField(default=0)
|
value2 = models.FloatField(default=0)
|
||||||
condition = models.CharField(max_length=20,choices=conditionchoices,null=True)
|
condition = models.CharField(max_length=20,choices=conditionchoices,null=True)
|
||||||
|
|
||||||
|
class ConditionEditForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Condition
|
||||||
|
fields = ['metric','condition','value1','value2']
|
||||||
|
|
||||||
|
|
||||||
rowchoices = []
|
rowchoices = []
|
||||||
for key,value in mytypes.workouttypes:
|
for key,value in mytypes.workouttypes:
|
||||||
if key in mytypes.rowtypes:
|
if key in mytypes.rowtypes:
|
||||||
rowchoices.append((key,value))
|
rowchoices.append((key,value))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Alert(models.Model):
|
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)
|
manager = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
rower = models.ForeignKey(Rower, on_delete=models.CASCADE)
|
rower = models.ForeignKey(Rower, on_delete=models.CASCADE)
|
||||||
measured = models.OneToOneField(Condition,verbose_name='Measuring',on_delete=models.CASCADE,
|
measured = models.OneToOneField(Condition,verbose_name='Measuring',on_delete=models.CASCADE,
|
||||||
related_name='measured')
|
related_name='measured')
|
||||||
filter = models.ManyToManyField(Condition, related_name='filters',verbose_name='Filters')
|
filter = models.ManyToManyField(Condition, related_name='filters',verbose_name='Filters')
|
||||||
reststrokes = models.BooleanField(default=False,null=True,verbose_name='Include Rest Strokes')
|
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)
|
next_run = models.DateField(default=timezone.now)
|
||||||
emailalert = models.BooleanField(default=True,verbose_name='Send email alerts')
|
emailalert = models.BooleanField(default=True,verbose_name='Send email alerts')
|
||||||
workouttype = models.CharField(choices=rowchoices,max_length=50,
|
workouttype = models.CharField(choices=rowchoices,max_length=50,
|
||||||
@@ -1058,7 +1065,10 @@ class Alert(models.Model):
|
|||||||
class AlertEditForm(ModelForm):
|
class AlertEditForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Alert
|
model = Alert
|
||||||
fields = ['name','measured','reststrokes','period','emailalert','workouttype']
|
fields = ['name','reststrokes','period','emailalert','workouttype']
|
||||||
|
widgets = {
|
||||||
|
'reststrokes':forms.CheckboxInput()
|
||||||
|
}
|
||||||
|
|
||||||
class BasePlannedSessionFormSet(BaseFormSet):
|
class BasePlannedSessionFormSet(BaseFormSet):
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<table>
|
<table>
|
||||||
{{ form.as_table }}
|
{{ form.as_table }}
|
||||||
|
{{ measuredform.as_table }}
|
||||||
</table>
|
</table>
|
||||||
<input type="submit" value="Save">
|
<input type="submit" value="Save">
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<table>
|
<table>
|
||||||
{{ form.as_table }}
|
{{ form.as_table }}
|
||||||
|
{{ measuredform.as_table }}
|
||||||
</table>
|
</table>
|
||||||
<input type="submit" value="Save">
|
<input type="submit" value="Save">
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -4324,8 +4324,20 @@ def alerts_view(request,userid=0):
|
|||||||
|
|
||||||
alerts = Alert.objects.filter(rower=r).order_by('next_run')
|
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',
|
return render(request,'alerts.html',
|
||||||
{
|
{
|
||||||
|
'breadcrumbs':breadcrumbs,
|
||||||
'alerts':alerts,
|
'alerts':alerts,
|
||||||
'rower':r,
|
'rower':r,
|
||||||
})
|
})
|
||||||
@@ -4337,12 +4349,51 @@ def alerts_view(request,userid=0):
|
|||||||
def alert_create_view(request,userid=0):
|
def alert_create_view(request,userid=0):
|
||||||
r = getrequestrower(request,userid=userid)
|
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',
|
return render(request,'alert_create.html',
|
||||||
{
|
{
|
||||||
|
'breadcrumbs':breadcrumbs,
|
||||||
'rower':r,
|
'rower':r,
|
||||||
'form':form,
|
'form':form,
|
||||||
|
'measuredform':measuredform,
|
||||||
})
|
})
|
||||||
|
|
||||||
# alert report view
|
# alert report view
|
||||||
@@ -4354,12 +4405,35 @@ def alert_create_view(request,userid=0):
|
|||||||
def alert_edit_view(request,id=0,userid=0):
|
def alert_edit_view(request,id=0,userid=0):
|
||||||
r = getrequestrower(request,userid=userid)
|
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',
|
return render(request,'alert_edit.html',
|
||||||
{
|
{
|
||||||
|
'breadcrumbs':breadcrumbs,
|
||||||
'rower':r,
|
'rower':r,
|
||||||
'form':form,
|
'form':form,
|
||||||
|
'measuredform':measuredform,
|
||||||
})
|
})
|
||||||
|
|
||||||
# alert delete view
|
# alert delete view
|
||||||
@@ -4385,6 +4459,10 @@ class AlertDelete(DeleteView):
|
|||||||
'url':'/rowers/analysis',
|
'url':'/rowers/analysis',
|
||||||
'name': 'Analysis'
|
'name': 'Analysis'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'url':reverse('alerts_view'),
|
||||||
|
'name':'Alerts',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'url': reverse('alert_edit_view',
|
'url': reverse('alert_edit_view',
|
||||||
kwargs={'userid':userid,'id':self.object.pk}),
|
kwargs={'userid':userid,'id':self.object.pk}),
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ from rowers.models import (
|
|||||||
microcyclecheckdates,mesocyclecheckdates,macrocyclecheckdates,
|
microcyclecheckdates,mesocyclecheckdates,macrocyclecheckdates,
|
||||||
TrainingMesoCycleForm, TrainingMicroCycleForm,
|
TrainingMesoCycleForm, TrainingMicroCycleForm,
|
||||||
RaceLogo,RowerBillingAddressForm,PaidPlan,
|
RaceLogo,RowerBillingAddressForm,PaidPlan,
|
||||||
AlertEditForm,
|
AlertEditForm, ConditionEditForm,
|
||||||
PlannedSessionComment,CoachRequest,CoachOffer,checkaccessplanuser
|
PlannedSessionComment,CoachRequest,CoachOffer,checkaccessplanuser
|
||||||
)
|
)
|
||||||
from rowers.models import (
|
from rowers.models import (
|
||||||
@@ -208,6 +208,7 @@ import numpy as np
|
|||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
from rowers.emails import send_template_email,htmlstrip
|
from rowers.emails import send_template_email,htmlstrip
|
||||||
|
from rowers.alerts import *
|
||||||
|
|
||||||
from pytz import timezone as tz,utc
|
from pytz import timezone as tz,utc
|
||||||
from timezonefinder import TimezoneFinder
|
from timezonefinder import TimezoneFinder
|
||||||
|
|||||||
Reference in New Issue
Block a user