Skip to content

Commit

Permalink
build codename prefix list from model's meta.default_permissions in g…
Browse files Browse the repository at this point in the history
…et_app_codenames
  • Loading branch information
erikvw committed Aug 15, 2024
1 parent 5d4387d commit dad0e6a
Show file tree
Hide file tree
Showing 12 changed files with 68 additions and 47 deletions.
47 changes: 34 additions & 13 deletions edc_auth/get_app_codenames.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ def get_app_codenames(
"""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(
Expand All @@ -27,9 +30,6 @@ def get_app_codenames(

clinic_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)
Expand All @@ -45,15 +45,36 @@ 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.extend(
get_codename(
app_config.name,
model_cls,
autocomplete_models,
override_permissions=permissions,
)
)
clinic_codenames.sort()
return clinic_codenames


def get_codename(
app_name,
model_cls,
autocomplete_models: list[str] | None = None,
override_permissions: list[str] | 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:
# codename = f"{app_name}.view_{model_name}"
permissions = override_permissions or model_cls._meta.default_permissions
prefixes = [f"{s}_" for s in permissions]
for prefix in prefixes:
codenames.append(f"{app_name}.{prefix}{model_name}")
return codenames
36 changes: 2 additions & 34 deletions runtests.py
Original file line number Diff line number Diff line change
@@ -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")
Empty file added tests/__init__.py
Empty file.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
32 changes: 32 additions & 0 deletions tests/test_settings.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit dad0e6a

Please sign in to comment.