Skip to content

Commit fa479c4

Browse files
28.10.2024_amelioration gestion edition + demarrage parcours
1 parent ad1b344 commit fa479c4

16 files changed

Lines changed: 357 additions & 59 deletions

File tree

flask_app/admin/coureurs/templates/view_coureur.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ <h3>{{ _('admin.view.participation') }}</h3>
6363
<th scope="col">parcours</th>
6464
<th scope="col">edition</th>
6565
<th scope="col">date</th>
66+
<th scope="col">dossard</th>
67+
<th scope="col">rank</th>
6668
</tr>
6769
</thead>
6870
<tbody>
@@ -71,6 +73,8 @@ <h3>{{ _('admin.view.participation') }}</h3>
7173
<th>{{inscription.parcours.name}}</th>
7274
<th>{{inscription.edition.name}}</th>
7375
<th>{{inscription.edition.edition_date.strftime('%d.%m.%Y')}}</th>
76+
<th>{% if inscription.dossard %}{{inscription.dossard}}{% endif %}</th>
77+
<th>{# {% if inscription.dossard %}{{inscription.dossard}}{% endif %} #}</th>
7478
</tr>
7579
{% endfor %}
7680
</tbody>

flask_app/admin/editions/dossard/__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ def change_dossard(data):
5656
db.session.commit()
5757
return True
5858

59+
@socketio.on('change_presence', namespace='/dossard')
60+
def set_presence(data):
61+
if not data.get('presence') is not None or not data.get('inscription_id'):
62+
return False
63+
64+
inscription:Inscription = Inscription.query.get(data['inscription_id'])
65+
if not inscription:
66+
return False
67+
if inscription.edition.edition_date>datetime.now():
68+
return False
69+
70+
inscription.present = bool(data['presence'])
71+
db.session.commit()
72+
return True
73+
5974
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard/generate', methods=['POST', 'GET'])
6075
@login_required
6176
@admin_required

flask_app/admin/editions/dossard/templates/generate_dossard.html

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
<th scope="col">coureur</th>
1010
<th scope="col">dossard</th>
1111
<th scope="col">parcours</th>
12+
{% if now > edition_data.edition_date %}
13+
<th scope="col">present</th>
14+
{% endif %}
1215
</tr>
1316
</thead>
1417
<tbody>
@@ -17,6 +20,15 @@
1720
<td>{{inscription.inscrit.name}}</td>
1821
<td id="inscription_{{inscription.id}}"><a href="javascript:change_dossard({{inscription.id}})"><i class="fa-solid fa-pen-to-square"></i></a> {% if inscription.dossard %}{{inscription.dossard}}{% endif %}</td>
1922
<td>{{inscription.parcours.name}}</td>
23+
{% if now > edition_data.edition_date %}
24+
<td><div class="form-check form-switch"><input id="presence_{{inscription.id}}" class="form-check-input" type="checkbox" {% if inscription.present %}checked{% endif %} ></div></td>
25+
<script>
26+
document.getElementById("presence_{{inscription.id}}").addEventListener('click', function(event){
27+
event.preventDefault()
28+
change_presence({{inscription.id}}, this)
29+
})
30+
</script>
31+
{% endif %}
2032
</tr>
2133
{% endfor %}
2234
</tbody>
@@ -43,6 +55,22 @@
4355
}
4456
}
4557

58+
function change_presence(inscription_id, button){
59+
checked = button.checked
60+
if(checked==false){
61+
if (!window.confirm('quoi une personne vient de partire alors qu\'elle étais là??')){
62+
return
63+
}
64+
}
65+
66+
socket.emit('change_presence', {'inscription_id':inscription_id, 'presence':checked},
67+
function(response){
68+
if(response){
69+
button.checked = checked
70+
}
71+
})
72+
}
73+
4674
</script>
4775

4876
{% endblock content %}

flask_app/admin/editions/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from flask_app.custom_field import MultiCheckboxFieldWithDescription
55

66
class Edition_form(FlaskForm):
7-
name = StringField('nom de l\'edition', validators=[DataRequired(), Length(max=20)])
7+
name = StringField('nom de l\'edition', validators=[DataRequired(), Length(max=40)])
88
edition_date = DateTimeLocalField('date le l\'edition', format='%Y-%m-%dT%H:%M', render_kw={}, validators=[DataRequired(), DateTimeNotPast()])
99
parcours = MultiCheckboxFieldWithDescription('parcours', validators=[DataRequired()])
1010
first_inscription = DateTimeLocalField('date d\'ouverture des inscriptions', format='%Y-%m-%dT%H:%M', render_kw={}, validators=[DataRequired(), DateTimeNotPast(), DateTimeBefore('last_inscription')])

