diff --git a/adminlte2_pdq/decorators.py b/adminlte2_pdq/decorators.py index d7ad6cef9b5486e60578d8be5e2d32a40bb5fbdb..1d17927f6830d7d804b213ef61bd886e07354851 100644 --- a/adminlte2_pdq/decorators.py +++ b/adminlte2_pdq/decorators.py @@ -77,8 +77,8 @@ def allow_anonymous_access(function=None): "allow_anonymous_access": True, "login_required": False, "allow_without_permissions": False, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } def decorator(function): @@ -129,8 +129,8 @@ def login_required(function=None, redirect_field_name="next", login_url=None): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": False, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } def decorator(function): @@ -168,8 +168,8 @@ def allow_without_permissions(function=None, redirect_field_name="next", login_u "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": True, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } def decorator(function): @@ -217,14 +217,16 @@ def permission_required_one(permission, login_url=None, raise_exception=False): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": False, - "one_of_permissions": permissions, - "full_permissions": None, + # "one_of_permissions": permissions, + # "full_permissions": None, } def decorator(function): # Save values to view fetch function for middleware handling + potential debugging. function.admin_pdq_data = admin_pdq_data + function.permission_required_one = permissions # Must have one, if any. + function.permission_required = None # Must have all, if any. Same as Django. @wraps(function) @_one_of_permission_required(permission, login_url, raise_exception) @@ -235,6 +237,8 @@ def permission_required_one(permission, login_url=None, raise_exception=False): # Save values to fully qualified view for middleware handling + potential debugging. function_view.admin_pdq_data = admin_pdq_data + function_view.permission_required_one = permissions # Must have one, if any. + function_view.permission_required = None # Must have all, if any. Same as Django. return function_view @@ -265,14 +269,16 @@ def permission_required(permission, login_url=None, raise_exception=False): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": False, - "one_of_permissions": None, - "full_permissions": permissions, + # "one_of_permissions": None, + # "full_permissions": permissions, } def decorator(function): # Save values to view fetch function for middleware handling + potential debugging. function.admin_pdq_data = admin_pdq_data + function.permission_required_one = None # Must have one, if any. + function.permission_required = permissions # Must have all, if any. Same as Django. @wraps(function) @django_permission_required(permission, login_url, raise_exception) @@ -283,6 +289,8 @@ def permission_required(permission, login_url=None, raise_exception=False): # Save values to fully qualified view for middleware handling + potential debugging. function_view.admin_pdq_data = admin_pdq_data + function_view.permission_required_one = None # Must have one, if any. + function_view.permission_required = permissions # Must have all, if any. Same as Django. return function_view diff --git a/adminlte2_pdq/middleware.py b/adminlte2_pdq/middleware.py index 20aa70766dfafbdedd64a6b347d31af32459d22d..e48906819b2b4715fe5cce2457261ae3cd64c91c 100644 --- a/adminlte2_pdq/middleware.py +++ b/adminlte2_pdq/middleware.py @@ -447,9 +447,9 @@ class AuthMiddleware: if view_class: # Is class-based view. - # If class inheriting from AdminLte mixins, then ensure data is up-to-date and fully initialized. - if hasattr(view_class, "_update_admin_pdq_data"): - view_class._update_admin_pdq_data() + # # If class inheriting from AdminLte mixins, then ensure data is up-to-date and fully initialized. + # if hasattr(view_class, "_update_admin_pdq_data"): + # view_class._update_admin_pdq_data() # Get AdminLte class data dict. admin_pdq_data = getattr(view_class, "admin_pdq_data", {}) @@ -523,8 +523,12 @@ class AuthMiddleware: data_dict["allow_anonymous_access"] = admin_pdq_data.get("allow_anonymous_access", False) data_dict["login_required"] = admin_pdq_data.get("login_required", False) data_dict["allow_without_permissions"] = admin_pdq_data.get("allow_without_permissions", False) - data_dict["one_of_permissions"] = admin_pdq_data.get("one_of_permissions", None) - data_dict["full_permissions"] = admin_pdq_data.get("full_permissions", None) + + permission_required_one_value = getattr(resolver.func, "permission_required_one", None) + permission_required_value = getattr(resolver.func, "permission_required", None) + + data_dict["one_of_permissions"] = permission_required_one_value + data_dict["full_permissions"] = permission_required_value except Http404: # Request was 404, not valid page. diff --git a/adminlte2_pdq/mixins.py b/adminlte2_pdq/mixins.py index be3a83610c56ecd9f4dc216aedf0ea8766d94544..d5ee674f7f359390f84a493d8c2a11b9848c5c4f 100644 --- a/adminlte2_pdq/mixins.py +++ b/adminlte2_pdq/mixins.py @@ -61,8 +61,8 @@ class AllowAnonymousAccessMixin(BaseAdminLteMixin): "allow_anonymous_access": True, "login_required": False, "allow_without_permissions": False, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } subclasses = [] @@ -85,8 +85,8 @@ class LoginRequiredMixin(DjangoLoginRequiredMixin, BaseAdminLteMixin): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": False, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } subclasses = [] @@ -112,8 +112,8 @@ class AllowWithoutPermissionsMixin(DjangoLoginRequiredMixin, BaseAdminLteMixin): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": True, - "one_of_permissions": None, - "full_permissions": None, + # "one_of_permissions": None, + # "full_permissions": None, } subclasses = [] @@ -140,8 +140,8 @@ class PermissionRequiredMixin(DjangoPermissionRequiredMixin, BaseAdminLteMixin): "allow_anonymous_access": False, "login_required": True, "allow_without_permissions": False, - "one_of_permissions": permission_required_one, - "full_permissions": permission_required, + # "one_of_permissions": permission_required_one, + # "full_permissions": permission_required, } subclasses = [] diff --git a/adminlte2_pdq/templatetags/sidebar_menu.py b/adminlte2_pdq/templatetags/sidebar_menu.py index 7fb5bd359d1d0e52778bdf745ae2f8b5c7282835..61348047a381e5429d0897a1252e5131ec7591cb 100644 --- a/adminlte2_pdq/templatetags/sidebar_menu.py +++ b/adminlte2_pdq/templatetags/sidebar_menu.py @@ -232,17 +232,33 @@ def get_permissions_from_view(view): if view_class: # Is class-based view. - # If class inheriting from AdminLte mixins, then ensure data is up-to-date and fully initialized. - if hasattr(view_class, "_update_admin_pdq_data"): - view_class._update_admin_pdq_data() + # # If class inheriting from AdminLte mixins, then ensure data is up-to-date and fully initialized. + # if hasattr(view_class, "_update_admin_pdq_data"): + # view_class._update_admin_pdq_data() # Get AdminLte class data dict. admin_pdq_data = getattr(view_class, "admin_pdq_data", {}) + + print(" view_class: {0}".format(view_class)) + print(" view.permission_required_one: {0}".format(getattr(view_class, "permission_required_one", None))) + print(" view.permission_required: {0}".format(getattr(view_class, "permission_required", None))) + print("") + + permission_required_one_value = getattr(view_class, "permission_required_one", None) + permission_required_value = getattr(view_class, "permission_required", None) + else: # Is function-based view. Get AdminLte function data dict. admin_pdq_data = getattr(view.func, "admin_pdq_data", {}) - print(" view_class: {0}".format(view_class)) + print(" view_class: {0}".format(view.func)) + print(" view.permission_required_one: {0}".format(getattr(view.func, "permission_required_one", None))) + print(" view.permission_required: {0}".format(getattr(view.func, "permission_required", None))) + print("") + + permission_required_one_value = getattr(view.func, "permission_required_one", None) + permission_required_value = getattr(view.func, "permission_required", None) + print(" pdq_data: {0}".format(admin_pdq_data)) print("") @@ -250,8 +266,15 @@ def get_permissions_from_view(view): view_data["allow_anonymous_access"] = admin_pdq_data.get("allow_anonymous_access", None) view_data["login_required"] = admin_pdq_data.get("login_required", None) view_data["allow_without_permissions"] = admin_pdq_data.get("allow_without_permissions", None) - view_data["one_of_permissions"] = admin_pdq_data.get("one_of_permissions", []) - view_data["full_permissions"] = admin_pdq_data.get("full_permissions", []) + + # # Because we seem unable to get the "updated" class attributes, + # # and only have access to the original literal class-level values, + # # we seem unable to rely on the data dict for this. + # permission_required_one_value = getattr(view_class, "permission_required_one", None) + # permission_required_value = getattr(view_class, "permission_required", None) + + view_data["one_of_permissions"] = permission_required_one_value + view_data["full_permissions"] = permission_required_value return view_data @@ -288,6 +311,7 @@ def get_permissions_from_node(node): node_one_of_permissions = node.get("one_of_permissions", None) node_full_permissions = node.get("permissions", None) + print(" Node Results:") print(" node_allow_anonymous_access: {0}".format(node_allow_anonymous_access)) print(" node_login_required: {0}".format(node_login_required)) print(" node_allow_without_permissions: {0}".format(node_allow_without_permissions)) @@ -368,6 +392,7 @@ def get_permissions_from_node(node): if isinstance(view_full_permissions, str): view_full_permissions = (view_full_permissions,) + print(" View Results:") print(" view_allow_anonymous_access: {0}".format(view_allow_anonymous_access)) print(" view_login_required: {0}".format(view_login_required)) print(" view_allow_without_permissions: {0}".format(view_allow_without_permissions)) @@ -439,6 +464,7 @@ def get_permissions_from_node(node): # Fall back to view value, as long as node allow_without_permissions is not set. full_permissions = view_full_permissions or [] + print(" Final Results:") print(" allow_anonymous_access: {0}".format(allow_anonymous_access)) print(" login_required: {0}".format(login_required)) print(" allow_without_permissions: {0}".format(allow_without_permissions)) diff --git a/tests/django_adminlte2_pdq/tests/test_decorators/test_isolated_decorators.py b/tests/django_adminlte2_pdq/tests/test_decorators/test_isolated_decorators.py index 36c7dec207fffad744f6d3af48051eb54d8d39b2..fc08a1ca3d37e9cd90b402b4a738c78307a93c19 100644 --- a/tests/django_adminlte2_pdq/tests/test_decorators/test_isolated_decorators.py +++ b/tests/django_adminlte2_pdq/tests/test_decorators/test_isolated_decorators.py @@ -180,7 +180,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - a_view.admin_pdq_data["one_of_permissions"], + a_view.permission_required_one, ("auth.add_foo",), ) @@ -197,7 +197,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - a_view.admin_pdq_data["one_of_permissions"], + a_view.permission_required_one, ("auth.add_foo", "auth.change_foo"), ) @@ -214,7 +214,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - a_view.admin_pdq_data["one_of_permissions"], + a_view.permission_required_one, ("auth.add_foo", "auth.change_foo"), ) @@ -231,7 +231,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - a_view.admin_pdq_data["one_of_permissions"], + a_view.permission_required_one, ("auth.add_foo", "auth.change_foo"), ) @@ -250,7 +250,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - a_view.admin_pdq_data["one_of_permissions"], + a_view.permission_required_one, ("auth.add_foo", "auth.change_foo"), ) @@ -271,7 +271,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - a_view.admin_pdq_data["full_permissions"], + a_view.permission_required, ("auth.add_foo",), ) @@ -288,7 +288,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 200) self.assertEqual( - a_view.admin_pdq_data["full_permissions"], + a_view.permission_required, ("auth.add_foo", "auth.change_foo"), ) @@ -305,7 +305,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - a_view.admin_pdq_data["full_permissions"], + a_view.permission_required, ("auth.add_foo", "auth.change_foo"), ) @@ -322,7 +322,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - a_view.admin_pdq_data["full_permissions"], + a_view.permission_required, ("auth.add_foo", "auth.change_foo"), ) @@ -341,7 +341,7 @@ class TestIsolatedDecorators(TestCase): self.assertEqual(response.status_code, 302) self.assertEqual( - a_view.admin_pdq_data["full_permissions"], + a_view.permission_required, ("auth.add_foo", "auth.change_foo"), )