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 %}
-

Exam: {{ exam.name }}

+

+ + {% if exam.exam_mode %} + Exam: + {% else %} + Packet: + {% endif %} + {{ exam.name }}

+ 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,