Skip to content

Commit 7ef0ef3

Browse files
23.03.2025_correcting bugs
1 parent 4a86eb1 commit 7ef0ef3

12 files changed

Lines changed: 182 additions & 271 deletions

File tree

README.md

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,10 @@
11
# 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
3-
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 chrono_des_vignes run --debug --extra-files flask-app/templates/:chrono_des_vignes/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 chrono_des_vignes/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-
```
2+
chrono des vignes is a web app made in python and the [Flask](https://pypi.org/project/Flask/) framwork for the back-end and the html, javascript for the front-end
3+
4+
## build the app
5+
to build the app you need to
6+
- rebuild the .venv from the requirement.txt
7+
- open a terminal with the virtual environment
8+
- launch the server with
9+
```shell
10+
$env:FLASK_DEBUG = 1;$env:FLASK_APP = "chrono_des_vignes";flask run --extra-files flask-app/templates/:flask_app/translations/```

babel.md

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

chrono_des_vignes/admin/parcours/templates/parcours.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ <h5 class="modal-title" id="new_edition_label">{{ _('admin.parcours.createnewpar
8181
</div>
8282
<div class="modal-body">
8383
<form action="" method="post" id="new_edition_form">
84-
{{ render_form(form) }}
84+
{{ render_form(form, map_label= _('form.start')) }}
8585
</form>
8686
</div>
8787
<div class="modal-footer">

chrono_des_vignes/babel.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,20 @@
5151
[jinja2: chrono_des_vignes/templates/doc/site/404.html]
5252
[jinja2: chrono_des_vignes/templates/doc/site/index.html]
5353
[jinja2: chrono_des_vignes/templates/doc/site/de/index.html]
54+
[jinja2: chrono_des_vignes/templates/doc/site/de/example/index.html]
5455
[jinja2: chrono_des_vignes/templates/doc/site/de/organisateurs/index.html]
5556
[jinja2: chrono_des_vignes/templates/doc/site/de/organisateurs/coureurs/index.html]
5657
[jinja2: chrono_des_vignes/templates/doc/site/de/organisateurs/edition/index.html]
5758
[jinja2: chrono_des_vignes/templates/doc/site/de/organisateurs/parcours/index.html]
5859
[jinja2: chrono_des_vignes/templates/doc/site/de/users/index.html]
5960
[jinja2: chrono_des_vignes/templates/doc/site/en/index.html]
61+
[jinja2: chrono_des_vignes/templates/doc/site/en/example/index.html]
6062
[jinja2: chrono_des_vignes/templates/doc/site/en/organisateurs/index.html]
6163
[jinja2: chrono_des_vignes/templates/doc/site/en/organisateurs/coureurs/index.html]
6264
[jinja2: chrono_des_vignes/templates/doc/site/en/organisateurs/edition/index.html]
6365
[jinja2: chrono_des_vignes/templates/doc/site/en/organisateurs/parcours/index.html]
6466
[jinja2: chrono_des_vignes/templates/doc/site/en/users/index.html]
67+
[jinja2: chrono_des_vignes/templates/doc/site/example/index.html]
6568
[jinja2: chrono_des_vignes/templates/doc/site/organisateurs/index.html]
6669
[jinja2: chrono_des_vignes/templates/doc/site/organisateurs/coureurs/index.html]
6770
[jinja2: chrono_des_vignes/templates/doc/site/organisateurs/edition/index.html]

chrono_des_vignes/dev/__init__.py

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ def dev_required(func):
3838
"""
3939
Modified login_required decorator to restrict access to dev
4040
"""
41-
4241
@wraps(func)
4342
def decorated_view(*args, **kwargs):
4443
if not app.debug:
45-
flash('dev is not enable')
44+
flash('dev is not enabled')
4645
return abort(404)
4746
return func(*args, **kwargs)
4847
return decorated_view
@@ -65,53 +64,42 @@ def create_cfg():
6564
for path in glob.iglob(f'{app.root_path}/**/*.{ext}', recursive=True):
6665
files += f'\n[{name}: {os.path.relpath(path)}]'.replace('\\', '/')
6766

68-
6967
with open(f'{app.root_path}/babel.cfg', '+w') as file:
7068
file.write(files)
7169

72-
def export_strings(source='en', target:list[str]=None):
73-
target = target if target else LANGAGES
70+
def export_strings(source='en', target=None):
71+
target = target or LANGAGES
7472
with open(f'{app.root_path}/translations/{source}/LC_MESSAGES/messages.po', 'r', encoding='utf-8') as file:
7573
source_str = StringIO(file.read())
7674
source_catalog = read_po(source_str)
77-
for_tron = { message.id: {source: message.string}
78-
for message in source_catalog if message.id }
75+
for_tron = {message.id: {source: message.string}
76+
for message in source_catalog if message.id}
77+
78+
# Assuming ic() is a function you defined somewhere
79+
#ic(source_catalog, for_tron, source, target)
7980

8081
for locale in target:
8182
if locale != source:
8283
with open(f'{app.root_path}/translations/{locale}/LC_MESSAGES/messages.po', 'r', encoding='utf-8') as file:
83-
target_str = StringIO( file.read())
84+
target_str = StringIO(file.read())
8485
target_catalog = read_po(target_str)
8586

8687
for message in target_catalog:
8788
if message.id and message.id in for_tron.keys():
88-
for_tron[message.id][locale]=message.string
89+
for_tron[message.id][locale] = message.string
8990

9091
return for_tron
9192

92-
@dev.route('/lang_json/<lang_id>', methods=['get', 'post'])
93+
@dev.route('/lang_json/<lang_id>', methods=['GET', 'POST'])
9394
@dev_required
9495
def lang_json(lang_id):
9596
langs = export_strings(source='fr', target=[lang for lang in LANGAGES if lang not in ('ids', 'pseudo')])
96-
9797
return jsonify({lang['fr']: lang[lang_id] for lang in langs.values()})
9898

99-
# @dev.route('/save_lang')
100-
# @dev_required
101-
# def save_lang():
102-
# data = {"+ distance": "+ distance","+ temps": "+ time","Les inscriptions ne sont pas encore ouvertes!": "Registrations are not yet open!","Les inscriptions ne sont pas encore ouvertes! Elles ouvrent le {date}": "Registrations are not yet open! They will open on {date}","abandonner": "abandon","about": "about","activer le chrono pour ce stand": "activate the timer for this stand","ajouter un nouveau coureur": "add a new runner","altitude": "altitude","ancien mot de passe": "old password","archiver": "archive","bienvenue {name}, tu es bien connecté": "welcome {name}, you are successfully logged in","cdv 2.0": "cdv 2.0","ce n'est pas votre inscription.": "this is not your registration.","changer la position": "change position","chemin": "path","chronometrer": "timekeeping","cliquer où vous voulez ajouter le stand": "click where you want to add the stand","clé": "key","commencer par créer un parcours": "start by creating a course","couleur du stand": "stand color","coureur": "runner","coureurs": "runners","course des vignes 2.0": "vineyard race 2.0","créer": "create","créer un compte": "create an account","créer un nouveau Parcours": "create a new course","créer une copie du parcours": "create a copy of the course","date": "date","date d'ouverture des inscriptions": "registration opening date","date de fermeture des inscriptions": "registration closing date","date de l'édition": "edition date","date de naissance": "date of birth","des utilisateur on été trouvé avec les mêmes nom. choisir qui inscrire": "users with the same name have been found. choose who to register","desarchiver": "unarchive","description de l'évenement": "event description","description du parcours": "course description","disqualifier": "disqualify","distance": "distance","documentation": "documentation","dossard": "bib number","e-mail": "e-mail","editions": "editions","email": "email","enter le nom du nouvel évènement": "enter the name of the new event","entrer le numéro de dossard": "enter the bib number","exporter au format excel": "export to Excel format","fermer": "close","fini": "finished","finir le parcours": "finish the course","fr": "fr","générer": "generate","gérer les dossard": "manage bib numbers","gérer les parcours": "manage courses","gérer les passages": "manage checkpoints","heure": "time","heure d'arrivée": "arrival time","heure de départ": "departure time","image de profile": "profile picture","info": "info","inscriptions": "registrations","l'utilisateur {username} a été inscrit avec succes": "user {username} has been successfully registered","l'édition \"{edition}\" n'existe pas": "the edition \"{edition}\" does not exist","l'évènement n'as pas pu être supprimé": "the event could not be deleted","l'événement \"{event}\" n'existe pas": "the event \"{event}\" does not exist","la clé a bien été supprimée": "the key has been successfully deleted","la clé n'as pas pu être suprimée": "the key could not be deleted","lancer le parcours": "start the course","langues": "languages","latitude du depart": "starting latitude","latitude du départ": "starting latitude","latitude du stand": "stand latitude","le coureur ayans l\\'id {coureur} n\\'existe pas.": "the runner with id {coureur} does not exist.","le mot de passe ou le nom d'utilisateur n'est pas valide": "the password or username is invalid","le parcours \"{parcours}\" n'existe pas": "the course \"{parcours}\" does not exist","les inscriptions sont déjà fermées!": "registrations are already closed!","lieu de rendez-vous": "meeting place","longitude du depart": "starting longitude","longitude du départ": "starting longitude","longitude du stand": "stand longitude","modifier le mot de passe": "change password","modifier son compte": "modify account","modifier son mot de passe": "change password","modifier son profil": "modify profile","mot de passe": "password","ne plus participer": "no longer participate","nom": "name","nom complet": "full name","nom d'utilisateur": "username","nom de l'etape": "stage name","nom de l'édition": "edition name","nom de l'évenement": "event name","nom de l'événement": "event name","nom du parcours": "course name","nom du stand": "stand name","nous contacter": "contact us","nouveau mot de passe": "new password","nouveau stand": "new stand","nouvelle édition": "new edition","numéro de téléphone": "phone number","ouvrir sur Google Maps": "open in Google Maps","parcours": "course","parcours archivés": "archived courses","parcours choisis": "chosen courses","parcours non modifiable car déjà utilisé dans une édition": "course not editable as it has already been used in an edition","participations": "participations","place": "place","prochain événements": "upcoming events","profil": "profile","prénom": "first name","présents": "present","rang": "rank","rendez-vous": "appointment","répéter le mot de passe": "repeat password","répéter le nouveau mot de passe": "repeat new password","résultats": "results","s'inscrire": "register","sauver": "save","se connecter": "log in","se déconnecter": "log out","se désinscrire": "unregister","stand": "stand","supprimer": "delete","supprimer l'etape": "delete the stage","supprimer l'évenement": "delete the event","temps": "time","tu doit être admin de cet evenement pour acceder a cette page.": "you must be admin of this event to access this page.","tu doit être admin pour accéder à cette page.": "you must be admin to access this page.","tu es bien déconnecté !": "you are successfully logged out!","télephone": "telephone","téléphone": "telephone","username": "username","valider": "validate","vos inscriptions": "your registrations","vos événement": "your events","votre compte a bien été créé": "your account has been successfully created","édition": "edition","éditions": "editions","état": "state","événement": "event"}
103-
104-
105-
# langs = export_strings(source='fr', target=[lang for lang in LANGAGES if lang not in ('ids', 'pseudo')])
106-
# ic(langs)
107-
# for key, val in langs.items():
108-
# if val['fr'] in langs.values():
109-
# langs[key]['en'] = val['en']
110-
# ic(langs)
111-
# save_translations(langs)
112-
# return 'ok'
113-
11499
def save_translations(translations):
100+
if not translations:
101+
ic("No translations provided.")
102+
return
115103
with open(f'{app.root_path}/messages.pot', 'r', encoding='utf-8') as file:
116104
template = read_po(StringIO(file.read()))
117105

@@ -121,20 +109,19 @@ def save_translations(translations):
121109
new_catalog.add(id, translations[id][locale])
122110
new_catalog.update(template)
123111
with open(f'{app.root_path}/translations/{locale}/LC_MESSAGES/messages.po', 'wb') as file:
124-
write_po(file , new_catalog)
112+
write_po(file, new_catalog)
125113

126-
@dev.route('/languages', methods=['get', 'post'])
114+
@dev.route('/languages', methods=['GET', 'POST'])
127115
@dev_required
128116
def languages():
129117
langs = export_strings(source='fr', target=[lang for lang in LANGAGES if lang not in ('ids', 'pseudo')])
130-
form:langForm = langForm()
118+
form = langForm()
131119
if form.validate_on_submit():
132120
data = eval(form.data.data)
133121
save_translations(data)
134122
os.system('pybabel compile -f -d chrono_des_vignes/translations')
135123
return redirect(url_for('dev.languages'))
136-
app.run()
137-
return render_template('languages.html', langs = langs, form=form)
124+
return render_template('languages.html', langs=langs, form=form)
138125

139126
@dev.route('/reload_translations')
140127
@dev_required
@@ -149,9 +136,9 @@ def reload():
149136
for id, langs in translations.items():
150137
for lang, trad in langs.items():
151138
if lang == 'ids':
152-
new[id][lang]=id
139+
new[id][lang] = id
153140
elif lang == 'pseudo':
154-
new[id][lang]='XXXXXXXX'
141+
new[id][lang] = 'XXXXXXXX'
155142
save_translations(new)
156143

157144
os.system('pybabel compile -f -d chrono_des_vignes/translations')

chrono_des_vignes/lib.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ def get_points_elevation(points:list[tuple[float, float]]) -> list[dict[str, flo
4848
except requests.exceptions.ReadTimeout as e:
4949
ic(e)
5050
ic(time() - start, 'get_points_elevation')
51+
except Exception as e:
52+
ic(e, 'get_points_elevation', 'post error')
5153
else:
5254
ic(response.status_code, response)
5355
ic(time() - start, 'get_points_elevation')

chrono_des_vignes/templates/doc/docs/organisateurs/parcours.fr.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,31 @@
11
## créer un nouveau parcours
2+
- dans la page des parcours cliquez sur le plus en bas de la page
3+
- dans la pop-up remplire le formulaire
4+
5+
champ | explication
6+
------------------------|----------------
7+
nom du parcours | nom du parcours
8+
depart | lieu du stand de depart
9+
10+
- validez le formulaire pour créer l'édition
11+
- finire de créer le parcours de la même manière que pour [le modifier](#modifier-un-parcours).
212

313
## modifier un parcours
14+
!!! warning "attention"
15+
pour modifier un parcours il ne doit pas être utilisé dans aucune édition. si vous vouler créer une version modifiée il vous faut créer une [copie du parcours](#creer-une-copie-du-parcours).
16+
17+
vous pouver modifier le nom du parcours et sa description avec la première section de la page de l'édition.
18+
19+
### ajouter une étape
20+
pour ajouter une étape
21+
22+
### modifier un stand
23+
24+
### modifier une trace
25+
26+
### supprimer une étape
27+
28+
## créer une copie du parcours
429

530
## supprimer un parcours
631

0 commit comments

Comments
 (0)