ConceptPortal-public/rsconcept/backend/apps/rsform/views/operations.py

51 lines
1.8 KiB
Python
Raw Normal View History

''' Endpoints for RSForm. '''
2024-03-22 20:14:32 +03:00
from typing import cast
2024-05-24 18:31:14 +03:00
2024-03-22 20:14:32 +03:00
from django.db import transaction
from drf_spectacular.utils import extend_schema
from rest_framework import status as c
2024-05-24 18:31:14 +03:00
from rest_framework.decorators import api_view
from rest_framework.request import Request
from rest_framework.response import Response
from .. import models as m
from .. import serializers as s
2024-05-24 18:31:14 +03:00
@extend_schema(
summary='Inline synthesis: merge one schema into another',
tags=['Operations'],
request=s.InlineSynthesisSerializer,
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
)
@api_view(['PATCH'])
def inline_synthesis(request: Request):
''' Endpoint: Inline synthesis. '''
2024-03-22 20:14:32 +03:00
serializer = s.InlineSynthesisSerializer(
data=request.data,
context={'user': request.user}
)
serializer.is_valid(raise_exception=True)
2024-07-22 21:20:51 +03:00
schema = cast(m.RSForm, serializer.validated_data['receiver'])
2024-03-22 20:14:32 +03:00
items = cast(list[m.Constituenta], serializer.validated_data['items'])
2024-07-19 19:29:27 +03:00
with transaction.atomic():
new_items = schema.insert_copy(items)
for substitution in serializer.validated_data['substitutions']:
original = cast(m.Constituenta, substitution['original'])
replacement = cast(m.Constituenta, substitution['substitution'])
if original in items:
index = next(i for (i, cst) in enumerate(items) if cst == original)
original = new_items[index]
else:
index = next(i for (i, cst) in enumerate(items) if cst == replacement)
replacement = new_items[index]
schema.substitute(original, replacement, substitution['transfer_term'])
schema.restore_order()
2024-05-16 14:01:06 +03:00
return Response(
status=c.HTTP_200_OK,
2024-07-22 21:20:51 +03:00
data=s.RSFormParseSerializer(schema).data
)