Skip to content

Commit 6c6d5ff

Browse files
authored
Merge pull request #520 from digitalfabrik/feature/filter_feedback_by_content_creator
Filter feedback by object creator
2 parents cefc8c8 + b80b762 commit 6c6d5ff

7 files changed

Lines changed: 92 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
UNRELEASED
22
----------
33

4+
* [ [#353](https://github.com/digitalfabrik/lunes-cms/issues/353) ] Filter feedback by creator of related objects
5+
46

57
2024.5.1
68
--------

lunes_cms/cms/admins/feedback_admin.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from django.contrib import admin, messages
2+
23
from django.utils.translation import gettext_lazy as _
34

5+
from ..feedback_filter import filter_feedback_by_creator
46
from ..models import Feedback
57

68

@@ -67,6 +69,14 @@ def mark_as_unread(self, request, queryset):
6769
),
6870
)
6971

72+
def get_queryset(self, request):
73+
feedback_entries = super().get_queryset(request)
74+
75+
if not request.user.is_superuser:
76+
return filter_feedback_by_creator(feedback_entries, request.user)
77+
78+
return feedback_entries
79+
7080
class Media:
7181
"""
7282
Media class for Feedback Admin

lunes_cms/cms/feedback_filter.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from django.contrib.contenttypes.models import ContentType
2+
from django.db.models import Q
3+
4+
from .models import Discipline, TrainingSet, Document
5+
6+
7+
def filter_feedback_by_creator(feedback_queryset, user):
8+
"""
9+
Exclude feedback entries that are not related to objects created by the user
10+
"""
11+
12+
# Collect content type ID of discipline/trainingset/document model
13+
discipline_type_id = ContentType.objects.get(model="discipline").id
14+
trainingset_type_id = ContentType.objects.get(model="trainingset").id
15+
document_type_id = ContentType.objects.get(model="document").id
16+
17+
# Collect IDs disciplines/training sets/documents created by the user
18+
user_discipline_ids = [
19+
discipline.id
20+
for discipline in Discipline.objects.filter(created_by__in=user.groups.all())
21+
]
22+
user_trainingset_ids = [
23+
trainingset.id
24+
for trainingset in TrainingSet.objects.filter(created_by__in=user.groups.all())
25+
]
26+
user_document_ids = [
27+
document.id
28+
for document in Document.objects.filter(created_by__in=user.groups.all())
29+
]
30+
31+
# content_object field of feedback object cannot be used for direct query
32+
# Use content_type and object_id instead
33+
user_feedback_entries = feedback_queryset.filter(
34+
Q(content_type=discipline_type_id, object_id__in=user_discipline_ids)
35+
| (
36+
Q(content_type=trainingset_type_id, object_id__in=user_trainingset_ids)
37+
| Q(content_type=document_type_id, object_id__in=user_document_ids)
38+
)
39+
)
40+
41+
return user_feedback_entries

lunes_cms/cms/fixtures/test_data.json

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@
5858
["add_trainingset", "cms", "trainingset"],
5959
["change_trainingset", "cms", "trainingset"],
6060
["delete_trainingset", "cms", "trainingset"],
61-
["view_trainingset", "cms", "trainingset"]
61+
["view_trainingset", "cms", "trainingset"],
62+
["view_feedback", "cms", "feedback"]
6263
]
6364
}
6465
},
@@ -24825,5 +24826,25 @@
2482524826
"model": "cms.sponsor",
2482624827
"pk": 2,
2482724828
"fields": { "name": "Bundesagentur für Arbeit", "url": "https://www.arbeitsagentur.de/", "logo": "" }
24829+
},
24830+
{
24831+
"model": "cms.feedback",
24832+
"pk": 1,
24833+
"fields": {
24834+
"content_type": 1,
24835+
"object_id": 15,
24836+
"comment": "Good",
24837+
"created_date": "2022-06-28T23:21:07.074Z"
24838+
}
24839+
},
24840+
{
24841+
"model": "cms.feedback",
24842+
"pk": 2,
24843+
"fields": {
24844+
"content_type": 2,
24845+
"object_id": 36,
24846+
"comment": "Nice",
24847+
"created_date": "2022-06-28T23:21:07.074Z"
24848+
}
2482824849
}
2482924850
]

lunes_cms/cms/templates/admin/base.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
{% block extrajs %}
44
<script>
5-
let unread_feedback_cnt = {{ unread_feedback_cnt }};
5+
let unread_feedback_count = {{ unread_feedback_count }};
66
// Get the navigation item for the feedback menu entry
77
let feedbackNavItem = $("#jazzy-sidebar a.nav-link[href$='/admin/cms/feedback/']");
88
// If unread feedback exists, show counter
9-
if (feedbackNavItem && unread_feedback_cnt > 0) {
9+
if (feedbackNavItem && unread_feedback_count > 0) {
1010
// Create span element for counter
1111
let counterSpan = $(document.createElement("span"));
12-
counterSpan.text(unread_feedback_cnt);
12+
counterSpan.text(unread_feedback_count);
1313
counterSpan.addClass("position-absolute text-center rounded-circle bg-danger ml-2 px-1");
1414
counterSpan.css("min-width", "22.5px");
1515
// Append counter to the feedback link

lunes_cms/core/context_processors.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Context processors pass additional variables to templates (see :ref:`context-processors`).
33
"""
44
from ..cms.models import Feedback
5+
from ..cms.feedback_filter import filter_feedback_by_creator
56

67

78
def feedback_processor(request):
@@ -14,4 +15,11 @@ def feedback_processor(request):
1415
:return: The template context containing the number of unread feedback entries
1516
:rtype: dict
1617
"""
17-
return {"unread_feedback_cnt": Feedback.objects.filter(read_by=None).count()}
18+
unread_feedback_entries = Feedback.objects.filter(read_by=None)
19+
20+
if not request.user.is_superuser:
21+
unread_feedback_entries = filter_feedback_by_creator(
22+
unread_feedback_entries, request.user
23+
)
24+
25+
return {"unread_feedback_count": unread_feedback_entries.count()}

lunes_cms/locale/de/LC_MESSAGES/django.po

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: PACKAGE VERSION\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2024-05-06 10:40+0000\n"
10+
"POT-Creation-Date: 2024-05-22 08:52+0000\n"
1111
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1212
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -98,20 +98,20 @@ msgstr "Bild"
9898
msgid "singular article"
9999
msgstr "Singular-Artikel"
100100

101-
#: cms/admins/feedback_admin.py:32
101+
#: cms/admins/feedback_admin.py:34
102102
msgid "Mark as read"
103103
msgstr "Als gelesen markieren"
104104

105-
#: cms/admins/feedback_admin.py:47
105+
#: cms/admins/feedback_admin.py:49
106106
msgid "The selected feedback entries were successfully marked as read."
107107
msgstr ""
108108
"Die ausgewählten Feedback-Einträge wurden erfolgreich als gelesen markiert."
109109

110-
#: cms/admins/feedback_admin.py:51
110+
#: cms/admins/feedback_admin.py:53
111111
msgid "Mark as unread"
112112
msgstr "Als ungelesen markieren"
113113

114-
#: cms/admins/feedback_admin.py:66
114+
#: cms/admins/feedback_admin.py:68
115115
msgid "The selected feedback entries were successfully marked as unread."
116116
msgstr ""
117117
"Die ausgewählten Feedback-Einträge wurden erfolgreich als ungelesen markiert."

0 commit comments

Comments
 (0)