Skip to content

Commit 1bb5dec

Browse files
23.10.2024_ajout profil utilisateur
1 parent 8c28309 commit 1bb5dec

20 files changed

Lines changed: 684 additions & 265 deletions

File tree

flask_app/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import os
1111
install()
1212

13-
1413
# met la langue en francais pour le formatage des dates
1514
import locale
1615
locale.setlocale(locale.LC_TIME,'')

flask_app/admin/editions/__init__.py

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from datetime import datetime
77
from flask_app.admin.editions.dossard import dossard
88
from flask_app.admin.editions.passages import passages
9+
from flask_app.admin.editions.parcours import parcours
910
from sqlalchemy import or_
1011

1112
editions = Blueprint('editions', __name__, template_folder='templates')
1213
editions.register_blueprint(dossard)
1314
editions.register_blueprint(passages)
15+
editions.register_blueprint(parcours)
1416

1517
@set_route(editions, '/event/<event_name>/editions', methods=['POST', 'GET'])
1618
@login_required
@@ -112,25 +114,3 @@ def modify_edition_page(event_name, edition_name):
112114
else:
113115
form.name.errors = list(form.name.errors)+['vous utiliser deja ce nom.']
114116
return render_template('modify_edition.html', user_data=user, event_data=event, edition_data=edition, form = form, now=datetime.now(), event_modif=True, edition_sidebar=True)
115-
116-
@set_route(editions, '/event/<event_name>/editions/<edition_name>/generate_dossard', methods=['POST', 'GET'])
117-
@login_required
118-
@admin_required
119-
def generate_dossard(event_name, edition_name):
120-
event : Event = Event.query.filter_by(name=event_name).first_or_404()
121-
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
122-
user = current_user
123-
124-
125-
return render_template('generate_dossard.html', user_data=user, event_data=event, edition_data=edition, now=datetime.now(), inscriptions=edition.inscriptions, event_modif=True, edition_sidebar=True)
126-
127-
128-
@set_route(editions, '/event/<event_name>/editions/<edition_name>/generate_dossard/generate', methods=['POST', 'GET'])
129-
@login_required
130-
@admin_required
131-
def generate_all_dossard(event_name, edition_name):
132-
event : Event = Event.query.filter_by(name=event_name).first_or_404()
133-
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
134-
user = current_user
135-
136-
return redirect(url_for("admin.editions.generate_dossard", event_name=event.name, edition_name=edition.name))
Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,77 @@
1-
from flask import Blueprint, flash, render_template, redirect
2-
from flask_app import admin_required, db, set_route
1+
from flask import Blueprint, flash, render_template, redirect, url_for, request, session
2+
from flask_app import admin_required, db, set_route, socketio
33
from flask_app.admin.editions.forms import Edition_form
44
from flask_login import login_required, current_user
5-
from flask_app.models import Event, Parcours, Edition
5+
from flask_app.models import Event, Parcours, Edition, Inscription
66
from datetime import datetime
7+
from flask_socketio import join_room, leave_room
78

89
dossard = Blueprint('dossard', __name__, template_folder='templates')
910

