Display and filter authors on index pages
This commit is contained in:
@@ -203,6 +203,8 @@ class ExamBase(models.Model):
|
|||||||
def get_authors(self):
|
def get_authors(self):
|
||||||
"""Returns a comma seperated text list of authors"""
|
"""Returns a comma seperated text list of authors"""
|
||||||
authors = ", ".join([i.username for i in self.author.all()])
|
authors = ", ".join([i.username for i in self.author.all()])
|
||||||
|
if not authors:
|
||||||
|
return "None"
|
||||||
return authors
|
return authors
|
||||||
|
|
||||||
def get_author_objects(self):
|
def get_author_objects(self):
|
||||||
|
|||||||
@@ -13,7 +13,15 @@
|
|||||||
<h4 class="exam-number-title">{{filter.qs|length}} exams found.</h4>
|
<h4 class="exam-number-title">{{filter.qs|length}} exams found.</h4>
|
||||||
{% for exam in filter.qs %}
|
{% for exam in filter.qs %}
|
||||||
<div class="">
|
<div class="">
|
||||||
<h1><a href="{% url app_name|add:':exam_overview' pk=exam.pk %}">Exam: {{ exam.name }} </a></h1>
|
<h1><a href="{% url app_name|add:':exam_overview' pk=exam.pk %}">
|
||||||
|
|
||||||
|
{% if exam.exam_mode %}
|
||||||
|
Exam:
|
||||||
|
{% else %}
|
||||||
|
Packet:
|
||||||
|
{% endif %}
|
||||||
|
{{ exam.name }} </a></h1>
|
||||||
|
<span class="authors">Authors: {{exam.get_authors}}</span>
|
||||||
{% if exam.exam_mode %}
|
{% if exam.exam_mode %}
|
||||||
{% if app_name in "rapids longs anatomy" %}
|
{% if app_name in "rapids longs anatomy" %}
|
||||||
{% if request.user.is_staff %}<a href="{% url app_name|add:':mark_overview' pk=exam.pk %}">Mark answers</a>{% endif %}
|
{% if request.user.is_staff %}<a href="{% url app_name|add:':mark_overview' pk=exam.pk %}">Mark answers</a>{% endif %}
|
||||||
@@ -23,3 +31,16 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.authors {
|
||||||
|
float: right;
|
||||||
|
opacity: 50%;}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{% endblock css %}
|
||||||
|
|
||||||
|
|||||||
+11
-19
@@ -39,7 +39,7 @@ from django.views.generic.edit import CreateView, UpdateView, DeleteView
|
|||||||
from django.views.generic.list import ListView
|
from django.views.generic.list import ListView
|
||||||
from django.views.generic.detail import DetailView
|
from django.views.generic.detail import DetailView
|
||||||
from django_filters.views import FilterView
|
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 django_tables2.views import SingleTableMixin
|
||||||
from reversion.views import RevisionMixin
|
from reversion.views import RevisionMixin
|
||||||
from atlas.models import CaseCollection
|
from atlas.models import CaseCollection
|
||||||
@@ -320,7 +320,7 @@ class ExamViews(View, LoginRequiredMixin):
|
|||||||
# group_map = {"rapids" : "rapid_checker", "anatomy" : "anatomy_checker", "longs":"long_checker"}
|
# group_map = {"rapids" : "rapid_checker", "anatomy" : "anatomy_checker", "longs":"long_checker"}
|
||||||
# exam_group = group_map[self.app_name]
|
# exam_group = group_map[self.app_name]
|
||||||
|
|
||||||
class ExamFilter(FilterSet):
|
class BasicExamFilter(FilterSet):
|
||||||
sort_order = OrderingFilter(
|
sort_order = OrderingFilter(
|
||||||
fields=(("name", "name"), ("exam_mode", "exam_mode"))
|
fields=(("name", "name"), ("exam_mode", "exam_mode"))
|
||||||
)
|
)
|
||||||
@@ -333,22 +333,7 @@ class ExamViews(View, LoginRequiredMixin):
|
|||||||
"active": ["exact"],
|
"active": ["exact"],
|
||||||
"archive": ["exact"],
|
"archive": ["exact"],
|
||||||
"open_access": ["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):
|
def __init__(self, data=None, *args, **kwargs):
|
||||||
# if filterset is bound, use initial values as defaults
|
# if filterset is bound, use initial values as defaults
|
||||||
@@ -365,7 +350,13 @@ class ExamViews(View, LoginRequiredMixin):
|
|||||||
|
|
||||||
super().__init__(data, *args, **kwargs)
|
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
|
# TODO: these may be better implemented as decorators
|
||||||
def check_user_access(self, user: User, exam_id: int = None):
|
def check_user_access(self, user: User, exam_id: int = None):
|
||||||
@@ -1264,10 +1255,11 @@ class ExamViews(View, LoginRequiredMixin):
|
|||||||
)
|
)
|
||||||
):
|
):
|
||||||
exams = self.Exam.objects.all()
|
exams = self.Exam.objects.all()
|
||||||
|
filter = self.ExtraExamFilter(request.GET, queryset=exams)
|
||||||
else:
|
else:
|
||||||
exams = self.Exam.objects.filter(author__id=request.user.id)
|
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(
|
return render(
|
||||||
request,
|
request,
|
||||||
|
|||||||
Reference in New Issue
Block a user