Skip to content
Snippets Groups Projects
Commit 81f83c39 authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Ostylován přihlašovací formulář a hlášky u něj

Solve #2
parent f163b3ce
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !11. Comments created here will be created in the context of that merge request.
import datetime import datetime
from flask import render_template, request, g, redirect, url_for, session from flask import render_template, request, g, redirect, url_for, session
from flask.helpers import flash
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
import werkzeug.exceptions import werkzeug.exceptions
import wtforms import wtforms
from wtforms.fields.html5 import EmailField
import wtforms.validators as validators import wtforms.validators as validators
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from typing import Optional from typing import Optional
...@@ -17,7 +19,7 @@ from mo.web import app, NeedLoginError ...@@ -17,7 +19,7 @@ from mo.web import app, NeedLoginError
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
next = wtforms.HiddenField() next = wtforms.HiddenField()
email = wtforms.StringField('E-mail', validators=[validators.DataRequired()]) email = EmailField('E-mail', validators=[validators.DataRequired()])
passwd = wtforms.PasswordField('Heslo') passwd = wtforms.PasswordField('Heslo')
submit = wtforms.SubmitField('Přihlásit se') submit = wtforms.SubmitField('Přihlásit se')
reset = wtforms.SubmitField('Obnovit heslo') reset = wtforms.SubmitField('Obnovit heslo')
...@@ -44,7 +46,7 @@ def login(): ...@@ -44,7 +46,7 @@ def login():
if not user: if not user:
app.logger.error('Login: Neznámý uživatel <%s>', email) app.logger.error('Login: Neznámý uživatel <%s>', email)
error = 'Neznámý uživatel.' flash('Neznámý uživatel', 'danger')
elif form.reset.data: elif form.reset.data:
app.logger.info('Login: Požadavek na reset hesla pro <%s>', email) app.logger.info('Login: Požadavek na reset hesla pro <%s>', email)
...@@ -52,17 +54,17 @@ def login(): ...@@ -52,17 +54,17 @@ def login():
now = datetime.datetime.now().astimezone() now = datetime.datetime.now().astimezone()
if (user.reset_at is not None if (user.reset_at is not None
and now - user.reset_at < min_time_between_resets): and now - user.reset_at < min_time_between_resets):
error = 'Poslední požadavek na obnovení hesla byl odeslán příliš nedávno.' flash('Poslední požadavek na obnovení hesla byl odeslán příliš nedávno', 'danger')
else: else:
token = mo.users.ask_reset_password(user) token = mo.users.ask_reset_password(user)
db.get_session().commit() db.get_session().commit()
mo.util.send_password_reset_email(user, token) mo.util.send_password_reset_email(user, token)
return render_template('reset.html') flash('Na uvedenou adresu byl odeslán e-mail s odkazem na obnovu hesla', 'success')
elif not form.passwd.data or not mo.users.check_password(user, form.passwd.data): elif not form.passwd.data or not mo.users.check_password(user, form.passwd.data):
app.logger.error('Login: Špatné heslo pro uživatele <%s>', email) app.logger.error('Login: Špatné heslo pro uživatele <%s>', email)
error = 'Chybné heslo.' flash('Chybné heslo', 'danger')
else: else:
app.logger.info('Login: Přihlásil se uživatel <%s>', email) app.logger.info('Login: Přihlásil se uživatel <%s>', email)
mo.users.login(user) mo.users.login(user)
...@@ -70,7 +72,7 @@ def login(): ...@@ -70,7 +72,7 @@ def login():
session['uid'] = user.user_id session['uid'] = user.user_id
return after_login(user, form.next.data) return after_login(user, form.next.data)
return render_template('login.html', form=form, error=error) return render_template('login.html', form=form)
@app.route('/auth/logout', methods=('POST',)) @app.route('/auth/logout', methods=('POST',))
...@@ -115,22 +117,20 @@ def handle_need_login(e): ...@@ -115,22 +117,20 @@ def handle_need_login(e):
class ResetForm(FlaskForm): class ResetForm(FlaskForm):
token = wtforms.HiddenField() token = wtforms.HiddenField()
passwd = wtforms.PasswordField('Heslo') passwd = wtforms.PasswordField('Nové heslo')
submit = wtforms.SubmitField('Nastavit heslo') submit = wtforms.SubmitField('Nastavit heslo')
cancel = wtforms.SubmitField('Zrušit obnovu hesla') cancel = wtforms.SubmitField('Zrušit obnovu hesla')
@app.route('/auth/reset', methods=('GET', 'POST')) @app.route('/auth/reset', methods=('GET', 'POST'))
def reset(): def reset():
if request.args.get('done'):
return render_template('reset.html', okay='Heslo nastaveno.')
form = ResetForm(token=request.args.get('token')) form = ResetForm(token=request.args.get('token'))
ok = form.validate_on_submit() ok = form.validate_on_submit()
user = mo.users.check_reset_password(form.token.data) user = mo.users.check_reset_password(form.token.data)
if not user: if not user:
return render_template('reset.html', fatal='Neplatný požadavek na obnovu hesla.') flash('Neplatný požadavek na obnovu hesla', 'danger')
return redirect(url_for('login'))
if not ok: if not ok:
return render_template('reset.html', form=form) return render_template('reset.html', form=form)
...@@ -138,13 +138,11 @@ def reset(): ...@@ -138,13 +138,11 @@ def reset():
mo.users.cancel_reset_password(user) mo.users.cancel_reset_password(user)
app.logger.info('Login: Zrušen reset hesla pro uživatele <%s>', user.email) app.logger.info('Login: Zrušen reset hesla pro uživatele <%s>', user.email)
db.get_session().commit() db.get_session().commit()
return render_template('reset.html', okay='Obnova hesla zrušena.') flash('Obnova hesla zrušena', 'warning')
return redirect(url_for('login'))
elif len(form.passwd.data) < 8: elif len(form.passwd.data) < 8:
return render_template( flash('Heslo musí být aspoň 8 znaků dlouhé', 'danger')
'reset.html', return render_template('reset.html', form=form)
form=form,
error='Heslo musí být aspoň 8 znaků dlouhé.'
)
else: else:
mo.users.do_reset_password(user) mo.users.do_reset_password(user)
mo.users.set_password(user, form.passwd.data) mo.users.set_password(user, form.passwd.data)
...@@ -155,4 +153,5 @@ def reset(): ...@@ -155,4 +153,5 @@ def reset():
details={'action': 'reset-passwd'}, details={'action': 'reset-passwd'},
) )
db.get_session().commit() db.get_session().commit()
return redirect(url_for('reset', done=1)) flash('Nové heslo úspěšně nastaveno, nyní se můžete přihlásit', 'success')
return redirect(url_for('login'))
{% extends "base.html" %} {% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block body %} {% block body %}
<h2>Login</h2> <h2>Login</h2>
{% if error %} <form method="POST" class="form form-horizontal" action="">
<p class=error>{{ error }}
{% endif %}
<form method="POST" action="">
{{ form.csrf_token }} {{ form.csrf_token }}
{{ form.next() }} {{ form.next() }}
<table> {{ wtf.form_field(form.email, form_type='horizontal') }}
<tr><td>E-mail:<td>{{ form.email(size=32) }} {{ wtf.form_field(form.passwd, form_type='horizontal') }}
<tr><td>Heslo:<td>{{ form.passwd(size=32) }} <div class="btn-group col-lg-offset-2">
<tr><td colspan=2>{{ form.submit() }} {{ form.reset() }} {{ wtf.form_field(form.submit, class="btn btn-primary") }}
</table> {{ wtf.form_field(form.reset) }}
</div>
</form> </form>
{% endblock %} {% endblock %}
{% extends "base.html" %} {% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block body %} {% block body %}
<h2>Obnova hesla</h2> <h2>Nastavení nového hesla</h2>
{% if fatal %} <form method="POST" class="form form-horizontal" action="">
<p class=error>{{ fatal }}
{% elif okay %}
<p class=okay>{{ okay }}
<p>Pokračujte <a href='{{ url_for('login') }}'>přihlášením do systému</a>.
{% elif form %}
{% if error %}
<p class=error>{{ error }}
{% endif %}
<form method="POST" action="">
{{ form.csrf_token }} {{ form.csrf_token }}
{{ form.token() }} {{ form.token() }}
<table> {{ wtf.form_field(form.passwd, form_type='horizontal') }}
<tr><td>Heslo:<td>{{ form.passwd(size=32) }} <div class="btn-group col-lg-offset-2">
<tr><td colspan=2>{{ form.submit() }} {{ form.cancel() }} {{ wtf.form_field(form.submit, class="btn btn-primary") }}
</table> {{ wtf.form_field(form.cancel) }}
</div>
</form> </form>
{% else %}
<p>Na uvedenou adresu byl odeslán e-mail s odkazem na obnovu hesla.
{% endif %}
{% endblock %} {% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment