mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Refactoring: simplify clone procedure
This commit is contained in:
parent
64ebce3082
commit
2f830a920b
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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([]),
|
||||
|
|
Loading…
Reference in New Issue
Block a user