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

DSN: Obecné UI pro čekání na mail s periodickou kontrolou nedoručenek

parent 565a0cb4
No related branches found
No related tags found
1 merge request!138Zpracování nedoručenek
...@@ -780,6 +780,30 @@ def user_validate_email(): ...@@ -780,6 +780,30 @@ def user_validate_email():
return render_template('acct_validate_email.html', form=form) return render_template('acct_validate_email.html', form=form)
def make_dsn_check_token(rr: db.RegRequest) -> str:
return mo.tokens.sign_token([str(rr.reg_id)], 'dsn-check')
@app.route('/acct/dsn-check/<token>')
def dsn_check(token):
# Jelikož nevyžadujeme login, nechceme předávat v URL přímo IDčka do databáze.
# Místo toho předáváme podepsaný token obsahující IDčko.
fields = mo.tokens.verify_token(token, 'dsn-check')
if not fields:
raise werkzeug.exceptions.NotFound()
reg_id = int(fields[0])
sess = db.get_session()
reg = sess.query(db.RegRequest).options(joinedload(db.RegRequest.dsn)).get(reg_id)
if not reg:
raise werkzeug.exceptions.NotFound()
if reg.dsn is not None:
return render_template('acct_dsn_check.html', dsn=reg.dsn)
else:
return ""
if getattr(config, 'INSECURE_TEST_LOGIN', False): if getattr(config, 'INSECURE_TEST_LOGIN', False):
@app.route('/test-login/<email>') @app.route('/test-login/<email>')
def test_login(email: str): def test_login(email: str):
......
<div class='alert alert-danger'>
E-mail se nepodařilo doručit.
<table class='dsn-check-err'>
<tr>
<th>Kód chyby:
<td>{{ dsn.status|dsn_status }}
<tr>
<th>Chybová zpráva:
<td>{{ dsn.diag_code|or_dash }}
<tr>
<th>Vzdálený server:
<td>{{ dsn.remote_mta|or_dash }}
</table>
</div>
{#
{% set dsns = [dsn] %}
{% include "parts/dsn.html" %}
#}
<div id='dsn-report'>
<p>
Počkejte prosím, až vám přijde e-mail, a klikněte na odkaz v něm uvedený.
</p>
</div>
{% if dsn_check_token %}
<script type="text/javascript">
let dsn_check_counter = 0;
let dsn_stop = false;
function schedule_dsn_check()
{
if (dsn_stop)
return;
dsn_check_counter++;
if (dsn_check_counter > 100)
return;
let timeout = 30_000;
if (dsn_check_counter < 10)
timeout = 5_000;
window.setTimeout(function() {
console.log('DSN: Checking');
fetch("{{ url_for('dsn_check', token=dsn_check_token) }}")
.then(response => {
if (response.status >= 400 && response.status <= 499)
dsn_stop = true;
if (response.ok)
return response.text();
else
throw Error("Failed with status code " + response.status)
})
.then((value) => {
if (value != "") {
console.log('DSN: Received report')
const report_div = document.getElementById("dsn-report");
report_div.innerHTML = value;
dsn_stop = true;
}
schedule_dsn_check();
})
.catch(err => {
console.log('DSN: ' + err)
schedule_dsn_check();
});
}, timeout);
}
schedule_dsn_check();
</script>
{% endif %}
...@@ -596,6 +596,21 @@ table.data input.form-control { ...@@ -596,6 +596,21 @@ table.data input.form-control {
margin: 2ex 2ex; margin: 2ex 2ex;
} }
/* Upozornění na nedoručený mail v registraci */
table.dsn-check-err {
border-collapse: collapse;
margin-top: 2ex;
}
table.dsn-check-err tr td, table.dsn-check-err tr th {
padding-top: 0.1ex;
}
table.dsn-check-err tr th {
padding-right: 2ex;
}
/* Vzhled pro mobily a úzké displeje */ /* Vzhled pro mobily a úzké displeje */
@media only screen and (max-width: 600px) { @media only screen and (max-width: 600px) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment