Skip to content

Commit 8c28309

Browse files
19102024_amelioration affichage passages
1 parent 97dcb05 commit 8c28309

5 files changed

Lines changed: 109 additions & 15 deletions

File tree

flask_app/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from flask_colorpicker import colorpicker
77
from icecream import install
88
from flask_babel import Babel, lazy_gettext, gettext, _
9+
from flask_socketio import SocketIO
910
import os
1011
install()
1112

@@ -33,6 +34,8 @@
3334

3435
migrate = Migrate(app, db)
3536

37+
socketio = SocketIO(app)
38+
3639
login_manager = LoginManager()
3740
login_manager.init_app(app)
3841
login_manager.login_view = 'users.login'

flask_app/admin/editions/passages/__init__.py

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,76 @@ def parcours_chrono_list_dist(parcours:Parcours, dist_stand:list[int]):
101101
else:
102102
break
103103

104+
def get_passage_data(passage:Passage)->dict:
105+
data={'dossard':passage.inscription.dossard,
106+
'name':passage.inscription.inscrit.name,
107+
'time_stamp':passage.time_stamp,
108+
'parcours':[]}
109+
110+
user_passages:list[Passage] = Passage.query.filter(Passage.inscription==passage.inscription, Passage.time_stamp<=passage.time_stamp).all()
111+
if len(user_passages)>0:
112+
first_passage = user_passages[0]
113+
for stand, dist in zip(passage.inscription.parcours.iter_chrono_list(), passage.inscription.parcours.get_chrono_dists()):
114+
if len(user_passages)>0 and stand == user_passages[0].get_stand():
115+
delta=user_passages[0].time_stamp-first_passage.time_stamp
116+
days = delta.days
117+
hours, remainder = divmod(delta.seconds, 3600)
118+
minutes, seconds = divmod(remainder, 60)
119+
delta= f"{f'{days} days, 'if days>0 else ''}{hours:02}:{minutes:02}:{seconds:02}"
120+
user_passages.pop(0)
121+
succes=True
122+
elif len(user_passages)>0:
123+
delta=None
124+
succes=False
125+
else:
126+
succes=None
127+
delta=None
128+
129+
data['parcours'].append({'stand':stand, 'dist':round(dist, 3), 'delta':delta, 'succes':succes})
130+
for p in user_passages:
131+
succes=None
132+
delta = p.time_stamp-first_passage.time_stamp
133+
days = delta.days
134+
hours, remainder = divmod(delta.seconds, 3600)
135+
minutes, seconds = divmod(remainder, 60)
136+
delta= f"{f'{days} days, 'if days>0 else ''}{hours:02}:{minutes:02}:{seconds:02}"
137+
data['parcours'].append({'stand':p.get_stand(), 'dist':None, 'delta':delta, 'succes':succes})
138+
139+
return data
140+
141+
def get_key_passage_data(key:PassageKey):
142+
passage:Passage
143+
data = []
144+
for passage in Passage.query.filter_by(key=key).order_by(Passage.time_stamp.asc()).all():
145+
data.append(get_passage_data(passage))
146+
147+
'''passage_user = passage.inscription.inscrit
148+
passage_stand = passage.key.stands.filter_by(parcours=passage.inscription.parcours).first()
149+
passage_chronos_list = list(passage.inscription.parcours.iter_chrono_list())
150+
151+
user_passages = Passage.query.filter(Passage.inscription==passage.inscrit, Passage.time_stamp<=passage.time_stamp).all()
152+
passage_data = [{'stand':stand, 'dist':dist} for stand, dist in zip(passage.inscription.parcours.iter_chrono_list(), passage.inscription.parcours.get_chrono_dists())]
153+
offset = 0
154+
for index, passed_passage in enumerate(user_passages):
155+
index+=offset
156+
if index +1 >= len(passage_chronos_list):
157+
passage_data.append({'user':False})
158+
for stand in passage_chronos_list[index:]:
159+
if passed_stand_id == stand:
160+
ic(user_passages_passage[passage_user.id], Passage.query.get(user_passages_passage[passage_user.id][0]), Passage.query.get(user_passages_passage[passage_user.id][index]))
161+
return_list.append(True)
162+
delta = Passage.query.get(user_passages_passage[passage_user.id][index]).time_stamp-Passage.query.get(user_passages_passage[passage_user.id][0]).time_stamp
163+
days = delta.days
164+
hours, remainder = divmod(delta.seconds, 3600)
165+
minutes, seconds = divmod(remainder, 60)
166+
delta_list.append(f"{f'{days} days, 'if days>0 else ''}{hours:02}:{minutes:02}:{seconds:02}")
167+
break
168+
else:
169+
return_list.append(None)
170+
delta_list.append(None)
171+
offset+=1'''
172+
173+
return data
104174

