Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Remove guardian ObjectPermissionChecker monkey patch #631

Merged
merged 1 commit into from
Sep 24, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 1 addition & 22 deletions strawberry_django/integrations/guardian.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
import contextlib
import dataclasses
import weakref
from typing import Optional, Type, Union, cast
from typing import Type, Union, cast

from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.db import models
from guardian import backends as _guardian_backends
from guardian.conf import settings as guardian_settings
from guardian.core import ObjectPermissionChecker as _ObjectPermissionChecker
from guardian.models.models import GroupObjectPermissionBase, UserObjectPermissionBase
from guardian.utils import get_anonymous_user as _get_anonymous_user
from guardian.utils import get_group_obj_perms_model, get_user_obj_perms_model

from strawberry_django.utils.typing import UserType

_cache = weakref.WeakKeyDictionary()


@dataclasses.dataclass
class ObjectPermissionModels:
Expand All @@ -39,18 +33,3 @@ def get_user_or_anonymous(user: UserType) -> UserType:
with contextlib.suppress(get_user_model().DoesNotExist):
return cast(UserType, _get_anonymous_user())
return user


class ObjectPermissionChecker(_ObjectPermissionChecker):
def __new__(cls, user_or_group: Optional[Union[UserType, Group]] = None):
if user_or_group is not None and user_or_group in _cache:
return _cache[user_or_group]

obj = _ObjectPermissionChecker(user_or_group=user_or_group)
_cache[user_or_group] = obj

return obj


# Use our implementation that reuses the checker for the same user/group
_guardian_backends.ObjectPermissionChecker = ObjectPermissionChecker
Loading