Skip to content

Commit 2873713

Browse files
committed
Filter review dashboard by question answers
1 parent 771c6be commit 2873713

File tree

4 files changed

+57
-71
lines changed

4 files changed

+57
-71
lines changed

doc/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Release Notes
44
=============
55

6+
- :feature:`-` The review dashboard can now be filtered by question answers, just like the submission list.
67
- :feature:`-` New anonymisation indicator in proposal list.
78
- :feature:`1418` Speaker availabilities are now limited to the sum of all room availabilites.
89
- :feature:`1440` The list of team members is now always sorted by name.

src/pretalx/orga/templates/orga/review/dashboard.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@
132132
</details>
133133
</div>
134134
</form>
135+
{% if filter_form.is_valid and filter_form.cleaned_data.question %}
136+
<p class="text-muted ml-2">
137+
<span class="fa fa-filter"></span>
138+
{% blocktranslate trimmed with question=filter_form.cleaned_data.question.question %}
139+
List filtered by answers to question "{{ question }}".
140+
{% endblocktranslate %}
141+
<a href="?{% url_replace request 'question' '' 'answer' '' 'answer__options' '' %}" class="text-muted">
142+
<span class="fa fa-times"></span>
143+
{% translate "Remove filter" %}
144+
</a>
145+
</p>
146+
{% endif %}
135147
</div>
136148

137149
<form method="post">{% csrf_token %}

src/pretalx/orga/views/review.py

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,45 +28,21 @@
2828
TagsForm,
2929
)
3030
from pretalx.orga.forms.submission import SubmissionStateChangeForm
31-
from pretalx.orga.views.submission import ReviewerSubmissionFilter
31+
from pretalx.orga.views.submission import BaseSubmissionList
3232
from pretalx.person.models import User
3333
from pretalx.submission.forms import QuestionsForm, SubmissionFilterForm
3434
from pretalx.submission.models import Review, Submission, SubmissionStates
3535

3636

