Skip to content

Commit 9d006ed

Browse files
14.02.2024_Add Optional validator to email fields in Flask forms
1 parent 965f96c commit 9d006ed

31 files changed

Lines changed: 1325 additions & 797 deletions

File tree

chrono_des_vignes/__init__.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from flask_bcrypt import Bcrypt
1212
import os
1313
from dotenv import load_dotenv
14+
from datetime import datetime
1415
install()
1516
load_dotenv()
1617
from sqlalchemy import make_url
@@ -28,7 +29,7 @@
2829
app = Flask(__name__)
2930
app.config['SERVER_NAME'] = 'localhost:5000'
3031
password= os.environ.get('db_password')
31-
app.config['SECRET_KEY'] = password #! change that for deployment
32+
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY') #! change that for deployment
3233
url_object = URL.create(
3334
"mysql+pymysql",
3435
username="root",
@@ -84,10 +85,6 @@ def get_timezone():
8485

8586
babel = Babel(app, locale_selector=get_locale, timezone_selector=get_timezone)
8687

87-
@app.context_processor
88-
def inject_babel():
89-
return dict(_=gettext)
90-
9188
from chrono_des_vignes.models import User
9289
@login_manager.user_loader
9390
def load_user(user_id:str ):
@@ -119,8 +116,8 @@ def lang_url_for(*args, **kwargs):
119116
return url_for(*args, lang=lang, **kwargs)
120117

121118
@app.context_processor
122-
def inject_lang_url_for():
123-
return dict(url_for=lang_url_for)
119+
def jinja_context():
120+
return dict(_=gettext, url_for=lang_url_for, now=datetime.now())
124121

125122
def set_route(blueprint, path, **options):
126123
def decorator(func):
@@ -141,8 +138,10 @@ def wrap(*args, **kwargs):
141138
from chrono_des_vignes.admin import admin
142139
from chrono_des_vignes.view import view
143140
from chrono_des_vignes.dev import dev
141+
from chrono_des_vignes.livetrack import livetrack
144142
app.register_blueprint(users)
145143
app.register_blueprint(admin)
146144
app.register_blueprint(view)
147145
app.register_blueprint(dev)
146+
app.register_blueprint(livetrack)
148147
from chrono_des_vignes import routes

chrono_des_vignes/admin/coureurs/templates/view_coureur.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ <h3>{{ _('admin.view.participation') }}</h3>
8585
<th>{{inscription.edition.name}}</th>
8686
<th>{{inscription.edition.edition_date.strftime('%d.%m.%Y')}}</th>
8787
<th>{% if inscription.dossard %}{{inscription.dossard}}{% endif %}</th>
88-
<th>{# {% if inscription.dossard %}{{inscription.dossard}}{% endif %} #}</th>
88+
<th>{% if inscription.end=='finish' %}{{inscription.rank}}{% endif %}</th>
8989
</tr>
9090
{% endfor %}
9191
</tbody>

chrono_des_vignes/admin/editions/dossard/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from chrono_des_vignes.custom_validators import DataRequired, Length, EqualTo, DonTExist, DbLength, Email
1212
from .form import NewCoureurForm, ValidateNewCoureurForm
1313
from sqlalchemy import func, and_, or_, not_
14+
from wtforms.validators import Optional
1415

1516
dossard = Blueprint('dossard', __name__, template_folder='templates')
1617

@@ -39,7 +40,7 @@ def edition_dossards(event_name, edition_name):
3940
'name':[DataRequired(), DbLength(User, 'name')],
4041
'lastname':[DataRequired(), DbLength(User, 'lastname')],
4142
'username':[DataRequired(), DbLength(User, 'username')],
42-
'email':[DataRequired(), DbLength(User, 'email'), Email()]
43+
'email':[Optional(), DbLength(User, 'email'), Email()]
4344
}
4445
ic('first validation', form.validate(extra_validators=supp_validators), form.parcours.data)
4546
if form.validate(extra_validators=supp_validators):

chrono_des_vignes/admin/editions/dossard/form.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
from flask_wtf import FlaskForm
22
from wtforms import StringField, DateTimeLocalField, FloatField, SubmitField, TextAreaField, EmailField, DateField, IntegerField, TelField
3-
from chrono_des_vignes.custom_validators import DataRequired, Length, DateTimeNotPast, DateTimeBefore, InputRequired
3+
from chrono_des_vignes.custom_validators import DataRequired, Length, DateTimeNotPast, DateTimeBefore, InputRequired, Email
44
from chrono_des_vignes.custom_field import MultiCheckboxFieldWithDescription
55
from flask_babel import lazy_gettext as _
66
from chrono_des_vignes.models import User
7-
7+
from wtforms.validators import Optional
88
from chrono_des_vignes.custom_validators import DbLength
99

1010
class NewCoureurForm(FlaskForm):
1111
name = StringField(_('form.name'), validators=[DbLength(table=User, column='name')])
1212
lastname = StringField(_('form.lastname'), validators=[DbLength(table=User, column='lastname')])
1313
username = StringField(_('form.username'))
14-
email = EmailField(_('form.email'))
14+
email = EmailField(_('form.email'), validators=[Optional(), Email()])
1515
phone = TelField(_('form.tel'))
1616
datenaiss = DateField(_('form.birth'), validators=[DataRequired()])
1717

@@ -25,7 +25,7 @@ class ValidateNewCoureurForm(FlaskForm):
2525
name = StringField(_('form.name'), validators=[DbLength(table=User, column='name')])
2626
lastname = StringField(_('form.lastname'), validators=[DbLength(table=User, column='lastname')])
2727
username = StringField(_('form.username'))
28-
email = EmailField(_('form.email'))
28+
email = EmailField(_('form.email'), validators=[Optional(), Email()])
2929
phone = TelField(_('form.tel'))
3030
datenaiss = DateField(_('form.birth'), validators=[DataRequired()])
3131

chrono_des_vignes/admin/editions/parcours/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def get_parcours_passages(parcours):
4444
else:
4545
pass_data = {'parcours':[], 'started':False, 'id':coureur.id, 'dossard':coureur.dossard, 'name':coureur.inscrit.name}
4646
for stand, dist in zip(coureur.parcours.iter_chrono_list(), coureur.parcours.get_chrono_dists()):
47-
pass_data['parcours'].append({'stand':{'name':stand.name}, 'dist':round(dist, 3), 'delta':'', 'succes':None})
47+
pass_data['parcours'].append({'stand':{'name':stand.name}, 'dist':round(dist, 3), 'delta':'', 'success':None})
4848
data.append(pass_data)
4949
return data
5050

@@ -68,7 +68,7 @@ def launch_parcours(data):
6868
pass_data.update({'started':True, 'parcours_id':inscription.parcours.id, 'start_time':first_passage.time_stamp.timestamp() , 'id':inscription.id, 'finish':inscription.has_finish(), 'all_right':inscription.has_all_right(), 'end':inscription.end})
6969
emit('new_passage', pass_data, namespace='/edition/parcours', to=f'edition-parcours-{inscription.event.id}-{inscription.edition.id}')
7070

71-
@socketio.on('launch_parcours', namespace='/edition/parcours')
71+
@socketio.on('stop_parcours', namespace='/edition/parcours')
7272
def stop_parcours(data):
7373
parcours = Parcours.query.get(data.get('parcours_id'))
7474
edition = Edition.query.get(session['room'].split('-')[3])

chrono_des_vignes/admin/editions/parcours/templates/edition_parcours.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
<th class="text-center pe-1"> <i class="`+(passage.current?'fa-solid fa-circle fa-l':'fa-regular fa-circle fa-xs')+`"></i></th>
6060
<td class="pe-3">${passage.stand.name}</td>
6161
<td class="pe-3">`+
62-
(passage.succes==true?passage.delta:(passage.succes==false?'<i class="fa-solid fa-xmark"></i>':''))+
62+
(passage.success==true?passage.delta:(passage.success==false?'<i class="fa-solid fa-xmark"></i>':''))+
6363
`</td>
6464
<td>
6565
${ passage.dist !=null?passage.dist+' km':'' }
@@ -138,7 +138,7 @@
138138
<th class="text-center pe-1"> <i class="`+(passage.current?'fa-solid fa-circle fa-l':'fa-regular fa-circle fa-xs')+`"></i></th>
139139
<td class="pe-3">${passage.stand.name}</td>
140140
<td class="pe-3">`+
141-
(passage.succes==true||passage.succes==null?passage.delta:(passage.succes==false?'<i class="fa-solid fa-xmark"></i>':''))+
141+
(passage.success==true||passage.success==null?passage.delta:(passage.success==false?'<i class="fa-solid fa-xmark"></i>':''))+
142142
`</td>
143143
<td>
144144
${ passage.dist !=null?passage.dist+' km':'' }
@@ -283,7 +283,7 @@
283283
document.getElementById("end-parcours-{{ parcours.id }}").addEventListener('click', function(event){
284284
let button = event.target
285285
let start_time = Date.now()
286-
socket.emit('launch_parcours', {'parcours_id':{{ parcours.id }}, 'start_time': start_time})
286+
socket.emit('stop_parcours', {'parcours_id':{{ parcours.id }}, 'start_time': start_time})
287287
}, { once: true })
288288
}
289289

