Skip to content
Snippets Groups Projects

Registrace

Compare and Show latest version
1 file
+ 22
18
Compare changes
  • Side-by-side
  • Inline
+ 22
18
@@ -30,7 +30,7 @@ class LoginForm(FlaskForm):
reset = wtforms.SubmitField('Zapomenuté heslo')
def login_and_redirect(user: db.User, url: Optional[str] = None):
def login_and_redirect(user: db.User, flash_msg: Optional[str] = None, url: Optional[str] = None):
session.clear()
session['uid'] = user.user_id
if not url:
@@ -40,6 +40,8 @@ def login_and_redirect(user: db.User, url: Optional[str] = None):
url = url_for('index')
else:
url = request.script_root + url
if flash_msg:
flash(flash_msg, 'success')
return redirect(url)
@@ -107,7 +109,7 @@ def incarnate(id):
raise werkzeug.exceptions.NotFound()
app.logger.info('Login: Uživatel #%s se převtělil na #%s', g.user.user_id, new_user.user_id)
return login_and_redirect(new_user)
return login_and_redirect(new_user, flash_msg='Převtělení proběhlo')
@app.route('/user/settings')
@@ -176,7 +178,7 @@ def reset():
app.logger.info('Login: Přihlásil se uživatel <%s> po resetování hesla', user.email)
db.get_session().commit()
flash('Nastavení nového hesla a přihlášení do systému proběhlo úspěšně', 'success')
return login_and_redirect(user)
return login_and_redirect(user, flash_msg='Heslo nastaveno')
class RegStatus(Enum):
@@ -242,16 +244,17 @@ class Reg1:
x, y = self._captcha()
cisla = ['nula', 'jedna', 'dva', 'tři', 'čtyři', 'pět', 'šest', 'sedm', 'osm', 'devět',
'deset', 'jedenáct', 'dvanáct', 'třináct', 'čtrnáct', 'patnáct', 'šestnáct', 'sedmnáct', 'osmnáct', 'devatenáct']
app.logger.debug(f'Reg1: Captcha: {x}*{y}')
return f'Napiš číslem, kolik je {cisla[x]} krát {cisla[y]}.'
def captcha_check_answer(self, answer: str) -> bool:
x, y = self._captcha()
correct = x * y
if answer == str(correct):
app.logger.debug(f'Reg1: Captcha: {answer} správně')
app.logger.debug(f'Reg1: Captcha: {x}*{y}={answer} správně')
return True
else:
app.logger.debug(f'Reg1: Captcha: {answer} špatně')
app.logger.debug(f'Reg1: Captcha: {x}*{y}={answer} špatně')
return False
def create_reg_request(self, email: str) -> bool:
@@ -306,23 +309,24 @@ class Reg1Form(FlaskForm):
def validate_captcha(self, field):
c = self._reg1
if not c.captcha_check_answer(field.data):
raise ValidationError('Chybný výsledek: ' + c.task())
raise ValidationError('Chybný výsledek: ' + c.captcha_task())
@app.route('/auth/create', methods=('GET', 'POST'))
def create_acct():
form = Reg1Form()
reg1 = mo.users.RegStep1(form.token.data)
reg1 = Reg1(form.token.data)
form._reg1 = reg1
form.captcha.description = reg1.captcha_task()
if reg1.status == RegStatus.ok and form.validate_on_submit():
# XXX: Existenci e-mailu chceme kontrolovat až po spotřebování captchi na reg_request
if reg1.create_reg_request(form.email.data) and reg1.check_email_free(form.email.data):
flash('Odeslán e-mail s odkazem na založení účtu', 'success')
mo.util.send_confirm_create_email(reg1.email_token)
user = db.User(email=form.email.data, first_name='Nový', last_name='Uživatel')
mo.util.send_confirm_create_email(user, reg1.email_token)
return redirect(url_for('confirm_email'))
form.captcha.description = reg1.captcha_task()
if reg1.status != RegStatus.ok:
form.token.data = reg1.as_token()
form.captcha.data = ""
@@ -368,15 +372,15 @@ class Reg2:
sess = db.get_session()
rr = sess.query(db.RegRequest).with_for_update().filter_by(email_token=token).one_or_none()
if not rr:
# FIXME: Log
app.logger.info('Reg2: Registrace nenalezena')
return RegStatus.expired
if rr.expires_at < mo.now:
# FIXME: Log
app.logger.info('Reg2: Registrace expirovala')
return RegStatus.expired
if rr.used_at is not None:
# FIXME: Log
app.logger.info('Reg2: Registrace spotřebována')
return RegStatus.already_spent
self.rr = rr
@@ -418,15 +422,15 @@ class Reg2:
class Reg2Form(FlaskForm):
email = wtforms.StringField('E-mail', validators=[validators.DataRequired()], render_kw={"disabled": "disabled"})
email = wtforms.StringField('E-mail', render_kw={"disabled": "disabled"})
first_name = wtforms.StringField('Křestní jméno', validators=[validators.DataRequired()])
last_name = wtforms.StringField('Příjmení', validators=[validators.DataRequired()])
passwd = wtforms.PasswordField('Heslo', description='Heslo musí mít alespoň 8 znaků. Doporučujeme kombinovat velká a malá písmena a číslice.')
passwd2 = wtforms.PasswordField('Zopakujte heslo')
passwd = wtforms.PasswordField('Heslo', description='Heslo musí mít alespoň 8 znaků. Doporučujeme kombinovat velká a malá písmena a číslice.', validators=[validators.DataRequired()])
passwd2 = wtforms.PasswordField('Zopakujte heslo', validators=[validators.DataRequired()])
submit = wtforms.SubmitField('Vytvořit účet')
def validate_passwd(form, field):
if len(field) < 8:
if len(field.data) < 8:
raise wtforms.ValidationError('Heslo musí mít aspoň 8 znaků.')
def validate_passwd2(form, field):
@@ -458,12 +462,12 @@ def confirm_email():
if reg2.create(form.first_name.data, form.last_name.data, form.passwd.data):
flash('Založení účtu a přihlášení do systému proběhlo úspěšně', 'success')
app.logger.info(f'Login: Přihlásil se uživatel <{reg2.user.email}> po založení účtu')
return login_and_redirect(reg2.user)
return login_and_redirect(reg2.user, flash_msg='Účet úspěšně založen')
if reg2.status == RegStatus.already_exists:
flash('Účet s touto adresou už existuje')
form.email = reg2.rr.email
form.email.data = reg2.rr.email
db.get_session().rollback() # Nechcme držet transakci otevřenou zbytečně dlouho
return render_template('acct_reg2.html', form=form)
Loading