diff --git a/generic/models.py b/generic/models.py
index bcef0275..92b4c7fd 100644
--- a/generic/models.py
+++ b/generic/models.py
@@ -203,6 +203,8 @@ class ExamBase(models.Model):
def get_authors(self):
"""Returns a comma seperated text list of authors"""
authors = ", ".join([i.username for i in self.author.all()])
+ if not authors:
+ return "None"
return authors
def get_author_objects(self):
diff --git a/generic/templates/generic/exam_index.html b/generic/templates/generic/exam_index.html
index 4a78b086..7d2f6f05 100644
--- a/generic/templates/generic/exam_index.html
+++ b/generic/templates/generic/exam_index.html
@@ -13,7 +13,15 @@
{{filter.qs|length}} exams found.
{% for exam in filter.qs %}
-
+
+
Authors: {{exam.get_authors}}
{% if exam.exam_mode %}
{% if app_name in "rapids longs anatomy" %}
{% if request.user.is_staff %}
Mark answers{% endif %}
@@ -23,3 +31,16 @@
{% endfor %}
{% endblock %}
+
+
+{% block css %}
+
+
+{% endblock css %}
+
diff --git a/generic/views.py b/generic/views.py
index 61be559e..59c5835c 100644
--- a/generic/views.py
+++ b/generic/views.py
@@ -39,7 +39,7 @@ from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django_filters.views import FilterView
-from django_filters import FilterSet, OrderingFilter
+from django_filters import FilterSet, OrderingFilter, ModelMultipleChoiceFilter
from django_tables2.views import SingleTableMixin
from reversion.views import RevisionMixin
from atlas.models import CaseCollection
@@ -320,7 +320,7 @@ class ExamViews(View, LoginRequiredMixin):
# group_map = {"rapids" : "rapid_checker", "anatomy" : "anatomy_checker", "longs":"long_checker"}
# exam_group = group_map[self.app_name]
- class ExamFilter(FilterSet):
+ class BasicExamFilter(FilterSet):
sort_order = OrderingFilter(
fields=(("name", "name"), ("exam_mode", "exam_mode"))
)
@@ -333,22 +333,7 @@ class ExamViews(View, LoginRequiredMixin):
"active": ["exact"],
"archive": ["exact"],
"open_access": ["exact"],
- #'release_date': ['isnull'],
}
- # filter_overrides = {
- # models.CharField: {
- # 'filter_class': django_filters.CharFilter,
- # 'extra': lambda f: {
- # 'lookup_expr': 'icontains',
- # },
- # },
- # models.BooleanField: {
- # 'filter_class': django_filters.BooleanFilter,
- # 'extra': lambda f: {
- # 'widget': forms.CheckboxInput,
- # },
- # },
- # }
def __init__(self, data=None, *args, **kwargs):
# if filterset is bound, use initial values as defaults
@@ -365,7 +350,13 @@ class ExamViews(View, LoginRequiredMixin):
super().__init__(data, *args, **kwargs)
- self.ExamFilter = ExamFilter
+ self.BasicExamFilter = BasicExamFilter
+
+ # We give some users the ability to filter by authors
+ class ExtraExamFilter(BasicExamFilter):
+ author = ModelMultipleChoiceFilter(queryset=User.objects.all(), null_label="No author")
+
+ self.ExtraExamFilter = ExtraExamFilter
# TODO: these may be better implemented as decorators
def check_user_access(self, user: User, exam_id: int = None):
@@ -1264,10 +1255,11 @@ class ExamViews(View, LoginRequiredMixin):
)
):
exams = self.Exam.objects.all()
+ filter = self.ExtraExamFilter(request.GET, queryset=exams)
else:
exams = self.Exam.objects.filter(author__id=request.user.id)
+ filter = self.BasicExamFilter(request.GET, queryset=exams)
- filter = self.ExamFilter(request.GET, queryset=exams)
return render(
request,