Compare commits

...

6 Commits

4 changed files with 56 additions and 22 deletions
src
fellchensammlung
models.py
templates/fellchensammlung/partials
views.py
tests/test_views

@ -680,6 +680,30 @@ class Report(models.Model):
def get_moderation_actions(self):
return ModerationAction.objects.filter(report=self)
@property
def reported_content(self):
"""
Dynamically fetch the reported content based on subclass.
The alternative would be to use the ContentType framework:
https://docs.djangoproject.com/en/5.1/ref/contrib/contenttypes/
"""
if hasattr(self, "reportadoptionnotice"):
return self.reportadoptionnotice.adoption_notice
elif hasattr(self, "reportcomment"):
return self.reportcomment.reported_comment
return None
@property
def reported_content_url(self):
"""
Same as reported_content, just for url
"""
if hasattr(self, "reportadoptionnotice"):
print(self.reportadoptionnotice.adoption_notice.get_absolute_url)
return self.reportadoptionnotice.adoption_notice.get_absolute_url
elif hasattr(self, "reportcomment"):
return self.reportcomment.reported_comment.get_absolute_url
return None
class ReportAdoptionNotice(Report):
adoption_notice = models.ForeignKey("AdoptionNotice", on_delete=models.CASCADE)
@ -688,6 +712,9 @@ class ReportAdoptionNotice(Report):
def reported_content(self):
return self.adoption_notice
def __str__(self):
return f"Report der Vermittlung {self.adoption_notice}"
class ReportComment(Report):
reported_comment = models.ForeignKey("Comment", on_delete=models.CASCADE)

@ -1,9 +1,7 @@
{% load i18n %}
<div class="report card">
<h2>
{% blocktranslate %}
Meldung von {{ report.reported_content }}
{% endblocktranslate %}
{% translate 'Meldung von ' %} <a href="{{ report.reported_content_url }}"><i>{{ report.reported_content }}</i></a>
</h2>
{% if report.reported_broken_rules %}
{% translate "Regeln gegen die Verstoßen wurde" %}
@ -13,19 +11,25 @@
{% endfor %}
</ul>
{% endif %}
<p><b>{% translate "Kommentar zur Meldung" %}:</b>
{{ report.user_comment }}
<p>
{% if report.user_comment %}
<b>{% translate "Kommentar zur Meldung" %}:</b> {{ report.user_comment }}
{% else %}
<i>{% translate 'Es wurde kein Kommentar zur Meldung hinzugefügt.' %}</i>
{% endif %}
</p>
<div class="container-edit-buttons">
<form action="allow" class="">
{% csrf_token %}
<input type="hidden" name="report_id" value="{{ report.pk }}">
<button class="btn allow" type="submit">{% translate "Inhalt genehmigen" %}</button>
</form>
<form action="disallow" class="">
{% csrf_token %}
<input type="hidden" name="report_id" value="{{ report.pk }}">
<button class="btn allow" type="submit">{% translate "Inhalt als gesperrt kennzeichnen" %}</button>
</form>
</div>
{% if is_mod_or_above %}
<div class="container-edit-buttons">
<form action="allow" class="">
{% csrf_token %}
<input type="hidden" name="report_id" value="{{ report.pk }}">
<button class="btn allow" type="submit">{% translate "Inhalt genehmigen" %}</button>
</form>
<form action="disallow" class="">
{% csrf_token %}
<input type="hidden" name="report_id" value="{{ report.pk }}">
<button class="btn allow" type="submit">{% translate "Inhalt als gesperrt kennzeichnen" %}</button>
</form>
</div>
{% endif %}
</div>

@ -429,10 +429,13 @@ def report_detail(request, report_id, form_complete=False):
"""
Detailed view of a report, including moderation actions
"""
report = Report.objects.get(pk=report_id)
# Prefetching reduces the number of queries to the database that are needed (see reported_content)
report = Report.objects.select_related("reportadoptionnotice", "reportcomment").get(pk=report_id)
moderation_actions = ModerationAction.objects.filter(report_id=report_id)
is_mod_or_above = user_is_trust_level_or_above(request.user, TrustLevel.MODERATOR)
context = {"report": report, "moderation_actions": moderation_actions, "form_complete": form_complete}
context = {"report": report, "moderation_actions": moderation_actions,
"form_complete": form_complete, "is_mod_or_above": is_mod_or_above}
return render(request, 'fellchensammlung/details/detail-report.html', context)
@ -503,7 +506,7 @@ def my_profile(request):
@user_passes_test(user_is_trust_level_or_above)
def modqueue(request):
open_reports = Report.objects.filter(status=Report.WAITING)
open_reports = Report.objects.select_related("reportadoptionnotice", "reportcomment").filter(status=Report.WAITING)
context = {"reports": open_reports}
return render(request, 'fellchensammlung/modqueue.html', context=context)

@ -108,7 +108,7 @@ class BasicViewTest(TestCase):
self.assertTrue(ReportComment.objects.filter(reported_comment=c.pk).exists())
def test_show_report_details_logged_in(self):
self.client.login(username='testuser0', password='12345')
self.client.login(username='testuser1', password='12345')
report = ReportComment.objects.get(user_comment="ReportComment1")
response = self.client.get(reverse('report-detail', args=(report.pk,)))
self.assertEqual(response.status_code, 200)
@ -125,7 +125,7 @@ class BasicViewTest(TestCase):
self.assertNotContains(response, '<form action="allow" class="">')
def test_show_report_details_admin(self):
self.client.login(username='testuser1', password='12345')
self.client.login(username='testuser0', password='12345')
report = ReportComment.objects.get(user_comment="ReportComment1")
response = self.client.get(reverse('report-detail', args=(report.pk,)))
self.assertEqual(response.status_code, 200)