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

Tlačítko na pozvání zvacího emailu / resetování hesla v detailu soutěžícího/organizátora

Užitečné po změně emailu.
parent 535f147c
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !56. Comments created here will be created in the context of that merge request.
...@@ -7,6 +7,7 @@ from sqlalchemy import or_ ...@@ -7,6 +7,7 @@ from sqlalchemy import or_
from sqlalchemy.orm import joinedload, subqueryload from sqlalchemy.orm import joinedload, subqueryload
from wtforms import validators from wtforms import validators
from wtforms.fields.simple import SubmitField
from wtforms.validators import Required from wtforms.validators import Required
...@@ -210,6 +211,20 @@ class FormRemoveRole(FlaskForm): ...@@ -210,6 +211,20 @@ class FormRemoveRole(FlaskForm):
remove = wtforms.SubmitField('Odebrat roli') remove = wtforms.SubmitField('Odebrat roli')
class ResendInviteForm(FlaskForm):
resend_invite = SubmitField()
def do(self, user: db.User):
token = mo.users.ask_reset_password(user)
db.get_session().commit()
if user.last_login_at is None and mo.util.send_new_account_email(user, token):
flash('Uvítací e-mail s odkazem pro nastavení hesla odeslán na {}'.format(user.email), 'success')
elif mo.util.send_password_reset_email(user, token):
flash('E-mail s odkazem pro resetování hesla odeslán na {}'.format(user.email), 'success')
else:
flash('Problém při odesílání e-mailu s odkazem pro nastavení hesla', 'danger')
@app.route('/org/org/<int:id>/', methods=('GET', 'POST')) @app.route('/org/org/<int:id>/', methods=('GET', 'POST'))
def org_org(id: int): def org_org(id: int):
sess = db.get_session() sess = db.get_session()
...@@ -222,6 +237,13 @@ def org_org(id: int): ...@@ -222,6 +237,13 @@ def org_org(id: int):
rr = g.gatekeeper.rights_generic() rr = g.gatekeeper.rights_generic()
can_assign_rights = rr.have_right(Right.assign_rights) can_assign_rights = rr.have_right(Right.assign_rights)
resend_invite_form: Optional[ResendInviteForm] = None
if rr.can_edit_user(user):
resend_invite_form = ResendInviteForm()
if resend_invite_form.validate_on_submit():
resend_invite_form.do(user)
return redirect(url_for('org_org', id=id))
form_add_role = FormAddRole() form_add_role = FormAddRole()
form_remove_role = FormRemoveRole() form_remove_role = FormRemoveRole()
role_errors = [] role_errors = []
...@@ -286,6 +308,7 @@ def org_org(id: int): ...@@ -286,6 +308,7 @@ def org_org(id: int):
can_incarnate=g.user.is_admin, can_incarnate=g.user.is_admin,
roles_by_type=mo.rights.roles_by_type, role_errors=role_errors, roles_by_type=mo.rights.roles_by_type, role_errors=role_errors,
form_add_role=form_add_role, form_remove_role=form_remove_role, form_add_role=form_add_role, form_remove_role=form_remove_role,
resend_invite_form=resend_invite_form,
) )
...@@ -300,6 +323,13 @@ def org_user(id: int): ...@@ -300,6 +323,13 @@ def org_user(id: int):
rr = g.gatekeeper.rights_generic() rr = g.gatekeeper.rights_generic()
resend_invite_form: Optional[ResendInviteForm] = None
if rr.can_edit_user(user):
resend_invite_form = ResendInviteForm()
if resend_invite_form.validate_on_submit():
resend_invite_form.do(user)
return redirect(url_for('org_user', id=id))
participants = sess.query(db.Participant).filter_by(user_id=user.user_id) participants = sess.query(db.Participant).filter_by(user_id=user.user_id)
participations = ( participations = (
sess.query(db.Participation, db.Contest, db.Round) sess.query(db.Participation, db.Contest, db.Round)
...@@ -316,6 +346,7 @@ def org_user(id: int): ...@@ -316,6 +346,7 @@ def org_user(id: int):
'org_user.html', user=user, can_edit=rr.can_edit_user(user), 'org_user.html', user=user, can_edit=rr.can_edit_user(user),
can_incarnate=g.user.is_admin, can_incarnate=g.user.is_admin,
participants=participants, participations=participations, participants=participants, participations=participations,
resend_invite_form=resend_invite_form,
) )
......
...@@ -15,20 +15,27 @@ ...@@ -15,20 +15,27 @@
<tr><td>Poznámka:<td style="white-space: pre;">{{ user.note }} <tr><td>Poznámka:<td style="white-space: pre;">{{ user.note }}
</table> </table>
{% if can_edit %}
<div class="btn-group" role="group"> <div class="btn-group" role="group">
{% if can_edit %}
<a class="btn btn-primary" href="{{ url_for('org_org_edit', id=user.user_id) }}">Editovat</a> <a class="btn btn-primary" href="{{ url_for('org_org_edit', id=user.user_id) }}">Editovat</a>
{% endif %}
{% if resend_invite_form %}
<form method=POST class='btn-group' onsubmit='return confirm("Poslat organizátorovi email s odkazem na vytvoření hesla?");'>
{{ resend_invite_form.csrf_token }}
<button class="btn btn-default" type='submit' name='resend_invite'>
{% if user.last_login_at %}Resetovat heslo{% else %}Znovu poslat zvací email{% endif %}
</button>
</form>
{% endif %}
{% if g.user.is_admin %} {% if g.user.is_admin %}
<a class="btn btn-default" href="{{ log_url('user', user.user_id) }}">Historie</a> <a class="btn btn-default" href="{{ log_url('user', user.user_id) }}">Historie</a>
{% endif %} {% endif %}
</div>
{% endif %}
{% if can_incarnate %} {% if can_incarnate %}
<form action="{{ url_for('incarnate', id=user.user_id) }}" method=POST class='btn-group'> <form action="{{ url_for('incarnate', id=user.user_id) }}" method=POST class='btn-group'>
<button class="btn btn-default" type='Submit'>Převtělit se</button> <button class="btn btn-default" type='Submit'>Převtělit se</button>
</form> </form>
{% endif %} {% endif %}
</div>
{% if user.is_org or user.is_admin %} {% if user.is_org or user.is_admin %}
<h3>Role</h3> <h3>Role</h3>
......
...@@ -10,25 +10,32 @@ ...@@ -10,25 +10,32 @@
{% if user.is_admin %}<tr><td>Správce:<td>ano{% endif %} {% if user.is_admin %}<tr><td>Správce:<td>ano{% endif %}
{% if user.is_org %}<tr><td>Organizátor:<td>ano{% endif %} {% if user.is_org %}<tr><td>Organizátor:<td>ano{% endif %}
<tr><td>Účet založen:<td>{{ user.created_at|timeformat }} <tr><td>Účet založen:<td>{{ user.created_at|timeformat }}
<tr><td>Poslední přihlášení:<td>{{ user.last_login_at|timeformat }} <tr><td>Poslední přihlášení:{% if user.last_login_at %}<td>{{ user.last_login_at|timeformat }}{% else %}<td class="error"><i>Zatím nepřihlášen</i>{% endif %}
{% if user.reset_at %}<tr><td>Reset hesla:<td>{{ user.reset_at|timeformat }}{% endif %} {% if user.reset_at %}<tr><td>Reset hesla:<td>{{ user.reset_at|timeformat }}{% endif %}
<tr><td>Poznámka:<td style="white-space: pre;">{{ user.note }} <tr><td>Poznámka:<td style="white-space: pre;">{{ user.note }}
</table> </table>
{% if can_edit %}
<div class="btn-group" role="group"> <div class="btn-group" role="group">
{% if can_edit %}
<a class="btn btn-primary" href="{{ url_for('org_user_edit', id=user.user_id) }}">Editovat</a> <a class="btn btn-primary" href="{{ url_for('org_user_edit', id=user.user_id) }}">Editovat</a>
{% endif %}
{% if resend_invite_form %}
<form method=POST class='btn-group' onsubmit='return confirm("Poslat účastníkovi email s odkazem na vytvoření hesla?");'>
{{ resend_invite_form.csrf_token }}
<button class="btn btn-default" type='submit' name='resend_invite'>
{% if user.last_login_at %}Resetovat heslo{% else %}Znovu poslat zvací email{% endif %}
</button>
</form>
{% endif %}
{% if g.user.is_admin %} {% if g.user.is_admin %}
<a class="btn btn-default" href="{{ log_url('user', user.user_id) }}">Historie</a> <a class="btn btn-default" href="{{ log_url('user', user.user_id) }}">Historie</a>
{% endif %} {% endif %}
</div>
{% endif %}
{% if can_incarnate %} {% if can_incarnate %}
<form action="{{ url_for('incarnate', id=user.user_id) }}" method=POST class='btn-group'> <form action="{{ url_for('incarnate', id=user.user_id) }}" method=POST class='btn-group'>
<button class="btn btn-default" type='Submit'>Převtělit se</button> <button class="btn btn-default" type='Submit'>Převtělit se</button>
</form> </form>
{% endif %} {% endif %}
</div>
<h3>Registrace v ročnících</h3> <h3>Registrace v ročnících</h3>
{% if participants.count() %} {% if participants.count() %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment