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. ''' ''' Models: RSForm API. '''
from copy import deepcopy
from typing import Iterable, Optional, Union, cast from typing import Iterable, Optional, Union, cast
from django.db import transaction from django.db import transaction
@ -137,25 +138,15 @@ class RSForm:
newAlias = f'{get_type_prefix(cst.cst_type)}{indices[cst.cst_type]}' newAlias = f'{get_type_prefix(cst.cst_type)}{indices[cst.cst_type]}'
mapping[cst.alias] = newAlias mapping[cst.alias] = newAlias
result: list[Constituenta] = [] result = deepcopy(items)
for cst in items: for cst in result:
newCst = Constituenta.objects.create( cst.pk = None
schema=self.item, cst.schema = self.item
order=position, cst.order = position
alias=mapping[cst.alias], cst.alias = mapping[cst.alias]
cst_type=cst.cst_type, cst.apply_mapping(mapping)
convention=cst.convention, cst.save()
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()
position = position + 1 position = position + 1
result.append(newCst)
self.item.save() self.item.save()
return result return result

View File

@ -1,4 +1,5 @@
''' Endpoints for library. ''' ''' Endpoints for library. '''
from copy import deepcopy
from typing import cast from typing import cast
from django.db import transaction from django.db import transaction
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
@ -96,29 +97,27 @@ class LibraryViewSet(viewsets.ModelViewSet):
serializer = s.LibraryItemCloneSerializer(data=request.data) serializer = s.LibraryItemCloneSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
item = self._get_item() item = self._get_item()
if item.item_type == m.LibraryItemType.RSFORM: clone = deepcopy(item)
schema = m.RSForm(item) clone.pk = None
clone_data = s.RSFormTRSSerializer(schema).data clone.owner = self.request.user
clone_data['item_type'] = item.item_type clone.title = serializer.validated_data['title']
clone_data['owner'] = self.request.user clone.alias = serializer.validated_data.get('alias', '')
clone_data['title'] = serializer.validated_data['title'] clone.comment = serializer.validated_data.get('comment', '')
clone_data['alias'] = serializer.validated_data.get('alias', '') clone.is_common = serializer.validated_data.get('is_common', False)
clone_data['comment'] = serializer.validated_data.get('comment', '') clone.is_canonical = False
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 = s.RSFormTRSSerializer(data=clone_data, context={'load_meta': True}) if clone.item_type == m.LibraryItemType.RSFORM:
clone.is_valid(raise_exception=True) clone.save()
new_schema = 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( return Response(
status=c.HTTP_201_CREATED, 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) return Response(status=c.HTTP_400_BAD_REQUEST)

View File

@ -58,11 +58,6 @@ interface IRSEditContext {
setSelected: React.Dispatch<React.SetStateAction<ConstituentaID[]>>; setSelected: React.Dispatch<React.SetStateAction<ConstituentaID[]>>;
select: (target: ConstituentaID) => void; select: (target: ConstituentaID) => void;
selectAllInputs: () => void;
selectAllOutputs: () => void;
selectMax: () => void;
selectInputs: () => void;
selectOutputs: () => void;
deselect: (target: ConstituentaID) => void; deselect: (target: ConstituentaID) => void;
toggleSelect: (target: ConstituentaID) => void; toggleSelect: (target: ConstituentaID) => void;
deselectAll: () => void; deselectAll: () => void;
@ -276,11 +271,12 @@ export const RSEditState = ({
return; return;
} }
const oldCount = model.schema.items.length; const oldCount = model.schema.items.length;
model.inlineSynthesis(data, newSchema => model.inlineSynthesis(data, newSchema => {
toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`) setSelected([]);
); toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`);
});
}, },
[model] [model, setSelected]
); );
const moveUp = useCallback(() => { const moveUp = useCallback(() => {
@ -489,11 +485,6 @@ export const RSEditState = ({
setSelected: setSelected, setSelected: setSelected,
select: (target: ConstituentaID) => setSelected(prev => [...prev, target]), select: (target: ConstituentaID) => setSelected(prev => [...prev, target]),
deselect: (target: ConstituentaID) => setSelected(prev => prev.filter(id => id !== 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) => toggleSelect: (target: ConstituentaID) =>
setSelected(prev => (prev.includes(target) ? prev.filter(id => id !== target) : [...prev, target])), setSelected(prev => (prev.includes(target) ? prev.filter(id => id !== target) : [...prev, target])),
deselectAll: () => setSelected([]), deselectAll: () => setSelected([]),