diff --git a/src/govoplan_core/core/install_config.py b/src/govoplan_core/core/install_config.py index 07428a1..0bb2e6e 100644 --- a/src/govoplan_core/core/install_config.py +++ b/src/govoplan_core/core/install_config.py @@ -737,6 +737,8 @@ CALENDAR_OUTBOX_TERMINAL_RETENTION_DAYS=90 PLATFORM_EVENT_OUTBOX_MAX_ATTEMPTS=8 PLATFORM_EVENT_OUTBOX_TERMINAL_RETENTION_DAYS=90 SCHEDULING_CANCELLATION_NOTICE_DAYS=30 +SCHEDULING_PUBLIC_SELF_ENROLLMENT_ENABLED=true +SCHEDULING_PUBLIC_SELF_ENROLLMENT_MAX_CAPACITY=10000 # Deployment-wide connector egress policy. Enable private networks only when # this installation intentionally integrates with internal services. @@ -818,6 +820,8 @@ CALENDAR_OUTBOX_TERMINAL_RETENTION_DAYS=90 PLATFORM_EVENT_OUTBOX_MAX_ATTEMPTS=8 PLATFORM_EVENT_OUTBOX_TERMINAL_RETENTION_DAYS=90 SCHEDULING_CANCELLATION_NOTICE_DAYS=30 +SCHEDULING_PUBLIC_SELF_ENROLLMENT_ENABLED=true +SCHEDULING_PUBLIC_SELF_ENROLLMENT_MAX_CAPACITY=10000 GOVOPLAN_CONNECTOR_ALLOW_PRIVATE_NETWORKS=true GOVOPLAN_CONNECTOR_MAX_STRUCTURED_RESPONSE_BYTES=16777216 diff --git a/src/govoplan_core/settings.py b/src/govoplan_core/settings.py index 1cb174f..11fee99 100644 --- a/src/govoplan_core/settings.py +++ b/src/govoplan_core/settings.py @@ -262,6 +262,16 @@ class Settings(BaseSettings): le=90, alias="SCHEDULING_CANCELLATION_NOTICE_DAYS", ) + scheduling_public_self_enrollment_enabled: bool = Field( + default=True, + alias="SCHEDULING_PUBLIC_SELF_ENROLLMENT_ENABLED", + ) + scheduling_public_self_enrollment_max_capacity: int = Field( + default=10_000, + ge=1, + le=10_000, + alias="SCHEDULING_PUBLIC_SELF_ENROLLMENT_MAX_CAPACITY", + ) mock_mailbox_dir: str = Field(default="runtime/mock-mailbox", alias="MOCK_MAILBOX_DIR") # Development bootstrap only. Do not use this in production. diff --git a/tests/test_install_config.py b/tests/test_install_config.py index 6f9ebfb..f7e7dca 100644 --- a/tests/test_install_config.py +++ b/tests/test_install_config.py @@ -76,6 +76,26 @@ class InstallConfigTests(unittest.TestCase): with self.subTest(invalid=invalid), self.assertRaises(ValidationError): Settings(SCHEDULING_CANCELLATION_NOTICE_DAYS=invalid) + def test_scheduling_public_self_enrollment_policy_is_configurable(self) -> None: + defaults = Settings() + self.assertTrue(defaults.scheduling_public_self_enrollment_enabled) + self.assertEqual( + defaults.scheduling_public_self_enrollment_max_capacity, + 10_000, + ) + configured = Settings( + SCHEDULING_PUBLIC_SELF_ENROLLMENT_ENABLED="false", + SCHEDULING_PUBLIC_SELF_ENROLLMENT_MAX_CAPACITY="250", + ) + self.assertFalse(configured.scheduling_public_self_enrollment_enabled) + self.assertEqual( + configured.scheduling_public_self_enrollment_max_capacity, + 250, + ) + for invalid in ("0", "10001"): + with self.subTest(invalid=invalid), self.assertRaises(ValidationError): + Settings(SCHEDULING_PUBLIC_SELF_ENROLLMENT_MAX_CAPACITY=invalid) + def test_self_hosted_validation_reports_actionable_missing_settings(self) -> None: result = validate_runtime_configuration({}, profile="self-hosted") @@ -246,6 +266,8 @@ class InstallConfigTests(unittest.TestCase): self.assertIn("MASTER_KEY_B64=