raise e
# Decode the response
- return json.loads(response.body)
+ if response.body:
+ return json.loads(response.body)
async def get_lists(self):
"""
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):
"""
{% end %}
</nav>
- {% if current_user and current_user.is_dbl_moderator() %}
- <div class="block">
- <form method="POST" action="/dbl/reports/{{ report.id }}/approve">
- {% raw xsrf_form_html() %}
-
- <button class="button is-success is-fullwidth">
- {{ _("Approve") }}
- </button>
- </form>
- </div>
+ {# Actions #}
+ {% if not report.is_closed() %}
+ {% if current_user and current_user.is_dbl_moderator() %}
+ <div class="block">
+ <form method="POST" action="/dbl/reports/{{ report.id }}/close">
+ {% raw xsrf_form_html() %}
- <div class="block">
- <form method="POST" action="/dbl/reports/{{ report.id }}/reject">
- {% raw xsrf_form_html() %}
+ <input type="hidden" name="accept" value="true" />
- <button class="button is-link is-outlined is-fullwidth">
- {{ _("Reject") }}
- </button>
- </form>
- </div>
+ <button class="button is-success is-fullwidth">
+ {{ _("Approve") }}
+ </button>
+ </form>
+ </div>
+
+ <div class="block">
+ <form method="POST" action="/dbl/reports/{{ report.id }}/close">
+ {% raw xsrf_form_html() %}
+
+ <input type="hidden" name="accept" value="false" />
+
+ <button class="button is-link is-outlined is-fullwidth">
+ {{ _("Reject") }}
+ </button>
+ </form>
+ </div>
+ {% end %}
{% end %}
</div>
</div>
(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
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