From 1003f27f8a0f2b2c90ebf7ac435b97f8f8ad9583 Mon Sep 17 00:00:00 2001 From: ceoro9 Date: Tue, 15 May 2018 21:08:33 +0300 Subject: [PATCH 1/2] created user mixin, which incorporates login required and student/teacher required logic and apply it to class views --- django_school/classroom/mixins.py | 20 ++++++++++++++++++++ django_school/classroom/views/students.py | 10 ++++------ django_school/classroom/views/teachers.py | 19 +++++++------------ 3 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 django_school/classroom/mixins.py diff --git a/django_school/classroom/mixins.py b/django_school/classroom/mixins.py new file mode 100644 index 00000000..6507a63c --- /dev/null +++ b/django_school/classroom/mixins.py @@ -0,0 +1,20 @@ +""" + Mixins for class-based views, + that check user role, they count + on decorators logic functionality! +""" + +from django.contrib.auth.mixins import UserPassesTestMixin +from django.contrib.auth.decorators import login_required + +from .decorators import student_required, teacher_required + + +class StudentRequiredMixin(UserPassesTestMixin): + def test_func(self): + return login_required() and student_required() + + +class TeacherRequiredMixin(UserPassesTestMixin): + def test_func(self): + return login_required() and teacher_required() diff --git a/django_school/classroom/views/students.py b/django_school/classroom/views/students.py index 19e5719c..11ecf628 100644 --- a/django_school/classroom/views/students.py +++ b/django_school/classroom/views/students.py @@ -11,6 +11,7 @@ from ..decorators import student_required from ..forms import StudentInterestsForm, StudentSignUpForm, TakeQuizForm from ..models import Quiz, Student, TakenQuiz, User +from ..mixins import StudentRequiredMixin class StudentSignUpView(CreateView): @@ -28,8 +29,7 @@ def form_valid(self, form): return redirect('students:quiz_list') -@method_decorator([login_required, student_required], name='dispatch') -class StudentInterestsView(UpdateView): +class StudentInterestsView(StudentRequiredMixin, UpdateView): model = Student form_class = StudentInterestsForm template_name = 'classroom/students/interests_form.html' @@ -43,8 +43,7 @@ def form_valid(self, form): return super().form_valid(form) -@method_decorator([login_required, student_required], name='dispatch') -class QuizListView(ListView): +class QuizListView(StudentRequiredMixin, ListView): model = Quiz ordering = ('name', ) context_object_name = 'quizzes' @@ -61,8 +60,7 @@ def get_queryset(self): return queryset -@method_decorator([login_required, student_required], name='dispatch') -class TakenQuizListView(ListView): +class TakenQuizListView(StudentRequiredMixin, ListView): model = TakenQuiz context_object_name = 'taken_quizzes' template_name = 'classroom/students/taken_quiz_list.html' diff --git a/django_school/classroom/views/teachers.py b/django_school/classroom/views/teachers.py index 9237f2f5..25e59acb 100644 --- a/django_school/classroom/views/teachers.py +++ b/django_school/classroom/views/teachers.py @@ -13,6 +13,7 @@ from ..decorators import teacher_required from ..forms import BaseAnswerInlineFormSet, QuestionForm, TeacherSignUpForm from ..models import Answer, Question, Quiz, User +from ..mixins import TeacherRequiredMixin class TeacherSignUpView(CreateView): @@ -30,8 +31,7 @@ def form_valid(self, form): return redirect('teachers:quiz_change_list') -@method_decorator([login_required, teacher_required], name='dispatch') -class QuizListView(ListView): +class QuizListView(TeacherRequiredMixin,ListView): model = Quiz ordering = ('name', ) context_object_name = 'quizzes' @@ -45,8 +45,7 @@ def get_queryset(self): return queryset -@method_decorator([login_required, teacher_required], name='dispatch') -class QuizCreateView(CreateView): +class QuizCreateView(TeacherRequiredMixin, CreateView): model = Quiz fields = ('name', 'subject', ) template_name = 'classroom/teachers/quiz_add_form.html' @@ -59,8 +58,7 @@ def form_valid(self, form): return redirect('teachers:quiz_change', quiz.pk) -@method_decorator([login_required, teacher_required], name='dispatch') -class QuizUpdateView(UpdateView): +class QuizUpdateView(TeacherRequiredMixin, UpdateView): model = Quiz fields = ('name', 'subject', ) context_object_name = 'quiz' @@ -82,8 +80,7 @@ def get_success_url(self): return reverse('teachers:quiz_change', kwargs={'pk': self.object.pk}) -@method_decorator([login_required, teacher_required], name='dispatch') -class QuizDeleteView(DeleteView): +class QuizDeleteView(TeacherRequiredMixin, DeleteView): model = Quiz context_object_name = 'quiz' template_name = 'classroom/teachers/quiz_delete_confirm.html' @@ -98,8 +95,7 @@ def get_queryset(self): return self.request.user.quizzes.all() -@method_decorator([login_required, teacher_required], name='dispatch') -class QuizResultsView(DetailView): +class QuizResultsView(TeacherRequiredMixin, DetailView): model = Quiz context_object_name = 'quiz' template_name = 'classroom/teachers/quiz_results.html' @@ -188,8 +184,7 @@ def question_change(request, quiz_pk, question_pk): }) -@method_decorator([login_required, teacher_required], name='dispatch') -class QuestionDeleteView(DeleteView): +class QuestionDeleteView(TeacherRequiredMixin, DeleteView): model = Question context_object_name = 'question' template_name = 'classroom/teachers/question_delete_confirm.html' From c70391b6319111fb12dfaf939fd5aff1e4f98e12 Mon Sep 17 00:00:00 2001 From: ceoro9 Date: Tue, 15 May 2018 22:14:19 +0300 Subject: [PATCH 2/2] changed user check functionality --- django_school/classroom/mixins.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/django_school/classroom/mixins.py b/django_school/classroom/mixins.py index 6507a63c..8c6cb57a 100644 --- a/django_school/classroom/mixins.py +++ b/django_school/classroom/mixins.py @@ -1,20 +1,16 @@ """ Mixins for class-based views, - that check user role, they count - on decorators logic functionality! + that check user auth. and role """ from django.contrib.auth.mixins import UserPassesTestMixin -from django.contrib.auth.decorators import login_required - -from .decorators import student_required, teacher_required class StudentRequiredMixin(UserPassesTestMixin): def test_func(self): - return login_required() and student_required() + return self.request.user.is_authenticated and self.request.user.is_student class TeacherRequiredMixin(UserPassesTestMixin): def test_func(self): - return login_required() and teacher_required() + return self.request.user.is_authenticated and self.request.user.is_teacher