docs(identity): complete German reference coverage
Module Package Release / publish-packages (push) Successful in 12s
Module Package Release / publish-packages (push) Successful in 12s
This commit is contained in:
+1
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-identity"
|
name = "govoplan-identity"
|
||||||
version = "0.1.18"
|
version = "0.1.19"
|
||||||
description = "GovOPlaN identity directory module."
|
description = "GovOPlaN identity directory module."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""GovOPlaN identity module."""
|
"""GovOPlaN identity module."""
|
||||||
|
|
||||||
__version__ = "0.1.18"
|
__version__ = "0.1.19"
|
||||||
|
|||||||
@@ -2,11 +2,18 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from govoplan_core.core.access import CAPABILITY_AUTH_PERMISSION_EVALUATOR, CAPABILITY_AUTH_PRINCIPAL_RESOLVER
|
from govoplan_core.core.access import (
|
||||||
from govoplan_core.core.identity import CAPABILITY_IDENTITY_DIRECTORY, CAPABILITY_IDENTITY_SEARCH
|
CAPABILITY_AUTH_PERMISSION_EVALUATOR,
|
||||||
|
CAPABILITY_AUTH_PRINCIPAL_RESOLVER,
|
||||||
|
)
|
||||||
|
from govoplan_core.core.identity import (
|
||||||
|
CAPABILITY_IDENTITY_DIRECTORY,
|
||||||
|
CAPABILITY_IDENTITY_SEARCH,
|
||||||
|
)
|
||||||
from govoplan_core.core.module_guards import persistent_table_uninstall_guard
|
from govoplan_core.core.module_guards import persistent_table_uninstall_guard
|
||||||
from govoplan_core.core.modules import (
|
from govoplan_core.core.modules import (
|
||||||
CapabilityDocumentation,
|
CapabilityDocumentation,
|
||||||
|
DocumentationCondition,
|
||||||
DocumentationTopic,
|
DocumentationTopic,
|
||||||
FrontendModule,
|
FrontendModule,
|
||||||
MigrationSpec,
|
MigrationSpec,
|
||||||
@@ -47,7 +54,11 @@ def _permission(
|
|||||||
|
|
||||||
|
|
||||||
PERMISSIONS = (
|
PERMISSIONS = (
|
||||||
_permission("identity:identity:read", "View identities", "Search and read normalized identities and their account links."),
|
_permission(
|
||||||
|
"identity:identity:read",
|
||||||
|
"View identities",
|
||||||
|
"Search and read normalized identities and their account links.",
|
||||||
|
),
|
||||||
_permission(
|
_permission(
|
||||||
"identity:identity:admin",
|
"identity:identity:admin",
|
||||||
"Administer identities",
|
"Administer identities",
|
||||||
@@ -104,8 +115,11 @@ def _dsar_provider(context: ModuleContext) -> IdentityDsarProvider:
|
|||||||
manifest = ModuleManifest(
|
manifest = ModuleManifest(
|
||||||
id="identity",
|
id="identity",
|
||||||
name="Identity",
|
name="Identity",
|
||||||
version="0.1.18",
|
version="0.1.19",
|
||||||
required_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR),
|
required_capabilities=(
|
||||||
|
CAPABILITY_AUTH_PRINCIPAL_RESOLVER,
|
||||||
|
CAPABILITY_AUTH_PERMISSION_EVALUATOR,
|
||||||
|
),
|
||||||
permissions=PERMISSIONS,
|
permissions=PERMISSIONS,
|
||||||
role_templates=ROLE_TEMPLATES,
|
role_templates=ROLE_TEMPLATES,
|
||||||
route_factory=_route_factory,
|
route_factory=_route_factory,
|
||||||
@@ -185,6 +199,23 @@ manifest = ModuleManifest(
|
|||||||
audience=("user", "system_admin", "identity_admin", "auditor"),
|
audience=("user", "system_admin", "identity_admin", "auditor"),
|
||||||
related_modules=("core", "access", "tenancy"),
|
related_modules=("core", "access", "tenancy"),
|
||||||
order=23,
|
order=23,
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Betroffenenanfragen für Identitäten",
|
||||||
|
"summary": (
|
||||||
|
"Eine kanonische Identität nur exportieren, wenn exakte Identitäts- und Kontoverknüpfungskennungen einander bestätigen."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Identity-Datensätze sind systemweit und nicht mandanteneigen. Der Betroffenen-Provider verlangt deshalb eine exakte "
|
||||||
|
"Identitätskennung und entweder das exakt verknüpfte Konto oder die Kennung der Kontoverknüpfung, bevor er Anzeige-, "
|
||||||
|
"externes Subjekt-, Lebenszyklus- und passende Verknüpfungsdaten ausgibt. Andere Verknüpfungen und beliebige "
|
||||||
|
"Identitätseinstellungen sind ausgeschlossen. Eine Mandantenanfrage darf die Identität nicht automatisch deaktivieren "
|
||||||
|
"oder die Verknüpfung entfernen, weil beides Authentifizierung und Mitgliedschaften außerhalb dieses Mandanten beeinflussen "
|
||||||
|
"kann. Eine Löschung wird als manuelle Prüfung unter Beteiligung der Zuständigen für Identity, Access, Tenancy und "
|
||||||
|
"Aufbewahrung erfasst."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"help_contexts": ["privacy.data-subject-requests"],
|
"help_contexts": ["privacy.data-subject-requests"],
|
||||||
"consequence_classes": {
|
"consequence_classes": {
|
||||||
@@ -208,6 +239,18 @@ manifest = ModuleManifest(
|
|||||||
layer="configured",
|
layer="configured",
|
||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("tenant_admin", "access_admin", "operator"),
|
audience=("tenant_admin", "access_admin", "operator"),
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Identitätsverzeichnis",
|
||||||
|
"summary": (
|
||||||
|
"Identity besitzt normalisierte Subjekte und verknüpft sie mit Plattformkonten; Access besitzt die Autorisierung."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Eine Identität kann mehrere Konten besitzen. Identitätsmerkmale bleiben von Authentifizierungssitzungen, "
|
||||||
|
"Organisationsfunktionen und Berechtigungsentscheidungen getrennt."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
order=24,
|
order=24,
|
||||||
),
|
),
|
||||||
DocumentationTopic(
|
DocumentationTopic(
|
||||||
@@ -218,11 +261,38 @@ manifest = ModuleManifest(
|
|||||||
"The Identity administration surface lists, creates, inspects, updates, deactivates, and reactivates canonical identities. These records are system-scoped; the current tenant is shown only as the acting administrative context. Account references remain opaque to Identity and one account can be linked to only one identity through this administration API. The first link becomes primary automatically. A primary link cannot be removed while another link remains: promote the replacement first. Every write and primary-account transition is recorded as a system audit event. Deactivation is reversible and does not suspend authentication, erase links, or change permissions."
|
"The Identity administration surface lists, creates, inspects, updates, deactivates, and reactivates canonical identities. These records are system-scoped; the current tenant is shown only as the acting administrative context. Account references remain opaque to Identity and one account can be linked to only one identity through this administration API. The first link becomes primary automatically. A primary link cannot be removed while another link remains: promote the replacement first. Every write and primary-account transition is recorded as a system audit event. Deactivation is reversible and does not suspend authentication, erase links, or change permissions."
|
||||||
),
|
),
|
||||||
layer="configured",
|
layer="configured",
|
||||||
documentation_types=("admin",),
|
documentation_types=("admin", "user"),
|
||||||
audience=("system_admin", "identity_admin", "access_admin"),
|
audience=("system_admin", "identity_admin", "access_admin"),
|
||||||
|
conditions=(
|
||||||
|
DocumentationCondition(
|
||||||
|
required_modules=("identity",),
|
||||||
|
any_scopes=(
|
||||||
|
"identity:identity:read",
|
||||||
|
"identity:identity:admin",
|
||||||
|
"identity:account_link:admin",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
order=26,
|
order=26,
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Kanonisches Identitätsverzeichnis administrieren",
|
||||||
|
"summary": (
|
||||||
|
"Systemweite Identitäten und ihre Kontoverknüpfungen verwalten, ohne Authentifizierung oder Zugriffskontrolle zu übernehmen."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Die Identity-Administrationsoberfläche listet, erstellt, prüft, aktualisiert, deaktiviert und reaktiviert kanonische "
|
||||||
|
"Identitäten. Diese Datensätze sind systemweit; der aktuelle Mandant wird nur als administrativer Handlungskontext gezeigt. "
|
||||||
|
"Kontoverweise bleiben für Identity undurchsichtig, und ein Konto darf über diese API nur mit einer Identität verknüpft "
|
||||||
|
"sein. Die erste Verknüpfung wird automatisch primär. Eine primäre Verknüpfung kann nicht entfernt werden, solange eine "
|
||||||
|
"weitere besteht; machen Sie zuerst den Ersatz primär. Jeder Schreibvorgang und jeder Wechsel des primären Kontos wird als "
|
||||||
|
"System-Auditereignis festgehalten. Die Deaktivierung ist umkehrbar und sperrt weder die Authentifizierung noch löscht sie "
|
||||||
|
"Verknüpfungen oder verändert Berechtigungen."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "guide",
|
"kind": "workflow",
|
||||||
"help_contexts": ["identity.admin.directory"],
|
"help_contexts": ["identity.admin.directory"],
|
||||||
"prerequisites": [
|
"prerequisites": [
|
||||||
"The administrator has system identity administration permission.",
|
"The administrator has system identity administration permission.",
|
||||||
@@ -244,6 +314,22 @@ manifest = ModuleManifest(
|
|||||||
documentation_types=("admin",),
|
documentation_types=("admin",),
|
||||||
audience=("tenant_admin", "access_admin", "operator"),
|
audience=("tenant_admin", "access_admin", "operator"),
|
||||||
order=25,
|
order=25,
|
||||||
|
translations={
|
||||||
|
"de": {
|
||||||
|
"title": "Lebenszyklus von Identitäten und Kontoverknüpfungen administrieren",
|
||||||
|
"summary": (
|
||||||
|
"Identitäten umkehrbar deaktivieren und das primäre Konto ändern, ohne die Herkunft der Verknüpfungen zu verwerfen."
|
||||||
|
),
|
||||||
|
"body": (
|
||||||
|
"Eine Deaktivierung entfernt die Identität aus der gewöhnlichen Suche, während die direkte Auflösung einen ausdrücklich "
|
||||||
|
"inaktiven Datensatz beibehält. Alle Kontoverknüpfungen bleiben erhalten; es handelt sich weder um Kontosperrung noch "
|
||||||
|
"Löschung. Ein Wechsel des primären Kontos wählt eine bestehende Verknüpfung, stuft das bisherige primäre Konto atomar "
|
||||||
|
"zurück, erhält die Kompatibilität mehrerer Konten und zeichnet handelnde Person, altes/neues Konto und "
|
||||||
|
"Verknüpfungsquellennachweis auf. Der berechtigte Aufrufer schreibt Zustand und Auditnachweis gemeinsam fest oder setzt "
|
||||||
|
"beides zurück."
|
||||||
|
),
|
||||||
|
}
|
||||||
|
},
|
||||||
metadata={
|
metadata={
|
||||||
"kind": "reference",
|
"kind": "reference",
|
||||||
"prerequisites": [
|
"prerequisites": [
|
||||||
@@ -261,9 +347,16 @@ manifest = ModuleManifest(
|
|||||||
maturity="vertical_slice",
|
maturity="vertical_slice",
|
||||||
documentation_ref="docs/IDENTITY_MODEL.md",
|
documentation_ref="docs/IDENTITY_MODEL.md",
|
||||||
test_ref="tests/test_directory.py",
|
test_ref="tests/test_directory.py",
|
||||||
known_limits=("Identity proofing and external-directory reconciliation are outside the current vertical slice.",),
|
known_limits=(
|
||||||
|
"Identity proofing and external-directory reconciliation are outside the current vertical slice.",
|
||||||
|
),
|
||||||
owned_concepts=("identity", "identity-account link"),
|
owned_concepts=("identity", "identity-account link"),
|
||||||
non_owned_concepts=("account authentication", "function assignment", "contact point", "organization"),
|
non_owned_concepts=(
|
||||||
|
"account authentication",
|
||||||
|
"function assignment",
|
||||||
|
"contact point",
|
||||||
|
"organization",
|
||||||
|
),
|
||||||
security_docs=("docs/IDENTITY_MODEL.md",),
|
security_docs=("docs/IDENTITY_MODEL.md",),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from govoplan_identity.backend.manifest import manifest
|
||||||
|
|
||||||
|
|
||||||
|
class IdentityDocumentationContractTests(unittest.TestCase):
|
||||||
|
def test_all_static_topics_have_complete_german_content(self) -> None:
|
||||||
|
for topic in manifest.documentation:
|
||||||
|
german = (topic.translations or {}).get("de", {})
|
||||||
|
self.assertEqual({"title", "summary", "body"}, set(german), topic.id)
|
||||||
|
self.assertTrue(
|
||||||
|
all(str(value).strip() for value in german.values()), topic.id
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_administration_is_permission_conditioned_workflow(self) -> None:
|
||||||
|
topic = next(
|
||||||
|
item
|
||||||
|
for item in manifest.documentation
|
||||||
|
if item.id == "identity.administration"
|
||||||
|
)
|
||||||
|
self.assertEqual("workflow", topic.metadata["kind"])
|
||||||
|
self.assertTrue(topic.conditions)
|
||||||
|
self.assertIn("user", topic.documentation_types)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/identity-webui",
|
"name": "@govoplan/identity-webui",
|
||||||
"version": "0.1.18",
|
"version": "0.1.19",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ const adminSections: AdminSectionsUiCapability = {
|
|||||||
export const identityModule: PlatformWebModule = {
|
export const identityModule: PlatformWebModule = {
|
||||||
id: "identity",
|
id: "identity",
|
||||||
label: "Identity",
|
label: "Identity",
|
||||||
version: "0.1.18",
|
version: "0.1.19",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
optionalDependencies: ["access", "audit", "idm"],
|
optionalDependencies: ["access", "audit", "idm"],
|
||||||
viewSurfaces: [
|
viewSurfaces: [
|
||||||
|
|||||||
Reference in New Issue
Block a user