basic views (not complete)
This commit is contained in:
@@ -1046,6 +1046,14 @@ class Alert(models.Model):
|
|||||||
verbose_name='Exercise/Boat Class',default='water')
|
verbose_name='Exercise/Boat Class',default='water')
|
||||||
|
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
stri = u'Alert {name} on {metric} for {workouttype}'.format(
|
||||||
|
name = self.name,
|
||||||
|
metric = self.measured.metric,
|
||||||
|
workouttype = self.workouttype
|
||||||
|
)
|
||||||
|
|
||||||
|
return stri
|
||||||
|
|
||||||
class BasePlannedSessionFormSet(BaseFormSet):
|
class BasePlannedSessionFormSet(BaseFormSet):
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|||||||
29
rowers/templates/alert_delete_confirm.html
Normal file
29
rowers/templates/alert_delete_confirm.html
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{% extends "newbase.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
|
||||||
|
{% block title %}Planned Session{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<h1>Confirm Delete</h1>
|
||||||
|
<p>This will permanently delete the alert</p>
|
||||||
|
|
||||||
|
<ul class="main-content">
|
||||||
|
<li class="grid_2">
|
||||||
|
<p>
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<p>Are you sure you want to delete <em>{{ object }}</em>?</p>
|
||||||
|
<input class="button red" type="submit" value="Confirm">
|
||||||
|
</form>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% include 'menu_analytics.html' %}
|
||||||
|
{% endblock %}
|
||||||
73
rowers/templates/alerts.html
Normal file
73
rowers/templates/alerts.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{% extends "newbase.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% block title %}Rowsandall - Analysis {% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
|
||||||
|
<h1>Alerts for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||||
|
<p>Set up automatic alerting for your workouts</p>
|
||||||
|
|
||||||
|
|
||||||
|
<ul class="main-content">
|
||||||
|
{% if alerts %}
|
||||||
|
<li class="grid_4">
|
||||||
|
<table width="100%" class="listtable shortpadded">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>metric</th>
|
||||||
|
<th>Workout type</th>
|
||||||
|
<th>Next Run</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for alert in alerts %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ alert.name }}</td>
|
||||||
|
<td>{{ alert.measured.metric }}</td>
|
||||||
|
<td>{{ alert.workouttype }}</td>
|
||||||
|
<td>{{ alert.next_run }}</td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/alerts/{{ alert.id }}/edit/" title="Edit">
|
||||||
|
<i class="fas fa-pencil-alt fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="small"
|
||||||
|
href="/rowers/alerts/{{ alert.id }}/stats/"
|
||||||
|
title="Report">
|
||||||
|
<i class="fal fa-table fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="small" href="/rowers/alerts/{{ alert.id }}/delete/"
|
||||||
|
title="Delete">
|
||||||
|
<i class="fas fa-trash-alt fa-fw"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="grid_4">
|
||||||
|
<p>You have not set any alerts for {{ rower.user.first_name }}</p>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li class="grid_4">
|
||||||
|
<p>
|
||||||
|
<a href="/rowers/alert/new/">Create new alert</a>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% include 'menu_analytics.html' %}
|
||||||
|
{% endblock %}
|
||||||
@@ -417,6 +417,11 @@ urlpatterns = [
|
|||||||
name='multi_compare_view'),
|
name='multi_compare_view'),
|
||||||
re_path(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.multi_compare_view,name='multi_compare_view'),
|
re_path(r'^multi-compare/workout/(?P<id>\b[0-9A-Fa-f]+\b)/$',views.multi_compare_view,name='multi_compare_view'),
|
||||||
re_path(r'^multi-compare/$',views.multi_compare_view,name='multi_compare_view'),
|
re_path(r'^multi-compare/$',views.multi_compare_view,name='multi_compare_view'),
|
||||||
|
re_path(r'^alerts/(?P<userid>\d+)/$',views.alerts_view,name='alerts_view'),
|
||||||
|
re_path(r'^alerts/$',views.alerts_view,name='alerts_view'),
|
||||||
|
re_path(r'^alerts/(?P<pk>\d+)/delete/$',views.AlertDelete.as_view(),name='alert_delete_view'),
|
||||||
|
re_path(r'^alerts/(?P<id>\d+)/edit/user/(?P<userid>\d+)/$',views.alert_edit_view,name='alert_edit_view'),
|
||||||
|
re_path(r'^alerts/(?P<id>\d+)/edit/$',views.alert_edit_view,name='alert_edit_view'),
|
||||||
re_path(r'^user-boxplot/user/(?P<userid>\d+)/$',views.boxplot_view,name='boxplot_view'),
|
re_path(r'^user-boxplot/user/(?P<userid>\d+)/$',views.boxplot_view,name='boxplot_view'),
|
||||||
re_path(r'^user-boxplot/$',views.boxplot_view,name='boxplot_view'),
|
re_path(r'^user-boxplot/$',views.boxplot_view,name='boxplot_view'),
|
||||||
re_path(r'^user-boxplot-data/$',views.boxplot_view_data,name='boxplot_view_data'),
|
re_path(r'^user-boxplot-data/$',views.boxplot_view_data,name='boxplot_view_data'),
|
||||||
|
|||||||
@@ -4314,3 +4314,92 @@ def agegrouprecordview(request,sex='male',weightcategory='hwt',
|
|||||||
'active':'nav-analysis',
|
'active':'nav-analysis',
|
||||||
'the_div':div,
|
'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')
|
||||||
|
|
||||||
|
return render(request,'alerts.html',
|
||||||
|
{
|
||||||
|
'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)
|
||||||
|
|
||||||
|
return render(request,'alert_create.html',
|
||||||
|
{
|
||||||
|
'rower':r,
|
||||||
|
})
|
||||||
|
|
||||||
|
# alert report view
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
return render(request,'alert_edit.html',
|
||||||
|
{
|
||||||
|
'rower':r,
|
||||||
|
})
|
||||||
|
|
||||||
|
# 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('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
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ from rowers.models import (
|
|||||||
VirtualRaceForm,VirtualRaceResultForm,RowerImportExportForm,
|
VirtualRaceForm,VirtualRaceResultForm,RowerImportExportForm,
|
||||||
IndoorVirtualRaceResultForm,IndoorVirtualRaceResult,
|
IndoorVirtualRaceResultForm,IndoorVirtualRaceResult,
|
||||||
IndoorVirtualRaceForm,PlannedSessionCommentForm,
|
IndoorVirtualRaceForm,PlannedSessionCommentForm,
|
||||||
|
Alert, Condition
|
||||||
)
|
)
|
||||||
from rowers.models import (
|
from rowers.models import (
|
||||||
FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet,
|
FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet,
|
||||||
|
|||||||
Reference in New Issue
Block a user