Backport ACL computation improvements
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -286,8 +286,8 @@ class ObjectListPermissionFilterMixin(object):
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if self.access_object_retrieve_method and self.object_permission:
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=(self.object_permission,), user=request.user,
|
||||
obj=getattr(self, self.access_object_retrieve_method)()
|
||||
obj=getattr(self, self.access_object_retrieve_method)(),
|
||||
permissions=(self.object_permission,), user=request.user
|
||||
)
|
||||
return super(ObjectListPermissionFilterMixin, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
@@ -296,7 +296,8 @@ class ObjectListPermissionFilterMixin(object):
|
||||
|
||||
if not self.access_object_retrieve_method and self.object_permission:
|
||||
return AccessControlList.objects.filter_by_access(
|
||||
self.object_permission, self.request.user, queryset=queryset
|
||||
queryset=queryset, permission=self.object_permission,
|
||||
user=self.request.user
|
||||
)
|
||||
else:
|
||||
return queryset
|
||||
@@ -327,9 +328,10 @@ class ObjectPermissionCheckMixin(object):
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if self.object_permission:
|
||||
AccessControlList.objects.check_access(
|
||||
permissions=self.object_permission, user=request.user,
|
||||
obj=self.get_permission_object(),
|
||||
related=getattr(self, 'object_permission_related', None)
|
||||
permissions=(self.object_permission,),
|
||||
related=getattr(self, 'object_permission_related', None),
|
||||
user=request.user
|
||||
)
|
||||
|
||||
return super(
|
||||
@@ -427,7 +429,7 @@ class ViewPermissionCheckMixin(object):
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if self.view_permission:
|
||||
Permission.check_permissions(
|
||||
Permission.check_user_permissions(
|
||||
permissions=(self.view_permission,), user=self.request.user
|
||||
)
|
||||
|
||||
|
||||
@@ -33,6 +33,26 @@ def encapsulate(function):
|
||||
return lambda: function
|
||||
|
||||
|
||||
def get_related_field(model, related_field_name):
|
||||
try:
|
||||
local_field_name, remaining_field_path = related_field_name.split(
|
||||
LOOKUP_SEP, 1
|
||||
)
|
||||
except ValueError:
|
||||
local_field_name = related_field_name
|
||||
remaining_field_path = None
|
||||
|
||||
related_field = model._meta.get_field(local_field_name)
|
||||
|
||||
if remaining_field_path:
|
||||
return get_related_field(
|
||||
model=related_field.related_model,
|
||||
related_field_name=remaining_field_path
|
||||
)
|
||||
|
||||
return related_field
|
||||
|
||||
|
||||
def introspect_attribute(attribute_name, obj):
|
||||
"""
|
||||
Resolve the attribute of model. Supports nested reference using dotted
|
||||
|
||||
@@ -145,7 +145,7 @@ class ObjectErrorLogEntryListClearView(ConfirmView):
|
||||
class ObjectErrorLogEntryListView(SingleObjectListView):
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
AccessControlList.objects.check_access(
|
||||
obj=self.get_object(), permissions=permission_error_log_view,
|
||||
obj=self.get_object(), permissions=(permission_error_log_view,),
|
||||
user=request.user
|
||||
)
|
||||
|
||||
|
||||
@@ -5,3 +5,9 @@ class DatabaseWarning(UserWarning):
|
||||
"""
|
||||
Warning when using unsupported database backends
|
||||
"""
|
||||
|
||||
|
||||
class InterfaceWarning(UserWarning):
|
||||
"""
|
||||
Warning when using obsolete internal interfaces
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user