Adds permissions checks for views involving objects.
This commit is contained in:
parent
4b3e9bc87e
commit
48b62a258a
1 changed files with 26 additions and 8 deletions
|
|
@ -13,7 +13,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib.admin.views.decorators import staff_member_required
|
from django.contrib.admin.views.decorators import staff_member_required
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.db.models.functions import Lower
|
from django.db.models.functions import Lower
|
||||||
from django.http import HttpResponseRedirect, Http404
|
from django.http import HttpResponseBadRequest, HttpResponseRedirect, Http404
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.views.generic import View, TemplateView, ListView, DetailView, FormView
|
from django.views.generic import View, TemplateView, ListView, DetailView, FormView
|
||||||
|
|
@ -173,7 +173,8 @@ class EvenniaDeleteView(DeleteView):
|
||||||
|
|
||||||
class ObjectDetailView(DetailView):
|
class ObjectDetailView(DetailView):
|
||||||
|
|
||||||
model = ObjectDB
|
model = class_from_module(settings.BASE_OBJECT_TYPECLASS)
|
||||||
|
access_type = 'view'
|
||||||
|
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
"""
|
"""
|
||||||
|
|
@ -183,19 +184,35 @@ class ObjectDetailView(DetailView):
|
||||||
calculate the same for the object and make sure it matches.
|
calculate the same for the object and make sure it matches.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
obj = super(ObjectDetailView, self).get_object(queryset)
|
if not queryset:
|
||||||
|
queryset = self.get_queryset()
|
||||||
|
|
||||||
|
# Get the object, ignoring all checks and filters
|
||||||
|
obj = self.model.objects.get(pk=self.kwargs.get('pk'))
|
||||||
|
|
||||||
|
# Check if this object was requested in a valid manner
|
||||||
if slugify(obj.name) != self.kwargs.get(self.slug_url_kwarg):
|
if slugify(obj.name) != self.kwargs.get(self.slug_url_kwarg):
|
||||||
raise Http404(u"No %(verbose_name)s found matching the query" %
|
raise HttpResponseBadRequest(u"No %(verbose_name)s found matching the query" %
|
||||||
{'verbose_name': queryset.model._meta.verbose_name})
|
{'verbose_name': queryset.model._meta.verbose_name})
|
||||||
|
|
||||||
|
# Check if account has permissions to access object
|
||||||
|
account = self.request.user
|
||||||
|
if not obj.access(account, self.access_type):
|
||||||
|
raise PermissionDenied(u"You are not authorized to %s this object." % self.access_type)
|
||||||
|
|
||||||
|
# Get the object, based on the specified queryset
|
||||||
|
obj = super(ObjectDetailView, self).get_object(queryset)
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
class ObjectCreateView(LoginRequiredMixin, EvenniaCreateView):
|
class ObjectCreateView(LoginRequiredMixin, EvenniaCreateView):
|
||||||
|
|
||||||
model = ObjectDB
|
model = class_from_module(settings.BASE_OBJECT_TYPECLASS)
|
||||||
|
|
||||||
class ObjectDeleteView(LoginRequiredMixin, ObjectDetailView, EvenniaDeleteView):
|
class ObjectDeleteView(LoginRequiredMixin, ObjectDetailView, EvenniaDeleteView):
|
||||||
|
|
||||||
model = ObjectDB
|
model = class_from_module(settings.BASE_OBJECT_TYPECLASS)
|
||||||
|
access_type = 'delete'
|
||||||
template_name = 'website/object_confirm_delete.html'
|
template_name = 'website/object_confirm_delete.html'
|
||||||
|
|
||||||
def delete(self, request, *args, **kwargs):
|
def delete(self, request, *args, **kwargs):
|
||||||
|
|
@ -212,7 +229,8 @@ class ObjectDeleteView(LoginRequiredMixin, ObjectDetailView, EvenniaDeleteView):
|
||||||
|
|
||||||
class ObjectUpdateView(LoginRequiredMixin, ObjectDetailView, EvenniaUpdateView):
|
class ObjectUpdateView(LoginRequiredMixin, ObjectDetailView, EvenniaUpdateView):
|
||||||
|
|
||||||
model = ObjectDB
|
model = class_from_module(settings.BASE_OBJECT_TYPECLASS)
|
||||||
|
access_type = 'edit'
|
||||||
|
|
||||||
def get_initial(self):
|
def get_initial(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue