From 2f830a920bcf7dcfd6e874838f1586a64539b7f6 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:16:10 +0300 Subject: [PATCH] Refactoring: simplify clone procedure --- .../backend/apps/rsform/models/api_RSForm.py | 27 +++++-------- .../backend/apps/rsform/views/library.py | 39 +++++++++---------- .../src/pages/RSFormPage/RSEditContext.tsx | 19 +++------ 3 files changed, 33 insertions(+), 52 deletions(-) diff --git a/rsconcept/backend/apps/rsform/models/api_RSForm.py b/rsconcept/backend/apps/rsform/models/api_RSForm.py index a78c7513..51771e2c 100644 --- a/rsconcept/backend/apps/rsform/models/api_RSForm.py +++ b/rsconcept/backend/apps/rsform/models/api_RSForm.py @@ -1,4 +1,5 @@ ''' Models: RSForm API. ''' +from copy import deepcopy from typing import Iterable, Optional, Union, cast from django.db import transaction @@ -137,25 +138,15 @@ class RSForm: newAlias = f'{get_type_prefix(cst.cst_type)}{indices[cst.cst_type]}' mapping[cst.alias] = newAlias - result: list[Constituenta] = [] - for cst in items: - newCst = Constituenta.objects.create( - schema=self.item, - order=position, - alias=mapping[cst.alias], - cst_type=cst.cst_type, - convention=cst.convention, - term_raw=cst.term_raw, - term_resolved=cst.term_resolved, - term_forms=cst.term_forms, - definition_raw=cst.definition_raw, - definition_formal=cst.definition_formal, - definition_resolved=cst.definition_resolved - ) - newCst.apply_mapping(mapping) - newCst.save() + result = deepcopy(items) + for cst in result: + cst.pk = None + cst.schema = self.item + cst.order = position + cst.alias = mapping[cst.alias] + cst.apply_mapping(mapping) + cst.save() position = position + 1 - result.append(newCst) self.item.save() return result diff --git a/rsconcept/backend/apps/rsform/views/library.py b/rsconcept/backend/apps/rsform/views/library.py index 8288dee5..7c6e2f9b 100644 --- a/rsconcept/backend/apps/rsform/views/library.py +++ b/rsconcept/backend/apps/rsform/views/library.py @@ -1,4 +1,5 @@ ''' Endpoints for library. ''' +from copy import deepcopy from typing import cast from django.db import transaction from django_filters.rest_framework import DjangoFilterBackend @@ -96,29 +97,27 @@ class LibraryViewSet(viewsets.ModelViewSet): serializer = s.LibraryItemCloneSerializer(data=request.data) serializer.is_valid(raise_exception=True) item = self._get_item() - if item.item_type == m.LibraryItemType.RSFORM: - schema = m.RSForm(item) - clone_data = s.RSFormTRSSerializer(schema).data - clone_data['item_type'] = item.item_type - clone_data['owner'] = self.request.user - clone_data['title'] = serializer.validated_data['title'] - clone_data['alias'] = serializer.validated_data.get('alias', '') - clone_data['comment'] = serializer.validated_data.get('comment', '') - clone_data['is_common'] = serializer.validated_data.get('is_common', False) - clone_data['is_canonical'] = serializer.validated_data.get('is_canonical', False) - if 'items' in request.data: - filtered_items = [] - for cst in clone_data['items']: - if cst['entityUID'] in request.data['items']: - filtered_items.append(cst) - clone_data['items'] = filtered_items + clone = deepcopy(item) + clone.pk = None + clone.owner = self.request.user + clone.title = serializer.validated_data['title'] + clone.alias = serializer.validated_data.get('alias', '') + clone.comment = serializer.validated_data.get('comment', '') + clone.is_common = serializer.validated_data.get('is_common', False) + clone.is_canonical = False - clone = s.RSFormTRSSerializer(data=clone_data, context={'load_meta': True}) - clone.is_valid(raise_exception=True) - new_schema = clone.save() + if clone.item_type == m.LibraryItemType.RSFORM: + clone.save() + + need_filter = 'items' in request.data + for cst in m.RSForm(item).constituents(): + if not need_filter or cst.pk in request.data['items']: + cst.pk = None + cst.schema = clone + cst.save() return Response( status=c.HTTP_201_CREATED, - data=s.RSFormParseSerializer(new_schema.item).data + data=s.RSFormParseSerializer(clone).data ) return Response(status=c.HTTP_400_BAD_REQUEST) diff --git a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx index f940f364..9fa96cf5 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx @@ -58,11 +58,6 @@ interface IRSEditContext { setSelected: React.Dispatch>; select: (target: ConstituentaID) => void; - selectAllInputs: () => void; - selectAllOutputs: () => void; - selectMax: () => void; - selectInputs: () => void; - selectOutputs: () => void; deselect: (target: ConstituentaID) => void; toggleSelect: (target: ConstituentaID) => void; deselectAll: () => void; @@ -276,11 +271,12 @@ export const RSEditState = ({ return; } const oldCount = model.schema.items.length; - model.inlineSynthesis(data, newSchema => - toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`) - ); + model.inlineSynthesis(data, newSchema => { + setSelected([]); + toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`); + }); }, - [model] + [model, setSelected] ); const moveUp = useCallback(() => { @@ -489,11 +485,6 @@ export const RSEditState = ({ setSelected: setSelected, select: (target: ConstituentaID) => setSelected(prev => [...prev, target]), deselect: (target: ConstituentaID) => setSelected(prev => prev.filter(id => id !== target)), - selectAllInputs: () => setSelected(prev => [...prev, ...(model.schema?.graph.expandAllInputs(prev) ?? [])]), - selectAllOutputs: () => setSelected(prev => [...prev, ...(model.schema?.graph.expandAllOutputs(prev) ?? [])]), - selectOutputs: () => setSelected(prev => [...prev, ...(model.schema?.graph.expandOutputs(prev) ?? [])]), - selectInputs: () => setSelected(prev => [...prev, ...(model.schema?.graph.expandInputs(prev) ?? [])]), - selectMax: () => setSelected(prev => model.schema?.graph.maximizePart(prev) ?? []), toggleSelect: (target: ConstituentaID) => setSelected(prev => (prev.includes(target) ? prev.filter(id => id !== target) : [...prev, target])), deselectAll: () => setSelected([]),