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 = `
@@ -47,13 +48,14 @@ function flash_close(element) { for(var i = 0; i < childs.length; i++) { childs[i].style.top = ((i + 1) * 70 - 45) + 'px'; } - }, 200); + }, 0); } /* Send post ajax request to url defined in action. Callback the function defined in the callback attribute from the submit type. */ +/* We don't need Ajax at that time. Maybe later function ajaxWrapper(evt){ evt.preventDefault(); var elems = evt.target; @@ -78,9 +80,7 @@ function ajaxWrapper(evt){ req.send(params); } -/* - Add event listener on submit for all form with class with-ajax. -*/ +// Add event listener on submit for all form with class with-ajax. window.onload = function(){ @@ -104,4 +104,5 @@ window.onload = function(){ function login(response){ alert(response); -} \ No newline at end of file +} +//*/ \ No newline at end of file diff --git a/app/templates/account.html b/app/templates/account.html new file mode 100644 index 0000000..23cd8b8 --- /dev/null +++ b/app/templates/account.html @@ -0,0 +1,50 @@ +{% extends "base/container.html" %} + +{% block content %} +
+
+

Gestion du compte :

+ +
+ {{ form2.hidden_tag() }} +
+ {{ form2.email.label }} + {{ form2.email() }} + {% for error in form2.email.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form2.password.label }} + {{ form2.password() }} + {% for error in form2.password.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form2.password2.label }} + {{ form2.password2() }} + {% for error in form2.password2.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form2.newsletter.label }} + {{ form2.newsletter() }} +
{{ form2.newsletter.description }}
+ {% for error in form2.newsletter.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form2.old_password.label }} + {{ form2.old_password() }} + {% for error in form2.old_password.errors %} + {{ error }} + {% endfor %} +
+
{{ form2.submit(class_="bg-green") }}
+
+
+
+{% endblock %} diff --git a/app/templates/base/navbar/account.html b/app/templates/base/navbar/account.html index 6758b89..ac8dd12 100644 --- a/app/templates/base/navbar/account.html +++ b/app/templates/base/navbar/account.html @@ -31,7 +31,7 @@
- + @@ -49,14 +49,12 @@

Invité

-
Mot de passe oublié ?