From accef904be04f265be3738905d67e7e9c4d4de3a Mon Sep 17 00:00:00 2001 From: Ross Date: Tue, 3 Aug 2021 20:34:35 +0100 Subject: [PATCH] . --- anatomy/static/css/anatomy.css | 6 ++--- longs/filters.py | 21 +++++++++++++++++- longs/tables.py | 28 ++++++++++++++++++++++-- longs/templates/longs/question_view.html | 18 +++++++++++++++ longs/urls.py | 3 +++ longs/views.py | 25 ++++++++++++++++++--- rapids/urls.py | 4 ++-- rapids/views.py | 4 ++-- 8 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 longs/templates/longs/question_view.html diff --git a/anatomy/static/css/anatomy.css b/anatomy/static/css/anatomy.css index 65cb5577..f47d2658 100644 --- a/anatomy/static/css/anatomy.css +++ b/anatomy/static/css/anatomy.css @@ -491,14 +491,14 @@ td.user-answer-score-2::after { color: red } - table.longs .user-answer-score-5, table.longs .user-answer-score-5\.5 { + table.longs .user-answer-score-5\.0, table.longs .user-answer-score-5\.5 { color: yellow } - table.longs .user-answer-score-6, table.longs .user-answer-score-6\.5 { + table.longs .user-answer-score-6\.0, table.longs .user-answer-score-6\.5 { color: yellowgreen } - table.longs .user-answer-score-7, table.longs .user-answer-score-7\.5 { + table.longs .user-answer-score-7\.0, table.longs .user-answer-score-7\.5 { color: green } \ No newline at end of file diff --git a/longs/filters.py b/longs/filters.py index 98cdb4d3..84b0bf94 100755 --- a/longs/filters.py +++ b/longs/filters.py @@ -1,6 +1,6 @@ import django_filters -from .models import Long, LongSeries, Exam +from .models import Long, LongSeries, Exam, CidUserAnswer from django.contrib.auth.models import User def get_exams(request): @@ -51,4 +51,23 @@ class LongSeriesFilter(django_filters.FilterSet): #queryset = queryset.filter(open_access=True) | queryset.filter(author__id=request.user.id) queryset = queryset.filter(author__id=request.user.id) super(LongSeriesFilter, self).__init__(data=data, queryset=queryset, prefix=prefix, request=request) + pass + +class UserAnswerFilter(django_filters.FilterSet): + class Meta: + model = CidUserAnswer + fields = ( + "cid", + "normal", + "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="long_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/longs/tables.py b/longs/tables.py index c1aebc63..6a299515 100755 --- a/longs/tables.py +++ b/longs/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import A -from .models import Long, LongSeries +from .models import Long, LongSeries, CidUserAnswer from django.utils.html import format_html @@ -111,4 +111,28 @@ class LongSeriesTable(tables.Table): def render_popup(self, value, record): print(self) - return format_html("""Popup""", record.pk) \ No newline at end of file + return format_html("""Popup""", record.pk) + +class UserAnswerTable(tables.Table): + select = tables.CheckBoxColumn(accessor=("pk")) + delete = tables.LinkColumn( + "longs:user_answer_delete", text="Delete", args=[A("pk")], orderable=False + ) + view = tables.LinkColumn('longs:user_answer_view', + text='View', + args=[A('pk')], + orderable=False) + class Meta: + model = CidUserAnswer + template_name = "django_tables2/bootstrap4.html" + fields = ( + "cid", + "question", + "normal", + "answer", + #"answer_compare", + "exam", + "created", + "updated", + ) + \ No newline at end of file diff --git a/longs/templates/longs/question_view.html b/longs/templates/longs/question_view.html new file mode 100644 index 00000000..0c1da180 --- /dev/null +++ b/longs/templates/longs/question_view.html @@ -0,0 +1,18 @@ +{% extends 'longs/base.html' %} + +{% load render_table from django_tables2 %} +{% block css %} +{% endblock %} + +{% block content %} + +
+

Filter Long

+
+ {{ filter.form }} + +
+
+{% render_table table %} + +{% endblock %} \ No newline at end of file diff --git a/longs/urls.py b/longs/urls.py index 7edf2ffa..ca47b8d6 100755 --- a/longs/urls.py +++ b/longs/urls.py @@ -104,4 +104,7 @@ urlpatterns = [ name="long_series_update", ), path("/add_note", views.AddNote.as_view(), name="long_add_note"), + path("user_answers/", views.UserAnswerTableView.as_view(), name="user_answer_table_view"), + path("user_answers/", views.UserAnswerView.as_view(), name="user_answer_view"), + path("user_answers//delete", views.UserAnswerDelete.as_view(), name="user_answer_delete"), ] diff --git a/longs/views.py b/longs/views.py index f02aa1f8..bda049bf 100755 --- a/longs/views.py +++ b/longs/views.py @@ -8,6 +8,8 @@ from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist, PermissionDenied, ViewDoesNotExist from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic.detail import DetailView +from generic.mixins import SuperuserRequiredMixin from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.views.generic import ListView @@ -33,8 +35,8 @@ from .models import ( Exam, CidUserAnswer, ) -from .tables import LongTable, LongSeriesTable -from .filters import LongFilter, LongSeriesFilter +from .tables import LongTable, LongSeriesTable, UserAnswerTable +from .filters import LongFilter, LongSeriesFilter, UserAnswerFilter from django_tables2 import SingleTableView, SingleTableMixin from django_filters.views import FilterView @@ -998,4 +1000,21 @@ def question_json_recreate(request, pk): #question.get_question_json() - return redirect("longs:question_detail", pk=pk) \ No newline at end of file + return redirect("longs:question_detail", pk=pk) + + +class UserAnswerView(LoginRequiredMixin, DetailView): + model = CidUserAnswer + + +class UserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView): + model = CidUserAnswer + table_class = UserAnswerTable + template_name = "longs/question_view.html" + + filterset_class = UserAnswerFilter + + +class UserAnswerDelete(SuperuserRequiredMixin, DeleteView): + model = CidUserAnswer + success_url = reverse_lazy("longs:user_answer_table_view") diff --git a/rapids/urls.py b/rapids/urls.py index 44ccbcec..6eab01b0 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -66,7 +66,7 @@ urlpatterns = [ name="rapid_update", ), path("/add_note", views.AddNote.as_view(), name="rapid_add_note"), - path("user_answers/", views.RapidUserAnswerTableView.as_view(), name="rapid_user_answer_table_view"), - path("user_answers/", views.RapidUserAnswerView.as_view(), name="rapid_user_answer_view"), + path("user_answers/", views.UserAnswerTableView.as_view(), name="rapid_user_answer_table_view"), + path("user_answers/", views.UserAnswerView.as_view(), name="rapid_user_answer_view"), path("user_answers//delete", views.UserAnswerDelete.as_view(), name="rapid_user_answer_delete"), ] diff --git a/rapids/views.py b/rapids/views.py index b0a470ed..9657ad8f 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -985,11 +985,11 @@ class ExamUpdate( return super().form_valid(form) -class RapidUserAnswerView(LoginRequiredMixin, DetailView): +class UserAnswerView(LoginRequiredMixin, DetailView): model = CidUserAnswer -class RapidUserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView): +class UserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView): model = CidUserAnswer table_class = RapidUserAnswerTable template_name = "rapids/rapid_question_view.html"