From a6822e2f2b573eb771e06797b0d685b8574717be Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:05:12 +0300 Subject: [PATCH] Backend refactoring: use PrimaryKeyRelatedField --- rsconcept/backend/apps/rsform/messages.py | 3 - .../apps/rsform/serializers/__init__.py | 5 +- .../backend/apps/rsform/serializers/basics.py | 6 +- .../apps/rsform/serializers/data_access.py | 165 +++++++++--------- .../apps/rsform/tests/s_views/t_rsforms.py | 20 +-- rsconcept/backend/apps/rsform/urls.py | 2 + .../backend/apps/rsform/views/__init__.py | 1 + .../backend/apps/rsform/views/operations.py | 33 ++++ .../backend/apps/rsform/views/rsforms.py | 25 ++- .../frontend/src/context/RSFormContext.tsx | 6 +- rsconcept/frontend/src/models/rsform.ts | 8 +- .../src/pages/RSFormPage/RSEditContext.tsx | 8 +- rsconcept/frontend/src/utils/backendAPI.ts | 8 +- 13 files changed, 166 insertions(+), 124 deletions(-) create mode 100644 rsconcept/backend/apps/rsform/views/operations.py diff --git a/rsconcept/backend/apps/rsform/messages.py b/rsconcept/backend/apps/rsform/messages.py index 4141155a..5a3e1b1a 100644 --- a/rsconcept/backend/apps/rsform/messages.py +++ b/rsconcept/backend/apps/rsform/messages.py @@ -4,9 +4,6 @@ def constituentaNotOwned(title: str): return f'Конституента не принадлежит схеме: {title}' -def constituentaNotExists(): - return 'Конституента не существует' - def renameTrivial(name: str): return f'Имя должно отличаться от текущего: {name}' diff --git a/rsconcept/backend/apps/rsform/serializers/__init__.py b/rsconcept/backend/apps/rsform/serializers/__init__.py index c2214f1d..92ddfd28 100644 --- a/rsconcept/backend/apps/rsform/serializers/__init__.py +++ b/rsconcept/backend/apps/rsform/serializers/__init__.py @@ -16,12 +16,13 @@ from .data_access import ( VersionSerializer, VersionCreateSerializer, ConstituentaSerializer, - CstStructuredSerializer, + CstTargetSerializer, CstMoveSerializer, CstSubstituteSerializer, CstCreateSerializer, CstRenameSerializer, - CstListSerializer + CstListSerializer, + InlineSynthesisSerializer ) from .schema_typing import ( NewCstResponse, diff --git a/rsconcept/backend/apps/rsform/serializers/basics.py b/rsconcept/backend/apps/rsform/serializers/basics.py index 5891b3dc..ebf561bd 100644 --- a/rsconcept/backend/apps/rsform/serializers/basics.py +++ b/rsconcept/backend/apps/rsform/serializers/basics.py @@ -5,10 +5,6 @@ from rest_framework import serializers from cctext import Resolver, Reference, ReferenceType, EntityReference, SyntacticReference -ConstituentaID = serializers.IntegerField -NodeID = serializers.IntegerField - - class ExpressionSerializer(serializers.Serializer): ''' Serializer: RSLang expression. ''' expression = serializers.CharField() @@ -77,7 +73,7 @@ class NodeDataSerializer(serializers.Serializer): class ASTNodeSerializer(serializers.Serializer): ''' Serializer: Syntax tree node. ''' - uid = NodeID() + uid = serializers.IntegerField() parent = serializers.IntegerField() # type: ignore typeID = serializers.IntegerField() start = serializers.IntegerField() diff --git a/rsconcept/backend/apps/rsform/serializers/data_access.py b/rsconcept/backend/apps/rsform/serializers/data_access.py index 3c05fb6a..667a4e90 100644 --- a/rsconcept/backend/apps/rsform/serializers/data_access.py +++ b/rsconcept/backend/apps/rsform/serializers/data_access.py @@ -1,8 +1,9 @@ ''' Serializers for persistent data manipulation. ''' from typing import Optional, cast from rest_framework import serializers +from rest_framework.serializers import PrimaryKeyRelatedField as PKField -from .basics import ConstituentaID, CstParseSerializer +from .basics import CstParseSerializer from .io_pyconcept import PyConceptAdapter @@ -10,20 +11,6 @@ from ..models import Constituenta, LibraryItem, RSForm, Version, CstType from .. import messages as msg -def _try_access_constituenta(item_id: str, schema: LibraryItem) -> Constituenta: - try: - cst = Constituenta.objects.get(pk=item_id) - except Constituenta.DoesNotExist as exception: - raise serializers.ValidationError({ - f'{item_id}': msg.constituentaNotExists() - }) from exception - if cst.schema != schema: - raise serializers.ValidationError({ - f'{item_id}': msg.constituentaNotOwned(schema.title) - }) - return cst - - class LibraryItemSerializer(serializers.ModelSerializer): ''' Serializer: LibraryItem entry. ''' class Meta: @@ -106,6 +93,16 @@ class ConstituentaSerializer(serializers.ModelSerializer): return result +class CstDetailsSerializer(serializers.ModelSerializer): + ''' Serializer: Constituenta data including parse. ''' + parse = CstParseSerializer() + + class Meta: + ''' serializer metadata. ''' + model = Constituenta + fields = '__all__' + + class CstCreateSerializer(serializers.ModelSerializer): ''' Serializer: Constituenta creation. ''' insert_after = serializers.IntegerField(required=False, allow_null=True) @@ -119,49 +116,6 @@ class CstCreateSerializer(serializers.ModelSerializer): 'insert_after', 'term_forms' -class CstStructuredSerializer(serializers.ModelSerializer): - ''' Serializer: Constituenta structure production. ''' - class Meta: - ''' serializer metadata. ''' - model = Constituenta - fields = ('id',) - - def validate(self, attrs): - schema = cast(LibraryItem, self.context['schema']) - cst = _try_access_constituenta(self.initial_data['id'], schema) - if cst.cst_type not in [CstType.FUNCTION, CstType.STRUCTURED, CstType.TERM]: - raise serializers.ValidationError({ - f'{cst.id}': msg.constituentaNoStructure() - }) - self.instance = cst - return attrs - - -class CstRenameSerializer(serializers.ModelSerializer): - ''' Serializer: Constituenta renaming. ''' - class Meta: - ''' serializer metadata. ''' - model = Constituenta - fields = 'id', 'alias', 'cst_type' - - def validate(self, attrs): - schema = cast(LibraryItem, self.context['schema']) - cst = _try_access_constituenta(self.initial_data['id'], schema) - new_alias = self.initial_data['alias'] - if cst.alias == new_alias: - raise serializers.ValidationError({ - 'alias': msg.renameTrivial(new_alias) - }) - if RSForm(schema).constituents().filter(alias=new_alias).exists(): - raise serializers.ValidationError({ - 'alias': msg.renameTaken(new_alias) - }) - self.instance = cst - attrs['schema'] = schema - attrs['id'] = self.initial_data['id'] - return attrs - - class RSFormSerializer(serializers.ModelSerializer): ''' Serializer: Detailed data for RSForm. ''' subscribers = serializers.ListField( @@ -204,16 +158,6 @@ class RSFormSerializer(serializers.ModelSerializer): return result | data -class CstDetailsSerializer(serializers.ModelSerializer): - ''' Serializer: Constituenta data including parse. ''' - parse = CstParseSerializer() - - class Meta: - ''' serializer metadata. ''' - model = Constituenta - fields = '__all__' - - class RSFormParseSerializer(serializers.ModelSerializer): ''' Serializer: Detailed data for RSForm including parse. ''' subscribers = serializers.ListField( @@ -250,14 +194,14 @@ class RSFormParseSerializer(serializers.ModelSerializer): class CstSubstituteSerializer(serializers.Serializer): ''' Serializer: Constituenta substitution. ''' - original = ConstituentaID() - substitution = ConstituentaID() + original = PKField(many=False, queryset=Constituenta.objects.all()) + substitution = PKField(many=False, queryset=Constituenta.objects.all()) transfer_term = serializers.BooleanField(required=False, default=False) def validate(self, attrs): schema = cast(LibraryItem, self.context['schema']) - original_cst = Constituenta.objects.get(pk=self.initial_data['original']) - substitution_cst = Constituenta.objects.get(pk=self.initial_data['substitution']) + original_cst = cast(Constituenta, attrs['original']) + substitution_cst = cast(Constituenta, attrs['substitution']) if original_cst.alias == substitution_cst.alias: raise serializers.ValidationError({ 'alias': msg.substituteTrivial(original_cst.alias) @@ -276,22 +220,81 @@ class CstSubstituteSerializer(serializers.Serializer): return attrs -class CstListSerializer(serializers.Serializer): - ''' Serializer: List of constituents from one origin. ''' - items = serializers.ListField( - child=serializers.IntegerField() - ) +class CstTargetSerializer(serializers.Serializer): + ''' Serializer: Target single Constituenta. ''' + target = PKField(many=False, queryset=Constituenta.objects.all()) def validate(self, attrs): schema = cast(LibraryItem, self.context['schema']) - cstList = [] + cst = cast(Constituenta, attrs['target']) + if schema and cst.schema != schema: + raise serializers.ValidationError({ + f'{cst.id}': msg.constituentaNotOwned(schema.title) + }) + if cst.cst_type not in [CstType.FUNCTION, CstType.STRUCTURED, CstType.TERM]: + raise serializers.ValidationError({ + f'{cst.id}': msg.constituentaNoStructure() + }) + self.instance = cst + return attrs + + +class CstRenameSerializer(serializers.Serializer): + ''' Serializer: Constituenta renaming. ''' + target = PKField(many=False, queryset=Constituenta.objects.all()) + alias = serializers.CharField() + cst_type = serializers.CharField() + + def validate(self, attrs): + attrs = super().validate(attrs) + schema = cast(LibraryItem, self.context['schema']) + cst = cast(Constituenta, attrs['target']) + if cst.schema != schema: + raise serializers.ValidationError({ + f'{cst.id}': msg.constituentaNotOwned(schema.title) + }) + new_alias = self.initial_data['alias'] + if cst.alias == new_alias: + raise serializers.ValidationError({ + 'alias': msg.renameTrivial(new_alias) + }) + if RSForm(schema).constituents().filter(alias=new_alias).exists(): + raise serializers.ValidationError({ + 'alias': msg.renameTaken(new_alias) + }) + return attrs + + +class CstListSerializer(serializers.Serializer): + ''' Serializer: List of constituents from one origin. ''' + items = PKField(many=True, queryset=Constituenta.objects.all()) + + def validate(self, attrs): + schema = cast(LibraryItem, self.context['schema']) + if not schema: + return attrs + for item in attrs['items']: - cst = _try_access_constituenta(item, schema) - cstList.append(cst) - attrs['constituents'] = cstList + if item.schema != schema: + raise serializers.ValidationError({ + f'{item.id}': msg.constituentaNotOwned(schema.title) + }) return attrs class CstMoveSerializer(CstListSerializer): ''' Serializer: Change constituenta position. ''' move_to = serializers.IntegerField() + + +class InlineSynthesisSerializer(serializers.Serializer): + ''' Serializer: Inline synthesis operation input. ''' + receiver = PKField(many=False, queryset=LibraryItem.objects.all()) + source = PKField(many=False, queryset=LibraryItem.objects.all()) # type: ignore + items = PKField(many=True, queryset=Constituenta.objects.all()) + substitutions = serializers.ListField( + child=CstSubstituteSerializer() + ) + + def validate(self, attrs): + return attrs diff --git a/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py b/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py index fd5c8806..e844d48f 100644 --- a/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py +++ b/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py @@ -220,7 +220,7 @@ class TestRSFormViewset(APITestCase): definition_resolved='Test2' ) - data = {'id': cst2.pk, 'alias': 'D2', 'cst_type': 'term'} + data = {'target': cst2.pk, 'alias': 'D2', 'cst_type': 'term'} response = self.client.patch( f'/api/rsforms/{self.unowned.item.id}/cst-rename', data=data, format='json' @@ -233,21 +233,21 @@ class TestRSFormViewset(APITestCase): ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - data = {'id': cst1.pk, 'alias': cst1.alias, 'cst_type': 'term'} + data = {'target': cst1.pk, 'alias': cst1.alias, 'cst_type': 'term'} response = self.client.patch( f'/api/rsforms/{self.owned.item.id}/cst-rename', data=data, format='json' ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - data = {'id': cst1.pk, 'alias': cst3.alias} + data = {'target': cst1.pk, 'alias': cst3.alias} response = self.client.patch( f'/api/rsforms/{self.owned.item.id}/cst-rename', data=data, format='json' ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - data = {'alias': 'D2', 'cst_type': 'term', 'id': cst1.pk} + data = {'target': cst1.pk, 'alias': 'D2', 'cst_type': 'term'} item = self.owned.item d1 = Constituenta.objects.create(schema=item, alias='D1', cst_type='term', order=4) d1.term_raw = '@{X1|plur}' @@ -519,21 +519,21 @@ class TestRSFormViewset(APITestCase): a1.save() f1.save() - data = {'id': invalid_id} + data = {'target': invalid_id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - data = {'id': x1.id} + data = {'target': x1.id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - data = {'id': s2.id} + data = {'target': s2.id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' @@ -542,7 +542,7 @@ class TestRSFormViewset(APITestCase): # Testing simple structure s1.refresh_from_db() - data = {'id': s1.id} + data = {'target': s1.id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' @@ -558,7 +558,7 @@ class TestRSFormViewset(APITestCase): # Testing complex structure s3.refresh_from_db() - data = {'id': s3.id} + data = {'target': s3.id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' @@ -572,7 +572,7 @@ class TestRSFormViewset(APITestCase): # Testing function f1.refresh_from_db() - data = {'id': f1.id} + data = {'target': f1.id} response = self.client.patch( f'/api/rsforms/{item.id}/cst-produce-structure', data=data, format='json' diff --git a/rsconcept/backend/apps/rsform/urls.py b/rsconcept/backend/apps/rsform/urls.py index db70745b..71b8067f 100644 --- a/rsconcept/backend/apps/rsform/urls.py +++ b/rsconcept/backend/apps/rsform/urls.py @@ -19,6 +19,8 @@ urlpatterns = [ path('rsforms//versions/create', views.create_version), path('rsforms//versions/', views.retrieve_version), + path('operations/inline-synthesis', views.inline_synthesis), + path('rslang/parse-expression', views.parse_expression), path('rslang/to-ascii', views.convert_to_ascii), path('rslang/to-math', views.convert_to_math), diff --git a/rsconcept/backend/apps/rsform/views/__init__.py b/rsconcept/backend/apps/rsform/views/__init__.py index 8d543ed2..d58a8f06 100644 --- a/rsconcept/backend/apps/rsform/views/__init__.py +++ b/rsconcept/backend/apps/rsform/views/__init__.py @@ -15,6 +15,7 @@ from .rsforms import ( RSFormViewSet, TrsImportView, create_rsform ) +from .operations import inline_synthesis from .cctext import ( parse_text, generate_lexeme, diff --git a/rsconcept/backend/apps/rsform/views/operations.py b/rsconcept/backend/apps/rsform/views/operations.py new file mode 100644 index 00000000..2fa38bdc --- /dev/null +++ b/rsconcept/backend/apps/rsform/views/operations.py @@ -0,0 +1,33 @@ +''' Endpoints for RSForm. ''' +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.request import Request +from drf_spectacular.utils import extend_schema +from rest_framework import status as c + +from .. import models as m +from .. import serializers as s + +@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. ''' + serializer = s.InlineSynthesisSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + + schema = m.RSForm(serializer.validated_data['receiver']) + # schema.substitute( + # original=serializer.validated_data['original'], + # substitution=serializer.validated_data['substitution'], + # transfer_term=serializer.validated_data['transfer_term'] + # ) + schema.item.refresh_from_db() + return Response( + status=c.HTTP_200_OK, + data=s.RSFormParseSerializer(schema.item).data + ) diff --git a/rsconcept/backend/apps/rsform/views/rsforms.py b/rsconcept/backend/apps/rsform/views/rsforms.py index af6fd1d6..b3f60d4d 100644 --- a/rsconcept/backend/apps/rsform/views/rsforms.py +++ b/rsconcept/backend/apps/rsform/views/rsforms.py @@ -68,7 +68,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr @extend_schema( summary='produce the structure of a given constituenta', tags=['RSForm'], - request=s.CstStructuredSerializer, + request=s.CstTargetSerializer, responses={c.HTTP_200_OK: s.NewMultiCstResponse} ) @action(detail=True, methods=['patch'], url_path='cst-produce-structure') @@ -76,9 +76,9 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr ''' Produce a term for every element of the target constituenta typification. ''' schema = self._get_schema() - serializer = s.CstStructuredSerializer(data=request.data, context={'schema': schema.item}) + serializer = s.CstTargetSerializer(data=request.data, context={'schema': schema.item}) serializer.is_valid(raise_exception=True) - cst = cast(m.Constituenta, serializer.instance) + cst = cast(m.Constituenta, serializer.validated_data['target']) schema_details = s.RSFormParseSerializer(schema.item).data['items'] cst_parse = next(item for item in schema_details if item['id']==cst.id)['parse'] @@ -110,12 +110,19 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr schema = self._get_schema() serializer = s.CstRenameSerializer(data=request.data, context={'schema': schema.item}) serializer.is_valid(raise_exception=True) - old_alias = m.Constituenta.objects.get(pk=request.data['id']).alias - serializer.save() - mapping = { old_alias: serializer.validated_data['alias'] } + + cst = cast(m.Constituenta, serializer.validated_data['target']) + old_alias = cst.alias + + cst.alias = serializer.validated_data['alias'] + cst.cst_type = serializer.validated_data['cst_type'] + cst.save() + + mapping = { old_alias: cst.alias } schema.apply_mapping(mapping, change_aliases=False) schema.item.refresh_from_db() - cst = m.Constituenta.objects.get(pk=serializer.validated_data['id']) + cst.refresh_from_db() + return Response( status=c.HTTP_200_OK, data={ @@ -166,7 +173,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr context={'schema': schema.item} ) serializer.is_valid(raise_exception=True) - schema.delete_cst(serializer.validated_data['constituents']) + schema.delete_cst(serializer.validated_data['items']) schema.item.refresh_from_db() return Response( status=c.HTTP_200_OK, @@ -189,7 +196,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr ) serializer.is_valid(raise_exception=True) schema.move_cst( - listCst=serializer.validated_data['constituents'], + listCst=serializer.validated_data['items'], target=serializer.validated_data['move_to'] ) schema.item.refresh_from_db() diff --git a/rsconcept/frontend/src/context/RSFormContext.tsx b/rsconcept/frontend/src/context/RSFormContext.tsx index cafdcf0a..266d7459 100644 --- a/rsconcept/frontend/src/context/RSFormContext.tsx +++ b/rsconcept/frontend/src/context/RSFormContext.tsx @@ -11,10 +11,10 @@ import { IConstituentaList, IConstituentaMeta, ICstCreateData, - ICstID, ICstMovetoData, ICstRenameData, ICstSubstituteData, + ICstTarget, ICstUpdateData, IRSForm, IRSFormUploadData @@ -64,7 +64,7 @@ interface IRSFormContext { upload: (data: IRSFormUploadData, callback: () => void) => void; resetAliases: (callback: () => void) => void; - produceStructure: (data: ICstID, callback?: DataCallback) => void; + produceStructure: (data: ICstTarget, callback?: DataCallback) => void; cstCreate: (data: ICstCreateData, callback?: DataCallback) => void; cstRename: (data: ICstRenameData, callback?: DataCallback) => void; @@ -265,7 +265,7 @@ export const RSFormState = ({ schemaID, versionID, children }: RSFormStateProps) ); const produceStructure = useCallback( - (data: ICstID, callback?: DataCallback) => { + (data: ICstTarget, callback?: DataCallback) => { setError(undefined); patchProduceStructure(schemaID, { data: data, diff --git a/rsconcept/frontend/src/models/rsform.ts b/rsconcept/frontend/src/models/rsform.ts index 75ea4e9a..d01b18bb 100644 --- a/rsconcept/frontend/src/models/rsform.ts +++ b/rsconcept/frontend/src/models/rsform.ts @@ -83,9 +83,11 @@ export interface IConstituentaMeta { } /** - * Represents id for {@link IConstituenta}. + * Represents target {@link IConstituenta}. */ -export interface ICstID extends Pick {} +export interface ICstTarget { + target: ConstituentaID; +} /** * Represents Constituenta. @@ -143,7 +145,7 @@ export interface ICstUpdateData /** * Represents data, used in renaming {@link IConstituenta}. */ -export interface ICstRenameData extends Pick {} +export interface ICstRenameData extends ICstTarget, Pick {} /** * Represents data, used in merging {@link IConstituenta}. diff --git a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx index 5cd21025..48218658 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx @@ -33,10 +33,10 @@ import { IConstituenta, IConstituentaMeta, ICstCreateData, - ICstID, ICstMovetoData, ICstRenameData, ICstSubstituteData, + ICstTarget, ICstUpdateData, IRSForm, TermForm @@ -351,7 +351,7 @@ export const RSEditState = ({ return; } const data: ICstRenameData = { - id: activeCst.id, + target: activeCst.id, alias: activeCst.alias, cst_type: activeCst.cst_type }; @@ -390,8 +390,8 @@ export const RSEditState = ({ if (!activeCst) { return; } - const data: ICstID = { - id: activeCst.id + const data: ICstTarget = { + target: activeCst.id }; model.produceStructure(data, cstList => { toast.success(`Добавлены конституенты: ${cstList.length}`); diff --git a/rsconcept/frontend/src/utils/backendAPI.ts b/rsconcept/frontend/src/utils/backendAPI.ts index 65fa7852..e7bce728 100644 --- a/rsconcept/frontend/src/utils/backendAPI.ts +++ b/rsconcept/frontend/src/utils/backendAPI.ts @@ -27,10 +27,10 @@ import { IConstituentaMeta, ICstCreateData, ICstCreatedResponse, - ICstID, ICstMovetoData, ICstRenameData, ICstSubstituteData, + ICstTarget, ICstUpdateData, IProduceStructureResponse, IRSFormCreateData, @@ -319,15 +319,15 @@ export function patchConstituenta(target: string, request: FrontExchange) { AxiosPatch({ - title: `Renaming constituenta id=${request.data.id} for schema id=${schema}`, + title: `Renaming constituenta id=${request.data.target} for schema id=${schema}`, endpoint: `/api/rsforms/${schema}/cst-rename`, request: request }); } -export function patchProduceStructure(schema: string, request: FrontExchange) { +export function patchProduceStructure(schema: string, request: FrontExchange) { AxiosPatch({ - title: `Producing structure constituenta id=${request.data.id} for schema id=${schema}`, + title: `Producing structure constituenta id=${request.data.target} for schema id=${schema}`, endpoint: `/api/rsforms/${schema}/cst-produce-structure`, request: request });