From e70239433f9051d4d0ac5b26d134fc0134afe15d Mon Sep 17 00:00:00 2001 From: "Maxime Alves LIRMM@home" Date: Tue, 17 May 2022 16:01:58 +0200 Subject: [PATCH] [halfdomain] add ability to specify a domain's acl module path in __acl__ attribute --- halfapi/__init__.py | 2 +- halfapi/half_domain.py | 19 +++++++++++++++---- halfapi/halfapi.py | 5 +++-- halfapi/testing/test_domain.py | 1 + tests/test_domain.py | 1 + 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/halfapi/__init__.py b/halfapi/__init__.py index 695b6a3..cdc43c2 100644 --- a/halfapi/__init__.py +++ b/halfapi/__init__.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -__version__ = '0.6.14' +__version__ = '0.6.15' def version(): return f'HalfAPI version:{__version__}' diff --git a/halfapi/half_domain.py b/halfapi/half_domain.py index 9e5700c..2901463 100644 --- a/halfapi/half_domain.py +++ b/halfapi/half_domain.py @@ -27,7 +27,7 @@ from .lib.domain_middleware import DomainMiddleware from .logging import logger class HalfDomain(Starlette): - def __init__(self, domain, router=None, app=None): + def __init__(self, domain, router=None, acl=None, app=None): """ Parameters: domain (str): Module name (should be importable) @@ -53,7 +53,7 @@ class HalfDomain(Starlette): self.m_router = importlib.import_module(self.router, domain) - self.m_acl = importlib.import_module(f'{domain}.acl') + self.m_acl = HalfDomain.m_acl(domain, acl) self.config = { **app.config } @@ -85,11 +85,21 @@ class HalfDomain(Starlette): ] ) + @staticmethod + def m_acl(domain, acl=None): + """ Returns the imported acl module for the domain + """ + if (not acl): + acl = getattr('__acl__', domain, '.acl') + + return importlib.import_module(acl, domain) + + @staticmethod def acls(domain): """ Returns the ACLS constant for the given domain """ - m_acl = importlib.import_module(f'{domain}.acl') + m_acl = HalfDomain.m_acl(domain) try: return getattr(m_acl, 'ACLS') except AttributeError: @@ -98,7 +108,8 @@ class HalfDomain(Starlette): @staticmethod def acls_route(domain): d_res = {} - m_acl = importlib.import_module(f'{domain}.acl') + m_acl = HalfDomain.m_acl(domain) + for acl_name, doc, order in HalfDomain.acls(domain): fct = getattr(m_acl, acl_name) d_res[acl_name] = { diff --git a/halfapi/halfapi.py b/halfapi/halfapi.py index d33a572..a35a995 100644 --- a/halfapi/halfapi.py +++ b/halfapi/halfapi.py @@ -122,7 +122,7 @@ class HalfAPI(Starlette): domain_key = domain.get('name', key) - self.add_domain(domain_key, domain.get('router'), path) + self.add_domain(domain_key, domain.get('router'), domain.get('acl'), path) schemas.append(self.__domains[domain_key].schema()) @@ -237,13 +237,14 @@ class HalfAPI(Starlette): def domains(self): return self.__domains - def add_domain(self, name, router=None, path='/', config=None): + def add_domain(self, name, router=None, acl=None, path='/', config=None): if config: self.config['domain'][name] = config self.__domains[name] = HalfDomain( name, router, + acl, self ) diff --git a/halfapi/testing/test_domain.py b/halfapi/testing/test_domain.py index b39f76b..3ff1100 100644 --- a/halfapi/testing/test_domain.py +++ b/halfapi/testing/test_domain.py @@ -52,6 +52,7 @@ class TestDomain(TestCase): self.halfapi_conf['domain'][self.DOMAIN] = { 'name': self.DOMAIN, 'router': self.ROUTERS, + 'acl': self.ACL, 'prefix': False, 'enabled': True, 'config': { diff --git a/tests/test_domain.py b/tests/test_domain.py index 9607d37..1dca0ae 100644 --- a/tests/test_domain.py +++ b/tests/test_domain.py @@ -6,6 +6,7 @@ class TestDummyDomain(TestDomain): DOMAIN = __name__ ROUTERS = __routers__ + ACL = '.acl' def test_domain(self): self.check_domain()