switched to template based class
This commit is contained in:
@@ -4208,7 +4208,8 @@ def forcecurve_multi_interactive_chart(selected):
|
|||||||
|
|
||||||
return (script, div)
|
return (script, div)
|
||||||
|
|
||||||
def instroke_multi_interactive_chart(selected):
|
def instroke_multi_interactive_chart(selected, *args, **kwargs):
|
||||||
|
|
||||||
df_plot = pd.DataFrame()
|
df_plot = pd.DataFrame()
|
||||||
ids = [analysis.id for analysis in selected]
|
ids = [analysis.id for analysis in selected]
|
||||||
metrics = list(set([analysis.metric for analysis in selected]))
|
metrics = list(set([analysis.metric for analysis in selected]))
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from rest_framework.urlpatterns import format_suffix_patterns
|
|||||||
from rest_framework.permissions import *
|
from rest_framework.permissions import *
|
||||||
from rowers import views
|
from rowers import views
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView, View
|
||||||
|
|
||||||
from rowers.permissions import (
|
from rowers.permissions import (
|
||||||
IsOwnerOrNot, IsOwnerOrReadOnly,
|
IsOwnerOrNot, IsOwnerOrReadOnly,
|
||||||
@@ -38,6 +38,10 @@ from rowers.serializers import (
|
|||||||
PlannedSessionSerializer,
|
PlannedSessionSerializer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from rowers.forms import ForceCurveMultipleCompareForm
|
||||||
|
from rowers.models import ForceCurveAnalysis
|
||||||
|
from rowers.interactiveplots import forcecurve_multi_interactive_chart, instroke_multi_interactive_chart
|
||||||
|
|
||||||
from oauth2_provider.views import (
|
from oauth2_provider.views import (
|
||||||
AuthorizedTokensListView,
|
AuthorizedTokensListView,
|
||||||
AuthorizedTokenDeleteView,
|
AuthorizedTokenDeleteView,
|
||||||
@@ -836,10 +840,19 @@ urlpatterns = [
|
|||||||
re_path(r'^errormessage/(?P<errormessage>[\w\ ]+.*)/$',
|
re_path(r'^errormessage/(?P<errormessage>[\w\ ]+.*)/$',
|
||||||
views.errormessage_view, name='errormessage_view'),
|
views.errormessage_view, name='errormessage_view'),
|
||||||
re_path(r'^analysis/$', views.analysis_view, name='analysis'),
|
re_path(r'^analysis/$', views.analysis_view, name='analysis'),
|
||||||
re_path(r'^analysis/instrokeanalysis/$', views.instrokeanalysis_view,
|
re_path(r'^analysis/instrokeanalysis/$', views.SavedAnalysisView.as_view(
|
||||||
name='instrokeanalysis_view'),
|
chart = instroke_multi_interactive_chart,
|
||||||
re_path(r'^analysis/forcecurveanalysis/$', views.forcecurveanalysis_view,
|
),
|
||||||
name='forcecurveanalysis_view'),
|
name='instrokeanalysis_view'),
|
||||||
|
re_path(r'^analysis/forcecurveanalysis/$', views.SavedAnalysisView.as_view(
|
||||||
|
template_name='forcecurve_analysis.html',
|
||||||
|
form_class = ForceCurveMultipleCompareForm,
|
||||||
|
analysis_class = ForceCurveAnalysis,
|
||||||
|
chart = forcecurve_multi_interactive_chart,
|
||||||
|
name = 'Force Curve Analysis',
|
||||||
|
url = '/rowers/analysis/forcecurveanalysis/'
|
||||||
|
),
|
||||||
|
name='forcecurveanalysis_view'),
|
||||||
re_path(r'^analysis/instrokeanalysis/(?P<pk>\d+)/delete/$',
|
re_path(r'^analysis/instrokeanalysis/(?P<pk>\d+)/delete/$',
|
||||||
views.InStrokeAnalysisDelete.as_view(), name='instroke_analysis_delete_view'),
|
views.InStrokeAnalysisDelete.as_view(), name='instroke_analysis_delete_view'),
|
||||||
re_path(r'^analysis/forcecurveanalysis/(?P<pk>\d+)/delete/$',
|
re_path(r'^analysis/forcecurveanalysis/(?P<pk>\d+)/delete/$',
|
||||||
|
|||||||
@@ -1844,53 +1844,6 @@ def agegrouprecordview(request, sex='male', weightcategory='hwt',
|
|||||||
'the_div': div,
|
'the_div': div,
|
||||||
})
|
})
|
||||||
|
|
||||||
@user_passes_test(ispromember, login_url="/rowers/paidplans",
|
|
||||||
message="This functionality requires a Pro plan or higher."
|
|
||||||
" If you are already a Pro user, please log in to access this functionality",
|
|
||||||
redirect_field_name=None)
|
|
||||||
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
|
|
||||||
def forcecurveanalysis_view(request, userid=0):
|
|
||||||
r = getrequestrower(request, userid=userid)
|
|
||||||
|
|
||||||
analyses = ForceCurveAnalysis.objects.filter(rower=r).order_by("-date","-id")
|
|
||||||
selected = []
|
|
||||||
|
|
||||||
div = ""
|
|
||||||
script = ""
|
|
||||||
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
|
||||||
form = ForceCurveMultipleCompareForm(request.POST)
|
|
||||||
|
|
||||||
if form.is_valid():
|
|
||||||
cd = form.cleaned_data
|
|
||||||
selected = cd['analyses']
|
|
||||||
request.session['analyses'] = [a.id for a in selected]
|
|
||||||
# now should redirect to analysis
|
|
||||||
|
|
||||||
script, div = forcecurve_multi_interactive_chart(selected)
|
|
||||||
|
|
||||||
|
|
||||||
breadcrumbs = [
|
|
||||||
{
|
|
||||||
'url': '/rowers/analysis',
|
|
||||||
'name': 'Analysis'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'url': reverse('instrokeanalysis_view'),
|
|
||||||
'name': 'In-Stroke Analysis',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
return render(request, 'forcecurve_analysis.html',
|
|
||||||
{
|
|
||||||
'breadcrumbs': breadcrumbs,
|
|
||||||
'analyses': analyses,
|
|
||||||
'rower': r,
|
|
||||||
'the_script': script,
|
|
||||||
'the_div': div,
|
|
||||||
'selected': selected,
|
|
||||||
})
|
|
||||||
|
|
||||||
#instroke analysis delete view
|
#instroke analysis delete view
|
||||||
class ForceCurveAnalysisDelete(DeleteView):
|
class ForceCurveAnalysisDelete(DeleteView):
|
||||||
@@ -1947,51 +1900,103 @@ class ForceCurveAnalysisDelete(DeleteView):
|
|||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
@user_passes_test(ispromember, login_url="/rowers/paidplans",
|
|
||||||
message="This functionality requires a Pro plan or higher."
|
|
||||||
" If you are already a Pro user, please log in to access this functionality",
|
|
||||||
redirect_field_name=None)
|
|
||||||
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
|
|
||||||
def instrokeanalysis_view(request, userid=0):
|
|
||||||
r = getrequestrower(request, userid=userid)
|
|
||||||
|
|
||||||
analyses = InStrokeAnalysis.objects.filter(rower=r).order_by("-date","-id")
|
class SavedAnalysisView(UserPassesTestMixin, View):
|
||||||
|
form_class = InStrokeMultipleCompareForm
|
||||||
|
initial = {}
|
||||||
selected = []
|
selected = []
|
||||||
|
|
||||||
div = ""
|
div = ""
|
||||||
script = ""
|
script = ""
|
||||||
|
url = '/rowers/analysis/instrokeanalysis/'
|
||||||
|
name = 'In-Stroke Analysis'
|
||||||
|
breadcrumbs = []
|
||||||
|
|
||||||
|
analysis_class = InStrokeAnalysis
|
||||||
|
template_name = 'instroke_analysis.html'
|
||||||
|
r = None
|
||||||
|
analyses = None
|
||||||
|
chart = instroke_multi_interactive_chart
|
||||||
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
def handle_no_permission(self):
|
||||||
form = InStrokeMultipleCompareForm(request.POST)
|
if self.request.user.is_anonymous:
|
||||||
|
url = reverse('login')+'?next='+self.request.path
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
|
messages.error(self.request, "This functionality requires a Pro plan or higher."
|
||||||
|
" If you are already a Pro user, please log in to access this functionality")
|
||||||
|
return HttpResponseRedirect("/rowers/paidplans")
|
||||||
|
|
||||||
|
|
||||||
|
def test_func(self):
|
||||||
|
return ispromember(self.request.user)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.userid = kwargs.get('userid',0)
|
||||||
|
self.form_class = kwargs.get('form_class',self.form_class)
|
||||||
|
self.initial = kwargs.get('initial', self.initial)
|
||||||
|
self.selected = kwargs.get('selected', self.selected)
|
||||||
|
self.name = kwargs.get('name', self.name)
|
||||||
|
self.url = kwargs.get('url', self.url)
|
||||||
|
self.analysis_class = kwargs.get('analysis_class', self.analysis_class)
|
||||||
|
self.template_name = kwargs.get('template_name', self.template_name)
|
||||||
|
self.chart = kwargs.get('chart', self.chart)
|
||||||
|
|
||||||
|
|
||||||
|
self.breadcrumbs = breadcrumbs = [
|
||||||
|
{
|
||||||
|
'url': '/rowers/analysis',
|
||||||
|
'name': 'Analysis'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url': self.url,
|
||||||
|
'name': self.name,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
def setup(self, request, *args, **kwargs):
|
||||||
|
super(SavedAnalysisView, self).setup(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
self.r = getrequestrower(request, userid=self.userid)
|
||||||
|
if self.r is not None and not is_coach_user(self.request.user, self.r.user):
|
||||||
|
raise PermissionDenied("You are not allowed to see analyses for this user")
|
||||||
|
self.analyses = self.analysis_class.objects.filter(rower=self.r).order_by("-date","-id")
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
return render(request, self.template_name,
|
||||||
|
{
|
||||||
|
'breadcrumbs': self.breadcrumbs,
|
||||||
|
'analyses': self.analyses,
|
||||||
|
'rower': self.r,
|
||||||
|
'the_script': self.script,
|
||||||
|
'the_div': self.div,
|
||||||
|
'selected': self.selected,
|
||||||
|
})
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
form = self.form_class(request.POST)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
cd = form.cleaned_data
|
cd = form.cleaned_data
|
||||||
selected = cd['analyses']
|
self.selected = cd['analyses']
|
||||||
request.session['analyses'] = [a.id for a in selected]
|
|
||||||
|
request.session['analyses'] = [a.id for a in self.selected]
|
||||||
# now should redirect to analysis
|
# now should redirect to analysis
|
||||||
script, div = instroke_multi_interactive_chart(selected)
|
self.script, self.div = self.chart(self.selected)
|
||||||
|
else:
|
||||||
|
print(form.errors)
|
||||||
|
|
||||||
|
return render(request, self.template_name,
|
||||||
|
{
|
||||||
|
'breadcrumbs': self.breadcrumbs,
|
||||||
|
'analyses': self.analyses,
|
||||||
|
'rower': self.r,
|
||||||
|
'the_script': self.script,
|
||||||
|
'the_div': self.div,
|
||||||
|
'selected': self.selected,
|
||||||
|
})
|
||||||
|
|
||||||
breadcrumbs = [
|
|
||||||
{
|
|
||||||
'url': '/rowers/analysis',
|
|
||||||
'name': 'Analysis'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'url': reverse('instrokeanalysis_view'),
|
|
||||||
'name': 'In-Stroke Analysis',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
return render(request, 'instroke_analysis.html',
|
|
||||||
{
|
|
||||||
'breadcrumbs': breadcrumbs,
|
|
||||||
'analyses': analyses,
|
|
||||||
'rower': r,
|
|
||||||
'the_script': script,
|
|
||||||
'the_div': div,
|
|
||||||
'selected': selected,
|
|
||||||
})
|
|
||||||
|
|
||||||
#instroke analysis delete view
|
#instroke analysis delete view
|
||||||
class InStrokeAnalysisDelete(DeleteView):
|
class InStrokeAnalysisDelete(DeleteView):
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ import urllib
|
|||||||
import yaml
|
import yaml
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from numbers import Number
|
from numbers import Number
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView, View
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django import template
|
from django import template
|
||||||
@@ -119,9 +119,12 @@ from django.urls import reverse, reverse_lazy
|
|||||||
|
|
||||||
from django.core.exceptions import PermissionDenied, MultipleObjectsReturned
|
from django.core.exceptions import PermissionDenied, MultipleObjectsReturned
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
|
|
||||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.urls import resolve
|
from django.urls import resolve
|
||||||
|
from django.utils.decorators import method_decorator
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
||||||
from django.utils.datastructures import MultiValueDictKeyError
|
from django.utils.datastructures import MultiValueDictKeyError
|
||||||
from django.utils import timezone, translation
|
from django.utils import timezone, translation
|
||||||
from django.core.mail import send_mail, BadHeaderError
|
from django.core.mail import send_mail, BadHeaderError
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from django.urls import path, re_path
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView, View
|
||||||
from rowsandall_app.views import rootview, landingview, logoview
|
from rowsandall_app.views import rootview, landingview, logoview
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
from rowers import views as rowersviews
|
from rowers import views as rowersviews
|
||||||
|
|||||||
Reference in New Issue
Block a user