Skip to content
Snippets Groups Projects
Commit 1f416065 authored by Martin Mareš's avatar Martin Mareš
Browse files

Merge branch 'mj/settings' into 'devel'

UI na uživatelské preference

See merge request mj/mo-submit!104
parents 8a457b17 4704bb3f
Branches
No related tags found
1 merge request!104UI na uživatelské preference
......@@ -12,7 +12,7 @@ import mo.config as config
from mo.util import logger
def send_user_email(user: db.User, subject: str, body: str) -> bool:
def send_user_email(user: db.User, subject: str, body: str, add_footer: bool = False) -> bool:
logger.info(f'Mail: "{subject}" -> {user.email}')
mail_from = getattr(config, 'MAIL_FROM', None)
......@@ -38,6 +38,11 @@ def send_user_email(user: db.User, subject: str, body: str) -> bool:
msg['Subject'] = 'OSMO – ' + subject
msg['Date'] = datetime.datetime.now()
if add_footer:
body += "\n" + ("=" * 76) + "\n"
body += "Pokud nechcete tyto e-maily dostávat, vypněte si notifikace v nastavení\n"
body += f"svého účtu na {settings_url()}."
msg.set_content(body, cte='quoted-printable')
mail_instead = getattr(config, 'MAIL_INSTEAD', None)
......@@ -80,6 +85,10 @@ def contestant_list_url(contest: db.Contest, registered_only: bool) -> str:
return url
def settings_url() -> str:
return config.WEB_ROOT + 'acct/settings'
def send_new_account_email(user: db.User, token: str) -> bool:
return send_user_email(user, 'Založen nový účet', textwrap.dedent('''\
Vítejte!
......@@ -153,4 +162,4 @@ def send_join_notify_email(dest: db.User, who: db.User, contest: db.Contest) ->
{url}
Váš OSMO
'''))
'''), add_footer=True)
from flask import Flask, request, g, session
from flask import Flask, request, g, session, redirect, url_for
import flask.logging
import flask.wrappers
from flask_bootstrap import Bootstrap
......@@ -166,6 +166,8 @@ def init_request():
elif path.startswith('/user/'):
if not user:
raise NeedLoginError()
if user.is_org or user.is_admin:
return redirect(url_for('org_index'))
app.before_request(init_request)
......
......
......@@ -107,9 +107,28 @@ def incarnate(id):
return login_and_redirect(new_user, flash_msg='Převtělení proběhlo')
@app.route('/user/settings')
class AcctSettingsForm(FlaskForm):
email_notify = wtforms.BooleanField('Posílat e-mailové notifikace')
submit = wtforms.SubmitField('Nastavit')
# URL je explicitně uvedeno v mo.email.settings_url
@app.route('/acct/settings', methods=('GET', 'POST'))
def user_settings():
sess = db.get_session()
user = g.user
form = AcctSettingsForm()
if not form.submit.data:
form.email_notify.data = user.email_notify
if form.validate_on_submit():
user.email_notify = form.email_notify.data
app.logger.info(f'Settings: Změněny preference uživatele #{user.user_id}: {db.get_object_changes(user)}')
# Do databázového logu nezapisujeme, nemá smysl logovat prkotiny.
sess.commit()
flash('Nastavení změněno.', 'success')
return redirect(url_for('user_settings'))
roles = (sess.query(db.UserRole)
.filter_by(user_id=g.user.user_id)
......@@ -121,10 +140,13 @@ def user_settings():
else:
pant = sess.query(db.Participant).get((g.user.user_id, config.CURRENT_YEAR))
return render_template('settings.html', user=g.user, pant=pant, roles=roles, roles_by_type=mo.rights.roles_by_type)
return render_template(
'settings.html',
user=g.user, pant=pant, roles=roles, roles_by_type=mo.rights.roles_by_type,
form=form)
class SettingsForm(FlaskForm):
class PersonalSettingsForm(FlaskForm):
email = mo_fields.Email(validators=[validators.DataRequired()])
current_passwd = mo_fields.Password('Aktuální heslo', validators=[validators.DataRequired()])
new_passwd = mo_fields.NewPassword(
......@@ -138,12 +160,12 @@ class SettingsForm(FlaskForm):
raise ValidationError('Chybné heslo.')
@app.route('/user/settings/change', methods=('GET', 'POST'))
def user_settings_change():
@app.route('/acct/settings/personal', methods=('GET', 'POST'))
def user_settings_personal():
sess = db.get_session()
user = g.user
form = SettingsForm()
form = PersonalSettingsForm()
if not form.submit.data:
form.email.data = user.email
......
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Uživatel {{ user.full_name() }}{% endblock %}
{% block body %}
......@@ -15,11 +16,24 @@
{% endif %}
</table>
<p><a class='btn btn-primary' href='{{ url_for('user_settings_change') }}'>Změnit e-mail nebo heslo</a>
<p><a class='btn btn-primary' href='{{ url_for('user_settings_personal') }}'>Změnit e-mail nebo heslo</a>
<p>Pokud potřebujete změnit jiné údaje, ozvěte se svému učiteli nebo garantovi.
Neuspějete-li u nich, napište správci OSMO (kontakt viz patička stránky).
<h3>Nastavení</h3>
<form action="" method="post" class="form" role="form">
{{ form.csrf_token }}
<div class='form-group'>
{{ wtf.form_field(form.email_notify, form_type='simple') }}
</div>
{{ wtf.form_field(form.submit, form_type='simple', button_map={'submit': 'primary'}) }}
</form>
{% if user.is_admin or user.is_org %}
<h3>Práva</h3>
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment