Commit 1938eae61316e9ddc2efcd20ba4283c857a7e659

Authored by Zambom
1 parent 428ed258

Adjusting too many redirections problem in subject

Showing 2 changed files with 41 additions and 65 deletions   Show diff stats
amadeus/permissions.py
1 # File used to store functions to handle permissions 1 # File used to store functions to handle permissions
2 2
  3 +from categories.models import Category
3 from subjects.models import Subject 4 from subjects.models import Subject
4 from topics.models import Resource 5 from topics.models import Resource
5 6
6 """ 7 """
7 Function to know if a user has permission to: 8 Function to know if a user has permission to:
  9 + - Edit Category
  10 + - Delete Category
  11 + - Create Subject
  12 + - Replicate Subject
  13 +"""
  14 +def has_category_permissions(user, category):
  15 + if user.is_staff:
  16 + return True
  17 +
  18 + if category.coordinators.filter(id = user.id).exists():
  19 + return True
  20 +
  21 + return False
  22 +
  23 +"""
  24 + Function to know if a user has permission to:
8 - Edit Subject 25 - Edit Subject
9 - Delete Subject 26 - Delete Subject
10 - Create Topic inside Subject 27 - Create Topic inside Subject
subjects/views.py
@@ -30,6 +30,7 @@ from .utils import has_student_profile, has_professor_profile, count_subjects, g @@ -30,6 +30,7 @@ from .utils import has_student_profile, has_professor_profile, count_subjects, g
30 from users.models import User 30 from users.models import User
31 from topics.models import Resource 31 from topics.models import Resource
32 32
  33 +from amadeus.permissions import has_category_permissions, has_subject_permissions, has_subject_view_permissions
33 34
34 class HomeView(LoginRequiredMixin, ListView): 35 class HomeView(LoginRequiredMixin, ListView):
35 login_url = reverse_lazy("users:login") 36 login_url = reverse_lazy("users:login")
@@ -234,32 +235,19 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView): @@ -234,32 +235,19 @@ class SubjectCreateView(LoginRequiredMixin, LogMixin, CreateView):
234 success_url = reverse_lazy('subject:index') 235 success_url = reverse_lazy('subject:index')
235 236
236 def dispatch(self, request, *args, **kwargs): 237 def dispatch(self, request, *args, **kwargs):
237 - user = request.user  
238 - pk = user.pk  
239 -  
240 if kwargs.get('subject_slug'): 238 if kwargs.get('subject_slug'):
241 - subject = Subject.objects.filter((Q(professor__pk=pk) | Q(category__coordinators__pk=pk)) & Q(slug = kwargs.get('subject_slug')))  
242 - if not user.is_staff:  
243 - if subject.count() == 0:  
244 - if request.META.get('HTTP_REFERER'):  
245 - return HttpResponseRedirect(request.META.get('HTTP_REFERER'))  
246 - else:  
247 - return redirect('subjects:index')  
248 - 239 + subject = get_object_or_404(Subject, slug = kwargs.get('subject_slug', ''))
  240 +
  241 + if not has_category_permissions(request.user, subject.category):
  242 + return redirect(reverse_lazy('subjects:home'))
249 243
250 if kwargs.get('slug'): 244 if kwargs.get('slug'):
251 - if not user.is_staff:  
252 - category = Category.objects.filter(Q(coordinators__pk=pk) & Q(slug= kwargs.get('slug')))  
253 - if category.count() == 0:  
254 - if request.META.get('HTTP_REFERER'):  
255 - return HttpResponseRedirect(request.META.get('HTTP_REFERER'))  
256 - else:  
257 - return redirect('subjects:index')  
258 - if request.method.lower() in self.http_method_names:  
259 - handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  
260 - else:  
261 - handler = self.http_method_not_allowed  
262 - return handler(request, *args, **kwargs) 245 + category = get_object_or_404(Category, slug = kwargs.get('slug', ''))
  246 +
  247 + if not has_category_permissions(request.user, category):
  248 + return redirect(reverse_lazy('subjects:home'))
  249 +
  250 + return super(SubjectCreateView, self).dispatch(request, *args, **kwargs)
