Skip to content

Commit 2096124

Browse files
refactor: get class attribute in runtime so it's available
1 parent ac51128 commit 2096124

6 files changed

Lines changed: 37 additions & 11 deletions

File tree

openedx_authz/api/permissions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
"""
77

88
from openedx_authz.api.data import ActionData, PermissionData, PolicyIndex, ScopeData, SubjectData
9-
from openedx_authz.engine.enforcer import enforcer
9+
from openedx_authz.engine.enforcer import AuthzEnforcer
10+
11+
enforcer = AuthzEnforcer.get_enforcer()
1012

1113
__all__ = [
1214
"get_permission_from_policy",

openedx_authz/api/roles.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
SubjectData,
2121
)
2222
from openedx_authz.api.permissions import get_permission_from_policy
23-
from openedx_authz.engine.enforcer import enforcer
23+
from openedx_authz.engine.enforcer import AuthzEnforcer
24+
25+
enforcer = AuthzEnforcer.get_enforcer()
2426

2527
__all__ = [
2628
"get_permissions_for_single_role",

openedx_authz/engine/enforcer.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
- Watcher: Redis-based watcher for real-time policy updates
1111
1212
Usage:
13-
from openedx_authz.engine.enforcer import enforcer
13+
from openedx_authz.engine.enforcer import AuthzEnforcer
1414
allowed = enforcer.enforce(user, resource, action)
1515
1616
Requires `CASBIN_MODEL` setting and Redis configuration for watcher functionality.
@@ -33,17 +33,33 @@ class AuthzEnforcer:
3333
3434
Ensures a single enforcer instance is created safely and configured with the
3535
ExtendedAdapter and Redis watcher for policy management and synchronization.
36+
37+
Usage:
38+
enforcer = AuthzEnforcer.get_enforcer()
39+
allowed = enforcer.enforce(user, resource, action)
3640
"""
3741

38-
enforcer = None
42+
_enforcer = None
3943

4044
def __new__(cls):
4145
"""Singleton pattern to ensure a single enforcer instance."""
42-
if cls.enforcer is None:
43-
cls.enforcer = cls.initialize_enforcer()
44-
return cls.enforcer
46+
if cls._enforcer is None:
47+
cls._enforcer = cls._initialize_enforcer()
48+
return cls._enforcer
49+
50+
@classmethod
51+
def get_enforcer(cls) -> FastEnforcer:
52+
"""Get the enforcer instance, creating it if needed.
53+
54+
Returns:
55+
FastEnforcer: The singleton enforcer instance.
56+
"""
57+
if cls._enforcer is None:
58+
cls._enforcer = cls._initialize_enforcer()
59+
return cls._enforcer
4560

46-
def initialize_enforcer(self) -> FastEnforcer:
61+
@staticmethod
62+
def _initialize_enforcer() -> FastEnforcer:
4763
"""
4864
Create and configure the Casbin FastEnforcer instance.
4965

openedx_authz/management/commands/load_policies.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
from django.core.management.base import BaseCommand
1313

1414
from openedx_authz import ROOT_DIRECTORY
15-
from openedx_authz.engine.enforcer import enforcer as global_enforcer
15+
from openedx_authz.engine.enforcer import AuthzEnforcer
1616
from openedx_authz.engine.utils import migrate_policy_between_enforcers
1717

18+
global_enforcer = AuthzEnforcer.get_enforcer()
19+
1820

1921
class Command(BaseCommand):
2022
"""Django management command to load policies into the authorization Django model.

openedx_authz/tests/api/test_roles.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@
3131
get_subject_role_assignments_in_scope,
3232
unassign_role_from_subject_in_scope,
3333
)
34-
from openedx_authz.engine.enforcer import enforcer as global_enforcer
34+
from openedx_authz.engine.enforcer import AuthzEnforcer
3535
from openedx_authz.engine.utils import migrate_policy_between_enforcers
3636

37+
global_enforcer = AuthzEnforcer.get_enforcer()
38+
3739

3840
class RolesTestSetupMixin(TestCase):
3941
"""Mixin to set up roles and assignments for tests."""

openedx_authz/tests/test_enforcer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from ddt import ddt
1111
from django.test import TestCase
1212

13-
from openedx_authz.engine.enforcer import enforcer as global_enforcer
13+
from openedx_authz.engine.enforcer import AuthzEnforcer
1414
from openedx_authz.engine.filter import Filter
1515
from openedx_authz.engine.utils import migrate_policy_between_enforcers
1616

17+
global_enforcer = AuthzEnforcer.get_enforcer()
18+
1719

1820
class PolicyLoadingTestSetupMixin(TestCase):
1921
"""Mixin providing policy loading test utilities."""

0 commit comments

Comments
 (0)