- infrasynth.configs: typed multi-tenant config store (registry, service, secrets, cache) + public config_changed/config_reset signals and API - emit the declared-but-dead signals (features flags/overrides, scheduler task_completed/task_failed, tenancy tenant_updated, audit model_changed) and per-model audit field exclusions - security: permission catalog (security_permission), Django-style model-derived AutoPermission, PermissionRegistry, RoleAssignment, global-or-tenant Grant/Revoke, catalog API - consolidate the permission surface: PermissionRegistry only (drop the settings dict), IsAuthenticatedAndPermitted aliases HybridPermission, require_permission replaced by required_permissions + require_all - packaging: add [build-system]; add Forgejo publish workflow (.forgejo)
28 lines
1.1 KiB
Python
28 lines
1.1 KiB
Python
"""Serializers for the ``configs`` API.
|
|
|
|
Reads expose ``key``, the (possibly masked) ``value``, and the definition
|
|
metadata the UI needs to render a form. Writes carry only ``value``; coercion and
|
|
validation happen in :class:`~infrasynth.configs.services.ConfigService` so there
|
|
is a single source of truth.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from rest_framework import serializers
|
|
|
|
__all__ = ["ConfigValueSerializer", "ConfigWriteSerializer"]
|
|
|
|
|
|
class ConfigValueSerializer(serializers.Serializer):
|
|
key = serializers.CharField()
|
|
value = serializers.JSONField(allow_null=True) # type: ignore[assignment]
|
|
type = serializers.CharField(allow_null=True)
|
|
group = serializers.CharField(allow_blank=True)
|
|
label = serializers.CharField(allow_blank=True) # type: ignore[assignment]
|
|
is_secret = serializers.BooleanField()
|
|
is_overridden = serializers.BooleanField()
|
|
updated_at = serializers.DateTimeField(allow_null=True)
|
|
|
|
|
|
class ConfigWriteSerializer(serializers.Serializer):
|
|
value = serializers.JSONField(required=True, allow_null=True) # type: ignore[assignment]
|