263 251
264 252
265 def get_initial(self): 253 def get_initial(self):
@@ -357,23 +345,12 @@ class SubjectUpdateView(LoginRequiredMixin, LogMixin, UpdateView): @@ -357,23 +345,12 @@ class SubjectUpdateView(LoginRequiredMixin, LogMixin, UpdateView):
357 redirect_field_name = 'next' 345 redirect_field_name = 'next'
358 346
359 def dispatch(self, request, *args, **kwargs): 347 def dispatch(self, request, *args, **kwargs):
360 - user = self.request.user 348 + subject = get_object_or_404(Subject, slug = kwargs.get('slug', ''))
361 349
362 - pk = user.pk  
363 -  
364 - subject = Subject.objects.filter((Q(professor__pk=pk) | Q(category__coordinators__pk=pk)) & Q(slug = kwargs.get('slug')))  
365 - if not user.is_staff:  
366 - if subject.count() == 0:  
367 - if request.META.get('HTTP_REFERER'):  
368 - return HttpResponseRedirect(request.META.get('HTTP_REFERER'))  
369 - else:  
370 - return redirect('subjects:index') 350 + if not has_subject_permissions(request.user, subject):
  351 + return redirect(reverse_lazy('subjects:home'))
371 352
372 - if request.method.lower() in self.http_method_names:  
373 - handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  
374 - else:  
375 - handler = self.http_method_not_allowed  
376 - return handler(request, *args, **kwargs) 353 + return super(SubjectUpdateView, self).dispatch(request, *args, **kwargs)
377 354
378 def get_context_data(self, **kwargs): 355 def get_context_data(self, **kwargs):
379 context = super(SubjectUpdateView, self).get_context_data(**kwargs) 356 context = super(SubjectUpdateView, self).get_context_data(**kwargs)
@@ -413,17 +390,11 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView): @@ -413,17 +390,11 @@ class SubjectDeleteView(LoginRequiredMixin, LogMixin, DeleteView):
413 template_name = 'subjects/delete.html' 390 template_name = 'subjects/delete.html'
414 391
415 def dispatch(self, request, *args, **kwargs): 392 def dispatch(self, request, *args, **kwargs):
416 - user = self.request.user 393 + subject = get_object_or_404(Subject, slug = kwargs.get('slug', ''))
417 394
418 - pk = user.pk  
419 -  
420 - subject = Subject.objects.filter((Q(professor__pk=pk) | Q(category__coordinators__pk=pk)) & Q(slug = kwargs.get('slug')))  
421 - if not user.is_staff:  
422 - if subject.count() == 0:  
423 - if request.META.get('HTTP_REFERER'):  
424 - return HttpResponseRedirect(request.META.get('HTTP_REFERER'))  
425 - else:  
426 - return redirect('subjects:index') 395 + if not has_subject_permissions(request.user, subject):
  396 + return redirect(reverse_lazy('subjects:home'))
  397 +
427 return super(SubjectDeleteView, self).dispatch(request, *args, **kwargs) 398 return super(SubjectDeleteView, self).dispatch(request, *args, **kwargs)
428 399
429 def get(self, request, *args, **kwargs): 400 def get(self, request, *args, **kwargs):
@@ -480,24 +451,12 @@ class SubjectDetailView(LoginRequiredMixin, LogMixin, DetailView): @@ -480,24 +451,12 @@ class SubjectDetailView(LoginRequiredMixin, LogMixin, DetailView):
480 context_object_name = 'subject' 451 context_object_name = 'subject'
481 452
482 def dispatch(self, request, *args,**kwargs): 453 def dispatch(self, request, *args,**kwargs):
483 - user = request.user  
484 - pk = user.pk  
485 - if kwargs.get('slug') and not user.is_staff:  
486 - subject = get_object_or_404(Subject, slug = kwargs.get('slug')) 454 + subject = get_object_or_404(Subject, slug = kwargs.get('slug', ''))
487 455
488 - subject = Subject.objects.filter((Q(students__pk=pk) | Q(professor__pk=pk) | Q(category__coordinators__pk=pk)) & Q(slug = kwargs.get('slug')))  
489 -  
490 - if subject.count() == 0:  
491 - if request.META.get('HTTP_REFERER'):  
492 - return HttpResponseRedirect(request.META.get('HTTP_REFERER'))  
493 - else:  
494 - return redirect('subjects:home')  
495 -  
496 - if request.method.lower() in self.http_method_names:  
497 - handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  
498 - else:  
499 - handler = self.http_method_not_allowed  
500 - return handler(request, *args, **kwargs) 456 + if not has_subject_view_permissions(request.user, subject):
  457 + return redirect(reverse_lazy('subjects:home'))
  458 +
  459 + return super(SubjectDetailView, self).dispatch(request, *args, **kwargs)
501 460
502 def get_context_data(self, **kwargs): 461 def get_context_data(self, **kwargs):
503 context = super(SubjectDetailView, self).get_context_data(**kwargs) 462 context = super(SubjectDetailView, self).get_context_data(**kwargs)