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 = []