Skip to content

Commit f448e27

Browse files
25.09.2024_traduction en subdomain mais probleme avec conection utilisateur -> changement de plan plus de subdomain mais prefix url
1 parent e564265 commit f448e27

15 files changed

Lines changed: 92 additions & 75 deletions

File tree

flask_app/__init__.py

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from flask import Flask, redirect, url_for, flash, request, session
1+
from flask import Flask, redirect, flash, request, session, url_for
22
from flask_login import LoginManager, current_user
33
from flask_sqlalchemy import SQLAlchemy
44
from flask_migrate import Migrate
@@ -9,6 +9,7 @@
99
import os
1010
install()
1111

12+
1213
# met la langue en francais pour le formatage des dates
1314
import locale
1415
locale.setlocale(locale.LC_TIME,'')
@@ -24,6 +25,9 @@
2425
app.config['SECRET_KEY'] = 'secret_key' #! change that for deployment
2526
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///site.db"
2627
app.config['BABEL_TRANSLATION_DIRECTORIES'] = f'{app.root_path}/translations'
28+
app.config['SESSION_COOKIE_PATH'] = '/'
29+
app.config['SESSION_COOKIE_DOMAIN'] = 'localhost'
30+
ic(app.config)
2731
app.jinja_env.add_extension('jinja2.ext.loopcontrols')
2832
app.url_map.default_subdomain = ''
2933

@@ -93,24 +97,31 @@ def decorated_view(*args, **kwargs):
9397
return func(*args, **kwargs)
9498
return decorated_view
9599

96-
def lang(func):
97-
"""
98-
Modified login_required decorator to restrict access to admin group.
99-
"""
100-
101-
@wraps(func)
102-
def decorated_view(*args, **kwargs):
103-
lang = kwargs.pop('lang', 'fr')
104-
if lang in LANGAGES:
105-
session['lang'] = lang
106-
return func(*args, **kwargs)
107-
return decorated_view
100+
def lang_url_for(*args, **kwargs):
101+
lang = kwargs.pop('lang', _('app.lang'))
102+
if 'static' in args:
103+
return url_for(*args, **kwargs)
104+
if lang == 'fr':
105+
return url_for(*args, lang='', **kwargs)
106+
return url_for(*args, lang=lang, **kwargs)
108107

109-
'''#* erreur 403 acces non autorisé
110-
def error403():
111-
flash('tu doit etre connecté pour acceder a cette page.', 'danger')
112-
return redirect(url_for('home'))
113-
login_manager.unauthorized_handler(error403)'''
108+
@app.context_processor
109+
def inject_lang_url_for():
110+
return dict(url_for=lang_url_for)
111+
112+
def set_route(blueprint, path, **options):
113+
def decorator(func):
114+
@blueprint.route(path, **options)
115+
@blueprint.route(path, subdomain=options.pop('subdomain', '<lang>'), **options)
116+
@wraps(func)
117+
def wrap(*args, **kwargs):
118+
lang = kwargs.pop('lang', 'fr')
119+
if lang in LANGAGES:
120+
session['lang'] = lang
121+
return func(*args, **kwargs)
122+
return wrap
123+
124+
return decorator
114125

115126
# defini les pages du site web
116127
from flask_app.users import users

flask_app/admin/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from flask import Blueprint, render_template
22
from flask_login import login_required, current_user
3-
from flask_app import admin_required
3+
from flask_app import admin_required, set_route
44
from flask_app.models import Event
55
from flask_app.admin.editions import editions
66
from flask_app.admin.parcours import parcours_bp
@@ -12,7 +12,7 @@
1212
admin.register_blueprint(coureurs)
1313

1414

15-
@admin.route('/event/<event_name>')
15+
@set_route(admin, '/event/<event_name>')
1616
@login_required
1717
@admin_required
1818
def home_event(event_name):

flask_app/admin/coureurs/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from flask import Blueprint, render_template
22
from flask_login import current_user, login_required
3-
from flask_app import admin_required
3+
from flask_app import admin_required, set_route
44
from flask_app.models import Event, User
55
from flask_babel import _
66

77
coureurs = Blueprint("coureurs", __name__, template_folder='templates')
88

9-
@coureurs.route('/event/<event_name>/coureurs')
9+
@set_route(coureurs, '/event/<event_name>/coureurs')
1010
@login_required
1111
@admin_required
1212
def coureurs_page(event_name):
@@ -15,7 +15,7 @@ def coureurs_page(event_name):
1515
user = current_user
1616
return render_template("coureurs.html", user_data=user, event_data=event_data, event_modif=True)
1717

18-
@coureurs.route('/event/<event_name>/coureurs/<coureur>')
18+
@set_route(coureurs, '/event/<event_name>/coureurs/<coureur>')
1919
def view_coureur_page(event_name, coureur):
2020
event_data = Event.query.filter_by(name=event_name).first()
2121
coureur_data:User = User.query.get_or_404(coureur, _('admin.view.error.coureurdontexist:coureur').format(coureur=coureur))

flask_app/admin/editions/__init__.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from flask import Blueprint, flash, render_template, redirect, url_for, request
2-
from flask_app import admin_required, db
1+
from flask import Blueprint, flash, render_template, redirect, request
2+
from flask_app import admin_required, db, set_route, lang_url_for as url_for
33
from flask_app.admin.editions.forms import Edition_form
44
from flask_login import login_required, current_user
55
from flask_app.models import Event, Parcours, Edition
@@ -12,7 +12,7 @@
1212
editions.register_blueprint(dossard)
1313
editions.register_blueprint(passages)
1414

15-
@editions.route('/event/<event_name>/editions', methods=['POST', 'GET'])
15+
@set_route(editions, '/event/<event_name>/editions', methods=['POST', 'GET'])
1616
@login_required
1717
@admin_required
1818
def editions_page(event_name):
@@ -41,7 +41,7 @@ def editions_page(event_name):
4141

4242
return render_template("editions.html", user_data=user, event_data=event, form=form, event_modif=True)
4343

44-
@editions.route('/event/<event_name>/editions/<edition_name>/delete', methods=['POST', 'GET'])
44+
@set_route(editions, '/event/<event_name>/editions/<edition_name>/delete', methods=['POST', 'GET'])
4545
@login_required
4646
@admin_required
4747
def delete_edition_page(event_name, edition_name):
@@ -56,7 +56,7 @@ def delete_edition_page(event_name, edition_name):
5656
flash('l\'edition a bien été supprimée', 'success')
5757
return redirect(url_for('admin.editions.editions_page',event_name=event.name))
5858

59-
@editions.route('/event/<event_name>/editions/<edition_name>', methods=['POST', 'GET'])
59+
@set_route(editions, '/event/<event_name>/editions/<edition_name>', methods=['POST', 'GET'])
6060
@login_required
6161
@admin_required
6262
def modify_edition_page(event_name, edition_name):
@@ -71,6 +71,7 @@ def modify_edition_page(event_name, edition_name):
7171
'rdv_lng':edition.rdv_lng,
7272
'parcours':[str((p.name, p.description)) for p in edition.parcours]})
7373
form.parcours.choices=[str((p.name, p.description)) for p in event.parcours.filter(or_(Parcours.archived==False, Parcours.editions.any(Edition.id==edition.id))).all()]
74+
ic(dir(form.parcours)) # type: ignore
7475

7576
#? desactiver le champs si dates deja passé
7677
form.edition_date.render_kw.pop("disabled", None)
@@ -92,7 +93,7 @@ def modify_edition_page(event_name, edition_name):
9293
#? fin desactivation des champs
9394
ic(form.parcours.data)
9495
ic([str((p.name, p.description)) for p in edition.parcours])
95-
ic(request.form)
96+
ic(request.form.to_dict())
9697

9798
if form.validate_on_submit():
9899
print(form.parcours.data)
@@ -111,7 +112,7 @@ def modify_edition_page(event_name, edition_name):
111112
form.name.errors = list(form.name.errors)+['vous utiliser deja ce nom.']
112113
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)
113114

114-
@editions.route('/event/<event_name>/editions/<edition_name>/generate_dossard', methods=['POST', 'GET'])
115+
@set_route(editions, '/event/<event_name>/editions/<edition_name>/generate_dossard', methods=['POST', 'GET'])
115116
@login_required
116117
@admin_required
117118
def generate_dossard(event_name, edition_name):
@@ -123,7 +124,7 @@ def generate_dossard(event_name, edition_name):
123124
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)
124125

125126

126-
@editions.route('/event/<event_name>/editions/<edition_name>/generate_dossard/generate', methods=['POST', 'GET'])
127+
@set_route(editions, '/event/<event_name>/editions/<edition_name>/generate_dossard/generate', methods=['POST', 'GET'])
127128
@login_required
128129
@admin_required
129130
def generate_all_dossard(event_name, edition_name):

flask_app/admin/editions/dossard/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
from flask import Blueprint, flash, render_template, redirect, url_for
2-
from flask_app import admin_required, db
1+
from flask import Blueprint, flash, render_template, redirect
2+
from flask_app import admin_required, db, set_route
33
from flask_app.admin.editions.forms import Edition_form
44
from flask_login import login_required, current_user
55
from flask_app.models import Event, Parcours, Edition
66
from datetime import datetime
77

88
dossard = Blueprint('dossard', __name__, template_folder='templates')
99

10-
@dossard.route('/event/<event_name>/editions/<edition_name>/dossard', methods=['POST', 'GET'])
10+
@set_route(dossard, '/event/<event_name>/editions/<edition_name>/dossard', methods=['POST', 'GET'])
1111
@login_required
1212
@admin_required
1313
def dossard_page(event_name, edition_name):

flask_app/admin/editions/passages/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import time
2-
from flask import Blueprint, redirect, render_template, flash, request, url_for, jsonify
3-
from flask_app import admin_required, db
2+
from flask import Blueprint, redirect, render_template, flash, request, jsonify
3+
from flask_app import admin_required, db, set_route, lang_url_for as url_for
44
from flask_login import login_required, current_user
55
from flask_app.models import Event, Edition, PassageKey, Stand, Parcours, Passage, User, Inscription
66
from datetime import datetime
@@ -11,7 +11,7 @@
1111
passages = Blueprint('passages', __name__, template_folder='templates')
1212
@login_required
1313
@admin_required
14-
@passages.route("/event/<event_name>/editions/<edition_name>/dashboard", methods=['get', 'post'])
14+
@set_route(passages, "/event/<event_name>/editions/<edition_name>/dashboard", methods=['get', 'post'])
1515
def dashboard(event_name, edition_name):
1616
user = current_user
1717
event = Event.query.filter_by(name= event_name).first_or_404()
@@ -53,7 +53,7 @@ def dashboard(event_name, edition_name):
5353

5454
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)
5555

56-
@passages.route('/chrono', methods=["GET", 'post'])
56+
@set_route(passages, '/chrono', methods=["GET", 'post'])
5757
def chrono_home():
5858
user = current_user if current_user.is_authenticated else None
5959

@@ -67,7 +67,7 @@ def chrono_home():
6767

6868
return render_template('chrono_home.html', user_data=user, form=form)
6969

70-
@passages.route('/chrono/<key_code>')
70+
@set_route(passages, '/chrono/<key_code>')
7171
def chrono_page(key_code):
7272
user = current_user if current_user.is_authenticated else None
7373
key = PassageKey.query.filter_by(key=key_code).first_or_404()
@@ -80,7 +80,7 @@ def chrono_page(key_code):
8080
ic(key_passages)
8181
return render_template('chrono.html', user_data=user, key=key, passages=key_passages)
8282

83-
@passages.route('/chrono/set', methods=['post'])
83+
@set_route(passages, '/chrono/set', methods=['post'])
8484
def set_passage():
8585
form = SetPassageForm()
8686
inscription = Inscription.query.filter(Inscription.dossard == form.dossard.data).first()

flask_app/admin/parcours/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from flask import Blueprint, flash, redirect, render_template, request, url_for
2-
from flask_app import admin_required, db
1+
from flask import Blueprint, flash, redirect, render_template, request
2+
from flask_app import admin_required, db, set_route, lang_url_for as url_for
33
from flask_app.admin.parcours.forms import Parcours_name_form, Etape_modif_form, Stand_modif_form, New_parcours_form
44
from flask_login import login_required, current_user
55
from flask_app.models import Event, Stand, Trace, Parcours
@@ -17,7 +17,7 @@ def midpoint(latlng1, latlng2):
1717
lng = (latlng1[1]+latlng2[1])/2
1818
return (lat, lng)
1919

20-
@parcours_bp.route('/event/<event_name>/parcours/<parcours_name>/delete')
20+
@set_route(parcours_bp, '/event/<event_name>/parcours/<parcours_name>/delete')
2121
@login_required
2222
@admin_required
2323
def delete_parcours_page(event_name, parcours_name):
@@ -51,7 +51,7 @@ def delete_parcours_page(event_name, parcours_name):
5151

5252
return redirect(url_for('admin.parcours.parcours_page', event_name=event.name))
5353

54-
@parcours_bp.route('/event/<event_name>/parcours/<parcours_name>/archive')
54+
@set_route(parcours_bp, '/event/<event_name>/parcours/<parcours_name>/archive')
5555
@login_required
5656
@admin_required
5757
def archive_parcours_page(event_name, parcours_name):
@@ -61,7 +61,7 @@ def archive_parcours_page(event_name, parcours_name):
6161
db.session.commit()
6262
return redirect(url_for('admin.parcours.parcours_page', event_name=event.name))
6363

