Add ContentTypeViewMixin, ExternalObjectViewMixin

Add a mixin to ease the amount of code and imports required
for views that extract the content type from URL parameters.

Improve ExternalObjectViewMixin by adding a new class attribute
"external_object_pk_url_kwargs" to mechanize URL parameter
extraction. The external_object_pk_url_kwargs maps model
attributes using during manager get or filter from URL parameters.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-01-02 02:56:19 -04:00
parent da4e4d0b46
commit b3a781d51a

View File

@@ -2,7 +2,8 @@ from __future__ import unicode_literals
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured, PermissionDenied
from django.db.models.query import QuerySet
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, resolve_url
@@ -28,6 +29,14 @@ __all__ = (
)
class ContentTypeViewMixin(object):
def get_content_type(self):
return get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
class DeleteExtraDataMixin(object):
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
@@ -65,25 +74,47 @@ class ExtraContextMixin(object):
class ExternalObjectViewMixin(object):
external_object_pk_url_kwarg = 'pk'
external_object_class = None
external_object_permission = None
external_object_pk_url_kwarg = 'pk'
external_object_pk_url_kwargs = None # Usage: {'pk': 'pk'}
external_object_queryset = None
def get_external_object(self, klass=None, permission=None):
klass = klass or self.external_object_class
permission = permission or self.get_external_object_permission()
def get_pk_url_kwargs(self):
pk_url_kwargs = {}
if self.external_object_pk_url_kwargs:
pk_url_kwargs = self.external_object_pk_url_kwargs
else:
pk_url_kwargs['pk'] = self.external_object_pk_url_kwarg
for key, value in pk_url_kwargs.items():
pk_url_kwargs[key] = self.kwargs[value]
return pk_url_kwargs
def get_external_object(self):
return get_object_or_404(
klass=self.get_external_object_queryset(
klass=klass, permission=permission
), pk=self.kwargs[self.external_object_pk_url_kwarg]
klass=self.get_external_object_queryset_filtered(),
**self.get_pk_url_kwargs()
)
def get_external_object_permission(self):
return self.external_object_permission
def get_external_object_queryset(self, klass, permission=None):
queryset = klass.objects.all()
def get_external_object_queryset(self):
if not self.external_object_queryset and not self.external_object_class:
raise ImproperlyConfigured(
'View must provide either an external_object_queryset, '
'an external_object_class or a custom '
'get_external_object_queryset() method.'
)
return self.external_object_queryset or self.external_object_class.objects.all()
def get_external_object_queryset_filtered(self):
queryset = self.get_external_object_queryset()
permission = self.get_external_object_permission()
if permission:
queryset = AccessControlList.objects.filter_by_access(
@@ -175,7 +206,10 @@ class MultipleInstanceActionMixin(object):
class MultipleObjectMixin(object):
"""
Mixin that allows a view to work on a single or multiple objects
Mixin that allows a view to work on a single or multiple objects. It can
receive a pk, a slug or a list of IDs via an id_list query.
The pk, slug, and ID list parameter name can be changed using the
attributes: pk_url_kwargs, slug_url_kwarg, and pk_list_key.
"""
model = None
object_permission = None
@@ -227,7 +261,8 @@ class MultipleObjectMixin(object):
if self.object_permission:
return AccessControlList.objects.filter_by_access(
self.object_permission, self.request.user, queryset=queryset
permission=self.object_permission, queryset=queryset,
user=self.request.user
)
else:
return queryset
@@ -277,7 +312,7 @@ class ObjectActionMixin(object):
class ObjectListPermissionFilterMixin(object):
"""
access_object_retrieve_method is used to have the entire view check
access_object_retrieve_method is used to have the entire view check
against an object permission and not the individual secondary items.
"""
access_object_retrieve_method = None