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. '''
|
''' 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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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([]),
|
||||||
|
|
Loading…
Reference in New Issue
Block a user