B: Fix delete_reference

This commit is contained in:
Ivan 2025-08-05 19:12:19 +03:00
parent 54073dbbed
commit f710b6e12f
2 changed files with 69 additions and 7 deletions

View File

@ -1,6 +1,6 @@
''' Testing API: Propagate changes through references in OSS. ''' ''' Testing API: Propagate changes through references in OSS. '''
from apps.oss.models import OperationSchema, OperationType from apps.oss.models import Inheritance, OperationSchema, OperationType
from apps.rsform.models import Constituenta, CstType, RSForm from apps.rsform.models import Constituenta, CstType, RSForm
from shared.EndpointTester import EndpointTester, decl_endpoint from shared.EndpointTester import EndpointTester, decl_endpoint
@ -79,8 +79,8 @@ class ReferencePropagationTestCase(EndpointTester):
) )
self.owned.set_arguments(self.operation5.pk, [self.operation4, self.operation3]) self.owned.set_arguments(self.operation5.pk, [self.operation4, self.operation3])
self.owned.set_substitutions(self.operation5.pk, [{ self.owned.set_substitutions(self.operation5.pk, [{
'original': self.ks4X1, 'original': self.ks1X2,
'substitution': self.ks1X2 'substitution': self.ks4X1
}]) }])
self.owned.execute_operation(self.operation5) self.owned.execute_operation(self.operation5)
self.operation5.refresh_from_db() self.operation5.refresh_from_db()
@ -97,8 +97,8 @@ class ReferencePropagationTestCase(EndpointTester):
) )
self.owned.set_arguments(self.operation6.pk, [self.operation2, self.operation3]) self.owned.set_arguments(self.operation6.pk, [self.operation2, self.operation3])
self.owned.set_substitutions(self.operation6.pk, [{ self.owned.set_substitutions(self.operation6.pk, [{
'original': self.ks2X1, 'original': self.ks2X2,
'substitution': self.ks1X1 'substitution': self.ks1X2
}]) }])
self.owned.execute_operation(self.operation6) self.owned.execute_operation(self.operation6)
self.operation6.refresh_from_db() self.operation6.refresh_from_db()
@ -143,4 +143,64 @@ class ReferencePropagationTestCase(EndpointTester):
self.assertEqual(self.ks6.constituentsQ().count(), 4) self.assertEqual(self.ks6.constituentsQ().count(), 4)
self.assertEqual(self.ks5.constituentsQ().count(), 5) self.assertEqual(self.ks5.constituentsQ().count(), 5)
# TODO: add more tests
@decl_endpoint('/api/rsforms/{schema}/create-cst', method='post')
def test_create_constituenta(self):
data = {
'alias': 'X3',
'cst_type': CstType.BASE,
}
response = self.executeCreated(data=data, schema=self.ks1.model.pk)
new_cst = Constituenta.objects.get(pk=response.data['new_cst']['id'])
inherited = Constituenta.objects.filter(as_child__parent_id=new_cst.pk)
self.assertEqual(self.ks1.constituentsQ().count(), 4)
self.assertEqual(self.ks4.constituentsQ().count(), 7)
self.assertEqual(self.ks5.constituentsQ().count(), 11)
self.assertEqual(self.ks6.constituentsQ().count(), 7)
self.assertEqual(inherited.count(), 3)
@decl_endpoint('/api/rsforms/{schema}/delete-multiple-cst', method='patch')
def test_delete_constituenta(self):
data = {'items': [self.ks1X1.pk]}
response = self.executeOK(data=data, schema=self.ks1.model.pk)
self.ks4D2.refresh_from_db()
self.ks5D4.refresh_from_db()
self.ks6D2.refresh_from_db()
self.assertEqual(self.ks4D2.definition_formal, r'X1 X2 X3 S1 D1')
self.assertEqual(self.ks5D4.definition_formal, r'X1 X2 X3 DEL S1 D1 D2 D3')
self.assertEqual(self.ks6D2.definition_formal, r'X1 DEL X3 S1 D1')
self.assertEqual(self.ks4.constituentsQ().count(), 6)
self.assertEqual(self.ks5.constituentsQ().count(), 8)
self.assertEqual(self.ks6.constituentsQ().count(), 5)
@decl_endpoint('/api/oss/{item}/delete-reference', method='patch')
def test_delete_reference_redirection(self):
data = {
'layout': self.layout_data,
'target': self.operation3.pk,
'keep_connections': True,
'keep_constituents': False
}
self.executeOK(data=data, item=self.owned_id)
self.assertEqual(self.ks4.constituentsQ().count(), 6)
self.assertEqual(self.ks5.constituentsQ().count(), 9)
self.assertEqual(self.ks6.constituentsQ().count(), 6)
@decl_endpoint('/api/oss/{item}/delete-reference', method='patch')
def test_delete_reference_constituents(self):
data = {
'layout': self.layout_data,
'target': self.operation3.pk,
'keep_connections': False,
'keep_constituents': True
}
ks5X4 = Constituenta.objects.get(schema=self.ks5.model, alias='X4')
self.assertEqual(Inheritance.objects.filter(child=ks5X4).count(), 1)
self.executeOK(data=data, item=self.owned_id)
self.assertEqual(self.ks4.constituentsQ().count(), 6)
self.assertEqual(self.ks5.constituentsQ().count(), 9)
self.assertEqual(self.ks6.constituentsQ().count(), 7)
self.assertEqual(Inheritance.objects.filter(child=ks5X4).count(), 0)

View File

@ -677,13 +677,15 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev
) )
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
operation = cast(m.Operation, serializer.validated_data['target']) operation = cast(m.Operation, serializer.validated_data['target'])
keep_connections = serializer.validated_data['keep_connections']
keep_constituents = serializer.validated_data['keep_constituents']
layout = serializer.validated_data['layout'] layout = serializer.validated_data['layout']
layout = [x for x in layout if x['nodeID'] != 'o' + str(operation.pk)] layout = [x for x in layout if x['nodeID'] != 'o' + str(operation.pk)]
with transaction.atomic(): with transaction.atomic():
oss = m.OperationSchemaCached(item) oss = m.OperationSchemaCached(item)
m.Layout.update_data(pk, layout) m.Layout.update_data(pk, layout)
oss.delete_reference(operation.pk, serializer.validated_data['keep_connections']) oss.delete_reference(operation.pk, keep_connections, keep_constituents)
item.save(update_fields=['time_update']) item.save(update_fields=['time_update'])
return Response( return Response(