Skip to content

Commit 72f2073

Browse files
07.02.2025_fix bug add pwd hash and modify layout style
1 parent 22d1fe4 commit 72f2073

34 files changed

Lines changed: 497 additions & 535 deletions

File tree

README.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1-
command to launch the server:
1+
# chrono des vignes
2+
chrono des vignes est une web app codée en python avec le framework [Flask](https://pypi.org/project/Flask/) pour le back-end et html javascript pour le front-end
23

3-
flask --app flask_app run --debug --extra-files flask-app/templates/:flask_app/translations/
4+
## lancer le serveur
5+
pour lancer le serveur flask il vous faut d'abord lancer l'environement virtuel(venv)
6+
```bash
7+
.venv/Scripts/Activate.ps1
8+
```
9+
10+
puis lancer le serveur
11+
```bash
12+
flask --app flask_app run --debug --extra-files flask-app/templates/:flask_app/translations/
13+
```
14+
15+
## documentation mkdocs
16+
17+
### serveur de developpement
18+
commencer par [ouvrire l'environement virtuel](#lancer-le-serveur)
19+
20+
puis rentrer dans le dossier de la documentation
21+
```bash
22+
cd flask_app/templates/doc
23+
```
24+
puis lancer le serveur
25+
``` bash
26+
mkdocs serve
27+
```
28+
### construire la documentation
29+
[lancer l'environement](#lancer-le-serveur) et [rentrer dans le dossier de la documentation](#serveur-de-developpement)
30+
puis construire la documentation
31+
```bash
32+
mkdocs build
33+
```

flask_app/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
LANGAGES = ['de', 'fr', 'en']
2424
if DEV_ENABLE:
2525
LANGAGES += ['ids', 'pseudo']
26+
PICTURE_SIZE = (200, 200)
2627

2728
app = Flask(__name__)
2829
app.config['SERVER_NAME'] = 'localhost:5000'

flask_app/admin/editions/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def modify_edition_page(event_name, edition_name):
100100
#? fin desactivation des champs
101101

102102
if form.validate_on_submit():
103+
ic(edition.rdv_lat, form.rdv_lat.data, edition.rdv_lng, form.rdv_lng.data)
103104
if form.name.data == edition.name or not event.editions.filter_by(name=form.name.data).first():
104105
edition.name = form.name.data
105106
edition.edition_date = form.edition_date.data

flask_app/admin/editions/dossard/__init__.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from xlsxwriter import Workbook
99
from io import BytesIO
1010
from flask_babel import _
11-
from flask_app.custom_validators import DataRequired, Length, EqualTo, DonTExist, DbLength
11+
from flask_app.custom_validators import DataRequired, Length, EqualTo, DonTExist, DbLength, Email
1212
from .form import NewCoureurForm, ValidateNewCoureurForm
1313
from sqlalchemy import func, and_, or_, not_
1414

@@ -17,7 +17,7 @@
1717
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard', methods=['POST', 'GET'])
1818
@login_required
1919
@admin_required
20-
def generate_dossard(event_name, edition_name):
20+
def edition_dossards(event_name, edition_name):
2121
event : Event = Event.query.filter_by(name=event_name).first_or_404()
2222
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
2323
user = current_user
@@ -39,15 +39,18 @@ def generate_dossard(event_name, edition_name):
3939
'name':[DataRequired(), DbLength(User, 'name')],
4040
'lastname':[DataRequired(), DbLength(User, 'lastname')],
4141
'username':[DataRequired(), DbLength(User, 'username')],
42-
'email':[DataRequired(), DbLength(User, 'email')]
42+
'email':[DataRequired(), DbLength(User, 'email'), Email()]
4343
}
4444
ic('first validation', form.validate(extra_validators=supp_validators), form.parcours.data)
4545
if form.validate(extra_validators=supp_validators):
4646
# create a new user with the form data and add it to all the parcours
47-
username=f'{form.name.data}.{form.lastname.data}'
48-
nb = User.query.filter(User.username.contains(username)).count()
49-
username += str(nb) if nb>0 else ''
50-
hash_pwd= 'dev' #! ''.join(secrets.choice(alphabet) for _ in range(10))
47+
if form.username.data:
48+
username = form.username.data
49+
else:
50+
username = f'{form.name.data}.{form.lastname.data}'
51+
nb = User.query.filter(User.username.contains(username)).count()
52+
username += str(nb) if nb>0 else ''
53+
hash_pwd= 'dev' # ! ''.join(secrets.choice(alphabet) for _ in range(10))
5154

5255
choices = event.parcours.filter(Parcours.name.in_([eval(data)[0] for data in form.parcours.data])).all()
5356
user = User(name=form.name.data,
@@ -79,6 +82,9 @@ def generate_dossard(event_name, edition_name):
7982
@login_required
8083
@admin_required
8184
def validate_new_user(event_name, edition_name):
85+
'''
86+
validate a new user that is already registered in the database
87+
'''
8288
event = Event.query.filter_by(name=event_name).first_or_404()
8389
edition : Edition= event.editions.filter_by(name=edition_name).first_or_404()
8490
form = ValidateNewCoureurForm()
@@ -101,7 +107,7 @@ def validate_new_user(event_name, edition_name):
101107

102108
flash(_('flash.success.newuser:username:name:lastname').format(username=user.username, name=user.name, lastname=user.lastname), 'success')
103109

104-
return redirect(url_for('admin.editions.dossard.generate_dossard', event_name=event_name, edition_name=edition_name))
110+
return redirect(url_for('admin.editions.dossard.edition_dossards', event_name=event_name, edition_name=edition_name))
105111
else:
106112
return {'ok':False}
107113

@@ -164,7 +170,7 @@ def generate_all_dossard(event_name, edition_name):
164170
last_dossard+=1
165171
db.session.commit()
166172

167-
return redirect(url_for("admin.editions.dossard.generate_dossard", event_name=event.name, edition_name=edition.name))
173+
return redirect(url_for("admin.editions.dossard.edition_dossards", event_name=event.name, edition_name=edition.name))
168174

169175

170176
# methode for download dossard as excel

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
{% endfor %}
3434
</tbody>
3535
</table>
36+
<script>
37+
$('table tbody tr').on('click', function() {
38+
window.location.href = $(this).data('href');
39+
});
40+
</script>
3641

3742
<a class="btn bg-info" href="{{ url_for('admin.editions.dossard.generate_all_dossard', event_name=event_data.name, edition_name=edition_data.name) }}">{{ _('admin.editions.dossard.generer') }}</a>
3843
<a class="btn bg-success" href="{{ url_for('admin.editions.dossard.export_dossard', event_name=event_data.name, edition_name=edition_data.name) }}" target="_blank" rel="noopener noreferrer">{{ _('admin.editions.dossard.export_excel') }}</a>

flask_app/admin/editions/passages/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
from .form import NewKeyForm, ChronoLoginForm, ChronoLoginForm
99
import secrets
1010
from flask_socketio import join_room, leave_room, emit
11+
from flask_babel import _
1112

1213
passages = Blueprint('passages', __name__, template_folder='templates')
14+
1315
@login_required
1416
@admin_required
1517
@set_route(passages, "/event/<event_name>/editions/<edition_name>/dashboard", methods=['get', 'post'])
@@ -56,6 +58,20 @@ def dashboard(event_name, edition_name):
5658

5759
return render_template('dashboard.html', event_data=event, edition_data = edition, user_data=user, now = datetime.now(), keys=keys, passages=passages, form=form, event_modif=True, edition_sidebar=True)
5860

61+
@login_required
62+
@admin_required
63+
@set_route(passages, '/event/<event_name>/editions/<edition_name>/delete/<key_id>')
64+
def delete_key(event_name, edition_name, key_id:int):
65+
key:PassageKey = PassageKey.query.filter_by(id=key_id).first_or_404()
66+
if key.passages.count()==0:
67+
db.session.delete(key)
68+
db.session.commit()
69+
flash(_('flash.key_deleted'), 'success')
70+
return redirect(url_for('admin.editions.passages.dashboard', event_name=event_name, edition_name=edition_name))
71+
else:
72+
flash(_('flash.key_not_deleted'), 'danger')
73+
return redirect(url_for('admin.editions.passages.dashboard', event_name=key.event.name, edition_name=key.edition.name))
74+
5975
@set_route(passages, '/chrono', methods=["GET", 'post'])
6076
def chrono_home():
6177
user = current_user if current_user.is_authenticated else None

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
{% endfor %}
2020
</ul>
2121
</div>
22-
<span class="badge rounded-pill bg-info">{{ key.key }}</span>
22+
<div class="d-flex justify-content-between align-items-center">
23+
<span class="badge rounded-pill bg-info me-4">{{ key.key }}</span>
24+
<a href="{{ url_for('admin.editions.passages.delete_key', event_name=event_data.name, edition_name=edition_data.name, key_id=key.id) }}">
25+
<i class="fa-regular fa-circle-xmark" style="color: #ff0000;"></i>
26+
</a>
27+
</div>
2328
</li>
2429
{% endfor %}
2530
</ul>

flask_app/admin/editions/result/templates/result.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,10 @@ <h2>{{ parcours }}</h2>
3434
{% endfor %}
3535
</tbody>
3636
</table>
37+
<script>
38+
$('table tbody tr').on('click', function() {
39+
window.location.href = $(this).data('href');
40+
});
41+
</script>
3742
{% endfor %}
3843
{% endblock content %}

flask_app/admin/editions/templates/edition-sidebar.html

Lines changed: 0 additions & 31 deletions
This file was deleted.

flask_app/admin/editions/templates/modify_edition.html

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
11
{% extends 'layout.html' %}
2-
{% from 'macro.html' import form_field, submit, map_field, label_span, input_span %}
2+
{% from 'macro.html' import form_field, submit, map_field, label_span, input_span, multiple_select_field %}
33
{% block content %}
44
<form action="" method="post">
55
{{ form.hidden_tag() }}
66
{{ form_field(form.name) }}
77
{{ form_field(form.edition_date) }}
88
{{ form_field(form.description) }}
9-
<div class="mb-3 row" id="parcours">{# parcours ne pas remplacer par macro car style different!! #}
10-
{{ form.parcours.label(class="col-sm-"+label_span+" col-form-label") }}
11-
<div class="col-sm-{{input_span}}">
12-
{% if form.parcours.errors %}
13-
{{ form.parcours(class="form-control form-control-lg is-invalid list-group") }}
14-
<div class="invalid-feedback">
15-
{% for error in form.parcours.errors %}
16-
<span>{{ error }}</span>
17-
{% endfor %}
18-
</div>
19-
{% else %}
20-
{{ form.parcours(class="form-control form-control-lg list-group") }}
21-
{% endif %}
22-
</div>
23-
</div>
9+
{{ multiple_select_field(form.parcours) }}
2410
{{ form_field(form.first_inscription) }}
2511
{{ form_field(form.last_inscription) }}
2612
{{ form_field(form.rdv_lat, input_id='lat_id', div_class='d-none') }}
2713
{{ form_field(form.rdv_lng, input_id='lng_id', div_class='d-none') }}
28-
{{ map_field(_('form.editionrdv'), 'lat_id', 'lng_id', form.rdv_lat.data, form.rdv_lng.data) }}
14+
{{ map_field(_('form.editionrdv'), 'lat_id', 'lng_id', form.rdv_lat.data, form.rdv_lng.data, disabled=(form.rdv_lat.render_kw.disabled == 'disabled' or form.rdv_lng.render_kw.disabled == 'disabled')) }}
2915
{{ submit(form) }}
3016
</form>
17+
{{(form.rdv_lat.render_kw.disabled == 'disabled' or form.rdv_lng.render_kw.disabled == 'disabled')}}---
18+
{{form.rdv_lat.render_kw.disabled}}---{{ form.rdv_lng.render_kw.disabled}}
3119

3220
<!-- Modal -->
3321

0 commit comments

Comments
 (0)