From: Michael Tremer Date: Sun, 8 Feb 2026 18:35:03 +0000 (+0000) Subject: dbl: Implement closing reports X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10c94a092364ab3ae3dfec083f5412af378b22d5;p=ipfire.org.git dbl: Implement closing reports Signed-off-by: Michael Tremer --- diff --git a/src/backend/dbl.py b/src/backend/dbl.py index 5693fad9..c50301cf 100644 --- a/src/backend/dbl.py +++ b/src/backend/dbl.py @@ -66,7 +66,8 @@ class DBL(Object): raise e # Decode the response - return json.loads(response.body) + if response.body: + return json.loads(response.body) async def get_lists(self): """ @@ -378,6 +379,27 @@ class Report(Model): return self._list + # Close! + + async def close(self, closed_by, accept=True): + """ + Closes the report + """ + # Cannot already be closed + if self.is_closed(): + raise RuntimeError("Report %s is already closed" % self) + + # Compose the payload + body = { + "closed_by" : closed_by.uid, + "accept" : accept, + } + + # Send the request + await self._backend.dbl._fetch( + "/reports/%s/close" % self.id, method="POST", body=body, + ) + class History(Model): """ diff --git a/src/templates/dbl/reports/show.html b/src/templates/dbl/reports/show.html index ce1f77f9..2e586f38 100644 --- a/src/templates/dbl/reports/show.html +++ b/src/templates/dbl/reports/show.html @@ -102,26 +102,33 @@ {% end %} - {% if current_user and current_user.is_dbl_moderator() %} -
-
- {% raw xsrf_form_html() %} - - -
-
+ {# Actions #} + {% if not report.is_closed() %} + {% if current_user and current_user.is_dbl_moderator() %} +
+
+ {% raw xsrf_form_html() %} -
- - {% raw xsrf_form_html() %} + - - -
+ + +
+ +
+
+ {% raw xsrf_form_html() %} + + + + +
+
+ {% end %} {% end %} diff --git a/src/web/__init__.py b/src/web/__init__.py index 45e13f0b..2bb5ff55 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -227,6 +227,7 @@ class Application(tornado.web.Application): (r"/dbl/lists/([\w\-]+)/history", dbl.ListHistoryHandler), (r"/dbl/report", dbl.SubmitReportHandler), (r"/dbl/reports/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})", dbl.ReportHandler), + (r"/dbl/reports/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/close", dbl.ReportCloseHandler), (r"/dbl/search", dbl.SearchHandler), # Single-Sign-On for Discourse diff --git a/src/web/dbl.py b/src/web/dbl.py index ac16132a..fea1f284 100644 --- a/src/web/dbl.py +++ b/src/web/dbl.py @@ -142,6 +142,29 @@ class ReportHandler(base.AnalyticsMixin, BaseHandler): list=list, reporter=reporter, status=status) +class ReportCloseHandler(base.AnalyticsMixin, BaseHandler): + def prepare(self): + # Require DBL moderators + if not self.current_user.is_dbl_moderator(): + raise tornado.web.HTTPError(401) + + @tornado.web.authenticated + async def post(self, id): + # Fetch the report + report = await self.backend.dbl.get_report(id) + if not report: + raise tornado.web.HTTPError(404, "Could not find report '%s'" % id) + + # Has the report been accepted? + accept = self.get_argument_bool("accept") + + # Approve the report + await report.close(self.current_user, accept=accept) + + # Send back to the report + self.redirect("/dbl/reports/%s" % report.id) + + class SearchHandler(base.AnalyticsMixin, BaseHandler): async def get(self): # Fetch the query