Refactoring: simplify clone procedure

This commit is contained in:
IRBorisov 2024-04-04 21:16:10 +03:00
parent 64ebce3082
commit 2f830a920b
3 changed files with 33 additions and 52 deletions

View File

@ -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

View File

@ -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)

View File

@ -58,11 +58,6 @@ interface IRSEditContext {
setSelected: React.Dispatch<React.SetStateAction<ConstituentaID[]>>;
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([]),