From b953d2714b413706fea0668deb3aafda518b58fd Mon Sep 17 00:00:00 2001
From: Sander Roosendaal
Date: Tue, 26 May 2020 16:47:49 +0200
Subject: [PATCH] standards_view and standard_view
---
rowers/models.py | 2 +
rowers/scoring.py | 6 +-
rowers/templates/list_standards.html | 84 ++++++++++++++++++++++++++++
rowers/templates/menu_racing.html | 5 ++
rowers/templates/standard_view.html | 72 ++++++++++++++++++++++++
rowers/urls.py | 2 +
rowers/views/racesviews.py | 77 +++++++++++++++++++++++++
rowers/views/statements.py | 2 +-
8 files changed, 247 insertions(+), 3 deletions(-)
create mode 100644 rowers/templates/list_standards.html
create mode 100644 rowers/templates/standard_view.html
diff --git a/rowers/models.py b/rowers/models.py
index dcf75050..e57a9793 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -2197,6 +2197,7 @@ from django.core.validators import RegexValidator,validate_email
class StandardCollection(models.Model):
name = models.CharField(max_length=150)
manager = models.ForeignKey(User, null=True,on_delete=models.CASCADE)
+ notes = models.CharField(blank=True,null=True,max_length=1000)
def __str__(self):
return self.name
@@ -2204,6 +2205,7 @@ class StandardCollection(models.Model):
class CourseStandard(models.Model):
name = models.CharField(max_length=150)
coursedistance = models.IntegerField()
+ coursetime = models.CharField(max_length=100,default="")
coursestandard = models.FloatField() # average boat speed
agemin = models.IntegerField(default=0)
agemax = models.IntegerField(default=120)
diff --git a/rowers/scoring.py b/rowers/scoring.py
index a4a6bd74..13ee7098 100644
--- a/rowers/scoring.py
+++ b/rowers/scoring.py
@@ -4,9 +4,9 @@ import pandas as pd
import arrow
import datetime
-def save_scoring(name,user,filename,id=0):
+def save_scoring(name,user,filename,id=0,notes=""):
if id==0:
- collection = StandardCollection(name=name,manager=user)
+ collection = StandardCollection(name=name,manager=user,notes=notes)
collection.save()
standards = CourseStandard.objects.filter(standardcollection=collection)
for standard in standards:
@@ -15,6 +15,7 @@ def save_scoring(name,user,filename,id=0):
try:
collection = StandardCollection.objects.get(id=id)
collection.name = name
+ collection.notes = notes
collection.save()
except StandardCollection.DoesNotExist:
@@ -88,6 +89,7 @@ def save_scoring(name,user,filename,id=0):
name=name,
coursedistance=coursedistance,
coursestandard=coursestandard,
+ coursetime=coursetime,
agemin=agemin,
agemax=agemax,
boatclass=boatclass,
diff --git a/rowers/templates/list_standards.html b/rowers/templates/list_standards.html
new file mode 100644
index 00000000..b99ac07f
--- /dev/null
+++ b/rowers/templates/list_standards.html
@@ -0,0 +1,84 @@
+{% extends "newbase.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+
+{% block title %}Rowsandall Course Standards List{% endblock %}
+
+{% block scripts %}
+
+{% endblock %}
+
+{% block main %}
+
+
+
+
+Standards Collections
+
+
+ -
+ {% if standards %}
+
+
+
+
+ | Name |
+ Maintainer |
+
+
+
+ {% for standard in standards %}
+
+ | {{ standard.name }} |
+ {{ standard.manager.first_name }} {{ standard.manager.last_name }} |
+
+ {% if standard.manager == user %}
+ {{ standard.name }}
+ {% else %}
+ {{ standard.name }}
+ {% endif %}
+ |
+
+
+
+ {% endfor %}
+
+
+
+ {% else %}
+ No standards found
+ {% endif %}
+
+
+
+
+
+
+ Add Standards
+
+
+
+
+
+ How-to
+
+ A set of Course Standard Times allows you to calculate a score for
+ each participant on how well they have done against the course
+ standard time for their category. This allows for comparison
+ and competition between the different categories.
+
+
+
+ {% endblock %}
+
+{% block sidebar %}
+{% include 'menu_racing.html' %}
+{% endblock %}
diff --git a/rowers/templates/menu_racing.html b/rowers/templates/menu_racing.html
index c1eb9178..a0a5d76b 100644
--- a/rowers/templates/menu_racing.html
+++ b/rowers/templates/menu_racing.html
@@ -131,6 +131,11 @@
{% endif %}
+
+
+ Course Time Standards
+
+
{% include 'menuscript.html' %}
diff --git a/rowers/templates/standard_view.html b/rowers/templates/standard_view.html
new file mode 100644
index 00000000..2bc1a232
--- /dev/null
+++ b/rowers/templates/standard_view.html
@@ -0,0 +1,72 @@
+{% extends "newbase.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+{% load leaflet_tags %}
+
+{% block meta %}
+{% leaflet_js %}
+{% leaflet_css %}
+{% endblock %}
+
+{% block scripts %}
+{% include "monitorjobs.html" %}
+{% endblock %}
+
+{% block title %}{{ standard.name }} {% endblock %}
+{% block og_title %}{{ standard.name }} {% endblock %}
+{% block main %}
+
+{{ standard.name }}
+
+
+ -
+
+
+ | Name | {{ collection.name }} |
+
+
+ | Manager | {{ collection.manager.first_name }} {{ collection.manager.last_name }} |
+
+
+ | Notes | {{ collection.notes|linebreaks }} |
+
+
+
+ -
+
Standard Times
+
+ | Name▲▼ |
+ Distance▲▼ |
+ Standard Time▲▼ |
+ Boat Class▲▼ |
+ Boat Type▲▼ |
+ Gender▲▼ |
+ Weight Class▲▼ |
+ Adaptive Class▲▼ |
+ Skill Class▲▼ |
+ Minimum▲▼/Maximum Age▲▼ |
+
+ {% for standard in standards %}
+
+ | {{ standard.name }} |
+ {{ standard.coursedistance }} |
+ {{ standard.coursetime }} |
+ {{ standard.boatclass }} |
+ {{ standard.boattype }} |
+ {{ standard.sex }} |
+ {{ standard.weightclass }} |
+ {{ standard.adaptiveclass }} |
+ {{ standard.skillclass }} |
+ {{ standard.agemin }}/{{ standard.agemax }} |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+{% include 'menu_racing.html' %}
+{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index ad52fd3b..ea85a5ad 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -201,6 +201,7 @@ urlpatterns = [
views.virtualevent_results_download_view,name='virtualevent_results_download_view'),
re_path(r'^list-workouts/$',views.workouts_view,name='workouts_view'),
re_path(r'^list-courses/$',views.courses_view,name='courses_view'),
+ re_path(r'^list-standards/$',views.standards_view,name='standards_view'),
re_path(r'^courses/upload/$',views.course_upload_view,name='course_upload_view'),
re_path(r'^workout/addmanual/(?P\d+)$',views.addmanual_view,name='addmanual_view'),
re_path(r'^workout/addmanual/$',views.addmanual_view,name='addmanual_view'),
@@ -752,6 +753,7 @@ urlpatterns = [
re_path(r'^courses/(?P\d+)/replace/$',views.course_replace_view,
name='course_replace_view'),
re_path(r'^courses/(?P\d+)/$',views.course_view,name='course_view'),
+ re_path(r'^standards/(?P\d+)/$',views.standard_view,name='standard_view'),
re_path(r'^courses/(?P\d+)/map/$',views.course_map_view,name='course_map_view'),
# URLS to be created
re_path(r'^help/$',TemplateView.as_view(template_name='help.html'), name='help'),
diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py
index 606dbdb0..591458a5 100644
--- a/rowers/views/racesviews.py
+++ b/rowers/views/racesviews.py
@@ -35,6 +35,39 @@ def courses_view(request):
'rower':r,
})
+# List Courses
+def standards_view(request):
+ r = getrower(request.user)
+
+ standards = StandardCollection.objects.all().order_by("name")
+ print(standards)
+
+ # add search processing
+ query = request.GET.get('q')
+ if query:
+ query_list = query.split()
+ standards = StandardCollection.objects.filter(
+ reduce(operator.and_,
+ (Q(name__icontains=q) for q in query_list)) |
+ reduce(operator.and_,
+ (Q(country__icontains=q) for q in query_list)) |
+ reduce(operator.and_,
+ (Q(notes__icontains=q) for q in query_list))
+ )
+ searchform = SearchForm(initial={'q':query})
+ else:
+ searchform = SearchForm()
+
+ print(standards)
+
+ return render(request,'list_standards.html',
+ {'standards':standards,
+ 'active':'nav-racing',
+ 'searchform':searchform,
+ 'rower':r,
+ })
+
+
# for ajax calls
def course_map_view(request,id=0):
@@ -249,6 +282,50 @@ def course_view(request,id=0):
}
)
+def standard_view(request,id=0):
+ try:
+ collection = StandardCollection.objects.get(id=id)
+ except StandardCollection.DoesNotExist:
+ return Http404("Standard Collection does not exist")
+
+ r = getrower(request.user)
+
+ orderby = request.GET.get('order_by')
+
+ if orderby is not None:
+ standards = CourseStandard.objects.filter(
+ standardcollection=collection
+ ).order_by(orderby,"-coursestandard","agemax","agemin","sex","name")
+ else:
+ standards = CourseStandard.objects.filter(
+ standardcollection=collection
+ ).order_by("-coursestandard","agemax","agemin","sex","name")
+
+ breadcrumbs = [
+ {
+ 'url': reverse('virtualevents_view'),
+ 'name': 'Challenges'
+ },
+ {
+ 'url': reverse(standards_view),
+ 'name': 'Standards'
+ },
+ {
+ 'url': reverse(standard_view,kwargs={'id':collection.id}),
+ 'name': collection.name
+ },
+ ]
+
+ return render(request, 'standard_view.html',
+ {
+ 'active':'nav-racing',
+ 'breadcrumbs':breadcrumbs,
+ 'collection':collection,
+ 'standards':standards,
+ 'rower':r,
+ }
+ )
+
@login_required()
@permission_required('racelogo.delete_logo',fn=get_logo_by_pk,raise_exception=True)
def logo_delete_view(request,id=0):
diff --git a/rowers/views/statements.py b/rowers/views/statements.py
index 156919f9..29a68349 100644
--- a/rowers/views/statements.py
+++ b/rowers/views/statements.py
@@ -113,7 +113,7 @@ from rowers.models import (
RaceLogo,RowerBillingAddressForm,PaidPlan,
AlertEditForm, ConditionEditForm,
PlannedSessionComment,CoachRequest,CoachOffer,
- VideoAnalysis,ShareKey,
+ VideoAnalysis,ShareKey,StandardCollection,CourseStandard,
)
from rowers.models import (
RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm,