From 7c20f4e776c45c12eaf4fe2ad56806a20c9e7e3c Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Fri, 24 Jan 2025 23:49:10 +0100
Subject: [PATCH] =?UTF-8?q?DSN:=20Org=20si=20m=C5=AF=C5=BEe=20nechat=20zob?=
 =?UTF-8?q?razit=20nedoru=C4=8Denky=20k=20=C3=BA=C4=8Dtu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 mo/web/org_users.py                | 20 ++++++++++++++++++++
 mo/web/templates/org_user_dsn.html | 24 ++++++++++++++++++++++++
 mo/web/templates/parts/dsn.html    | 28 ++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+)
 create mode 100644 mo/web/templates/org_user_dsn.html
 create mode 100644 mo/web/templates/parts/dsn.html

diff --git a/mo/web/org_users.py b/mo/web/org_users.py
index fdf5587f..43f104b0 100644
--- a/mo/web/org_users.py
+++ b/mo/web/org_users.py
@@ -823,3 +823,23 @@ def org_user_delete(user_id: int):
         return redirect(url_for('org_orgs') if user.is_org else url_for('org_users'))
 
     return render_template('org_user_delete.html', user=user, form=form, warnings=warnings, errors=errors)
+
+
+@app.route('/org/user/<int:user_id>/dsn')
+@app.route('/org/org/<int:user_id>/dsn', endpoint='org_org_dsn')
+def org_user_dsn(user_id: int):
+    sess = db.get_session()
+    user = mo.users.user_by_uid(user_id)
+    if not user:
+        raise werkzeug.exceptions.NotFound()
+
+    rr = g.gatekeeper.rights_generic()
+    if not rr.can_view_user(user):
+        raise werkzeug.exceptions.Forbidden()
+
+    dsns = (sess.query(db.EmailDSN)
+            .filter_by(user=user)
+            .order_by(db.EmailDSN.arrived_at.desc())
+            .all())
+
+    return render_template('org_user_dsn.html', user=user, dsns=dsns)
diff --git a/mo/web/templates/org_user_dsn.html b/mo/web/templates/org_user_dsn.html
new file mode 100644
index 00000000..f766a824
--- /dev/null
+++ b/mo/web/templates/org_user_dsn.html
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+{% block title %}Nedoručenky pro {{ user.email }}{% endblock %}
+{% block body %}
+
+{% if dsns %}
+
+<p>
+	Tuto e-mailovou adresu považujeme za nefunkční, protože pošta na ni poslaná
+	se vrátila jako nedoručitelná. Zde jsou zprávy o nedoručitelnosti e-mailů z nedávné doby.
+</p>
+
+{% include "parts/dsn.html" %}
+
+{% else %}
+
+<p><em>Momentálně neevidujeme žádnou nedoručitelnou poštu.</em></p>
+
+{% endif %}
+
+<div class="btn-group">
+	<a class='btn btn-primary' href="{{ user|user_url }}">Zpět na stránku uživatele</a>
+</div>
+
+{% endblock %}
diff --git a/mo/web/templates/parts/dsn.html b/mo/web/templates/parts/dsn.html
new file mode 100644
index 00000000..5feed019
--- /dev/null
+++ b/mo/web/templates/parts/dsn.html
@@ -0,0 +1,28 @@
+{# Výpis mailových nedoručenek #}
+
+{% for dsn in dsns %}
+
+<table class=data>
+	<tr>
+		<th>Čas
+		<td>{{ dsn.arrived_at|time_and_timedelta }}
+	<tr>
+		<th>Kód chyby
+		<td>{{ dsn.status }}
+	<tr>
+		<th>Chybová zpráva
+		<td>{{ dsn.diag_code|or_dash }}
+	<tr>
+		<th>Vzdálený server
+		<td>{{ dsn.remote_mta|or_dash }}
+	{% if g.user and g.user.is_admin %}
+	<tr>
+		<th>DSN token
+		<td>{{ dsn.token|or_dash }}
+	<tr>
+		<th>DSN Message-ID
+		<td>{{ dsn.message_id|or_dash }}
+	{% endif %}
+</table>
+
+{% endfor %}
-- 
GitLab