chrono_des_vignes/admin/editions/passages/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,26 +137,26 @@ def get_passage_data(passage:Passage, json=False)->dict:
137137
minutes, seconds = divmod(remainder, 60)
138138
delta= f"{f'{days} days, 'if days>0 else ''}{hours:02}:{minutes:02}:{seconds:02}"
139139
user_passages.pop(0)
140-
succes=True
140+
success=True
141141
elif len(user_passages)>0:
142142
delta=None
143-
succes=False
143+
success=False
144144
else:
145145
if not current:
146146
current=True
147147
data['parcours'][-1]['current']=True
148-
succes=None
148+
success=None
149149
delta=None
150150

151-
data['parcours'].append({'stand':stand if not json else {'name':stand.name}, 'dist':round(dist, 3), 'delta':delta, 'succes':succes})
151+
data['parcours'].append({'stand':stand if not json else {'name':stand.name}, 'dist':round(dist, 3), 'delta':delta, 'success':success})
152152
for p in user_passages:
153-
succes=None
153+
success=None
154154
delta = p.time_stamp-first_passage.time_stamp
155155
days = delta.days
156156
hours, remainder = divmod(delta.seconds, 3600)
157157
minutes, seconds = divmod(remainder, 60)
158158
delta= f"{f'{days} days, 'if days>0 else ''}{hours:02}:{minutes:02}:{seconds:02}"
159-
data['parcours'].append({'stand':p.get_stand() if not json else {'name':p.get_stand().name}, 'dist':None, 'delta':delta, 'succes':succes})
159+
data['parcours'].append({'stand':p.get_stand() if not json else {'name':p.get_stand().name}, 'dist':None, 'delta':delta, 'success':success})
160160
if not current:
161161
data['parcours'][-1]['current']=True
162162
return data

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
<th class="text-center pe-1"> <i class="`+(passage.current?'fa-solid fa-circle fa-l':'fa-regular fa-circle fa-xs')+`"></i></th>
176176
<td class="pe-3">${passage.stand.name}</td>
177177
<td class="pe-3">`+
178-
(passage.succes==true||passage.succes==null?passage.delta:(passage.succes==false?'<i class="fa-solid fa-xmark"></i>':''))+
178+
(passage.success==true||passage.success==null?passage.delta:(passage.success==false?'<i class="fa-solid fa-xmark"></i>':''))+
179179
`</td>
180180
<td>
181181
${ passage.dist !=null?passage.dist+' km':'' }

chrono_des_vignes/admin/editions/result/templates/result.html

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,5 @@ <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>
4237
{% endfor %}
4338
{% endblock content %}

chrono_des_vignes/babel.cfg

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
[python: chrono_des_vignes/admin/parcours/forms.py]
2020
[python: chrono_des_vignes/admin/parcours/__init__.py]
2121
[python: chrono_des_vignes/dev/__init__.py]
22+
[python: chrono_des_vignes/livetrack/__init__.py]
2223
[python: chrono_des_vignes/static/pyscript/main.py]
2324
[python: chrono_des_vignes/users/forms.py]
2425
[python: chrono_des_vignes/users/__init__.py]
@@ -32,7 +33,6 @@
3233
[jinja2: chrono_des_vignes/admin/editions/passages/templates/chrono_home.html]
3334
[jinja2: chrono_des_vignes/admin/editions/passages/templates/dashboard.html]
3435
[jinja2: chrono_des_vignes/admin/editions/result/templates/result.html]
35-
[jinja2: chrono_des_vignes/admin/editions/templates/edition-sidebar.html]
3636
[jinja2: chrono_des_vignes/admin/editions/templates/editions.html]
3737
[jinja2: chrono_des_vignes/admin/editions/templates/modify_edition.html]
3838
[jinja2: chrono_des_vignes/admin/parcours/templates/map_iframe.html]
@@ -43,11 +43,10 @@
4343
[jinja2: chrono_des_vignes/dev/template/dev_layout.html]
4444
[jinja2: chrono_des_vignes/dev/template/languages.html]
4545
[jinja2: chrono_des_vignes/dev/template/reload.html]
46+
[jinja2: chrono_des_vignes/livetrack/templates/livetrack.html]
4647
[jinja2: chrono_des_vignes/templates/0-home.html]
47-
[jinja2: chrono_des_vignes/templates/layout copy.html]
4848
[jinja2: chrono_des_vignes/templates/layout.html]
4949
[jinja2: chrono_des_vignes/templates/macro.html]
50-
[jinja2: chrono_des_vignes/templates/sidebar copy.html]
5150
[jinja2: chrono_des_vignes/templates/sidebar.html]
5251
[jinja2: chrono_des_vignes/templates/doc/site/404.html]
5352
[jinja2: chrono_des_vignes/templates/doc/site/index.html]

0 commit comments

Comments
 (0)