flask_app/admin/editions/parcours/__init__.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import time
1+
from datetime import datetime
22
from flask import Blueprint, redirect, render_template, flash, request, jsonify, session
33
from flask_app import admin_required, db, set_route, lang_url_for as url_for, socketio
44
from flask_app.admin.parcours import calc_points_dist
55
from flask_login import login_required, current_user
66
from flask_app.models import Event, Edition, PassageKey, Stand, Parcours, Passage, User, Inscription, Trace
7-
from datetime import datetime
8-
from flask_app.admin.editions.passages.form import NewKeyForm, ChronoLoginForm, ChronoLoginForm, SetPassageForm
9-
import secrets
107
from flask_socketio import join_room, leave_room, emit
118
from flask_app.admin.editions.passages import get_passage_data
129

@@ -35,19 +32,40 @@ def parcours_disconnect():
3532
def get_parcours_passages(parcours):
3633
parcours = Parcours.query.get(parcours)
3734
edition = Edition.query.get(session['room'].split('-')[3])
38-
inscription:list[Inscription] = Inscription.query.filter_by(edition=edition, parcours=parcours).all()
35+
inscriptions:list[Inscription] = Inscription.query.filter_by(edition=edition, parcours=parcours).all()
3936
data = []
40-
for coureur in inscription:
37+
for coureur in inscriptions:
4138
passage = coureur.passages.order_by(Passage.time_stamp.desc()).first()
39+
first_passage:Passage = coureur.passages.order_by(Passage.time_stamp.asc()).first()
4240
if coureur.has_started():
43-
ic(coureur.has_started(), coureur.has_finish(), coureur.has_all_right())
4441
pass_data = get_passage_data(passage, json=True)
45-
pass_data.update({'started':True, 'finish':coureur.has_finish(), 'all_right':coureur.has_all_right()})
42+
pass_data.update({'started':True, 'start_time':first_passage.time_stamp.timestamp(), 'id':coureur.id, 'finish':coureur.has_finish(), 'all_right':coureur.has_all_right(), 'end':coureur.end})
4643
data.append(pass_data)
4744
else:
48-
data.append({'started':False, 'dossard':coureur.dossard, 'name':coureur.inscrit.name})
45+
data.append({'started':False, 'id':coureur.id, 'dossard':coureur.dossard, 'name':coureur.inscrit.name})
4946
return data
5047

48+
@socketio.on('launch_parcours', namespace='/edition/parcours')
49+
def launch_parcours(data):
50+
parcours = Parcours.query.get(data['parcours_id'])
51+
edition = Edition.query.get(session['room'].split('-')[3])
52+
if parcours is not None and data.get('start_time'):
53+
start_time =datetime.fromtimestamp(data['start_time']/1000)
54+
for inscription in edition.inscriptions.filter(Inscription.parcours==parcours).all():
55+
if inscription.passages.count()==0:
56+
passage = Passage(time_stamp=start_time, inscription_id = inscription.id)
57+
db.session.add(passage)
58+
db.session.commit()
59+
db.session.refresh(passage)
60+
emit('new_passage', {'time':str(start_time), 'user':inscription.inscrit.username, 'dossard':inscription.dossard,'key':'', 'stand':passage.get_stand().name}, namespace='/dashboard', to=f'{passage.key.event.id}-{passage.key.edition.id}')
61+
62+
first_passage:Passage = inscription.passages.order_by(Passage.time_stamp.asc()).first()
63+
pass_data = get_passage_data(passage, json=True)
64+
pass_data.update({'started':True, 'parcours_id':inscription.parcours.id, 'start_time':first_passage.time_stamp.timestamp() , 'id':inscription.id, 'finish':inscription.has_finish(), 'all_right':inscription.has_all_right(), 'end':inscription.end})
65+
emit('new_passage', pass_data, namespace='/edition/parcours', to=f'edition-parcours-{inscription.event.id}-{inscription.edition.id}')
66+
67+
68+
5169
@set_route(parcours, '/event/<event_name>/editions/<edition_name>/parcours')
5270
@login_required
5371
@admin_required

0 commit comments

Comments
 (0)