@@ -35,24 +35,28 @@ def get_parcours_passages(parcours):
3535 inscriptions :list [Inscription ] = Inscription .query .filter_by (edition = edition , parcours = parcours ).all ()
3636 data = []
3737 for coureur in inscriptions :
38- passage = coureur .passages . order_by ( Passage . time_stamp . desc ()). first ()
38+ passage = coureur .get_last_passage ()
3939 first_passage :Passage = coureur .passages .order_by (Passage .time_stamp .asc ()).first ()
4040 if coureur .has_started ():
4141 pass_data = get_passage_data (passage , json = True )
4242 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 })
4343 data .append (pass_data )
4444 else :
45- data .append ({'started' :False , 'id' :coureur .id , 'dossard' :coureur .dossard , 'name' :coureur .inscrit .name })
45+ pass_data = {'parcours' :[], 'started' :False , 'id' :coureur .id , 'dossard' :coureur .dossard , 'name' :coureur .inscrit .name }
46+ for stand , dist in zip (coureur .parcours .iter_chrono_list (), coureur .parcours .get_chrono_dists ()):
47+ pass_data ['parcours' ].append ({'stand' :{'name' :stand .name }, 'dist' :round (dist , 3 ), 'delta' :'' , 'succes' :None })
48+ data .append (pass_data )
4649 return data
4750
4851@socketio .on ('launch_parcours' , namespace = '/edition/parcours' )
4952def launch_parcours (data ):
50- parcours = Parcours .query .get (data [ 'parcours_id' ] )
53+ parcours = Parcours .query .get (data . get ( 'parcours_id' ) )
5154 edition = Edition .query .get (session ['room' ].split ('-' )[3 ])
5255 if parcours is not None and data .get ('start_time' ):
5356 start_time = datetime .fromtimestamp (data ['start_time' ]/ 1000 )
57+ inscription :Inscription
5458 for inscription in edition .inscriptions .filter (Inscription .parcours == parcours ).all ():
55- if inscription .passages . count () == 0 :
59+ if inscription .has_started () and inscription . present :
5660 passage = Passage (time_stamp = start_time , inscription_id = inscription .id )
5761 db .session .add (passage )
5862 db .session .commit ()
@@ -64,7 +68,55 @@ def launch_parcours(data):
6468 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 })
6569 emit ('new_passage' , pass_data , namespace = '/edition/parcours' , to = f'edition-parcours-{ inscription .event .id } -{ inscription .edition .id } ' )
6670
67-
71+ @socketio .on ('launch_parcours' , namespace = '/edition/parcours' )
72+ def stop_parcours (data ):
73+ parcours = Parcours .query .get (data .get ('parcours_id' ))
74+ edition = Edition .query .get (session ['room' ].split ('-' )[3 ])
75+
76+ if parcours is not None :
77+ inscription :Inscription
78+ for inscription in edition .inscriptions .filter (Inscription .parcours == parcours ).all ():
79+ if inscription .end is None :
80+ if inscription .has_started ():
81+ if inscription .has_finish ():
82+ if inscription .has_all_right ():
83+ end = 'finish'
84+ else :
85+ end = 'disqual'
86+ else :
87+ end = 'abandon'
88+ else :
89+ end = 'absent'
90+
91+ inscription .end = end
92+ db .session .commit ()
93+ emit ('stop' , {'type' :end , 'inscription_id' :inscription .id }, namespace = '/edition/parcours' , to = f'edition-parcours-{ inscription .event .id } -{ inscription .edition .id } ' )
94+
95+ @socketio .on ('disqualify' , namespace = '/edition/parcours' )
96+ def disqualify (data ):
97+ inscription = Inscription .query .get (data .get ('inscription_id' ))
98+ if inscription :
99+ inscription .end = 'disqual'
100+ db .session .commit ()
101+ emit ('stop' , {'type' :'disqual' , 'inscription_id' :inscription .id }, namespace = '/edition/parcours' , to = f'edition-parcours-{ inscription .event .id } -{ inscription .edition .id } ' )
102+
103+ @socketio .on ('abandon' , namespace = '/edition/parcours' )
104+ def abandon (data ):
105+ if data .get ('inscription_id' ):
106+ inscription = Inscription .query .get (data ['inscription_id' ])
107+ inscription .end = 'abandon'
108+ db .session .commit ()
109+ emit ('stop' , {'type' :'abandon' , 'inscription_id' :inscription .id }, namespace = '/edition/parcours' , to = f'edition-parcours-{ inscription .event .id } -{ inscription .edition .id } ' )
110+
111+ @socketio .on ('finish' , namespace = '/edition/parcours' )
112+ def finish (data ):
113+ if data .get ('inscription_id' ):
114+ inscription :Inscription = Inscription .query .get (data ['inscription_id' ])
115+ if not inscription .has_finish ():
116+ return False
117+ inscription .end = 'finish'
118+ db .session .commit ()
119+ emit ('stop' , {'type' :'finish' , 'inscription_id' :inscription .id }, namespace = '/edition/parcours' , to = f'edition-parcours-{ inscription .event .id } -{ inscription .edition .id } ' )
68120
69121@set_route (parcours , '/event/<event_name>/editions/<edition_name>/parcours' )
70122@login_required
@@ -75,5 +127,9 @@ def view(event_name, edition_name):
75127 edition :Edition = event .editions .filter_by (name = edition_name ).first_or_404 ()
76128 parcours = edition .parcours
77129
78- return render_template ('edition_parcours.html' , parcours_data = parcours , edition_data = edition , event_data = event , user_data = user , event_modif = True , edition_sidebar = True )
130+ if 0 and edition .edition_date > datetime .now ():
131+ flash ('l\' edition n\' as pas encore commencé' , 'warning' )
132+ return redirect (url_for ('admin.editions.modify_edition_page' , edition_name = edition .name , event_name = event .name ))
133+
134+ return render_template ('edition_parcours.html' , parcours_data = parcours , edition_data = edition , event_data = event , user_data = user , event_modif = True , edition_sidebar = True , now = datetime .now ())
79135
0 commit comments