From c4f965070e50c0ae7372948aa07f3018311946ca Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Fri, 5 Apr 2024 12:23:10 +0200
Subject: [PATCH 1/2] 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 %}
+
+
+ -
+
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' %}
+
+

+
+ {% elif challenge.challenge.sessiontype == 'fastest_distance' %}
+
+

+
+ {% elif challenge.challenge.sessiontype != 'race' %}
+
+

+
+
+ {% endif %}
+
+ {{ challenge.div|safe}}
+ {{ challenge.script|safe}}
+
+
+{% endfor %}
+
+
+
+{% 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 @@
-
- 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 2/2] 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: