From f1139af364c6621ebaed4d748f83df32f6df8f22 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 19 Sep 2025 13:54:38 -0700 Subject: [PATCH 1/9] Add async methods to backend --- rules/permissions.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rules/permissions.py b/rules/permissions.py index 9dda1a0..bb31416 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,3 +1,4 @@ +from asgiref.sync import sync_to_async from .rulesets import RuleSet permissions = RuleSet() @@ -32,3 +33,9 @@ def has_perm(self, user, perm, *args, **kwargs): def has_module_perms(self, user, app_label): return has_perm(app_label, user) + + async def ahas_perm(self, user, perm, *args, **kwargs): + return await sync_to_async(has_perm)(user, perm, *args, **kwargs) + + async def ahas_module_perms(self, user, app_label): + return await sync_to_async(has_perm)(app_label, user) From 24b974ae49da44a5ca979f4f6073215b3cee829a Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:03:23 -0700 Subject: [PATCH 2/9] Add async test case --- tests/testsuite/test_permissions.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/testsuite/test_permissions.py b/tests/testsuite/test_permissions.py index c392647..4b78936 100644 --- a/tests/testsuite/test_permissions.py +++ b/tests/testsuite/test_permissions.py @@ -1,3 +1,4 @@ +from asgiref.sync import sync_to_async from unittest import TestCase from rules.permissions import ( @@ -50,3 +51,17 @@ def test_backend(self): assert not backend.has_perm(None, "can_edit_book") remove_perm("can_edit_book") assert not perm_exists("can_edit_book") + + async def test_backend_async(self): + backend = ObjectPermissionBackend() + + await sync_to_async(add_perm)("can_edit_book", always_true) + assert "can_edit_book" in permissions + assert await backend.ahas_perm(None, "can_edit_book") + assert await backend.ahas_module_perms(None, "can_edit_book") + with self.assertRaises(KeyError): + await sync_to_async(add_perm)("can_edit_book", always_true) + await sync_to_async(set_perm)("can_edit_book", always_false) + assert not await backend.ahas_perm(None, "can_edit_book") + await sync_to_async(remove_perm)("can_edit_book") + assert not await sync_to_async(perm_exists)("can_edit_book") From cb632d8acc762c487bb1995da1cac744b83b00f9 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:53:52 -0700 Subject: [PATCH 3/9] Update module sort --- rules/permissions.py | 1 + tests/testsuite/test_permissions.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rules/permissions.py b/rules/permissions.py index bb31416..e2f4fe3 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,4 +1,5 @@ from asgiref.sync import sync_to_async + from .rulesets import RuleSet permissions = RuleSet() diff --git a/tests/testsuite/test_permissions.py b/tests/testsuite/test_permissions.py index 4b78936..f361c8a 100644 --- a/tests/testsuite/test_permissions.py +++ b/tests/testsuite/test_permissions.py @@ -1,6 +1,7 @@ -from asgiref.sync import sync_to_async from unittest import TestCase +from asgiref.sync import sync_to_async + from rules.permissions import ( ObjectPermissionBackend, add_perm, From 7f4bc62ddf828c44eb5f35997fdbbe58d3cc0df2 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 19 Sep 2025 13:54:38 -0700 Subject: [PATCH 4/9] Add async methods to backend --- rules/permissions.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rules/permissions.py b/rules/permissions.py index 9dda1a0..bb31416 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,3 +1,4 @@ +from asgiref.sync import sync_to_async from .rulesets import RuleSet permissions = RuleSet() @@ -32,3 +33,9 @@ def has_perm(self, user, perm, *args, **kwargs): def has_module_perms(self, user, app_label): return has_perm(app_label, user) + + async def ahas_perm(self, user, perm, *args, **kwargs): + return await sync_to_async(has_perm)(user, perm, *args, **kwargs) + + async def ahas_module_perms(self, user, app_label): + return await sync_to_async(has_perm)(app_label, user) From 60689b66eb867782480589dedef18ff2343efbfd Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 19 Sep 2025 14:03:23 -0700 Subject: [PATCH 5/9] Add async test case --- tests/testsuite/test_permissions.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/testsuite/test_permissions.py b/tests/testsuite/test_permissions.py index c392647..4b78936 100644 --- a/tests/testsuite/test_permissions.py +++ b/tests/testsuite/test_permissions.py @@ -1,3 +1,4 @@ +from asgiref.sync import sync_to_async from unittest import TestCase from rules.permissions import ( @@ -50,3 +51,17 @@ def test_backend(self): assert not backend.has_perm(None, "can_edit_book") remove_perm("can_edit_book") assert not perm_exists("can_edit_book") + + async def test_backend_async(self): + backend = ObjectPermissionBackend() + + await sync_to_async(add_perm)("can_edit_book", always_true) + assert "can_edit_book" in permissions + assert await backend.ahas_perm(None, "can_edit_book") + assert await backend.ahas_module_perms(None, "can_edit_book") + with self.assertRaises(KeyError): + await sync_to_async(add_perm)("can_edit_book", always_true) + await sync_to_async(set_perm)("can_edit_book", always_false) + assert not await backend.ahas_perm(None, "can_edit_book") + await sync_to_async(remove_perm)("can_edit_book") + assert not await sync_to_async(perm_exists)("can_edit_book") From ee289aa002a0c05d1305c9982765bee2c0b99008 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:53:52 -0700 Subject: [PATCH 6/9] Update module sort --- rules/permissions.py | 1 + tests/testsuite/test_permissions.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rules/permissions.py b/rules/permissions.py index bb31416..e2f4fe3 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,4 +1,5 @@ from asgiref.sync import sync_to_async + from .rulesets import RuleSet permissions = RuleSet() diff --git a/tests/testsuite/test_permissions.py b/tests/testsuite/test_permissions.py index 4b78936..f361c8a 100644 --- a/tests/testsuite/test_permissions.py +++ b/tests/testsuite/test_permissions.py @@ -1,6 +1,7 @@ -from asgiref.sync import sync_to_async from unittest import TestCase +from asgiref.sync import sync_to_async + from rules.permissions import ( ObjectPermissionBackend, add_perm, From cbf69fec0b3a9699cfcf5e52f6a1b0853423ef6e Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:05:05 -0700 Subject: [PATCH 7/9] Lazy import asgiref --- rules/permissions.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/rules/permissions.py b/rules/permissions.py index e2f4fe3..75a036a 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,10 +1,14 @@ -from asgiref.sync import sync_to_async - from .rulesets import RuleSet + permissions = RuleSet() +async def _run_async(func, *args, **kwargs): + from asgiref.sync import sync_to_async + return await sync_to_async(func)(*args, **kwargs) + + def add_perm(name, pred): permissions.add_rule(name, pred) @@ -36,7 +40,7 @@ def has_module_perms(self, user, app_label): return has_perm(app_label, user) async def ahas_perm(self, user, perm, *args, **kwargs): - return await sync_to_async(has_perm)(user, perm, *args, **kwargs) + return await _run_async(has_perm, user, perm, *args, **kwargs) async def ahas_module_perms(self, user, app_label): - return await sync_to_async(has_perm)(app_label, user) + return await _run_async(has_perm, app_label, user) From 1144e5489d99424d083a2c75eeabf4f53015582e Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:09:06 -0700 Subject: [PATCH 8/9] Update formatting --- rules/permissions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/permissions.py b/rules/permissions.py index 75a036a..67ea8f7 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -1,11 +1,11 @@ from .rulesets import RuleSet - permissions = RuleSet() async def _run_async(func, *args, **kwargs): from asgiref.sync import sync_to_async + return await sync_to_async(func)(*args, **kwargs) From 794fa68c26e6c9c247256e22311e525c005a1b47 Mon Sep 17 00:00:00 2001 From: CristopherH95 <22552070+CristopherH95@users.noreply.github.com> Date: Tue, 11 Nov 2025 09:53:20 -0800 Subject: [PATCH 9/9] Add matching async authenticate method --- rules/permissions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rules/permissions.py b/rules/permissions.py index 67ea8f7..a2495a7 100644 --- a/rules/permissions.py +++ b/rules/permissions.py @@ -39,6 +39,9 @@ def has_perm(self, user, perm, *args, **kwargs): def has_module_perms(self, user, app_label): return has_perm(app_label, user) + async def aauthenticate(self, *args, **kwargs): + return None + async def ahas_perm(self, user, perm, *args, **kwargs): return await _run_async(has_perm, user, perm, *args, **kwargs)