diff --git a/mandelstudio/launch_validation.py b/mandelstudio/launch_validation.py index 83e2353..9d1da20 100644 --- a/mandelstudio/launch_validation.py +++ b/mandelstudio/launch_validation.py @@ -19,13 +19,39 @@ def _is_dummy_payment_app(app_label: str) -> bool: return "payment_dummy" in parts or normalized == "payment_dummy" +def _load_config_payload() -> dict: + config_path = Path(__file__).resolve().parent / "ocyan.json" + if not config_path.exists(): + return {} + with config_path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def get_declared_plugins() -> list[str]: + payload = _load_config_payload() + return [str(plugin) for plugin in payload.get("ocyan_plugins", [])] + + +def get_declared_payment_apps(installed_apps: list[str] | None = None) -> list[str]: + declared_plugins = [plugin for plugin in get_declared_plugins() if "payment" in plugin.lower()] + if declared_plugins: + return declared_plugins + installed_apps = installed_apps or list(settings.INSTALLED_APPS) + return [app for app in installed_apps if "payment" in app.lower()] + + +def get_checkout_apps() -> list[str]: + return [app for app in settings.INSTALLED_APPS if "checkout" in app.lower()] + + def validate_payment_provider_config() -> None: installed_apps = list(settings.INSTALLED_APPS) - payment_apps = [app for app in installed_apps if "payment" in app.lower()] - checkout_apps = [app for app in installed_apps if "checkout" in app.lower()] + payment_apps = get_declared_payment_apps(installed_apps) + checkout_apps = get_checkout_apps() + config_plugins = get_declared_plugins() if not payment_apps: - raise CommandError("No payment app found in INSTALLED_APPS.") + raise CommandError("No payment app declared for this project.") if not checkout_apps: raise CommandError("No checkout app found in INSTALLED_APPS.") if not any("oscar_checkout" in app.lower() for app in checkout_apps): @@ -34,9 +60,9 @@ def validate_payment_provider_config() -> None: raise CommandError( "Demo data plugin detected in INSTALLED_APPS. Remove all demodata plugins before launch." ) - if any(_is_dummy_payment_app(app) for app in payment_apps): + if any(_is_dummy_payment_app(app) for app in config_plugins): raise CommandError( - "Dummy payment app detected in INSTALLED_APPS. Use a real provider plugin before production launch." + "Dummy payment app is declared in ocyan.json. Use a real provider plugin before production launch." ) if any("mollie" in app.lower() for app in payment_apps): @@ -58,11 +84,7 @@ def validate_payment_provider_config() -> None: "Mollie key must be a live key for production launch (expected prefix 'live_')." ) - config_path = Path(__file__).resolve().parent / "ocyan.json" - if config_path.exists(): - with config_path.open("r", encoding="utf-8") as handle: - config_payload = json.load(handle) - config_plugins = [str(plugin) for plugin in config_payload.get("ocyan_plugins", [])] + if config_plugins: if any(_is_demo_data(plugin) for plugin in config_plugins): raise CommandError( "Demo data plugin detected in ocyan.json. Remove it before launch." diff --git a/mandelstudio/management/commands/validate_idea_marketplace_launch.py b/mandelstudio/management/commands/validate_idea_marketplace_launch.py index 7902f9a..9cacd8f 100644 --- a/mandelstudio/management/commands/validate_idea_marketplace_launch.py +++ b/mandelstudio/management/commands/validate_idea_marketplace_launch.py @@ -17,7 +17,8 @@ from mandelstudio.idea_marketplace import ( SHORT_DESCRIPTION_ATTRIBUTE_CODE, ) from mandelstudio.launch_validation import ( - _is_dummy_payment_app, + get_checkout_apps, + get_declared_payment_apps, validate_payment_provider_config, ) @@ -38,11 +39,8 @@ class Command(BaseCommand): validate_payment_provider_config() installed_apps = list(settings.INSTALLED_APPS) - if any(_is_dummy_payment_app(app) for app in installed_apps): - raise CommandError( - "Dummy payment app detected in INSTALLED_APPS. Use a real provider plugin before production launch." - ) - + payment_apps = get_declared_payment_apps(installed_apps) + checkout_apps = get_checkout_apps() config_path = Path(__file__).resolve().parents[2] / "ocyan.json" if config_path.exists(): with config_path.open("r", encoding="utf-8") as handle: