Skip to content
Snippets Groups Projects
Commit e56e87ad authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Merge branch '407-use-django-guardian-s-prefetch-mechanism-for-object-permissions' into 'master'

Resolve "Use django-guardian's prefetch mechanism for object permissions"

Closes #407

See merge request !540
parents c561c66e 25d55347
No related branches found
No related tags found
1 merge request!540Resolve "Use django-guardian's prefetch mechanism for object permissions"
Pipeline #6564 passed
Pipeline: AlekSIS

#6566

    ......@@ -21,6 +21,7 @@ from django.views.generic.edit import DeleteView, ModelFormMixin
    import reversion
    from guardian.admin import GuardedModelAdmin
    from guardian.core import ObjectPermissionChecker
    from jsonstore.fields import IntegerField, JSONFieldMixin
    from material.base import Layout, LayoutNode
    from rules.contrib.admin import ObjectPermissionsModelAdmin
    ......@@ -332,6 +333,10 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
    """Dynamically add a new permission to a model."""
    cls.extra_permissions.append((name, verbose_name))
    def set_object_permission_checker(self, checker: ObjectPermissionChecker):
    """Annotate a ``ObjectPermissionChecker`` for use with permission system."""
    self._permission_checker = checker
    def save(self, *args, **kwargs):
    """Ensure all functionality of our extensions that needs saving gets it."""
    # For auto-created remote syncable fields
    ......
    from typing import Optional
    from django.contrib.auth.backends import ModelBackend
    from django.contrib.auth.models import User
    from django.db.models import Model
    ......@@ -7,6 +9,7 @@ from guardian.backends import ObjectPermissionBackend
    from guardian.shortcuts import get_objects_for_user
    from rules import predicate
    from ..mixins import ExtensibleModel
    from ..models import Group
    from .core_helpers import get_content_type_by_perm, get_site_preferences
    from .core_helpers import has_person as has_person_helper
    ......@@ -25,8 +28,20 @@ def check_global_permission(user: User, perm: str) -> bool:
    return ModelBackend().has_perm(user, perm)
    def check_object_permission(user: User, perm: str, obj: Model) -> bool:
    """Check whether a user has a permission on a object."""
    def check_object_permission(
    user: User, perm: str, obj: Model, checker_obj: Optional[ExtensibleModel] = None
    ) -> bool:
    """Check whether a user has a permission on an object.
    You can provide a custom ``ObjectPermissionChecker`` for prefetching object permissions
    by annotating an extensible model with ``set_object_permission_checker``.
    This can be the provided object (``obj``) or a special object
    which is only used to get the checker class (``checker_obj``).
    """
    if not checker_obj:
    checker_obj = obj
    if hasattr(checker_obj, "_permission_checker"):
    return checker_obj._permission_checker.has_perm(perm, obj)
    return ObjectPermissionBackend().has_perm(user, perm, obj)
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment