diff --git a/edc_auth/get_app_codenames.py b/edc_auth/get_app_codenames.py index 5ba149d..832b198 100644 --- a/edc_auth/get_app_codenames.py +++ b/edc_auth/get_app_codenames.py @@ -14,10 +14,14 @@ def get_app_codenames( autocomplete_models: list[str] | None = None, permissions: list[str] | None = None, exclude_models: list[str] | tuple[str, ...] | None = None, + include_import_export: bool | None = None, ) -> list[str]: """Prepares and returns an ordered list of codenames for the common edc project apps to be used in `auth_objects`. + Reads default_permissions from model.Meta or permissions + to build a list of codenames for each model in the app_config. + For example, in `auths.py`: clinic_codenames = get_app_codenames( @@ -25,11 +29,8 @@ def get_app_codenames( ) """ - clinic_codenames: list[str] = [] + codenames: list[str] = [] autocomplete_models = autocomplete_models or [] - prefixes = ( - [f"{s}_" for s in permissions] if permissions else ["add_", "change_", "delete_"] - ) exclude_models = exclude_models or [] try: app_config = django_apps.get_app_config(list_app) @@ -37,7 +38,7 @@ def get_app_codenames( pass else: for model_cls in get_models(app_config, exclude_models): - clinic_codenames.append(f"{app_config.name}.view_{model_cls._meta.model_name}") + codenames.append(f"{app_config.name}.view_{model_cls._meta.model_name}") for name in crud_apps: try: app_config = django_apps.get_app_config(name) @@ -45,15 +46,41 @@ def get_app_codenames( pass else: for model_cls in get_models(app_config, exclude_models): - label_lower: str = model_cls._meta.label_lower - model_name: str = model_cls._meta.model_name - if "historical" in label_lower: - clinic_codenames.append(f"{app_config.name}.view_{model_name}") - elif label_lower in autocomplete_models: - clinic_codenames.append(f"{app_config.name}.view_{model_name}") - else: - clinic_codenames.append(f"{app_config.name}.view_{model_name}") - for prefix in prefixes: - clinic_codenames.append(f"{app_config.name}.{prefix}{model_name}") - clinic_codenames.sort() - return clinic_codenames + codenames.extend( + get_codename( + app_config.name, + model_cls, + autocomplete_models, + override_permissions=permissions, + include_import_export=include_import_export, + ) + ) + codenames.sort() + return codenames + + +def get_codename( + app_name, + model_cls, + autocomplete_models: list[str] | None = None, + override_permissions: list[str] | None = None, + include_import_export: bool | None = None, +) -> list[str]: + codenames = [] + autocomplete_models = autocomplete_models or [] + label_lower: str = model_cls._meta.label_lower + model_name: str = model_cls._meta.model_name + if "historical" in label_lower: + codenames.append(f"{app_name}.view_{model_name}") + elif label_lower in autocomplete_models: + codenames.append(f"{app_name}.view_{model_name}") + else: + permissions = override_permissions or model_cls._meta.default_permissions + if not include_import_export: + permissions = [ + x for x in permissions if x not in ["export", "import", "viewallsites"] + ] + prefixes = [f"{s}_" for s in permissions] + for prefix in prefixes: + codenames.append(f"{app_name}.{prefix}{model_name}") + return codenames diff --git a/runtests.py b/runtests.py index d938f53..d4b1905 100644 --- a/runtests.py +++ b/runtests.py @@ -1,37 +1,5 @@ #!/usr/bin/env python -import logging -from pathlib import Path - -from edc_test_utils import DefaultTestSettings, func_main - -app_name = "edc_auth" -base_dir = Path(__file__).absolute().parent - -project_settings = DefaultTestSettings( - calling_file=__file__, - SILENCED_SYSTEM_CHECKS=[ - "edc_sites.E001", - "edc_sites.E002", - "sites.E101", - "edc_navbar.E002", - "edc_navbar.E003", - ], - EDC_AUTH_CODENAMES_WARN_ONLY=True, - EDC_AUTH_SKIP_SITE_AUTHS=True, - EDC_AUTH_SKIP_AUTH_UPDATER=True, - BASE_DIR=base_dir, - APP_NAME=app_name, - SUBJECT_VISIT_MODEL="edc_visit_tracking.subjectvisit", - add_dashboard_middleware=True, - add_lab_dashboard_middleware=True, - use_test_urls=True, -).settings - - -def main(): - func_main(project_settings, f"{app_name}.tests") - +from edc_test_settings.func_main import func_main2 if __name__ == "__main__": - logging.basicConfig() - main() + func_main2("tests.test_settings", "edc_auth.tests") diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/edc_auth/tests/etc/user-aes-local.key b/tests/etc/user-aes-local.key similarity index 100% rename from edc_auth/tests/etc/user-aes-local.key rename to tests/etc/user-aes-local.key diff --git a/edc_auth/tests/etc/user-aes-restricted.key b/tests/etc/user-aes-restricted.key similarity index 100% rename from edc_auth/tests/etc/user-aes-restricted.key rename to tests/etc/user-aes-restricted.key diff --git a/edc_auth/tests/etc/user-rsa-local-private.pem b/tests/etc/user-rsa-local-private.pem similarity index 100% rename from edc_auth/tests/etc/user-rsa-local-private.pem rename to tests/etc/user-rsa-local-private.pem diff --git a/edc_auth/tests/etc/user-rsa-local-public.pem b/tests/etc/user-rsa-local-public.pem similarity index 100% rename from edc_auth/tests/etc/user-rsa-local-public.pem rename to tests/etc/user-rsa-local-public.pem diff --git a/edc_auth/tests/etc/user-rsa-restricted-private.pem b/tests/etc/user-rsa-restricted-private.pem similarity index 100% rename from edc_auth/tests/etc/user-rsa-restricted-private.pem rename to tests/etc/user-rsa-restricted-private.pem diff --git a/edc_auth/tests/etc/user-rsa-restricted-public.pem b/tests/etc/user-rsa-restricted-public.pem similarity index 100% rename from edc_auth/tests/etc/user-rsa-restricted-public.pem rename to tests/etc/user-rsa-restricted-public.pem diff --git a/edc_auth/tests/etc/user-salt-local.key b/tests/etc/user-salt-local.key similarity index 100% rename from edc_auth/tests/etc/user-salt-local.key rename to tests/etc/user-salt-local.key diff --git a/edc_auth/tests/etc/user-salt-restricted.key b/tests/etc/user-salt-restricted.key similarity index 100% rename from edc_auth/tests/etc/user-salt-restricted.key rename to tests/etc/user-salt-restricted.key diff --git a/tests/test_settings.py b/tests/test_settings.py new file mode 100644 index 0000000..5f9dc9e --- /dev/null +++ b/tests/test_settings.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import sys +from pathlib import Path + +from edc_test_settings.default_test_settings import DefaultTestSettings + +app_name = "edc_auth" +base_dir = Path(__file__).absolute().parent.parent + +project_settings = DefaultTestSettings( + calling_file=__file__, + DJANGO_CRYPTO_FIELDS_KEY_PATH=base_dir / "tests" / "etc", + SILENCED_SYSTEM_CHECKS=[ + "edc_sites.E001", + "edc_sites.E002", + "sites.E101", + "edc_navbar.E002", + "edc_navbar.E003", + ], + EDC_AUTH_CODENAMES_WARN_ONLY=True, + EDC_AUTH_SKIP_SITE_AUTHS=True, + EDC_AUTH_SKIP_AUTH_UPDATER=True, + BASE_DIR=base_dir, + APP_NAME=app_name, + SUBJECT_VISIT_MODEL="edc_visit_tracking.subjectvisit", + add_dashboard_middleware=True, + add_lab_dashboard_middleware=True, + use_test_urls=True, +).settings + +for k, v in project_settings.items(): + setattr(sys.modules[__name__], k, v)