Skip to content

Commit ca5f899

Browse files
authored
[FC-0099] feat: allow disabling auto-load policy based on settings (openedx#113)
1 parent 8298d3e commit ca5f899

5 files changed

Lines changed: 61 additions & 3 deletions

File tree

CHANGELOG.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ Change Log
1414
Unreleased
1515
**********
1616

17+
*
18+
19+
0.8.0 - 2025-10-24
20+
******************
21+
22+
Added
23+
=====
24+
25+
* Allow disabling auto-load and auto-save of policies by setting CASBIN_AUTO_LOAD_POLICY_INTERVAL to -1.
26+
27+
Changed
28+
=======
29+
1730
* Migrate from using pycodestyle and isort to ruff for code quality checks and formatting.
1831
* Enhance enforcement command with dual operational modes (database and file mode).
1932

openedx_authz/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
import os
66

7-
__version__ = "0.7.0"
7+
__version__ = "0.8.0"
88

99
ROOT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))

openedx_authz/engine/enforcer.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,12 @@ def _initialize_enforcer() -> SyncedEnforcer:
9393

9494
adapter = ExtendedAdapter()
9595
enforcer = SyncedEnforcer(settings.CASBIN_MODEL, adapter)
96-
enforcer.start_auto_load_policy(settings.CASBIN_AUTO_LOAD_POLICY_INTERVAL)
97-
enforcer.enable_auto_save(True)
96+
auto_load_policy_interval = getattr(settings, "CASBIN_AUTO_LOAD_POLICY_INTERVAL", 0)
97+
if auto_load_policy_interval > 0:
98+
enforcer.start_auto_load_policy(auto_load_policy_interval)
99+
enforcer.enable_auto_save(True)
100+
else:
101+
# Disable auto-save to prevent unnecessary database writes
102+
enforcer.enable_auto_save(False)
98103

99104
return enforcer

openedx_authz/tests/api/test_roles.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ def setUpClass(cls):
9494
"""
9595
super().setUpClass()
9696
AuthzEnforcer.get_enforcer().stop_auto_load_policy()
97+
# Enable auto-save to ensure policies are saved to the database
98+
# This is necessary because the tests are not using auto-load policy
99+
AuthzEnforcer.get_enforcer().enable_auto_save(True)
97100
cls._seed_database_with_policies()
98101

99102
def setUp(self):

openedx_authz/tests/test_enforcer.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,3 +520,40 @@ def test_auto_load_policy_detects_changes(self):
520520
# After auto-load, the new role assignment should be loaded
521521
policies_after_auto_load = global_enforcer.get_grouping_policy()
522522
self.assertIn(new_assignment, policies_after_auto_load)
523+
524+
@override_settings(CASBIN_AUTO_LOAD_POLICY_INTERVAL=-1)
525+
def test_auto_load_disabled(self):
526+
"""Test that auto-load can be disabled by setting interval to -1.
527+
528+
This test verifies that when CASBIN_AUTO_LOAD_POLICY_INTERVAL is set to -1,
529+
the enforcer does NOT automatically load policies from the database.
530+
531+
Expected result:
532+
- Policies remain empty after seeding database
533+
- Manual load_policy() is required to load policies
534+
- New policies don't appear without manual reload
535+
"""
536+
global_enforcer = AuthzEnforcer.get_enforcer()
537+
538+
# Initial policy count should be 0
539+
initial_policy_count = len(global_enforcer.get_policy())
540+
self.assertEqual(initial_policy_count, 0)
541+
542+
# Policies should still be empty since auto-load is disabled
543+
# and no database queries should have been made
544+
with self.assertNumQueries(0):
545+
time.sleep(1.0)
546+
policies_after_wait = global_enforcer.get_policy()
547+
self.assertEqual(len(policies_after_wait), 0)
548+
549+
# Seed the database with policies
550+
self._seed_database_with_policies()
551+
552+
# Manually load policies
553+
with self.assertNumQueries(1):
554+
time.sleep(1.0)
555+
global_enforcer.load_policy()
556+
# Since auto-save is also disabled, the policies should still
557+
# be empty after manual load
558+
policies_after_manual_load = global_enforcer.get_policy()
559+
self.assertEqual(len(policies_after_manual_load), 0)

0 commit comments

Comments
 (0)