Private
Public Access
1
0

switched to template based class

This commit is contained in:
Sander Roosendaal
2022-10-27 12:01:38 +02:00
parent 27e8096c29
commit 03b763de11
5 changed files with 110 additions and 88 deletions

View File

@@ -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]))

View File

@@ -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/$',

View File

@@ -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):

View File

@@ -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

View File

@@ -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