From 46ac8fcd1f5d700c0a62287f96c78b1e6732bf37 Mon Sep 17 00:00:00 2001 From: Dark-Storm Date: Sun, 3 Feb 2019 16:52:42 +0100 Subject: [PATCH] Redefinition des formulaires --- app/__init__.py | 2 +- app/forms.py | 71 ----------------------------------------- app/forms/account.py | 26 +++++++++++++++ app/forms/login.py | 9 ++++++ app/forms/search.py | 14 ++++++++ app/routes/account.py | 2 +- app/routes/index.py | 10 +----- app/routes/login.py | 4 +-- app/routes/search.py | 2 +- app/utils/render.py | 3 +- app/utils/validators.py | 22 +++++++++++++ 11 files changed, 79 insertions(+), 86 deletions(-) delete mode 100644 app/forms.py create mode 100644 app/forms/account.py create mode 100644 app/forms/login.py create mode 100644 app/forms/search.py create mode 100644 app/utils/validators.py diff --git a/app/__init__.py b/app/__init__.py index 2f8b1a9..10e8cde 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -14,4 +14,4 @@ login.login_view = 'login' login.login_message = "Veuillez vous authentifier avant de continuer." from app import models -from app.routes import index +from app.routes import index, login, search, account diff --git a/app/forms.py b/app/forms.py deleted file mode 100644 index d2b8346..0000000 --- a/app/forms.py +++ /dev/null @@ -1,71 +0,0 @@ -from flask_login import current_user -from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SubmitField, FileField -from wtforms.fields.html5 import DateField -from wtforms.validators import ValidationError, DataRequired, Optional, Email, EqualTo -from app.models.users import Member - -from wtforms.meta import DefaultMeta - -# TODO: Put those validators into a specific file -def validate_name(form, name): - member = Member.query.filter_by(name=name.data).first() - if member is not None: - raise ValidationError('Pseudo indisponible.') - if not Member.valid_name(name.data): - raise ValidationError("Nom d'utilisateur invalide.") - -def validate_email(form, email): - member = Member.query.filter_by(email=email.data).first() - if member is not None: - raise ValidationError('Adresse email déjà utilisée.') - -def validate_password(form, password): - if len(password.data) != 0 and len(password.data) < 10: - raise ValidationError('Mot de passe est trop court (10 caractères minimum)') - # TODO: add more rules >:] - -def verify_authentication(form, old_password): - if not current_user.check_password(old_password.data): - raise ValidationError('Mot de passe erroné') - -def login_form(f): - pass - -class LoginForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired()]) - password = PasswordField('Mot de passe :', validators=[DataRequired()]) - remember_me = BooleanField('Se souvenir de moi :') - submit = SubmitField('Connexion') - - -class RegistrationForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired(), validate_name]) - email = StringField('Adresse Email :', validators=[DataRequired(), Email(), validate_email]) - password = PasswordField('Mot de passe', validators=[DataRequired(), validate_password]) - password2 = PasswordField('Répéter le mot de passe', validators=[DataRequired(), EqualTo('password')]) - guidelines = BooleanField('J’accepte les CGU', validators=[DataRequired()]) - newsletter = BooleanField('Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.') - submit = SubmitField('S\'enregistrer') - -class UpdateAccountForm(FlaskForm): - avatar = FileField('Avatar :', validators=[]) - email = StringField('Adresse Email :', validators=[Optional(), Email(), validate_email]) - password = PasswordField('Mot de passe :', validators=[Optional(), validate_password]) - password2 = PasswordField('Répéter le mot de passe', validators=[Optional(), EqualTo('password')]) - birthday = DateField('Anniversaire', validators=[Optional()]) - signature = TextAreaField('Signature', validators=[Optional()]) - biography = TextAreaField('Présentation', validators=[Optional()]) - newsletter = BooleanField('Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.') - old_password = PasswordField('Ancien mot de passe :', validators=[DataRequired(), verify_authentication]) - submit = SubmitField('Mettre à jour') - -# TODO: compléter le formulaire de recherche avancée -class AdvancedSearchForm(FlaskForm): - q = StringField('Rechercher :', validators=[DataRequired()]) - date = DateField('Date', validators=[Optional()]) - submit = SubmitField('Affiner la recherche') - -class SearchForm(FlaskForm): - q = StringField('Rechercher', validators=[DataRequired()]) - \ No newline at end of file diff --git a/app/forms/account.py b/app/forms/account.py new file mode 100644 index 0000000..ded3e25 --- /dev/null +++ b/app/forms/account.py @@ -0,0 +1,26 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SubmitField, FileField +from wtforms.fields.html5 import DateField +from wtforms.validators import DataRequired, Optional, Email, EqualTo +import app.utils.validators as vd + +class RegistrationForm(FlaskForm): + username = StringField('Pseudonyme :', validators=[DataRequired(), vd.name]) + email = StringField('Adresse Email :', validators=[DataRequired(), Email(), vd.email]) + password = PasswordField('Mot de passe', validators=[DataRequired(), vd.password]) + password2 = PasswordField('Répéter le mot de passe', validators=[DataRequired(), EqualTo('password')]) + guidelines = BooleanField('J’accepte les CGU', validators=[DataRequired()]) + newsletter = BooleanField('Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.') + submit = SubmitField('S\'enregistrer') + +class UpdateAccountForm(FlaskForm): + avatar = FileField('Avatar :', validators=[]) + email = StringField('Adresse Email :', validators=[Optional(), Email(), vd.email]) + password = PasswordField('Mot de passe :', validators=[Optional(), vd.password]) + password2 = PasswordField('Répéter le mot de passe', validators=[Optional(), EqualTo('password')]) + birthday = DateField('Anniversaire', validators=[Optional()]) + signature = TextAreaField('Signature', validators=[Optional()]) + biography = TextAreaField('Présentation', validators=[Optional()]) + newsletter = BooleanField('Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.') + old_password = PasswordField('Ancien mot de passe :', validators=[DataRequired(), vd.authentication]) + submit = SubmitField('Mettre à jour') \ No newline at end of file diff --git a/app/forms/login.py b/app/forms/login.py new file mode 100644 index 0000000..2f49f7c --- /dev/null +++ b/app/forms/login.py @@ -0,0 +1,9 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, PasswordField, BooleanField, SubmitField +from wtforms.validators import DataRequired + +class LoginForm(FlaskForm): + username = StringField('Pseudonyme :', validators=[DataRequired()]) + password = PasswordField('Mot de passe :', validators=[DataRequired()]) + remember_me = BooleanField('Se souvenir de moi :') + submit = SubmitField('Connexion') \ No newline at end of file diff --git a/app/forms/search.py b/app/forms/search.py new file mode 100644 index 0000000..808b387 --- /dev/null +++ b/app/forms/search.py @@ -0,0 +1,14 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField +from wtforms.fields.html5 import DateField +from wtforms.validators import DataRequired, Optional + +# TODO: compléter le formulaire de recherche avancée +class AdvancedSearchForm(FlaskForm): + q = StringField('Rechercher :', validators=[DataRequired()]) + date = DateField('Date', validators=[Optional()]) + submit = SubmitField('Affiner la recherche') + +class SearchForm(FlaskForm): + q = StringField('Rechercher', validators=[DataRequired()]) + \ No newline at end of file diff --git a/app/routes/account.py b/app/routes/account.py index e2c01a5..27a5f1c 100644 --- a/app/routes/account.py +++ b/app/routes/account.py @@ -1,7 +1,7 @@ from flask import redirect, url_for, request, flash from flask_login import login_required, current_user from app import app, db -from app.forms import UpdateAccountForm, RegistrationForm +from app.forms.account import UpdateAccountForm, RegistrationForm from app.models.users import Member from app.utils.render import render diff --git a/app/routes/index.py b/app/routes/index.py index 6412a8f..692a11a 100644 --- a/app/routes/index.py +++ b/app/routes/index.py @@ -1,15 +1,7 @@ -from flask import render_template, flash, redirect, url_for, request -from flask_login import login_user, logout_user, current_user, login_required -from werkzeug.urls import url_parse -from app import app, db -from app.forms import LoginForm, RegistrationForm, UpdateAccountForm, SearchForm, AdvancedSearchForm -from app.models.users import Member - -from app.routes import login, account, search +from app import app from app.utils.render import render @app.route('/') def index(): - login_form = LoginForm() return render('index.html') \ No newline at end of file diff --git a/app/routes/login.py b/app/routes/login.py index 3ee269b..d504be7 100644 --- a/app/routes/login.py +++ b/app/routes/login.py @@ -1,11 +1,11 @@ from flask import redirect, url_for, request, flash from flask_login import login_user, logout_user, login_required, current_user from app import app -from app.forms import LoginForm +from app.forms.login import LoginForm from app.models.users import Member from app.utils.render import render -from app.routes import * # For open redirections +# from app.routes.index import index @app.route('/login', methods=['GET', 'POST']) def login(): diff --git a/app/routes/search.py b/app/routes/search.py index 30ba673..ef3fb41 100644 --- a/app/routes/search.py +++ b/app/routes/search.py @@ -1,5 +1,5 @@ from app import app -from app.forms import AdvancedSearchForm +from app.forms.search import AdvancedSearchForm from app.utils.render import render @app.route('/search') diff --git a/app/utils/render.py b/app/utils/render.py index 2d14db4..b7b918f 100644 --- a/app/utils/render.py +++ b/app/utils/render.py @@ -1,5 +1,6 @@ from flask import render_template -from app.forms import LoginForm, SearchForm +from app.forms.login import LoginForm +from app.forms.search import SearchForm def render(*args, **kwargs): # TODO: debugguer cette merde : au logout, ça foire diff --git a/app/utils/validators.py b/app/utils/validators.py new file mode 100644 index 0000000..81a34e9 --- /dev/null +++ b/app/utils/validators.py @@ -0,0 +1,22 @@ +from wtforms.validators import ValidationError + +def name(form, name): + member = Member.query.filter_by(name=name.data).first() + if member is not None: + raise ValidationError('Pseudo indisponible.') + if not Member.valid_name(name.data): + raise ValidationError("Nom d'utilisateur invalide.") + +def email(form, email): + member = Member.query.filter_by(email=email.data).first() + if member is not None: + raise ValidationError('Adresse email déjà utilisée.') + +def password(form, password): + if len(password.data) != 0 and len(password.data) < 10: + raise ValidationError('Mot de passe est trop court (10 caractères minimum)') + # TODO: add more rules >:] + +def authentication(form, old_password): + if not current_user.check_password(old_password.data): + raise ValidationError('Mot de passe erroné') \ No newline at end of file