feat(registry): add new endpoints for registers, exchange, and backups; update routing and configurations
Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 3m10s
CI/CD Pipeline / Run Tests (push) Successful in 3m35s
CI/CD Pipeline / Telegram Notify Success (push) Has been skipped
CI/CD Pipeline / Code Quality Checks (pull_request) Failing after 2m26s
CI/CD Pipeline / Run Tests (pull_request) Successful in 2m46s
CI/CD Pipeline / Telegram Notify Success (pull_request) Has been skipped

This commit is contained in:
2026-03-04 15:36:57 +01:00
parent 052389d921
commit a91ed1f1ae
90 changed files with 5488 additions and 622 deletions

View File

@@ -0,0 +1,88 @@
"""Сериализаторы приложения обмена данными."""
from apps.exchange.models import ExchangeConnection
from rest_framework import serializers
class ExchangeConnectionSerializer(serializers.ModelSerializer):
"""Сериализатор подключения без выдачи пароля в ответах."""
class Meta:
model = ExchangeConnection
fields = [
"id",
"server",
"port",
"username",
"database_name",
"schema_name",
"is_active",
"last_checked_at",
"last_error",
"created_at",
"updated_at",
]
read_only_fields = fields
class ExchangeConnectionCreateSerializer(serializers.Serializer):
"""Входные данные для создания активного подключения."""
server = serializers.CharField(max_length=255)
port = serializers.IntegerField(min_value=1, max_value=65535)
username = serializers.CharField(max_length=255)
password = serializers.CharField()
database_name = serializers.CharField(max_length=255)
schema_name = serializers.RegexField(
regex=r"^[A-Za-z_][A-Za-z0-9_]*$",
max_length=255,
error_messages={
"invalid": (
"Имя схемы должно начинаться с буквы/_, "
"содержать только буквы, цифры и _"
)
},
)
class ExchangeCopyRequestSerializer(serializers.Serializer):
"""Параметры запуска копирования данных."""
mode = serializers.ChoiceField(
choices=["all", "single", "selected"],
default="all",
)
table = serializers.CharField(required=False)
tables = serializers.ListField(
child=serializers.CharField(),
required=False,
allow_empty=False,
)
truncate_before_copy = serializers.BooleanField(default=True)
def validate(self, attrs):
mode = attrs["mode"]
table = attrs.get("table")
tables = attrs.get("tables")
if mode == "single" and not table:
raise serializers.ValidationError(
{"table": "Для mode=single нужно указать table"}
)
if mode == "selected" and not tables:
raise serializers.ValidationError(
{"tables": "Для mode=selected нужно указать tables"}
)
if mode != "single" and table:
raise serializers.ValidationError(
{"table": "Поле table допустимо только для mode=single"}
)
if mode != "selected" and tables:
raise serializers.ValidationError(
{"tables": "Поле tables допустимо только для mode=selected"}
)
return attrs