Private
Public Access
1
0

Merge branch 'develop' of bitbucket.org:sanderroosendaal/rowsandall into develop

This commit is contained in:
Sander Roosendaal
2020-06-12 16:56:56 +02:00
7 changed files with 170 additions and 8 deletions

View File

@@ -381,6 +381,7 @@ def add_workouts_plannedsession(ws,ps,r):
record.save()
job = myqueue(queue,handle_check_race_course,w.csvfilename,
w.id,ps.course.id,record.id,
w.user.user.email,w.user.user.first_name,
mode='coursetest')
else:
errors.append('Workout %i did not match session dates' % w.id)
@@ -659,6 +660,7 @@ def is_session_complete_ws(ws,ps):
record.save()
job = myqueue(queue,handle_check_race_course,ws[0].csvfilename,
ws[0].id,ps.course.id,record.id,
ws[0].user.user.email,ws[0].user.user.first_name,
mode='coursetest')
return (0,'not done',None)
@@ -1575,7 +1577,9 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0):
comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.')
job = myqueue(queue,handle_check_race_course,ws[0].csvfilename,
ws[0].id,race.course.id,record.id,splitsecond=splitsecond,
ws[0].id,race.course.id,record.id,
ws[0].user.user.email,ws[0].user.user.first_name,
splitsecond=splitsecond,
referencespeed=record.referencespeed,coursedistance=race.course.distance
)

View File

@@ -119,7 +119,11 @@ siteurl = SITE_URL
# testing task
from rowers.emails import send_template_email
from rowers.courseutils import coursetime_paths, coursetime_first, time_in_path,InvalidTrajectoryError
from rowers.courseutils import (
coursetime_paths, coursetime_first, time_in_path,
InvalidTrajectoryError
)
@app.task
def add(x, y):
@@ -342,7 +346,8 @@ def polygon_to_path(polygon,debug=True):
@app.task(bind=True)
def handle_check_race_course(self,
f1,workoutid,courseid,
recordid,**kwargs):
recordid,useremail,userfirstname,
**kwargs):
if 'debug' in kwargs:
debug = kwargs['debug']
@@ -435,8 +440,12 @@ def handle_check_race_course(self,
try:
entrytimes,entrydistances = time_in_path(rowdata,paths[0],maxmin='max',getall=True)
except InvalidTrajectoryError:
coursecomplete = False
return 0
entrytimes = []
entrydistances = []
coursecompleted = False
coursemeters = 0
coursetimeseconds = 0
cseconds = []
cmeters = []
@@ -532,6 +541,39 @@ def handle_check_race_course(self,
return 1
else:
query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 0, duration = "{duration}", distance = {distance}, workoutid = {workoutid}, startsecond = {startsecond}, endsecond = {endsecond}, points={points} WHERE id={recordid}'.format(
recordid=recordid,
duration=totaltime_sec_to_string(0),
distance=0),
points=0,
workoutid=workoutid,
startsecond=startsecond,
endsecond=endsecond,
)
if mode == 'coursetest':
query = 'UPDATE rowers_coursetestresult SET coursecompleted = 0, duration = "{duration}", distance = {distance}, workoutid = {workoutid}, startsecond = {startsecond}, endsecond = {endsecond}, points={points} WHERE id={recordid}'.format(
recordid=recordid,
duration=totaltime_sec_to_string(0),
distance=0,
points=0,
workoutid=workoutid,
startsecond=startsecond,
endsecond=endsecond,
)
with engine.connect() as conn, conn.begin():
result = conn.execute(query)
conn.close()
engine.dispose()
# send email
handle_send_email_coursefail(
useremail,userfirstname,
)
return 2
return 0
@@ -1122,6 +1164,29 @@ def handle_sendemail_raceregistration(
return 1
def handle_sendemail_coursefail(
useremail, username, **kwargs):
if 'debug' in kwargs:
debug = kwargs['debug']
else:
debug = True
subject = "The validation of your course has failed"
from_email = 'Rowsandall <info@rowsandall.com>'
d = {
'username':username,
}
res = send_template_email(from_email,[useremail],
subject,
'trajectoryfailemail.html',
d,**kwargs)
return 1
@app.task
def handle_sendemail_optout(
useremail, username, registeredname, racename, raceid, **kwargs):

View File

@@ -0,0 +1,22 @@
{% extends "emailbase.html" %}
{% block body %}
<p>Dear <strong>{{ username }}</strong>,</p>
<p>
Unfortunately, the course you took did not go through all gates for
the virtual challenge.
You can check your course versus the gates by clicking on Details
in your challenge result.
Of course, you can always submit a new row!
</p>
<p>
If you feel that your course should have been valid, or in case
you have questions, please
contact me by reply to this email.
</p>
<p>
Best Regards, the Rowsandall Team
</p>
{% endblock %}

View File

@@ -267,7 +267,7 @@
<h2>Results</h2>
{% endif %}
</p>
{% if results or dns %}
{% if results or dns or dnf %}
<p>
<table class="listtable shortpadded" width="100%">
<thead>
@@ -349,6 +349,32 @@
</td>
</tr>
{% endfor %}
{% for result in dnf %}
<tr>
<td>&nbsp;</td>
<td>{{ result.username }}</td>
<td>{{ result.teamname }}</td>
<td>{{ result.age }}</td>
<td>{{ result.sex }}</td>
<td>{{ result.weightcategory }}</td>
<td>
{% if result.adaptiveclass == 'None' %}
&nbsp;
{% else %}
{{ result.adaptiveclass }}
{% endif %}
</td>
<td>{{ result.boatclass }}</td>
{% if race.sessiontype == 'race' %}
<td>{{ result.boattype }}</td>
{% endif %}
<td>DNF</td>
<td>
<a href="/rowers/workout/{{ result.workoutid|encode }}/view/entry/{{ result.id }}/">
Details</a>
</td>
</tr>
{% endfor %}
{% for result in dns %}
<tr>
<td>&nbsp;</td>

View File

@@ -48,7 +48,7 @@
<h2>Results</h2>
{% endif %}
</p>
{% if results or dns %}
{% if results or dns or dnf %}
<p>
<table class="listtable shortpadded" width="100%">
<thead>
@@ -108,6 +108,32 @@
</td>
</tr>
{% endfor %}
{% for result in dnf %}
<tr>
<td>&nbsp;</td>
<td>{{ result.username }}</td>
<td>{{ result.teamname }}</td>
<td>{{ result.age }}</td>
<td>{{ result.sex }}</td>
<td>{{ result.weightcategory }}</td>
<td>
{% if result.adaptiveclass == 'None' %}
&nbsp;
{% else %}
{{ result.adaptiveclass }}
{% endif %}
</td>
<td>{{ result.boatclass }}</td>
{% if race.sessiontype == 'race' %}
<td>{{ result.boattype }}</td>
{% endif %}
<td>
<a href="/rowers/workout/{{ result.workoutid|encode }}/view/entry/{{ result.id }}/">
Details</a>
</td>
<td>DNF</td>
</tr>
{% endfor %}
{% for result in dns %}
<tr>
<td>&nbsp;</td>

View File

@@ -1956,7 +1956,9 @@ def plannedsession_view(request,id=0,userid=0):
record.save()
job = myqueue(queue,handle_check_race_course,
w.csvfilename,w.id,ps.course.id,
record.id,mode='coursetest')
record.id,
w.user.user.email,w.user.user.first_name,
mode='coursetest')
intsecs = 0
microsecs = 0

