From bce7420b7a94ef80e440deafcc632df03b5b6366 Mon Sep 17 00:00:00 2001 From: Ross Date: Tue, 31 Aug 2021 18:03:20 +0100 Subject: [PATCH] . --- anatomy/filters.py | 2 +- sbas/filters.py | 62 ++++++++++++++++++++++ sbas/tables.py | 72 ++++++++++++++++++++++++++ sbas/templates/sbas/question_view.html | 18 +++++++ sbas/views.py | 15 +++++- 5 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 sbas/filters.py create mode 100644 sbas/tables.py create mode 100644 sbas/templates/sbas/question_view.html diff --git a/anatomy/filters.py b/anatomy/filters.py index 0a67ed65..aa5d14c8 100644 --- a/anatomy/filters.py +++ b/anatomy/filters.py @@ -59,7 +59,7 @@ class AnatomyUserAnswerFilter(django_filters.FilterSet): ) def __init__(self, data=None, queryset=None, prefix=None, strict=None, user=None, request=None): - if not request.user.groups.filter(name="rapid_checker").exists(): + if not request.user.groups.filter(name="anatomy_checker").exists(): queryset = queryset.filter(open_access=True) | queryset.filter(author__id=request.user.id) super(AnatomyUserAnswerFilter, self).__init__(data=data, queryset=queryset, prefix=prefix, request=request) pass \ No newline at end of file diff --git a/sbas/filters.py b/sbas/filters.py new file mode 100644 index 00000000..e501698a --- /dev/null +++ b/sbas/filters.py @@ -0,0 +1,62 @@ +import django_filters + +from .models import Question, CidUserAnswer, Exam + +#from generic.filters import UserAnswerFilter +from django.contrib.auth.models import User + + +def get_exams(request): + if request is None: + return Exam.objects.none() + + if not request.user.groups.filter(name="anatomy_checker").exists(): + queryset = Exam.objects.filter(author__id=request.user.id) + else: + queryset = Exam.objects.all() + + return queryset + +def get_authors(request): + if request is None: + return User.objects.none() + + if not request.user.groups.filter(name="sba_checker").exists(): + queryset = User.objects.filter(id=request.user.id) + else: + queryset = User.objects.all() + + return queryset + + +class QuestionFilter(django_filters.FilterSet): + exams = django_filters.ModelMultipleChoiceFilter(queryset=get_exams) + author = django_filters.ModelMultipleChoiceFilter(queryset=get_authors) + class Meta: + model = Question + fields = ("exams", "category", "created_date", "open_access") + + def __init__(self, data=None, queryset=None, prefix=None, strict=None, user=None, request=None): + if not request.user.groups.filter(name="sba_checker").exists(): + queryset = queryset.filter(open_access=True) | queryset.filter(author__id=request.user.id) + super(QuestionFilter, self).__init__(data=data, queryset=queryset, prefix=prefix, request=request) + pass + +class UserAnswerFilter(django_filters.FilterSet): + class Meta: + model= CidUserAnswer + fields = ( + "cid", + "question", + "answer", + #"answer_compare", + "exam", + "created", + "updated", + ) + + def __init__(self, data=None, queryset=None, prefix=None, strict=None, user=None, request=None): + if not request.user.groups.filter(name="sba_checker").exists(): + queryset = queryset.filter(open_access=True) | queryset.filter(author__id=request.user.id) + super(UserAnswerFilter, self).__init__(data=data, queryset=queryset, prefix=prefix, request=request) + pass \ No newline at end of file diff --git a/sbas/tables.py b/sbas/tables.py new file mode 100644 index 00000000..2152583f --- /dev/null +++ b/sbas/tables.py @@ -0,0 +1,72 @@ +import django_tables2 as tables +from django_tables2.utils import A + +from .models import Question, CidUserAnswer + +from django.utils.html import format_html + +#from easy_thumbnails.files import get_thumbnailer + +#from easy_thumbnails.exceptions import InvalidImageFormatError + +#from generic.tables import UserAnswerTable + + +#class ImageColumn(tables.Column): +# def render(self, value): +# try: +# thumbnailer = get_thumbnailer(value) +# return format_html('', thumbnailer["exam-list"]) +# except InvalidImageFormatError: +# return format_html('Invalid image url', value) + + +class QuestionTable(tables.Table): + #edit = tables.LinkColumn( + # "sbas:sbas_question_update", text="Edit", args=[A("pk")], orderable=False + #) + view = tables.LinkColumn( + "sbas:question_detail", text="View", args=[A("pk")], orderable=False + ) + #delete = tables.LinkColumn( + # "sbas:question_delete", text="Delete", args=[A("pk")], orderable=False + #) + exams = tables.ManyToManyColumn(verbose_name="Exams") + + selection = tables.CheckBoxColumn(accessor="pk", orderable=False) + + class Meta: + model = Question + template_name = "django_tables2/bootstrap4.html" + fields = ( + "stem", + "a_answer", + "b_answer", + "c_answer", + "d_answer", + "e_answer", + "best_answer", + "created_date", + "category", + "author", + ) + sequence = ("view", "exams") + +class UserAnswerTable(tables.Table): + select = tables.CheckBoxColumn(accessor=("pk")) + #delete = tables.LinkColumn( + # "sbas:user_answer_delete", text="Delete", args=[A("pk")], orderable=False + #) + class Meta: + model = CidUserAnswer + template_name = "django_tables2/bootstrap4.html" + fields = ( + "cid", + "question", + "answer", + #"answer_compare", + "exam", + "created", + "updated", + ) + diff --git a/sbas/templates/sbas/question_view.html b/sbas/templates/sbas/question_view.html new file mode 100644 index 00000000..48f3cefc --- /dev/null +++ b/sbas/templates/sbas/question_view.html @@ -0,0 +1,18 @@ +{% extends 'sbas/base.html' %} + +{% load render_table from django_tables2 %} +{% block css %} +{% endblock %} + +{% block content %} + +
+

Filter SBA Questions

+
+ {{ filter.form }} + +
+
+{% render_table table %} + +{% endblock %} \ No newline at end of file diff --git a/sbas/views.py b/sbas/views.py index f4e9e4e8..7de294b3 100644 --- a/sbas/views.py +++ b/sbas/views.py @@ -24,6 +24,9 @@ from django.http import HttpResponseRedirect, HttpResponse from .models import Question, Category, Exam, CidUserAnswer +from django_tables2 import SingleTableView, SingleTableMixin +from django_filters.views import FilterView + from collections import defaultdict import os import base64 @@ -39,6 +42,9 @@ from rest_framework.pagination import PageNumberPagination from django.core.exceptions import PermissionDenied +from .tables import QuestionTable, UserAnswerTable +from .filters import QuestionFilter, UserAnswerFilter + class AuthorOrCheckerRequiredMixin(object): def get_object(self, *args, **kwargs): obj = super().get_object(*args, **kwargs) @@ -348,4 +354,11 @@ def exam_take(request, pk, sk, cid): def loadJsonAnswer(answer): pass -SbasExamViews = ExamViews(Exam, Question, "sbas", "sbas", loadJsonAnswer) \ No newline at end of file +SbasExamViews = ExamViews(Exam, Question, "sbas", "sbas", loadJsonAnswer) + +class QuestionView(LoginRequiredMixin, SingleTableMixin, FilterView): + model = Question + table_class = QuestionTable + template_name = "anatomy/anatomy_question_view.html" + + filterset_class = QuestionFilter