Make Access optional for Evaluation

This commit is contained in:
2026-07-12 09:32:16 +02:00
parent 3fa344b565
commit d027746c6d
4 changed files with 18 additions and 6 deletions

View File

@@ -28,6 +28,13 @@ Evaluation does not own:
- generic form rendering and submission runtime; those belong in `govoplan-forms` and `govoplan-forms-runtime` - generic form rendering and submission runtime; those belong in `govoplan-forms` and `govoplan-forms-runtime`
- BI dashboards and long-term reporting infrastructure - BI dashboards and long-term reporting infrastructure
## Optional Access Integration
`govoplan-access` is optional. With Access installed, Evaluation can use
identity resolution, permission checks, and role templates. Without Access,
Evaluation remains usable for reduced flows such as public-link questionnaires,
local participant lists, or tenant-local response collection.
## Development Install ## Development Install
```bash ```bash

View File

@@ -12,7 +12,6 @@ license = { file = "LICENSE" }
authors = [{ name = "GovOPlaN" }] authors = [{ name = "GovOPlaN" }]
dependencies = [ dependencies = [
"govoplan-core>=0.1.8", "govoplan-core>=0.1.8",
"govoplan-access>=0.1.8",
] ]
[tool.setuptools.packages.find] [tool.setuptools.packages.find]

View File

@@ -65,7 +65,10 @@ DOCUMENTATION = (
body=( body=(
"Evaluation owns structured post-process feedback, surveys, scoring, rubrics, recurring " "Evaluation owns structured post-process feedback, surveys, scoring, rubrics, recurring "
"evaluation runs, aggregation, and export-ready results. It may import poll response " "evaluation runs, aggregation, and export-ready results. It may import poll response "
"collections as context, but lightweight decision and availability polls remain owned by Poll." "collections as context, but lightweight decision and availability polls remain owned by Poll. "
"Access is optional: when installed, Evaluation can use principal resolution, permission "
"evaluation, and role templates; without it, reduced local or public-link response flows "
"remain possible."
), ),
layer="available", layer="available",
documentation_types=("admin",), documentation_types=("admin",),
@@ -79,9 +82,9 @@ manifest = ModuleManifest(
id=MODULE_ID, id=MODULE_ID,
name=MODULE_NAME, name=MODULE_NAME,
version=MODULE_VERSION, version=MODULE_VERSION,
dependencies=("access",), dependencies=(),
optional_dependencies=("poll", "scheduling", "calendar", "campaigns", "forms", "forms-runtime", "files", "reporting", "dashboard", "portal", "mail", "notifications"), optional_dependencies=("access", "poll", "scheduling", "calendar", "campaigns", "forms", "forms-runtime", "files", "reporting", "dashboard", "portal", "mail", "notifications"),
required_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR), optional_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR),
provides_interfaces=( provides_interfaces=(
ModuleInterfaceProvider(name="evaluation.feedback", version="0.1.8"), ModuleInterfaceProvider(name="evaluation.feedback", version="0.1.8"),
ModuleInterfaceProvider(name="evaluation.scoring", version="0.1.8"), ModuleInterfaceProvider(name="evaluation.scoring", version="0.1.8"),

View File

@@ -12,7 +12,10 @@ class EvaluationManifestTests(unittest.TestCase):
self.assertIsInstance(manifest, ModuleManifest) self.assertIsInstance(manifest, ModuleManifest)
self.assertEqual(manifest.id, "evaluation") self.assertEqual(manifest.id, "evaluation")
self.assertIn("access", 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("poll", manifest.optional_dependencies) self.assertIn("poll", manifest.optional_dependencies)
self.assertIn("evaluation.result_aggregation", {interface.name for interface in manifest.provides_interfaces}) self.assertIn("evaluation.result_aggregation", {interface.name for interface in manifest.provides_interfaces})
self.assertIn("poll.response_collection", {interface.name for interface in manifest.requires_interfaces}) self.assertIn("poll.response_collection", {interface.name for interface in manifest.requires_interfaces})