From 326c155c2431ab76d78389f259abdd01f8d368d1 Mon Sep 17 00:00:00 2001 From: Ross Date: Wed, 17 Feb 2021 21:49:25 +0000 Subject: [PATCH] . --- anatomy/tables.py | 3 +++ .../anatomy/question_confirm_delete.html | 1 + anatomy/templates/anatomy/question_detail.html | 1 + anatomy/urls.py | 1 + anatomy/views.py | 14 +++++++++++++- longs/tables.py | 7 +++++++ longs/templates/longs/long_confirm_delete.html | 1 + .../longs/longseries_confirm_delete.html | 1 + longs/templates/longs/question_detail.html | 1 + longs/urls.py | 2 ++ longs/views.py | 15 +++++++++++++-- rapids/tables.py | 4 ++++ rapids/templates/rapids/question_detail.html | 1 + rapids/templates/rapids/rapid_confirm_delete.html | 1 + rapids/urls.py | 1 + rapids/views.py | 5 ++++- templates/confirm_delete.html | 13 +++++++++++++ 17 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 anatomy/templates/anatomy/question_confirm_delete.html create mode 100644 longs/templates/longs/long_confirm_delete.html create mode 100644 longs/templates/longs/longseries_confirm_delete.html create mode 100644 rapids/templates/rapids/rapid_confirm_delete.html create mode 100644 templates/confirm_delete.html diff --git a/anatomy/tables.py b/anatomy/tables.py index 181be430..b4625fb9 100644 --- a/anatomy/tables.py +++ b/anatomy/tables.py @@ -52,6 +52,9 @@ class AnatomyQuestionTable(tables.Table): # text='Clone', # args=[A('pk')], # orderable=False) + delete = tables.LinkColumn( + "anatomy:question_delete", text="Delete", args=[A("pk")], orderable=False + ) exams = tables.ManyToManyColumn(verbose_name="Exams") class Meta: diff --git a/anatomy/templates/anatomy/question_confirm_delete.html b/anatomy/templates/anatomy/question_confirm_delete.html new file mode 100644 index 00000000..10ac7f23 --- /dev/null +++ b/anatomy/templates/anatomy/question_confirm_delete.html @@ -0,0 +1 @@ +{% include 'confirm_delete.html' %} \ No newline at end of file diff --git a/anatomy/templates/anatomy/question_detail.html b/anatomy/templates/anatomy/question_detail.html index a13bcf67..e2ac58b7 100644 --- a/anatomy/templates/anatomy/question_detail.html +++ b/anatomy/templates/anatomy/question_detail.html @@ -23,6 +23,7 @@
Edit Clone + Delete Admin Edit
diff --git a/anatomy/urls.py b/anatomy/urls.py index d27dd7a8..811043be 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -15,6 +15,7 @@ urlpatterns = [ views.answer_question, name="answer_question"), path("question//clone", views.QuestionClone.as_view(), name="question_clone"), + path("question//delete", views.QuestionDelete.as_view(), name="question_delete"), path("exam///mark", views.mark, name="mark"), path("exam//mark", views.AnatomyExamViews.mark_overview, name="mark_overview"), path("exam///", views.exam_take, name="exam_take"), diff --git a/anatomy/views.py b/anatomy/views.py index bf303ab7..b3d3caec 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -6,6 +6,7 @@ from django import forms # from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.models import User +from django.core.exceptions import PermissionDenied from django.contrib.auth.mixins import LoginRequiredMixin @@ -64,6 +65,14 @@ from django.template.defaulttags import register from generic.mixins import SuperuserRequiredMixin +class AuthorOrCheckerRequiredMixin(object): + def get_object(self, *args, **kwargs): + obj = super().get_object(*args, **kwargs) + if self.request.user.groups.filter(name="anatomy_checker").exists(): + return obj + if self.request.user not in obj.author.all(): + raise PermissionDenied() # or Http404 + return obj @register.filter def get_item(dictionary, key): @@ -948,4 +957,7 @@ AnatomyExamViews = ExamViews(Exam, "anatomy", "anatomy", loadJsonAnswer) class UserAnswerDelete(SuperuserRequiredMixin, DeleteView): model = CidUserAnswer - success_url = reverse_lazy("anatomy:anatomy_user_answer_view") \ No newline at end of file + success_url = reverse_lazy("anatomy:anatomy_user_answer_view") +class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView): + model = AnatomyQuestion + success_url = reverse_lazy("anatomy:anatomy_question_view") \ No newline at end of file diff --git a/longs/tables.py b/longs/tables.py index 5ce42e0a..a5bccc46 100755 --- a/longs/tables.py +++ b/longs/tables.py @@ -57,6 +57,9 @@ class LongTable(tables.Table): clone = tables.LinkColumn( "longs:long_clone", text="Clone", args=[A("pk")], orderable=False ) + delete = tables.LinkColumn( + "longs:long_delete", text="Delete", args=[A("pk")], orderable=False + ) series = LongImageColumn("Images", orderable=False) #series = tables.ManyToManyColumn(verbose_name="Exams") @@ -93,6 +96,10 @@ class LongSeriesTable(tables.Table): images = LongSeriesImageColumn("Images", orderable=False) + delete = tables.LinkColumn( + "longs:long_series_delete", text="Delete", args=[A("pk")], orderable=False + ) + class Meta: model = LongSeries template_name = "django_tables2/bootstrap4.html" diff --git a/longs/templates/longs/long_confirm_delete.html b/longs/templates/longs/long_confirm_delete.html new file mode 100644 index 00000000..10ac7f23 --- /dev/null +++ b/longs/templates/longs/long_confirm_delete.html @@ -0,0 +1 @@ +{% include 'confirm_delete.html' %} \ No newline at end of file diff --git a/longs/templates/longs/longseries_confirm_delete.html b/longs/templates/longs/longseries_confirm_delete.html new file mode 100644 index 00000000..10ac7f23 --- /dev/null +++ b/longs/templates/longs/longseries_confirm_delete.html @@ -0,0 +1 @@ +{% include 'confirm_delete.html' %} \ No newline at end of file diff --git a/longs/templates/longs/question_detail.html b/longs/templates/longs/question_detail.html index 93581614..731f7d9e 100755 --- a/longs/templates/longs/question_detail.html +++ b/longs/templates/longs/question_detail.html @@ -18,6 +18,7 @@ Edit Clone +Delete Add Note {% if request.user.is_superuser %} Admin Edit diff --git a/longs/urls.py b/longs/urls.py index b3d488ab..d45ba515 100755 --- a/longs/urls.py +++ b/longs/urls.py @@ -11,6 +11,7 @@ urlpatterns = [ path("question/", views.LongView.as_view(), name="long_view"), path("series/", views.LongSeriesView.as_view(), name="long_series_view"), path("series/", views.long_series_detail, name="long_series_detail"), + path("series//delete", views.LongSeriesDelete.as_view(), name="long_series_delete"), # path("unchecked/", views.unchecked_list, name="unchecked_list"), # path("verified//", views.verified_detail, name="verified_detail"), path("question//", views.long_detail, name="long_detail"), @@ -19,6 +20,7 @@ urlpatterns = [ # path("verified/", views.verified, name="verified"), # path("all_questions/", views.all_questions, name="all_questions"), path("question//scrap", views.long_scrap, name="long_scrap"), + path("question//delete", views.LongDelete.as_view(), name="long_delete"), path("exam////mark", views.mark_answer, name="mark_answer"), path("exam///mark", views.mark, name="mark"), path("exam//mark", views.LongExamViews.mark_overview, name="mark_overview"), diff --git a/longs/views.py b/longs/views.py index c2e86c9b..f40a35ef 100755 --- a/longs/views.py +++ b/longs/views.py @@ -63,7 +63,7 @@ logger = logging.getLogger(__name__) class AuthorOrCheckerRequiredMixin(object): def get_object(self, *args, **kwargs): - obj = super(UpdateView, self).get_object(*args, **kwargs) + obj = super().get_object(*args, **kwargs) if self.request.user.groups.filter(name="long_checker").exists() or self.request.user.is_superuser: return obj if self.request.user not in obj.get_author_objects(): @@ -71,7 +71,6 @@ class AuthorOrCheckerRequiredMixin(object): return obj - # def index(request): # other_longs = Long.objects.exclude(author=request.user.pk) # user_longs = Long.objects.filter(author=request.user.pk) @@ -228,6 +227,18 @@ class AddNote(LoginRequiredMixin, CreateView): # form.instance.author.add(self.request.user.id) +#@login_required +#@user_is_author_or_long_checker +#def long_delete(request, pk): + #q = get_object_or_404(Long, pk=pk) + #q.delete() +class LongDelete(AuthorOrCheckerRequiredMixin, DeleteView): + model = Long + success_url = reverse_lazy("longs:long_view") + +class LongSeriesDelete(AuthorOrCheckerRequiredMixin, DeleteView): + model = LongSeries + success_url = reverse_lazy("longs:long_series_view") @login_required def long_clone(request, pk): diff --git a/rapids/tables.py b/rapids/tables.py index e111bb6d..f6fa13ed 100755 --- a/rapids/tables.py +++ b/rapids/tables.py @@ -38,6 +38,10 @@ class RapidTable(tables.Table): text='Clone', args=[A('pk')], orderable=False) + delete = tables.LinkColumn('rapids:question_delete', + text='Delete', + args=[A('pk')], + orderable=False) images = ImageColumn("images", orderable=False) class Meta: diff --git a/rapids/templates/rapids/question_detail.html b/rapids/templates/rapids/question_detail.html index 7fa3a9e7..e3433fdf 100755 --- a/rapids/templates/rapids/question_detail.html +++ b/rapids/templates/rapids/question_detail.html @@ -18,6 +18,7 @@ Edit Clone +Delete Add Note {% if request.user.is_superuser %} Admin Edit diff --git a/rapids/templates/rapids/rapid_confirm_delete.html b/rapids/templates/rapids/rapid_confirm_delete.html new file mode 100644 index 00000000..10ac7f23 --- /dev/null +++ b/rapids/templates/rapids/rapid_confirm_delete.html @@ -0,0 +1 @@ +{% include 'confirm_delete.html' %} \ No newline at end of file diff --git a/rapids/urls.py b/rapids/urls.py index 058e81a4..28b54c4a 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -17,6 +17,7 @@ urlpatterns = [ #path("verified/", views.verified, name="verified"), #path("all_questions/", views.all_questions, name="all_questions"), path("question//scrap", views.rapid_scrap, name="rapid_scrap"), + path("question//delete", views.QuestionDelete.as_view(), name="question_delete"), path("exam///mark", views.mark, name="mark"), path("exam//mark", views.RapidExamViews.mark_overview, name="mark_overview"), # path("exam///", views.exam_take, name="exam_take"), diff --git a/rapids/views.py b/rapids/views.py index 787b2f9f..9373bf3d 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -70,7 +70,7 @@ logger = logging.getLogger(__name__) class AuthorOrCheckerRequiredMixin(object): def get_object(self, *args, **kwargs): - obj = super(UpdateView, self).get_object(*args, **kwargs) + obj = super().get_object(*args, **kwargs) if self.request.user.groups.filter(name="rapid_checker").exists(): return obj if self.request.user not in obj.author.all(): @@ -871,5 +871,8 @@ def exam_scores_cid_user(request, pk, sk): ) +class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView): + model = Rapid + success_url = reverse_lazy("rapids:rapid_view") RapidExamViews = ExamViews(Exam, "rapids", "rapid", loadJsonAnswer) \ No newline at end of file diff --git a/templates/confirm_delete.html b/templates/confirm_delete.html new file mode 100644 index 00000000..21192d5f --- /dev/null +++ b/templates/confirm_delete.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + + +{% block content %} + +

Deleting stuff

+ +
{% csrf_token %} +

Are you sure you want to delete "{{ object }}"?

+ +
+ +{% endblock content %}