37-
class ReviewDashboard(
38-
EventPermissionRequired, Filterable, ReviewerSubmissionFilter, ListView
39-
):
37+
class ReviewDashboard(EventPermissionRequired, BaseSubmissionList):
4038
template_name = "orga/review/dashboard.html"
41-
paginate_by = None
42-
context_object_name = "submissions"
4339
permission_required = "orga.view_review_dashboard"
44-
filter_fields = (
45-
"state",
46-
"submission_type",
47-
"tags",
48-
"track",
49-
"content_locale",
50-
"pending_state",
51-
"pending_state__isnull",
52-
)
53-
default_filters = (
54-
"code__icontains",
55-
"speakers__name__icontains",
56-
"title__icontains",
57-
)
58-
59-
def get_filter_form(self):
60-
return SubmissionFilterForm(
61-
data=self.request.GET,
62-
event=self.request.event,
63-
usable_states=[
64-
SubmissionStates.SUBMITTED,
65-
SubmissionStates.ACCEPTED,
66-
SubmissionStates.REJECTED,
67-
SubmissionStates.CONFIRMED,
68-
],
69-
limit_tracks=self.limit_tracks,
40+
paginate_by = None
41+
usable_states=(
42+
SubmissionStates.SUBMITTED,
43+
SubmissionStates.ACCEPTED,
44+
SubmissionStates.REJECTED,
45+
SubmissionStates.CONFIRMED,
7046
)
7147

7248
def filter_range(self, queryset):
@@ -95,16 +71,8 @@ def get_queryset(self):
9571
else (statistics.fmean if hasattr(statistics, "fmean") else statistics.mean)
9672
)
9773
queryset = (
98-
super()
99-
.get_queryset(for_review=True)
100-
.filter(
101-
state__in=[
102-
SubmissionStates.SUBMITTED,
103-
SubmissionStates.ACCEPTED,
104-
SubmissionStates.REJECTED,
105-
SubmissionStates.CONFIRMED,
106-
]
107-
)
74+
self._get_base_queryset(for_review=True)
75+
.filter(state__in=self.usable_states)
10876
)
10977
queryset = self.filter_queryset(queryset).annotate(
11078
review_count=Count("reviews", distinct=True),

src/pretalx/orga/views/submission.py

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -517,12 +517,9 @@ def get_form_kwargs(self):
517517
return kwargs
518518

519519

520-
class SubmissionList(
521-
EventPermissionRequired, Sortable, Filterable, ReviewerSubmissionFilter, ListView
522-
):
520+
class BaseSubmissionList(Sortable, Filterable, ReviewerSubmissionFilter, ListView):
523521
model = Submission
524522
context_object_name = "submissions"
525-
template_name = "orga/submission/list.html"
526523
filter_fields = (
527524
"submission_type",
528525
"state",
@@ -533,14 +530,13 @@ class SubmissionList(
533530
"pending_state__isnull",
534531
)
535532
sortable_fields = ("code", "title", "state", "is_featured")
536-
secondary_sort = {"state": ("pending_state",)}
537-
permission_required = "orga.view_submissions"
538-
paginate_by = 25
533+
usable_states = None
539534

540535
def get_filter_form(self):
541536
return SubmissionFilterForm(
542537
data=self.request.GET,
543538
event=self.request.event,
539+
usable_states=self.usable_states,
544540
limit_tracks=self.limit_tracks,
545541
)
546542

@@ -550,28 +546,10 @@ def get_default_filters(self, *args, **kwargs):
550546
default_filters.add("speakers__name__icontains")
551547
return default_filters
552548

553-
@context
554-
def show_submission_types(self):
555-
return self.request.event.submission_types.all().count() > 1
556-
557-
@context
558-
@cached_property
559-
def pending_changes(self):
560-
return self.request.event.submissions.filter(
561-
pending_state__isnull=False
562-
).count()
563-
564-
@context
565-
def show_tracks(self):
566-
if self.request.event.feature_flags["use_tracks"]:
567-
if self.limit_tracks:
568-
return len(self.limit_tracks) > 1
569-
return self.request.event.tracks.all().count() > 1
570-
571-
def get_queryset(self):
549+
def _get_base_queryset(self, for_review=False):
572550
# If somebody has *only* reviewer permissions for this event, they can only
573551
# see the proposals they can review.
574-
qs = super().get_queryset().order_by("-id")
552+
qs = super().get_queryset(for_review=for_review).order_by("-id")
575553
qs = self.filter_queryset(qs)
576554
question = self.request.GET.get("question")
577555
unanswered = self.request.GET.get("unanswered")
@@ -598,8 +576,35 @@ def get_queryset(self):
598576
qs = qs.annotate(has_answer=Exists(answers)).filter(has_answer=False)
599577
if "state" not in self.request.GET:
600578
qs = qs.exclude(state="deleted")
601-
qs = self.sort_queryset(qs)
602-
return qs.distinct()
579+
return qs
580+
581+
def get_queryset(self):
582+
return self.sort_queryset(self._get_base_queryset()).distinct()
583+
584+
585+
class SubmissionList(EventPermissionRequired, BaseSubmissionList):
586+
template_name = "orga/submission/list.html"
587+
permission_required = "orga.view_submissions"
588+
paginate_by = 25
589+
secondary_sort = {"state": ("pending_state",)}
590+
591+
@context
592+
def show_submission_types(self):
593+
return self.request.event.submission_types.all().count() > 1
594+
595+
@context
596+
@cached_property
597+
def pending_changes(self):
598+
return self.request.event.submissions.filter(
599+
pending_state__isnull=False
600+
).count()
601+
602+
@context
603+
def show_tracks(self):
604+
if self.request.event.feature_flags["use_tracks"]:
605+
if self.limit_tracks:
606+
return len(self.limit_tracks) > 1
607+
return self.request.event.tracks.all().count() > 1
603608

604609

605610
class FeedbackList(SubmissionViewMixin, ListView):

0 commit comments

Comments
 (0)