10-
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard', methods=['POST', 'GET'])
11+
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/modify_dossard', methods=['POST', 'GET'])
1112
@login_required
1213
@admin_required
1314
def dossard_page(event_name, edition_name):
1415
user = current_user
15-
return render_template('dossard.html', user_data=user, pyscript=True)
16+
return render_template('dossard.html', user_data=user, pyscript=True)
17+
18+
19+
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard', methods=['POST', 'GET'])
20+
@login_required
21+
@admin_required
22+
def generate_dossard(event_name, edition_name):
23+
event : Event = Event.query.filter_by(name=event_name).first_or_404()
24+
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
25+
user = current_user
26+
27+
28+
return render_template('generate_dossard.html', user_data=user, event_data=event, edition_data=edition, now=datetime.now(), inscriptions=edition.inscriptions, event_modif=True, edition_sidebar=True)
29+
30+
@socketio.on('connect', namespace='/dossard')
31+
def dossard_connect(auth):
32+
ic(current_user, auth, request.sid)
33+
if current_user.is_authenticated and auth.get('event_id') and auth.get('edition_id'):
34+
event:Event = Event.query.get(auth['event_id'])
35+
if not event or event.createur != current_user:
36+
return False # connection not allowed
37+
edition = event.editions.filter_by(id=auth['edition_id']).first()
38+
if not edition:
39+
return False # connection not allowed
40+
else:
41+
False # connection not allowed
42+
43+
@socketio.on('disconnect', namespace='/dossard')
44+
def dossard_disconnect():
45+
pass
46+
47+
@socketio.on('change_dossard', namespace='/dossard')
48+
def change_dossard(data):
49+
inscription = Inscription.query.get(data['inscription_id'])
50+
ic(data)
51+
if (not inscription and isinstance(data['new_dossard'], int) and not current_user.is_authenticated and inscription.event.createur == current_user):
52+
return False
53+
if Inscription.query.filter(Inscription.dossard == data['new_dossard'], Inscription.edition==inscription.edition, Inscription.id!=inscription.id).first():
54+
return {'erreur':'dossard déjà utilisé'}
55+
inscription.dossard = data['new_dossard']
56+
db.session.commit()
57+
return True
58+
59+
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard/generate', methods=['POST', 'GET'])
60+
@login_required
61+
@admin_required
62+
def generate_all_dossard(event_name, edition_name):
63+
event : Event = Event.query.filter_by(name=event_name).first_or_404()
64+
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
65+
user = current_user
66+
67+
ic(edition.inscriptions.count())
68+
dossard_nb = [inscription.dossard for inscription in edition.inscriptions.filter(Inscription.dossard!=None).all()]
69+
last_dossard = 1
70+
for inscription in edition.inscriptions.filter(Inscription.dossard==None).all():
71+
while last_dossard in dossard_nb:
72+
last_dossard+=1
73+
inscription.dossard = last_dossard
74+
last_dossard+=1
75+
db.session.commit()
76+
77+
return redirect(url_for("admin.editions.dossard.generate_dossard", event_name=event.name, edition_name=edition.name))
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{% 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 %}
5+
{% block content %}
6+
<table class="table">
7+
<thead>
8+
<tr>
9+
<th scope="col">coureur</th>
10+
<th scope="col">dossard</th>
11+
<th scope="col">parcours</th>
12+
</tr>
13+
</thead>
14+
<tbody>
15+
{% for inscription in inscriptions | sort(attribute="inscrit.name") %}
16+
<tr>
17+
<td>{{inscription.inscrit.name}}</td>
18+
<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>
19+
<td>{{inscription.parcours.name}}</td>
20+
</tr>
21+
{% endfor %}
22+
</tbody>
23+
</table>
24+
25+
<a class="btn bg-info" href="{{ url_for('admin.editions.dossard.generate_all_dossard', event_name=event_data.name, edition_name=edition_data.name) }}">generer</a>
26+
27+
<script>
28+
var socket = io('/dossard', {auth:{'event_id': {{ event_data.id }}, 'edition_id': {{ edition_data.id }} } })
29+
function change_dossard(inscription_id){
30+
console.log(inscription_id)
31+
let new_dossard = parseInt(window.prompt('enter the new dossard number'))
32+
if (new_dossard){
33+
socket.emit('change_dossard', {'inscription_id':inscription_id, 'new_dossard':new_dossard},
34+
function(response){
35+
if (response == true){
36+
let node = document.getElementById(`inscription_${inscription_id}`)
37+
let html = `<a href="javascript:change_dossard(${inscription_id})"><i class="fa-solid fa-pen-to-square"></i></a> ${new_dossard}`
38+
node.innerHTML = html
39+
} else if (response != false) {
40+
window.alert(response.erreur)
41+
}
42+
})
43+
}
44+
}
45+
46+
</script>
47+
48+
{% endblock content %}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import time
2+
from flask import Blueprint, redirect, render_template, flash, request, jsonify, session
3+
from flask_app import admin_required, db, set_route, lang_url_for as url_for, socketio
4+
from flask_app.admin.parcours import calc_points_dist
5+
from flask_login import login_required, current_user
6+
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
10+
from flask_socketio import join_room, leave_room, emit
11+
12+
parcours = Blueprint('parcours', __name__, template_folder='templates')
13+
14+
@set_route(parcours, '/event/<event_name>/editions/<edition_name>/parcours')
15+
@login_required
16+
@admin_required
17+
def view(event_name, edition_name):
18+
user = current_user
19+
event = Event.query.filter_by(name=event_name).first_or_404()
20+
edition:Edition = event.editions.filter_by(name=edition_name).first_or_404()
21+
parcours = edition.parcours
22+
return render_template('edition_parcours.html', parcours_data=parcours, edition_data = edition, event_data=event, user_data=user, event_modif=True, edition_sidebar=True)
23+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{% extends 'layout.html' %}
2+
{% block content %}
3+
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
4+
{% for parcours in parcours_data %}
5+
<li class="nav-item" role="presentation">
6+
<button class="nav-link {% if loop.index0==0 %}active{% endif %}" id="{{ parcours.id }}-tab" data-bs-toggle="pill" data-bs-target="#pills-{{ parcours.id }}" type="button" role="tab" aria-controls="pills-{{ parcours.id }}" aria-selected="{% if loop.index0==0 %}true{% else %}false{% endif %}">{{ parcours.name }}</button>
7+
</li>
8+
{% endfor %}
9+
</ul>
10+
<div class="tab-content" id="pills-tabContent">
11+
{% for parcours in parcours_data %}
12+
<div class="tab-pane fade {% if loop.index0==0 %}show active{% endif %}" id="pills-{{ parcours.id }}" role="tabpanel" aria-labelledby="pills-{{ parcours.id }}-tab">
13+
...
14+
</div>
15+
{% endfor %}
16+
</div>
17+
{% endblock %}

0 commit comments

Comments
 (0)