64-
@parcours_bp.route('/event/<event_name>/parcours/<parcours_name>/unarchive')
64+
@set_route(parcours_bp, '/event/<event_name>/parcours/<parcours_name>/unarchive')
6565
@login_required
6666
@admin_required
6767
def unarchive_parcours_page(event_name, parcours_name):
@@ -71,7 +71,7 @@ def unarchive_parcours_page(event_name, parcours_name):
7171
db.session.commit()
7272
return redirect(url_for('admin.parcours.parcours_page', event_name=event.name))
7373

74-
@parcours_bp.route('/event/<event_name>/parcours', methods=['POST', 'GET'])
74+
@set_route(parcours_bp, '/event/<event_name>/parcours', methods=['POST', 'GET'])
7575
@login_required
7676
@admin_required
7777
def parcours_page(event_name):
@@ -380,7 +380,7 @@ def create_map_and_alt_graph(parcours:Parcours, modif= False, rdv=None):
380380
return element_name, last_path_name, next_path_name, markers_name, program_list, map, graph
381381

382382

383-
@parcours_bp.route('/event/<event_name>/parcours/<parcours_name>', methods=['POST', 'GET'])
383+
@set_route(parcours_bp, '/event/<event_name>/parcours/<parcours_name>', methods=['POST', 'GET'])
384384
@login_required
385385
@admin_required
386386
def modify_parcours(event_name, parcours_name):

flask_app/dev/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from flask import Blueprint, redirect, render_template, flash, url_for, jsonify, request
2-
from flask_app import admin_required, db, DEV_ENABLE, app, LANGAGES
1+
from flask import Blueprint, redirect, render_template, flash, jsonify, request
2+
from flask_app import admin_required, db, DEV_ENABLE, app, LANGAGES, lang_url_for as url_for
33
from functools import wraps
44
import glob, os
55
from babel.messages.pofile import read_po, write_po

flask_app/routes.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from flask import render_template, request, session, redirect
2-
from flask_app import app, LANGAGES
2+
from flask_app import app, LANGAGES, set_route
33
from flask_login import current_user
44
from flask_app.models import Edition, Inscription, Event
55
from sqlalchemy import and_
@@ -8,7 +8,7 @@
88

99

1010

11-
@app.route('/')
11+
@set_route(app, '/')
1212
def home():
1313
# * home page of the web site
1414
if current_user.is_authenticated:
@@ -21,9 +21,12 @@ def home():
2121
next_events = Event.query.filter(Event.editions.any(and_(Edition.edition_date>=date,Edition.last_inscription>=date))).all()
2222
return render_template("0-home.html", user_data=user, inscriptions=inscriptions, events = next_events, time = date)
2323

24-
@app.route('/lang/<lang>')
25-
def change_lang(lang):
26-
next=request.args.get('next', '/')
27-
if lang in LANGAGES:
28-
session['lang'] = lang
29-
return redirect(next)
24+
@app.route('/lang/<lang>/<path:next>')
25+
def change_lang(lang, next:str):
26+
ic(lang, next)
27+
next=next.removeprefix('http://')
28+
ic(lang, next)
29+
ic('.'.join(next.split('.')[1:]), next.find(app.config['SERVER_NAME']))
30+
next = '.'.join(next.split('.')[1:]) if next.find(app.config['SERVER_NAME'])!=0 else next
31+
ic(lang, next)
32+
return redirect('http://'+lang+'.'+next)

flask_app/templates/layout.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<title>{{ _('app.name') }}</title>
1111
<meta name="viewport" content="width=device-width, initial-scale=1" />
1212
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css" />
13-
<link rel="stylesheet" href="/static/style.css" />
13+
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" />
1414
<!-- Bootstrap CSS -->
1515
<link
1616
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
@@ -54,7 +54,7 @@
5454
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
5555
<header>
5656
<nav
57-
class="navbar navbar-expand-sm bg-info fixed-top"
57+
class="navbar navbar-expand-md bg-info fixed-top"
5858
style="min-height: 70px"
5959
>
6060
<div class="container-fluid">
@@ -97,6 +97,7 @@
9797
<li class="nav-item dropdown">
9898
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">{{ _('app.languages') }} : {{ _('app.lang') }}</a>
9999
<ul class="dropdown-menu">
100+
{{ request.url }}
100101
<li><a class="dropdown-item" href="{{ url_for('change_lang', lang='fr', next=request.url ) }}">Francais</a></li>
101102
<li><a class="dropdown-item" href="{{ url_for('change_lang', lang='en', next=request.url ) }}">English</a></li>
102103
<li><a class="dropdown-item" href="{{ url_for('change_lang', lang='de', next=request.url ) }}">Deutsch</a></li>

0 commit comments

Comments
 (0)