"""This file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license. """ import logging from django.db.models.query import QuerySet from django.utils.functional import cached_property from rest_framework.generics import get_object_or_404 logger = logging.getLogger(__name__) class DummyModelMixin: def has_permission(self, user): return True class GetParentObjectMixin: parent_queryset = None @cached_property def parent_object(self): return self._get_parent_object() def _get_parent_object(self): """ The same as get_object method from DRF, but for the parent object For example if you want to get project inside /api/projects/ID/tasks handler """ assert self.parent_queryset is not None, ( "'%s' should include a `parent_queryset` attribute, " % self.__class__.__name__ ) queryset = self.parent_queryset if isinstance(queryset, QuerySet): # Ensure queryset is re-evaluated on each request. queryset = queryset.all() # Perform the lookup filtering. lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field assert lookup_url_kwarg in self.kwargs, ( 'Expected view %s to be called with a URL keyword argument ' 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 'attribute on the view correctly.' % (self.__class__.__name__, lookup_url_kwarg) ) filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} obj = get_object_or_404(queryset, **filter_kwargs) # May raise a permission denied self.check_object_permissions(self.request, obj) return obj