From 74dac7c789aaaff7f3167e9f25b68527ff4471f3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 5 Apr 2024 08:55:02 +0200 Subject: [PATCH 1/4] adding course result to plannedsessionview --- rowers/models.py | 8 ++++++ rowers/tasks.py | 3 ++- rowers/templates/course_view.html | 31 +++++++++++++++++++++++- rowers/templates/plannedsessionview.html | 2 +- rowers/views/analysisviews.py | 15 +++++++----- rowers/views/planviews.py | 1 - rowers/views/racesviews.py | 8 ++++++ 7 files changed, 58 insertions(+), 10 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 28fce46e..6ba7658d 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -4158,6 +4158,7 @@ class IndoorVirtualRaceResult(models.Model): class CourseTestResult(models.Model): userid = models.IntegerField(default=0) + courseid = models.IntegerField(default=0) workoutid = models.IntegerField(null=True) plannedsession = models.ForeignKey( PlannedSession, on_delete=models.CASCADE) @@ -4167,6 +4168,13 @@ class CourseTestResult(models.Model): startsecond = models.FloatField(default=0) endsecond = models.FloatField(default=0) + def save(self, *args, **kwargs): + if self.userid == 0: + w = Workout.objects.get(id=self.workoutid) + self.userid = w.user.id + + super(CourseTestResult, self).save(*args, **kwargs) + class IndoorVirtualRaceResultForm(ModelForm): class Meta: diff --git a/rowers/tasks.py b/rowers/tasks.py index 6572a1dd..f42891c9 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -1149,9 +1149,11 @@ def handle_check_race_course(self, record.duration = totaltime_sec_to_string(coursetimeseconds) record.distance = int(coursemeters) record.workoutid = workoutid + record.courseid = courseid record.startsecond = startsecond record.endsecond = endsecond record.points = points + record.coursecompleted = 1 record.save() if summary: # pragma: no cover @@ -1178,7 +1180,6 @@ def handle_check_race_course(self, workout.summary = summary workout.save() - if successemail: # pragma: no cover handle_sendemail_coursesucceed( useremail, userfirstname, logfile, workoutid diff --git a/rowers/templates/course_view.html b/rowers/templates/course_view.html index f1741712..e50e35fa 100644 --- a/rowers/templates/course_view.html +++ b/rowers/templates/course_view.html @@ -137,7 +137,36 @@

{% endif %} - {% endif %} + {% endif %} + {% if ownrecords %} +
  • +

    Own (Private) Results

    +

    + + + + + + + + + + {% for record in ownrecords %} + + + + + + + {% endfor %} + +
    TimeDistanceDate
    {{ record.duration |durationprint:"%H:%M:%S.%f" }}{{ record.distance }} m{{ record.workoutid|workoutdate }} + + +
    +

    +
  • +{% endif %} {% endblock %} diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html index 2389ffcc..3313c733 100644 --- a/rowers/templates/plannedsessionview.html +++ b/rowers/templates/plannedsessionview.html @@ -172,7 +172,7 @@ {% if coursescript %}
  • -

    Course

    +

    {{ plannedsession.course.name }}

    {{ coursediv|safe }} {{ coursescript|safe }} diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index af0f2272..46fc3383 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -410,12 +410,15 @@ def trendflexdata(workouts, options, userid=0): except (ValueError, AttributeError): # pragma: no cover return ('', 'Error: not enough data') else: # pragma: no cover - bins = np.arange(datadf['days ago'].min()-binsize, - datadf['days ago'].max()+binsize, - binsize, - ) - groups = datadf.groupby(pd.cut(datadf['days ago'], bins, - labels=False)) + try: + bins = np.arange(datadf['days ago'].min()-binsize, + datadf['days ago'].max()+binsize, + binsize, + ) + groups = datadf.groupby(pd.cut(datadf['days ago'], bins, + labels=False)) + except (ValueError, AttributeError): # pragma: no cover + return ('', 'Error: not enough data') xvalues = [] yvalues = [] diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index a3a424ad..e44609ac 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -2332,7 +2332,6 @@ def plannedsession_view(request, id=0, userid=0): if ps.sessiontype == 'coursetest': # pragma: no cover vs = CourseTestResult.objects.filter(plannedsession=ps, workoutid=w.id) - if vs: for record in vs: if record.workoutid == w.id: diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py index 965bd58a..a545d016 100644 --- a/rowers/views/racesviews.py +++ b/rowers/views/racesviews.py @@ -280,6 +280,13 @@ def course_view(request, id=0): workoutid__isnull=False, coursecompleted=True).order_by("duration", "-distance") + # get own training results + ownrecords = CourseTestResult.objects.filter( + courseid = course.id, + userid = r.id, + coursecompleted=True + ).order_by("duration", "-distance") + if request.user.is_authenticated: notsharing = Rower.objects.filter( share_course_results=False).exclude(id=r.id) @@ -371,6 +378,7 @@ def course_view(request, id=0): 'mapdiv': div, 'nosessions': False, 'records': records, + 'ownrecords': ownrecords, 'rower': r, 'form': form, 'onlyme': onlyme, From a8222a010649928f267140d539cc9f4cee533433 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 5 Apr 2024 09:05:05 +0200 Subject: [PATCH 2/4] tested, fixes --- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index a2f1b1b63a5106fddc25e3af452f43c46404cb03..1c7631ef1d42f6dbcb77fdaa4138395b664ea591 100644 GIT binary patch delta 3915 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 YUOY-q252rV)1jK*=05a(Co&W#< From c4f965070e50c0ae7372948aa07f3018311946ca Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 5 Apr 2024 12:23:10 +0200 Subject: [PATCH 3/4] new courses landing page --- rowers/interactiveplots.py | 9 +- rowers/templates/courses_challenges.html | 105 +++++++++++++++++++++++ rowers/urls.py | 2 + rowers/views/racesviews.py | 80 ++++++++++++++++- templates/newbase.html | 4 +- 5 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 rowers/templates/courses_challenges.html diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 4c03a9bb..1c64244c 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2263,7 +2263,7 @@ def course_map(course): - var mymap = L.map('map_canvas', {{ + var mymap = L.map('map_canvas_{id}', {{ center: [{latmean}, {lonmean}], zoom: 13, layers: [outdoors] @@ -2306,6 +2306,7 @@ def course_map(course): """.format( + id=course.id, latmean=latmean, lonmean=lonmean, scoordinates=scoordinates, @@ -2314,8 +2315,10 @@ def course_map(course): ) div = """ -
    - """ +
    + """.format( + id=course.id, + ) return script, div diff --git a/rowers/templates/courses_challenges.html b/rowers/templates/courses_challenges.html new file mode 100644 index 00000000..7c83ed87 --- /dev/null +++ b/rowers/templates/courses_challenges.html @@ -0,0 +1,105 @@ +{% extends "newbase.html" %} +{% load static %} +{% load rowerfilters %} +{% load leaflet_tags %} + +{% block meta %} +{% leaflet_js %} +{% leaflet_css %} +{% endblock %} + +{% block title %}Rowsandall Virtual Challenges{% endblock %} + +{% block scripts %} + + +{% endblock %} + +{% block main %} + +
    + +{% endblock %} + +{% block sidebar %} +{% include 'menu_racing.html' %} +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index a2c62399..c5d829b8 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -309,6 +309,8 @@ urlpatterns = [ name='workouts_view'), re_path(r'^list-workouts/user/(?P\d+)/$', views.workouts_view, name='workouts_view'), + re_path(r'^courses/$', views.courses_challenges_view, + name='courses_challenges_view'), re_path(r'^virtualevents/$', views.virtualevents_view, name='virtualevents_view'), re_path(r'^virtualevent/createchoice/$', TemplateView.as_view( diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py index a545d016..86294801 100644 --- a/rowers/views/racesviews.py +++ b/rowers/views/racesviews.py @@ -8,10 +8,86 @@ from django import forms from rowers.plannedsessions import timefield_to_seconds_duration from rowers.courses import getnearestraces, getnearestcourses,coursetokml, coursestokml +from random import sample + +# landing page for challenges & courses +def courses_challenges_view(request): + r = getrower(request.user) + g = GeoIP2() + + ip = request.META.get('HTTP_X_REAL_IP', '1.1.1.1') + try: + lat_lon = g.lat_lon(ip) + city = g.city(ip) + except: # pragma: no cover + lat_lon = None + city = { + 'city': '', + 'country_name': '', + 'time_zone': '', + } + + courses = GeoCourse.objects.all().order_by("country", "name", "distance") + nearby_courses = getnearestcourses(lat_lon, courses, whatisnear=2000) + liked_courses = GeoCourse.objects.filter(followers=r) + courses = GeoCourse.objects.filter(id__in=[course.id for course in nearby_courses]) | liked_courses + + courses = sample(list(courses),3) + + coursesdicts = [] + for course in courses: + script, div = course_map(course) + coursesdicts.append({ + 'course': course, + 'script': script, + 'div': div, + }) + + challenges = VirtualRace.objects.filter(startdate__gte=timezone.now()) + challenges2 = VirtualRace.objects.filter(startdate__lte=timezone.now(), + evaluation_closure__gte=timezone.now()-datetime.timedelta(days=3)) + + challenges = challenges | challenges2 + while len(challenges) < 3: + allchallenges = VirtualRace.objects.all().order_by("-startdate") + challenges = list(challenges)+sample(list(allchallenges), 3-len(challenges)) + challenges = list(set(challenges)) + + challenges = sample(list(challenges),3) + + challengesdicts = [] + for challenge in challenges: + script = '' + div = '' + if challenge.course: + script, div = course_map(challenge.course) + + challengesdicts.append( + { + 'script': script, + 'div': div, + 'challenge': challenge, + } + ) + + breadcrumbs = [ + { + 'url': reverse('courses_challenges_view'), + 'name': 'Courses and Challenges' + } + ] + + + return render(request, "courses_challenges.html", + { + 'coursesdicts': coursesdicts, + 'rower': r, + 'challengesdicts': challengesdicts, + 'breadcrumbs': breadcrumbs, + }) + # List Courses - - def courses_view(request): r = getrower(request.user) g = GeoIP2() diff --git a/templates/newbase.html b/templates/newbase.html index 54db92b3..baa53d37 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -206,8 +206,8 @@
      +
    • +

      Courses you might like

      +
    • +
    • +

      + All Courses +

      + Courses I like +

      +
    • +{% for course in coursesdicts %} +
    • + +

      {{ course.course.name }}

      +
      +

      {{ course.course.country }}

      +

      {{ course.course.distance }}m

      +
      + {{ course.div|safe}} + {{ course.script|safe}} +
      +
    • +{% endfor %} +
    • +

      Interesting Challenges

      +
    • +
    • +

      + Challenges page +

      + Nearby Challenges +

      +
    • +{% for challenge in challengesdicts %} +
    • + +

      {{ challenge.challenge.name }}

      +
      +

      {{ challenge.challenge.startdate|date:"Y-m-d" }} + {{ challenge.challenge.start_time|time:"H:i e" }} + to + {{ challenge.challenge.enddate|date:"Y-m-d" }} + {{ challenge.challenge.end_time|time:"H:i e" }} + ({{ challenge.challenge.timezone }})

      +

      {% if challenge.challenge.sessiontype == 'fastest_time' %} + Time Challenge: To be rowed on the water + {% elif challenge.challenge.sessiontype == 'fastest_distance' %} + Distance Challenge: To be rowed on the water + {% elif challenge.challenge.sessiontype != 'race' %} + Indoor Race: To be rowed on a Concept2 ergometer + {% endif %} +

      + {% if challenge.challenge.sessiontype == 'fastest_time' %} +
      + Marked Course +
      + {% elif challenge.challenge.sessiontype == 'fastest_distance' %} +
      + Marked Course +
      + {% elif challenge.challenge.sessiontype != 'race' %} +
      + Marked Course +
      + + {% endif %} +
      + {{ challenge.div|safe}} + {{ challenge.script|safe}} +
      +
    • +{% endfor %} + +
  • - -  Challenges + +  Challenges, Courses
  • From 813a8d86df094fbb342b7f11f68a1718f267c1c2 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 5 Apr 2024 13:06:39 +0200 Subject: [PATCH 4/4] fixes --- rowers/templates/courses_challenges.html | 2 +- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4000 bytes rowers/views/racesviews.py | 27 +++++++++++++++++------ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/rowers/templates/courses_challenges.html b/rowers/templates/courses_challenges.html index 7c83ed87..dec869a1 100644 --- a/rowers/templates/courses_challenges.html +++ b/rowers/templates/courses_challenges.html @@ -48,7 +48,7 @@
  • - Challenges page + All Active Challenges

    Nearby Challenges

    diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 1c7631ef1d42f6dbcb77fdaa4138395b664ea591..17b31447d2626ed92aaf111d21d34387eaeb8222 100644 GIT binary patch delta 257 zcmV+c0sj7>AD|xwABzYGrrEIust$kRix;#+M+Dy;_dgyib_d+qo$2Fm%%3kmt#;oZ zJh(_4&n`af`?O1M&&Ao>O}Bp8ot$i+R{FSFAHVGSE}ggAyRK|D;Q1XTfpR&tLDh zTBprkKJB;NaQSGzIRC-(bkm2wEl-x+W|=tTPahuLmHRq)+^vrvJv{v7X=bzibGQB1 z^cFvTefnaV?hN1ufZhKGiz{F3p8WPP9p2fZUaiw}c#u#oFCM0+@giON@Xr4LjbD`r H#DD<+@tThp delta 258 zcmV+d0sa1g46+&;32UkLl1W59h;{C*6P2C9`s~;OghE zcU!H~W-p)i+itjgv|pV6;CZ^~!{3%C%Wktw9P+0RkM7ES9X#&V$B!N!{_-@l+5WlP z{%d-RpT0hQu}pUc@B_f^|AWPqFLqCU`zY*DY)={Y<|D3=!x)6;m7E`50Cf1FwE Iw#0w|0Ot#om;e9( diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py index 86294801..860c58cd 100644 --- a/rowers/views/racesviews.py +++ b/rowers/views/racesviews.py @@ -32,7 +32,10 @@ def courses_challenges_view(request): liked_courses = GeoCourse.objects.filter(followers=r) courses = GeoCourse.objects.filter(id__in=[course.id for course in nearby_courses]) | liked_courses - courses = sample(list(courses),3) + if courses.count() >= 3: + courses = sample(list(courses),3) + else: + courses = GeoCourse.objects.all().order_by("country", "name", "distance") coursesdicts = [] for course in courses: @@ -43,17 +46,27 @@ def courses_challenges_view(request): 'div': div, }) + allchallenges = VirtualRace.objects.all().order_by("-startdate") + totalnrchallenges = allchallenges.count() challenges = VirtualRace.objects.filter(startdate__gte=timezone.now()) challenges2 = VirtualRace.objects.filter(startdate__lte=timezone.now(), evaluation_closure__gte=timezone.now()-datetime.timedelta(days=3)) - challenges = challenges | challenges2 - while len(challenges) < 3: - allchallenges = VirtualRace.objects.all().order_by("-startdate") - challenges = list(challenges)+sample(list(allchallenges), 3-len(challenges)) - challenges = list(set(challenges)) + challenges = challenges | challenges2 + count = 3 + if totalnrchallenges > count: + allchallenges = list(allchallenges) + while len(challenges) < count: + try: + challenges = list(challenges)+sample(allchallenges, count-len(challenges)) + except ValueError: + count = count-1 + challenges = list(set(challenges)) + else: + challenges = VirtualRace.objects.all() + count = challenges.count() - challenges = sample(list(challenges),3) + challenges = sample(list(challenges),count) challengesdicts = [] for challenge in challenges: