diff --git a/app/forms.py b/app/forms.py index ccf5c4a..41a4321 100644 --- a/app/forms.py +++ b/app/forms.py @@ -1,9 +1,31 @@ +from flask_login import current_user from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField from wtforms.validators import ValidationError, DataRequired, Email, EqualTo from app.models.users import Member +# TODO: Put those validators into a specific file +def validate_username(self, username): + member = Member.query.filter_by(username=username.data).first() + if member is not None: + raise ValidationError('Pseudo indisponible.') + +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é') + + class LoginForm(FlaskForm): username = StringField('Pseudonyme :', validators=[DataRequired()]) password = PasswordField('Mot de passe :', validators=[DataRequired()]) @@ -12,25 +34,18 @@ class LoginForm(FlaskForm): class RegistrationForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired()]) - email = StringField('Adresse Email :', validators=[DataRequired(), Email()]) - password = PasswordField('Mot de passe :', validators=[DataRequired()]) + username = StringField('Pseudonyme :', validators=[DataRequired()], validate_username) + 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') - def validate_username(self, username): - member = Member.query.filter_by(username=username.data).first() - if member is not None: - raise ValidationError('Pseudo indisponible.') - - def validate_email(self, 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(self, password): - if len(password.data) < 10: - raise ValidationError('Mot de passe est trop court (10 caractères minimum)') - # TODO: add more rules >:] +class UpdateAccountForm(FlaskForm): + email = StringField('Adresse Email :', validators=[Email(), validate_email]) + password = PasswordField('Mot de passe :', validators=[validate_password]) + password2 = PasswordField('Répéter le mot de passe', validators=[EqualTo('password')]) + 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') \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 6f889c3..1646435 100644 --- a/app/routes.py +++ b/app/routes.py @@ -2,35 +2,49 @@ 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 +from app.forms import LoginForm, RegistrationForm, UpdateAccountForm from app.models.users import Member -@app.route('/', methods=['GET', 'POST']) +@app.route('/') def index(): form = LoginForm() - flash('pseudo ou mot de passe invalide', 'error') - flash('tout ça c\'est ok !', 'ok') - flash('mais ça bof', 'warning') - flash('et une info', 'info') - if form.validate_on_submit(): - flash('test', 'ok') - member = Member.query.filter_by(username=form.username.data).first() - if member is None or not member.check_password(form.password.data): - flash('pseudo ou mot de passe invalide') - return redirect(url_for('index')) - flash('Connexion réussie') - login_user(member, remember=form.remember_me.data) - return render_template('index.html', form=form) +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'GET': + return redirect(url_for('index')) + form = LoginForm() + if form.validate_on_submit(): + member = Member.query.filter_by(username=form.username.data).first() + if member is None or not member.check_password(form.password.data): + flash('Pseudo ou mot de passe invalide', 'error') + return redirect(request.referrer) + login_user(member, remember=form.remember_me.data) + flash('Connexion réussie', 'info') + return redirect(request.referrer) -@app.route('/logout/') +@app.route('/logout') def logout(): logout_user() + flash('Déconnexion réussie', 'info') return redirect(url_for('index')) +@app.route('/account', methods=['GET', 'POST']) +def account(): + if not current_user.is_authenticated: + flash('Veuillez vous authentifier', 'warning') + return redirect(url_for('index')) + form = LoginForm() + form2 = UpdateAccountForm() + if form2.validate_on_submit(): + flash('Modifications pas encore effectuées', 'ok') + else: + flash('Erreur quelque part', 'error') + return render_template('account.html', form=form, form2=form2) + @app.route('/register', methods=['GET', 'POST']) def register(): if current_user.is_authenticated: @@ -41,16 +55,13 @@ def register(): member = Member(form2.username.data, form2.email.data, form2.password.data) db.session.add(member) db.session.commit() - flash('Congratulations, you are now a registered member!') + flash('Inscription réussie', 'ok') return redirect(url_for('validation')) - return render_template('register.html', title='Register', form=form, form2 = form2) - - - + return render_template('register.html', title='Register', form=form, form2=form2) @app.route('/register/validation/') def validation(): if current_user.is_authenticated : return redirect(url_for('index')) form = LoginForm() - return render_template('validation.html', form = form) + return render_template('validation.html', form=form) diff --git a/app/static/css/navbar.css b/app/static/css/navbar.css index f3cdb40..c3545b5 100644 --- a/app/static/css/navbar.css +++ b/app/static/css/navbar.css @@ -180,7 +180,7 @@ nav a:focus { margin-right: 10px; } -#menu form div { +#menu form { padding: 0 5%; } #menu form input[type="text"], diff --git a/app/static/scripts/pc-utils.js b/app/static/scripts/pc-utils.js index fbb1341..3779769 100644 --- a/app/static/scripts/pc-utils.js +++ b/app/static/scripts/pc-utils.js @@ -14,6 +14,7 @@ function getCookie(name) { /* Flash messages + TODO: Find a way to have good flash messages in a KISS & DRY way */ function flash_add(type, message) { template = `