105175
@set_route(passages, '/chrono/<key_code>')
106176
def chrono_page(key_code):
@@ -111,7 +181,8 @@ def chrono_page(key_code):
111181
flash('l\'edition n\'est pas aujourd\'hui', 'warning')
112182
return redirect(url_for("admin.editions.passages.chrono_home")) """
113183

114-
key_passages = []
184+
key_passages = get_key_passage_data(key)
185+
'''key_passages = []
115186
user_passages_stand = {}
116187
user_passages_passage = {}
117188
passage:Passage
@@ -161,7 +232,7 @@ def chrono_page(key_code):
161232
dist += element.get_dist()
162233
163234
key_passages.append((passage, passage_chronos_list, return_list, delta_list, dist_list))
164-
235+
'''
165236
ic(key_passages)
166237
return render_template('chrono.html', user_data=user, key=key, passages=reversed(key_passages))
167238

flask_app/admin/editions/passages/templates/chrono.html

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{% extends 'layout.html' %}
2+
{% block import %}
3+
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
4+
{% endblock %}
25
{% block content %}
36
<div>
47
<p>clé: {{ key.name }} ({{ key.key }})</p>
@@ -19,14 +22,14 @@
1922
<div class="w-50">
2023
<ul class="list-group mt-4" id="event_list">
2124
{% set r1000 = range(0, 1000) %}
22-
{% for (passage, chronos_list, trajet, delta, dist) in passages %}
23-
{% set id = (r1000 | random | string) + '-' + (passage.time_stamp.timestamp() | string) %}
25+
{% for data in passages %}
26+
{% set id = (r1000 | random | string) + '-' + (data.time_stamp.timestamp() | string) %}
2427
<li class="card mt-2 bg-success" id="event_list_{{ id }}">
2528
<div class="card-header">
2629
<p class="mb-0">
27-
{{passage.inscription.dossard}} {{ passage.inscription.inscrit.name }}
30+
{{data.dossard}} {{ data.name }}
2831
<br>
29-
{{ passage.time_stamp.strftime('%d.%m %H:%M:%S') }}
32+
{{ data.time_stamp.strftime('%d.%m %H:%M:%S') }}
3033
<br>
3134
<button class="btn" onclick="toggleDetails('{{ id }}', this)">
3235
<span class="icon" id="icon-{{ id }}"><i class="fas fa-chevron-right"></i></span>
@@ -38,19 +41,19 @@
3841

3942
<table>
4043
<tbody>
41-
{% for stand in chronos_list %}
44+
{% for passage in data.parcours %}
4245
<tr>
43-
<th class="text-center pe-1"><i class="{% if trajet|length == loop.index %}fa-solid fa-circle fa-l{% else %}fa-regular fa-circle fa-xs{% endif %}" {#{% if trajet|length == loop.index %}style="color: #00ff00"{% endif %}#}></i></th>
44-
<td class="pe-3">{{ stand.name }}</td>
46+
<th class="text-center pe-1"><i class="{% if data.current %}fa-solid fa-circle fa-l{% else %}fa-regular fa-circle fa-xs{% endif %}" {#{% if trajet|length == loop.index %}style="color: #00ff00"{% endif %}#}></i></th>
47+
<td class="pe-3">{{ passage.stand.name }} {{ data.current }}</td>
4548
<td class="pe-3">
46-
{% if trajet[loop.index0]==True %}
47-
{{ delta[loop.index0] }}
48-
{% elif trajet[loop.index0]==None %}
49+
{% if passage.succes==True %}
50+
{{ passage.delta }}
51+
{% elif passage.succes==False %}
4952
<i class="fa-solid fa-xmark"></i>
5053
{% endif %}
5154
</td>
5255
<td>
53-
{{ dist[loop.index0] }} km
56+
{{ passage.dist }} km
5457
</td>
5558
</tr>
5659
{% endfor %}

flask_app/models.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ def iter_chrono_list(self)->Iterator[Stand]:
106106
for id in eval(self.chronos_list):
107107
yield Stand.query.get(id)
108108

109+
def get_chrono_dists(self)->list[float]:
110+
dist=0
111+
dist_list=[]
112+
for e in self:
113+
if isinstance(e, Stand):
114+
if e.chrono:
115+
dist_list.append(dist)
116+
else:
117+
dist+=e.get_dist()
118+
return dist_list
119+
109120
class Stand(db.Model):
110121
__allow_unmapped__ = True
111122
id = db.Column(db.Integer, primary_key=True)
@@ -228,10 +239,13 @@ class Passage(db.Model):
228239
__allow_unmapped__ = True
229240
id = db.Column(db.Integer, primary_key=True)
230241
creation_date=db.Column(db.DateTime, nullable=False, default=datetime.now)
231-
time_stamp=db.Column(db.DateTime, nullable=False)
242+
time_stamp:datetime=db.Column(db.DateTime, nullable=False)
232243
key_id=db.Column(db.Integer, db.ForeignKey('passage_key.id'), nullable=False)
233244
inscription_id = db.Column(db.Integer, db.ForeignKey('inscription.id'), nullable=False)
234245
inscription:Inscription
235246

236247
def __repr__(self) -> str:
237-
return f'<Passage time={self.time_stamp} key={self.key.name} inscription={self.inscription.inscrit.username} >'
248+
return f'<Passage time={self.time_stamp} key={self.key.name} inscription={self.inscription.inscrit.username} >'
249+
250+
def get_stand(self)->Stand:
251+
return self.key.stands.filter_by(parcours=self.inscription.parcours).first()

flask_app/templates/layout.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
src="https://pyscript.net/releases/2024.6.1/core.js"
3232
></script>
3333
{% endif %}
34+
{% block import %}
35+
36+
{% endblock %}
3437
</head>
3538
<body style="min-width: 305px; height: 100vh">
3639
<!-- FontAwesome 6.2.0 CSS -->

0 commit comments

Comments
 (0)