View File

@@ -1072,6 +1072,12 @@ def virtualevent_view(request,id=0):
workoutid__isnull=True,
)
dnf = resultobj.objects.filter(
race=race,
workoutid__isnull=False,
coursecompleted=False,
)
if not request.user.is_anonymous:
if race_can_register(r,race):
@@ -1143,6 +1149,7 @@ def virtualevent_view(request,id=0):
adaptiveclass__in=adaptiveclass,
age__gte=age_min,
age__lte=age_max,
coursecompleted=True,
).order_by("duration")
else:
results = resultobj.objects.filter(
@@ -1154,6 +1161,7 @@ def virtualevent_view(request,id=0):
adaptiveclass__in=adaptiveclass,
age__gte=age_min,
age__lte=age_max,
coursecompleted=True,
).order_by("duration","-distance")
if entrycategory is not None:
@@ -1179,6 +1187,8 @@ def virtualevent_view(request,id=0):
coursecompleted=True,
).order_by("duration","-distance")
if results:
form = RaceResultFilterForm(records=records)
else:
@@ -1221,6 +1231,7 @@ def virtualevent_view(request,id=0):
'results':results,
'buttons':buttons,
'dns':dns,
'dnf':dnf,
'records':records,
'racelogo':racelogo,
'form':form,
@@ -1304,6 +1315,12 @@ def virtualevent_ranking_view(request,id=0):
workoutid__isnull=True,
)
dnf = resultobj.objects.filter(
race=race,
workoutid__isnull=False,
coursecompleted=False,
)
if not request.user.is_anonymous:
if race_can_register(r,race):