From f2afcaa09c8201b141b6593f8a1ba574354e4db8 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sat, 11 Jul 2026 16:49:00 +0200 Subject: [PATCH] Release v0.1.8 --- README.md | 6 +- package.json | 4 +- pyproject.toml | 4 +- src/govoplan_access/backend/manifest.py | 2 +- .../4a5b6c7d8e9f_access_semantic_directory.py | 0 .../migrations/dev_versions/__init__.py | 1 + .../4a5b6c7d8e9f_v017_access_baseline.py | 192 ++++++++++++++++++ webui/package.json | 4 +- webui/src/i18n/generatedTranslations.ts | 40 ++-- 9 files changed, 225 insertions(+), 28 deletions(-) rename src/govoplan_access/backend/migrations/{versions => dev_versions}/4a5b6c7d8e9f_access_semantic_directory.py (100%) create mode 100644 src/govoplan_access/backend/migrations/dev_versions/__init__.py create mode 100644 src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_v017_access_baseline.py diff --git a/README.md b/README.md index 5b1a7bb..3113c1e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # GovOPlaN Access + +**Repository type:** module (platform). + + `govoplan-access` is the platform module for GovOPlaN identity, authentication, sessions, API keys, RBAC, groups, users, and access administration. @@ -98,7 +102,7 @@ available: ```bash cd /mnt/DATA/git/govoplan-core -./scripts/gitea-sync-labels.py --root /mnt/DATA/git/govoplan-access --apply +/mnt/DATA/git/govoplan/tools/gitea/gitea-sync-labels.py --root /mnt/DATA/git/govoplan-access --apply ``` ## Development Install diff --git a/package.json b/package.json index 7c7f03b..b06c028 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/access-webui", - "version": "0.1.7", + "version": "0.1.8", "private": true, "type": "module", "main": "webui/src/index.ts", @@ -18,7 +18,7 @@ "LICENSE" ], "peerDependencies": { - "@govoplan/core-webui": "^0.1.7", + "@govoplan/core-webui": "^0.1.8", "lucide-react": "^1.23.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/pyproject.toml b/pyproject.toml index ee3cfcb..6d333f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-access" -version = "0.1.7" +version = "0.1.8" description = "GovOPlaN access platform module with identity, auth, RBAC, and scope primitives." readme = "README.md" requires-python = ">=3.12" license = { file = "LICENSE" } authors = [{ name = "GovOPlaN" }] dependencies = [ - "govoplan-core>=0.1.7", + "govoplan-core>=0.1.8", "SQLAlchemy>=2,<3", ] diff --git a/src/govoplan_access/backend/manifest.py b/src/govoplan_access/backend/manifest.py index aecaf20..ff55408 100644 --- a/src/govoplan_access/backend/manifest.py +++ b/src/govoplan_access/backend/manifest.py @@ -600,7 +600,7 @@ def _route_factory(context: ModuleContext): manifest = ModuleManifest( id="access", name="Access", - version="0.1.7", + version="0.1.8", optional_dependencies=("identity", "organizations", "tenancy", "idm"), permissions=ACCESS_PERMISSIONS, role_templates=ACCESS_ROLE_TEMPLATES, diff --git a/src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_access_semantic_directory.py b/src/govoplan_access/backend/migrations/dev_versions/4a5b6c7d8e9f_access_semantic_directory.py similarity index 100% rename from src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_access_semantic_directory.py rename to src/govoplan_access/backend/migrations/dev_versions/4a5b6c7d8e9f_access_semantic_directory.py diff --git a/src/govoplan_access/backend/migrations/dev_versions/__init__.py b/src/govoplan_access/backend/migrations/dev_versions/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/govoplan_access/backend/migrations/dev_versions/__init__.py @@ -0,0 +1 @@ + diff --git a/src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_v017_access_baseline.py b/src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_v017_access_baseline.py new file mode 100644 index 0000000..9f6a4cc --- /dev/null +++ b/src/govoplan_access/backend/migrations/versions/4a5b6c7d8e9f_v017_access_baseline.py @@ -0,0 +1,192 @@ +"""v0.1.7 access baseline + +Revision ID: 4a5b6c7d8e9f +Revises: None +Create Date: 2026-07-11 00:00:00.000000 +""" +from __future__ import annotations + +from alembic import op +import sqlalchemy as sa + + +revision = '4a5b6c7d8e9f' +down_revision = None +branch_labels = None +depends_on = '4f2a9c8e7b6d' + + +def upgrade() -> None: + op.create_table('access_identities', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('display_name', sa.String(length=255), nullable=True), + sa.Column('external_subject', sa.String(length=255), nullable=True), + sa.Column('source', sa.String(length=50), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_identities')) + ) + op.create_index(op.f('ix_access_identities_external_subject'), 'access_identities', ['external_subject'], unique=False) + op.create_table('access_organization_units', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('parent_id', sa.String(length=36), nullable=True), + sa.Column('slug', sa.String(length=100), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['parent_id'], ['access_organization_units.id'], name=op.f('fk_access_organization_units_parent_id_access_organization_units'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_organization_units_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_organization_units')), + sa.UniqueConstraint('tenant_id', 'slug', name='uq_organization_units_tenant_slug') + ) + op.create_index(op.f('ix_access_organization_units_parent_id'), 'access_organization_units', ['parent_id'], unique=False) + op.create_index(op.f('ix_access_organization_units_tenant_id'), 'access_organization_units', ['tenant_id'], unique=False) + op.create_table('access_external_function_role_assignments', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('source_module', sa.String(length=50), nullable=False), + sa.Column('function_id', sa.String(length=36), nullable=False), + sa.Column('role_id', sa.String(length=36), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['role_id'], ['access_roles.id'], name=op.f('fk_access_external_function_role_assignments_role_id_access_roles'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_external_function_role_assignments_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_external_function_role_assignments')), + sa.UniqueConstraint('tenant_id', 'source_module', 'function_id', 'role_id', name='uq_external_function_role_assignments') + ) + op.create_index(op.f('ix_access_external_function_role_assignments_function_id'), 'access_external_function_role_assignments', ['function_id'], unique=False) + op.create_index(op.f('ix_access_external_function_role_assignments_role_id'), 'access_external_function_role_assignments', ['role_id'], unique=False) + op.create_index(op.f('ix_access_external_function_role_assignments_source_module'), 'access_external_function_role_assignments', ['source_module'], unique=False) + op.create_index(op.f('ix_access_external_function_role_assignments_tenant_id'), 'access_external_function_role_assignments', ['tenant_id'], unique=False) + op.create_table('access_functions', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('organization_unit_id', sa.String(length=36), nullable=False), + sa.Column('slug', sa.String(length=100), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('delegable', sa.Boolean(), nullable=False), + sa.Column('act_in_place_allowed', sa.Boolean(), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['organization_unit_id'], ['access_organization_units.id'], name=op.f('fk_access_functions_organization_unit_id_access_organization_units'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_functions_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_functions')), + sa.UniqueConstraint('tenant_id', 'organization_unit_id', 'slug', name='uq_functions_tenant_ou_slug') + ) + op.create_index(op.f('ix_access_functions_organization_unit_id'), 'access_functions', ['organization_unit_id'], unique=False) + op.create_index(op.f('ix_access_functions_tenant_id'), 'access_functions', ['tenant_id'], unique=False) + op.create_table('access_identity_account_links', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('identity_id', sa.String(length=36), nullable=False), + sa.Column('account_id', sa.String(length=36), nullable=False), + sa.Column('is_primary', sa.Boolean(), nullable=False), + sa.Column('source', sa.String(length=50), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['account_id'], ['access_accounts.id'], name=op.f('fk_access_identity_account_links_account_id_access_accounts'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['identity_id'], ['access_identities.id'], name=op.f('fk_access_identity_account_links_identity_id_access_identities'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_identity_account_links')), + sa.UniqueConstraint('identity_id', 'account_id', name='uq_identity_account_links_identity_account') + ) + op.create_index(op.f('ix_access_identity_account_links_account_id'), 'access_identity_account_links', ['account_id'], unique=False) + op.create_index(op.f('ix_access_identity_account_links_identity_id'), 'access_identity_account_links', ['identity_id'], unique=False) + op.create_index('uq_identity_account_links_primary_account', 'access_identity_account_links', ['account_id'], unique=True, sqlite_where=sa.text('is_primary = 1'), postgresql_where=sa.text('is_primary IS TRUE')) + op.create_index('uq_identity_account_links_primary_identity', 'access_identity_account_links', ['identity_id'], unique=True, sqlite_where=sa.text('is_primary = 1'), postgresql_where=sa.text('is_primary IS TRUE')) + op.create_table('access_function_assignments', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('account_id', sa.String(length=36), nullable=False), + sa.Column('identity_id', sa.String(length=36), nullable=True), + sa.Column('function_id', sa.String(length=36), nullable=False), + sa.Column('organization_unit_id', sa.String(length=36), nullable=False), + sa.Column('applies_to_subunits', sa.Boolean(), nullable=False), + sa.Column('source', sa.String(length=50), nullable=False), + sa.Column('delegated_from_assignment_id', sa.String(length=36), nullable=True), + sa.Column('acting_for_account_id', sa.String(length=36), nullable=True), + sa.Column('valid_from', sa.DateTime(timezone=True), nullable=True), + sa.Column('valid_until', sa.DateTime(timezone=True), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['account_id'], ['access_accounts.id'], name=op.f('fk_access_function_assignments_account_id_access_accounts'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['acting_for_account_id'], ['access_accounts.id'], name=op.f('fk_access_function_assignments_acting_for_account_id_access_accounts'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['delegated_from_assignment_id'], ['access_function_assignments.id'], name=op.f('fk_access_function_assignments_delegated_from_assignment_id_access_function_assignments'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['function_id'], ['access_functions.id'], name=op.f('fk_access_function_assignments_function_id_access_functions'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['identity_id'], ['access_identities.id'], name=op.f('fk_access_function_assignments_identity_id_access_identities'), ondelete='SET NULL'), + sa.ForeignKeyConstraint(['organization_unit_id'], ['access_organization_units.id'], name=op.f('fk_access_function_assignments_organization_unit_id_access_organization_units'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_function_assignments_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_function_assignments')), + sa.UniqueConstraint('tenant_id', 'account_id', 'function_id', 'organization_unit_id', name='uq_function_assignments_account_scope') + ) + op.create_index(op.f('ix_access_function_assignments_account_id'), 'access_function_assignments', ['account_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_acting_for_account_id'), 'access_function_assignments', ['acting_for_account_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_delegated_from_assignment_id'), 'access_function_assignments', ['delegated_from_assignment_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_function_id'), 'access_function_assignments', ['function_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_identity_id'), 'access_function_assignments', ['identity_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_organization_unit_id'), 'access_function_assignments', ['organization_unit_id'], unique=False) + op.create_index(op.f('ix_access_function_assignments_tenant_id'), 'access_function_assignments', ['tenant_id'], unique=False) + op.create_table('access_function_role_assignments', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('function_id', sa.String(length=36), nullable=False), + sa.Column('role_id', sa.String(length=36), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['function_id'], ['access_functions.id'], name=op.f('fk_access_function_role_assignments_function_id_access_functions'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['role_id'], ['access_roles.id'], name=op.f('fk_access_function_role_assignments_role_id_access_roles'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_function_role_assignments_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_function_role_assignments')), + sa.UniqueConstraint('tenant_id', 'function_id', 'role_id', name='uq_function_role_assignments') + ) + op.create_index(op.f('ix_access_function_role_assignments_function_id'), 'access_function_role_assignments', ['function_id'], unique=False) + op.create_index(op.f('ix_access_function_role_assignments_role_id'), 'access_function_role_assignments', ['role_id'], unique=False) + op.create_index(op.f('ix_access_function_role_assignments_tenant_id'), 'access_function_role_assignments', ['tenant_id'], unique=False) + op.create_table('access_function_delegations', + sa.Column('id', sa.String(length=36), nullable=False), + sa.Column('tenant_id', sa.String(length=36), nullable=False), + sa.Column('function_assignment_id', sa.String(length=36), nullable=False), + sa.Column('delegator_account_id', sa.String(length=36), nullable=False), + sa.Column('delegate_account_id', sa.String(length=36), nullable=False), + sa.Column('mode', sa.String(length=30), nullable=False), + sa.Column('reason', sa.Text(), nullable=True), + sa.Column('valid_from', sa.DateTime(timezone=True), nullable=True), + sa.Column('valid_until', sa.DateTime(timezone=True), nullable=True), + sa.Column('revoked_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), + sa.ForeignKeyConstraint(['delegate_account_id'], ['access_accounts.id'], name=op.f('fk_access_function_delegations_delegate_account_id_access_accounts'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['delegator_account_id'], ['access_accounts.id'], name=op.f('fk_access_function_delegations_delegator_account_id_access_accounts'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['function_assignment_id'], ['access_function_assignments.id'], name=op.f('fk_access_function_delegations_function_assignment_id_access_function_assignments'), ondelete='CASCADE'), + sa.ForeignKeyConstraint(['tenant_id'], ['core_scopes.id'], name=op.f('fk_access_function_delegations_tenant_id_scopes'), ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id', name=op.f('pk_access_function_delegations')), + sa.UniqueConstraint('tenant_id', 'function_assignment_id', 'delegate_account_id', 'mode', name='uq_function_delegations_assignment_delegate_mode') + ) + op.create_index(op.f('ix_access_function_delegations_delegate_account_id'), 'access_function_delegations', ['delegate_account_id'], unique=False) + op.create_index(op.f('ix_access_function_delegations_delegator_account_id'), 'access_function_delegations', ['delegator_account_id'], unique=False) + op.create_index(op.f('ix_access_function_delegations_function_assignment_id'), 'access_function_delegations', ['function_assignment_id'], unique=False) + op.create_index(op.f('ix_access_function_delegations_revoked_at'), 'access_function_delegations', ['revoked_at'], unique=False) + op.create_index(op.f('ix_access_function_delegations_tenant_id'), 'access_function_delegations', ['tenant_id'], unique=False) + + +def downgrade() -> None: + op.drop_table('access_function_delegations') + op.drop_table('access_function_role_assignments') + op.drop_table('access_function_assignments') + op.drop_table('access_identity_account_links') + op.drop_table('access_functions') + op.drop_table('access_external_function_role_assignments') + op.drop_table('access_organization_units') + op.drop_table('access_identities') diff --git a/webui/package.json b/webui/package.json index 4ba70cf..7ad5546 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,6 +1,6 @@ { "name": "@govoplan/access-webui", - "version": "0.1.7", + "version": "0.1.8", "private": true, "type": "module", "main": "src/index.ts", @@ -13,7 +13,7 @@ } }, "peerDependencies": { - "@govoplan/core-webui": "^0.1.7", + "@govoplan/core-webui": "^0.1.8", "lucide-react": "^1.23.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/webui/src/i18n/generatedTranslations.ts b/webui/src/i18n/generatedTranslations.ts index 3ccd700..cf89b8b 100644 --- a/webui/src/i18n/generatedTranslations.ts +++ b/webui/src/i18n/generatedTranslations.ts @@ -17,7 +17,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.add_api_key.725d9988": "Add API key", "i18n:govoplan-access.add_global_account.18e4df22": "Add global account", "i18n:govoplan-access.add_group.2fca464f": "Add group", - "i18n:govoplan-access.add_function_role_mapping.1bc376ac": "Add function role mapping", + "i18n:govoplan-access.add_function_role_mapping.1bc376ac": "Add function mapping", "i18n:govoplan-access.add_role.d8d5d55c": "Add role", "i18n:govoplan-access.add_system_role.f9ef262b": "Add system role", "i18n:govoplan-access.add_tenant_user.36f37ce7": "Add tenant user", @@ -55,7 +55,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.create_api_key.d7b30388": "Create API key", "i18n:govoplan-access.create_global_account.e821f016": "Create global account", "i18n:govoplan-access.create_group.5a0b1c17": "Create group", - "i18n:govoplan-access.create_function_role_mapping.3718168d": "Create function role mapping", + "i18n:govoplan-access.create_function_role_mapping.3718168d": "Create function mapping", "i18n:govoplan-access.create_key.e028cb09": "Create key", "i18n:govoplan-access.create_role.db859bad": "Create role", "i18n:govoplan-access.create_system_role.a1e40b25": "Create system role", @@ -80,7 +80,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.deactivate_value.a276a667": "Deactivate {value0}", "i18n:govoplan-access.default_locale.b99d021f": "Default locale", "i18n:govoplan-access.delete_role.fbf0667e": "Delete role", - "i18n:govoplan-access.delete_function_role_mapping.0c0eec6e": "Delete function role mapping", + "i18n:govoplan-access.delete_function_role_mapping.0c0eec6e": "Delete function mapping", "i18n:govoplan-access.delete_function_role_mapping_value.419da2aa": "Delete the mapping for {value0}? Accepted assignments will no longer grant the mapped role.", "i18n:govoplan-access.delete_mapping.0d27d92a": "Delete mapping", "i18n:govoplan-access.delete_system_role.e2d84a56": "Delete system role", @@ -95,7 +95,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.dry_run.485a3d15": "Dry run", "i18n:govoplan-access.edit_global_account.d13b8485": "Edit global account", "i18n:govoplan-access.edit_group.edb57d8e": "Edit group", - "i18n:govoplan-access.edit_function_role_mapping.91ee75af": "Edit function role mapping", + "i18n:govoplan-access.edit_function_role_mapping.91ee75af": "Edit function mapping", "i18n:govoplan-access.edit_role.61dd63e9": "Edit role", "i18n:govoplan-access.edit_system_role.6ebb7cb0": "Edit system role", "i18n:govoplan-access.edit_tenant_user.99121a61": "Edit tenant user", @@ -114,11 +114,11 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.function_fact.4f7435e4": "Function fact", "i18n:govoplan-access.function_facts.848b32cc": "Function facts", "i18n:govoplan-access.function_id.e5e08937": "Function ID", - "i18n:govoplan-access.function_role_mapping_created.7a25eb5a": "Function role mapping created.", - "i18n:govoplan-access.function_role_mapping_deleted.fb180786": "Function role mapping deleted.", + "i18n:govoplan-access.function_role_mapping_created.7a25eb5a": "Function mapping created.", + "i18n:govoplan-access.function_role_mapping_deleted.fb180786": "Function mapping deleted.", "i18n:govoplan-access.function_role_mapping_help.0cf9996a": "The source module and function ID identify an accepted external function fact. Access grants the selected tenant role only while IDM reports an active accepted assignment for that fact.", - "i18n:govoplan-access.function_role_mapping_updated.76020443": "Function role mapping updated.", - "i18n:govoplan-access.function_role_mappings.2b64e9c3": "Function role mappings", + "i18n:govoplan-access.function_role_mapping_updated.76020443": "Function mapping updated.", + "i18n:govoplan-access.function_role_mappings.2b64e9c3": "Function mappings", "i18n:govoplan-access.general.9239ee2c": "General", "i18n:govoplan-access.global_account_details.0a0cf240": "Global account details", "i18n:govoplan-access.global_account_value_created.5100e467": "Global account {value0} created.", @@ -186,7 +186,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.no_api_keys_found.1f377128": "No API keys found.", "i18n:govoplan-access.no_assignable_roles_exist.a4c268c2": "No assignable roles exist.", "i18n:govoplan-access.no_expiry.39d436aa": "No expiry", - "i18n:govoplan-access.no_function_role_mappings_found.f735ff54": "No function role mappings found.", + "i18n:govoplan-access.no_function_role_mappings_found.f735ff54": "No function mappings found.", "i18n:govoplan-access.no_function_facts_found.b2ecee17": "No function facts found.", "i18n:govoplan-access.no_global_accounts_found.29d96a9e": "No global accounts found.", "i18n:govoplan-access.no_groups_exist_yet.9cd029f6": "No groups exist yet.", @@ -301,7 +301,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.tenant_profiles.4d7281ce": "Tenant profiles", "i18n:govoplan-access.tenant_retention_policy.f10893d7": "Tenant retention policy", "i18n:govoplan-access.tenant_retention.95b35db0": "Tenant retention", - "i18n:govoplan-access.tenant_role_templates": "Tenant role templates", + "i18n:govoplan-access.tenant_role_templates": "Role templates", "i18n:govoplan-access.tenant_roles.51aca82d": "Tenant roles", "i18n:govoplan-access.tenant_scoped_automation_credentials_are_capped_.9059dcae": "Tenant-scoped automation credentials are capped by their owner's current effective permissions. API keys are immutable after creation and are revoked rather than edited.", "i18n:govoplan-access.tenant_user_details.fbab9079": "Tenant user details", @@ -365,7 +365,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.add_api_key.725d9988": "Add API key", "i18n:govoplan-access.add_global_account.18e4df22": "Add global account", "i18n:govoplan-access.add_group.2fca464f": "Gruppe hinzufügen", - "i18n:govoplan-access.add_function_role_mapping.1bc376ac": "Funktions-Rollenzuordnung hinzufügen", + "i18n:govoplan-access.add_function_role_mapping.1bc376ac": "Funktionszuordnung hinzufügen", "i18n:govoplan-access.add_role.d8d5d55c": "Rolle hinzufügen", "i18n:govoplan-access.add_system_role.f9ef262b": "Add system role", "i18n:govoplan-access.add_tenant_user.36f37ce7": "Mandantenbenutzer hinzufügen", @@ -403,7 +403,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.create_api_key.d7b30388": "API-Schlüssel erstellen", "i18n:govoplan-access.create_global_account.e821f016": "Create global account", "i18n:govoplan-access.create_group.5a0b1c17": "Gruppe erstellen", - "i18n:govoplan-access.create_function_role_mapping.3718168d": "Funktions-Rollenzuordnung erstellen", + "i18n:govoplan-access.create_function_role_mapping.3718168d": "Funktionszuordnung erstellen", "i18n:govoplan-access.create_key.e028cb09": "Create key", "i18n:govoplan-access.create_role.db859bad": "Rolle erstellen", "i18n:govoplan-access.create_system_role.a1e40b25": "Create system role", @@ -428,7 +428,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.deactivate_value.a276a667": "Deactivate {value0}", "i18n:govoplan-access.default_locale.b99d021f": "Standardsprache", "i18n:govoplan-access.delete_role.fbf0667e": "Delete role", - "i18n:govoplan-access.delete_function_role_mapping.0c0eec6e": "Funktions-Rollenzuordnung löschen", + "i18n:govoplan-access.delete_function_role_mapping.0c0eec6e": "Funktionszuordnung löschen", "i18n:govoplan-access.delete_function_role_mapping_value.419da2aa": "Zuordnung für {value0} löschen? Akzeptierte Zuweisungen gewähren die zugeordnete Rolle dann nicht mehr.", "i18n:govoplan-access.delete_mapping.0d27d92a": "Zuordnung löschen", "i18n:govoplan-access.delete_system_role.e2d84a56": "Delete system role", @@ -443,7 +443,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.dry_run.485a3d15": "Trockenlauf", "i18n:govoplan-access.edit_global_account.d13b8485": "Edit global account", "i18n:govoplan-access.edit_group.edb57d8e": "Gruppe bearbeiten", - "i18n:govoplan-access.edit_function_role_mapping.91ee75af": "Funktions-Rollenzuordnung bearbeiten", + "i18n:govoplan-access.edit_function_role_mapping.91ee75af": "Funktionszuordnung bearbeiten", "i18n:govoplan-access.edit_role.61dd63e9": "Rolle bearbeiten", "i18n:govoplan-access.edit_system_role.6ebb7cb0": "Edit system role", "i18n:govoplan-access.edit_tenant_user.99121a61": "Mandantenbenutzer bearbeiten", @@ -462,11 +462,11 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.function_fact.4f7435e4": "Funktionsfakt", "i18n:govoplan-access.function_facts.848b32cc": "Funktionsfakten", "i18n:govoplan-access.function_id.e5e08937": "Funktions-ID", - "i18n:govoplan-access.function_role_mapping_created.7a25eb5a": "Funktions-Rollenzuordnung erstellt.", - "i18n:govoplan-access.function_role_mapping_deleted.fb180786": "Funktions-Rollenzuordnung gelöscht.", + "i18n:govoplan-access.function_role_mapping_created.7a25eb5a": "Funktionszuordnung erstellt.", + "i18n:govoplan-access.function_role_mapping_deleted.fb180786": "Funktionszuordnung gelöscht.", "i18n:govoplan-access.function_role_mapping_help.0cf9996a": "Quellmodul und Funktions-ID identifizieren einen akzeptierten externen Funktionsfakt. Access gewährt die ausgewählte Mandantenrolle nur, solange IDM eine aktive akzeptierte Zuweisung für diesen Fakt meldet.", - "i18n:govoplan-access.function_role_mapping_updated.76020443": "Funktions-Rollenzuordnung aktualisiert.", - "i18n:govoplan-access.function_role_mappings.2b64e9c3": "Funktions-Rollenzuordnungen", + "i18n:govoplan-access.function_role_mapping_updated.76020443": "Funktionszuordnung aktualisiert.", + "i18n:govoplan-access.function_role_mappings.2b64e9c3": "Funktionszuordnungen", "i18n:govoplan-access.general.9239ee2c": "Allgemein", "i18n:govoplan-access.global_account_details.0a0cf240": "Global account details", "i18n:govoplan-access.global_account_value_created.5100e467": "Global account {value0} created.", @@ -534,7 +534,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.no_api_keys_found.1f377128": "No API keys found.", "i18n:govoplan-access.no_assignable_roles_exist.a4c268c2": "Es gibt keine zuweisbaren Rollen.", "i18n:govoplan-access.no_expiry.39d436aa": "No expiry", - "i18n:govoplan-access.no_function_role_mappings_found.f735ff54": "Keine Funktions-Rollenzuordnungen gefunden.", + "i18n:govoplan-access.no_function_role_mappings_found.f735ff54": "Keine Funktionszuordnungen gefunden.", "i18n:govoplan-access.no_function_facts_found.b2ecee17": "Keine Funktionsfakten gefunden.", "i18n:govoplan-access.no_global_accounts_found.29d96a9e": "No global accounts found.", "i18n:govoplan-access.no_groups_exist_yet.9cd029f6": "Es gibt noch keine Gruppen.", @@ -649,7 +649,7 @@ export const generatedTranslations: PlatformTranslations = { "i18n:govoplan-access.tenant_profiles.4d7281ce": "Tenant profiles", "i18n:govoplan-access.tenant_retention_policy.f10893d7": "Tenant retention policy", "i18n:govoplan-access.tenant_retention.95b35db0": "Tenant retention", - "i18n:govoplan-access.tenant_role_templates": "Mandantenrollenvorlagen", + "i18n:govoplan-access.tenant_role_templates": "Rollenvorlagen", "i18n:govoplan-access.tenant_roles.51aca82d": "Mandantenrollen", "i18n:govoplan-access.tenant_scoped_automation_credentials_are_capped_.9059dcae": "Tenant-scoped automation credentials are capped by their owner's current effective permissions. API keys are immutable after creation and are revoked rather than edited.", "i18n:govoplan-access.tenant_user_details.fbab9079": "Mandantenbenutzerdetails",