diff --git a/README.md b/README.md index 7fc639c..1d18fd6 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,10 @@ The Scheduling manifest declares `poll` as a required dependency because availability collection and option/date poll primitives belong in `govoplan-poll`. -The manifest declares `evaluation` as an optional dependency. Scheduling may -trigger post-event or post-appointment feedback, but scheduling must not depend -on the heavier evaluation model just to find a meeting time. +The manifest declares `access` and `evaluation` as optional dependencies. +Scheduling may use Access for identity, groups, and permissions, and may trigger +post-event or post-appointment feedback through Evaluation. It must not require +either module just to find a meeting time. ## Expected Integrations @@ -85,7 +86,7 @@ on the heavier evaluation model just to find a meeting time. - `govoplan-evaluation`: optional post-event, post-appointment, or process feedback - `govoplan-calendar`: availability, calendars, resources, rooms, recurrence, Open-Xchange/calendar adapters - `govoplan-appointments`: conversion from a selected meeting time into a booked appointment where appropriate -- `govoplan-access` and `govoplan-idm`: participants, groups, directory lookup, permissions +- `govoplan-access` and `govoplan-idm`: optional participants, groups, directory lookup, permissions - `govoplan-mail` and `govoplan-notifications`: invitations, reminders, confirmations - `govoplan-portal`: external participant scheduling flows - `govoplan-workflow` and `govoplan-tasks`: follow-up work after a time is selected diff --git a/pyproject.toml b/pyproject.toml index e1d85e3..03e4791 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,6 @@ license = { file = "LICENSE" } authors = [{ name = "GovOPlaN" }] dependencies = [ "govoplan-core>=0.1.8", - "govoplan-access>=0.1.8", "govoplan-poll>=0.1.8", ] diff --git a/src/govoplan_scheduling/backend/manifest.py b/src/govoplan_scheduling/backend/manifest.py index 1ce84bb..efadb13 100644 --- a/src/govoplan_scheduling/backend/manifest.py +++ b/src/govoplan_scheduling/backend/manifest.py @@ -63,7 +63,10 @@ DOCUMENTATION = ( body=( "Scheduling owns meeting scheduling workflows, candidate slots, participant availability " "collection, conflict explanation, reminders, and decision handoff. It depends on Poll " - "for reusable availability matrices and can optionally trigger Evaluation for post-event feedback." + "for reusable availability matrices and can optionally trigger Evaluation for post-event feedback. " + "Access is optional: when installed, Scheduling can use principal resolution, permission " + "evaluation, groups, and role templates; without it, reduced signed-link or local organizer " + "flows remain possible." ), layer="available", documentation_types=("admin",), @@ -77,9 +80,9 @@ manifest = ModuleManifest( id=MODULE_ID, name=MODULE_NAME, version=MODULE_VERSION, - dependencies=("access", "poll"), - optional_dependencies=("calendar", "appointments", "evaluation", "mail", "notifications", "portal", "workflow", "tasks", "idm", "organizations"), - required_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR), + dependencies=("poll",), + optional_dependencies=("access", "calendar", "appointments", "evaluation", "mail", "notifications", "portal", "workflow", "tasks", "idm", "organizations"), + optional_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR), provides_interfaces=( ModuleInterfaceProvider(name="scheduling.candidate_slots", version="0.1.8"), ModuleInterfaceProvider(name="scheduling.decision_handoff", version="0.1.8"), diff --git a/tests/test_manifest.py b/tests/test_manifest.py index 3209922..b5f02d4 100644 --- a/tests/test_manifest.py +++ b/tests/test_manifest.py @@ -13,6 +13,10 @@ class SchedulingManifestTests(unittest.TestCase): self.assertIsInstance(manifest, ModuleManifest) self.assertEqual(manifest.id, "scheduling") self.assertIn("poll", manifest.dependencies) + self.assertNotIn("access", manifest.dependencies) + self.assertIn("access", manifest.optional_dependencies) + self.assertFalse(manifest.required_capabilities) + self.assertIn("auth.principalResolver", manifest.optional_capabilities) self.assertIn("evaluation", manifest.optional_dependencies) self.assertIn("poll.availability_matrix", {interface.name for interface in manifest.requires_interfaces})