From 09a6fbcdbb4f77b76d3111465955a1c7cee26fd8 Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Thu, 14 Oct 2021 18:35:54 +0200
Subject: [PATCH] adding course compare and course mapcompare, still need to
add onlyme option
---
rowers/templates/course_view.html | 8 +
rowers/urls.py | 3 +
rowers/views/workoutviews.py | 265 ++++++++++++++++++++++++++++++
3 files changed, 276 insertions(+)
diff --git a/rowers/templates/course_view.html b/rowers/templates/course_view.html
index b3e5252a..37cb41d9 100644
--- a/rowers/templates/course_view.html
+++ b/rowers/templates/course_view.html
@@ -46,6 +46,13 @@
{% if records %}
Course Results
+
+
+
+
+
@@ -88,6 +95,7 @@
{% endfor %}
+
{% if form %}
diff --git a/rowers/urls.py b/rowers/urls.py
index 7e07eeb3..8e997c17 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -407,8 +407,11 @@ urlpatterns = [
re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/wind/$',views.workout_wind_view,name='workout_wind_view'),
re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/image/$',views.workout_uploadimage_view,name='workout_uploadimage_view'),
re_path(r'^virtualevent/(?P\d+)/compare/$',views.virtualevent_compare_view,name='virtualevent_compare_view'),
+ re_path(r'^courses/(?P\d+)/compare/$',views.course_compare_view,name='course_compare_view'),
re_path(r'^virtualevent/(?P\d+)/mapcompare/$',views.virtualevent_mapcompare_view,
name='virtualevent_mapcompare_view'),
+ re_path(r'^courses/(?P\d+)/mapcompare/$',views.course_mapcompare_view,
+ name='course_mapcompare_view'),
re_path(r'^virtualevent/(?P\d+)/image/$',
views.virtualevent_uploadimage_view,name='virtualevent_uploadimage_view'),
re_path(r'^virtualevent/(?P\d+)/setimage/(?P\d+)/$',
diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py
index f88f8938..597b7566 100644
--- a/rowers/views/workoutviews.py
+++ b/rowers/views/workoutviews.py
@@ -1477,6 +1477,93 @@ def team_comparison_select(request,
'teams':get_my_teams(request.user),
})
+def course_mapcompare_view(request,id=0):
+ results = []
+
+ r = None
+ if not request.user.is_anonymous:
+ r = getrower(request.user)
+
+ try:
+ course = GeoCourse.objects.get(id=id)
+ except GeoCourse.DoesNotExist: # pragma: no cover
+ raise Http404("Course does not exist")
+
+
+ results = VirtualRaceResult.objects.filter(
+ course=course,
+ workoutid__isnull=False,
+ ).order_by("distance","duration")
+
+ workoutids = [result.workoutid for result in results]
+
+ startenddict = {}
+
+ for result in results:
+ startenddict[result.workoutid] = (result.startsecond,result.endsecond)
+
+ if len(workoutids) == 0: # pragma: no cover
+ url = reverse('course_view',
+ kwargs={
+ 'id':course.id,
+ })
+
+ messages.info(request,'There are no results to display')
+
+ return HttpResponseRedirect(url)
+
+ workouts = []
+ for id in workoutids:
+ try:
+ workouts.append(Workout.objects.get(id=id))
+ except Workout.DoesNotExist: # pragma: no cover
+ pass
+
+ labeldict = {
+ int(w.id): w.__str__() for w in workouts
+ }
+
+ script,div = leaflet_chart_compare(course,workoutids,
+ labeldict=labeldict,
+ startenddict=startenddict)
+
+ breadcrumbs = [
+ {
+ 'url': reverse('courses_view'),
+ 'name': 'Courses'
+ },
+ {
+ 'url':reverse('course_view',
+ kwargs={
+ 'id':course.id,
+ }
+ ),
+ 'name': course.name
+ },
+ {
+ 'url':reverse('course_mapcompare_view',
+ kwargs={
+ 'id':course.id,
+ }
+ ),
+ 'name': 'Course Compare'
+ }
+ ]
+
+
+ return render(request,'mapcompare.html',
+ {'mapscript':script,
+ 'mapdiv':div,
+ 'breadcrumbs':breadcrumbs,
+ 'rower':r,
+ 'course':course,
+ 'results':results,
+ 'active':'nav-racing',
+ 'teamid':0,
+ 'teams':[]
+ })
+
+
def virtualevent_mapcompare_view(request,id=0):
results = []
@@ -1567,6 +1654,184 @@ def virtualevent_mapcompare_view(request,id=0):
'teams':[]
})
+
+def course_compare_view(request,id=0):
+ results = []
+
+ promember = 0
+ if not request.user.is_anonymous:
+ r = getrower(request.user)
+ result = request.user.is_authenticated and ispromember(request.user)
+ if result:
+ promember=1
+ else: # pragma: no cover
+ r = None
+
+ try:
+ course = GeoCourse.objects.get(id=id)
+ except GeoCourse.DoesNotExist: # pragma: no cover
+ raise Http404("Course does not exist")
+
+
+ script,div = course_map(course)
+ resultobj = VirtualRaceResult
+
+ results = resultobj.objects.filter(
+ course=course,
+ workoutid__isnull=False,
+ coursecompleted=True,
+ ).order_by("duration","-distance")
+
+ workoutids = [result.workoutid for result in results]
+
+ startenddict = {}
+
+ for result in results:
+ startenddict[result.workoutid] = (result.startsecond,result.endsecond)
+
+ if len(workoutids) == 0: # pragma: no cover
+ url = reverse('course_view',
+ kwargs={
+ 'id':course.id,
+ })
+
+ messages.info(request,'There are no results to display')
+
+ return HttpResponseRedirect(url)
+
+ if request.method == 'GET':
+ xparam = 'distance'
+
+ yparam = 'pace'
+ plottype = 'line'
+
+ request.session['ids'] = workoutids
+ request.session['plottype'] = plottype
+ request.session['xparam'] = xparam
+ request.session['yparam'] = yparam
+
+
+ workouts = []
+ for id in workoutids:
+ try:
+ workouts.append(Workout.objects.get(id=id))
+ except Workout.DoesNotExist: # pragma: no cover
+ pass
+
+ form = WorkoutMultipleCompareForm()
+ form.fields["workouts"].queryset = Workout.objects.filter(id__in=workoutids)
+ form.fields["workouts"].initial = Workout.objects.filter(id__in=workoutids)
+
+
+ labeldict = {
+ int(w.id): w.__str__() for w in workouts
+ }
+
+
+
+ chartform = ChartParamChoiceForm(
+ initial = {
+ 'xparam':xparam,
+ 'yparam':yparam,
+ 'plottype':plottype,
+ 'teamid':0
+ }
+ )
+ if request.method == 'POST' and 'workouts' in request.POST:
+ form = WorkoutMultipleCompareForm(request.POST)
+ form.fields["workouts"].queryset = Workout.objects.filter(id__in=workoutids)
+ chartform = ChartParamChoiceForm(request.POST)
+ if form.is_valid() and chartform.is_valid():
+ cd = form.cleaned_data
+ workouts = cd['workouts']
+ workoutids = [w.id for w in workouts]
+ xparam = chartform.cleaned_data['xparam']
+ yparam = chartform.cleaned_data['yparam']
+ plottype = chartform.cleaned_data['plottype']
+ teamid = chartform.cleaned_data['teamid']
+ ids = [int(w.id) for w in workouts]
+ request.session['ids'] = ids
+ elif request.method == 'POST':
+ form = WorkoutMultipleCompareForm()
+ form.fields["workouts"].queryset = Workout.objects.filter(id__in=workoutids)
+ request.session['ids'] = workoutids
+
+
+ chartform = ChartParamChoiceForm(request.POST)
+ if chartform.is_valid():
+ xparam = chartform.cleaned_data['xparam']
+ yparam = chartform.cleaned_data['yparam']
+ plottype = chartform.cleaned_data['plottype']
+ teamid = chartform.cleaned_data['teamid']
+ try:
+ workoutids = request.session['ids']
+ except KeyError: # pragma: no cover
+ pass
+
+
+ workouts = []
+ for id in workoutids:
+ try:
+ workouts.append(Workout.objects.get(
+ id=id))
+ except Workout.DoesNotExist: # pragma: no cover
+ pass
+
+ labeldict = {
+ int(w.id): w.__str__() for w in workouts
+ }
+
+
+ res = interactive_multiple_compare_chart(workoutids,xparam,yparam,
+ promember=promember,
+ plottype=plottype,
+ labeldict=labeldict,startenddict=startenddict)
+ script = res[0]
+ div = res[1]
+ errormessage = res[3]
+ if errormessage != '': # pragma: no cover
+ messages.error(request,errormessage)
+
+ breadcrumbs = [
+ {
+ 'url': reverse('courses_view'),
+ 'name': 'Courses'
+ },
+ {
+ 'url':reverse('course_view',
+ kwargs={
+ 'id':course.id,
+ }
+ ),
+ 'name': course.name
+ },
+ {
+ 'url':reverse('virtualevent_compare_view',
+ kwargs={
+ 'id':course.id,
+ }
+ ),
+ 'name': 'Compare'
+ }
+ ]
+
+
+ return render(request,'multicompare.html',
+ {'interactiveplot':script,
+ 'the_div':div,
+ 'breadcrumbs':breadcrumbs,
+ 'rower':r,
+ 'course':course,
+ 'results':results,
+ 'active':'nav-racing',
+ 'promember':promember,
+ 'teamid':0,
+ 'chartform':chartform,
+ 'form':form,
+ 'teams':[]
+ })
+
+
def virtualevent_compare_view(request,id=0):
results = []