From bc956e0af2056e69b7248a021180e111657faa2a Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 15 Nov 2024 20:37:00 +0300 Subject: [PATCH] B: Fix incorrect operation deletion consequences --- .../apps/oss/models/OperationSchema.py | 24 ++++++++++++++++--- .../oss/tests/s_propagation/t_operations.py | 24 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/rsconcept/backend/apps/oss/models/OperationSchema.py b/rsconcept/backend/apps/oss/models/OperationSchema.py index d58b60aa..2285cfbc 100644 --- a/rsconcept/backend/apps/oss/models/OperationSchema.py +++ b/rsconcept/backend/apps/oss/models/OperationSchema.py @@ -97,11 +97,29 @@ class OperationSchema: def delete_operation(self, target: int, keep_constituents: bool = False): ''' Delete operation. ''' + self.cache.ensure_loaded() operation = self.cache.operation_by_id[target] - if not keep_constituents: - schema = self.cache.get_schema(operation) - if schema is not None: + schema = self.cache.get_schema(operation) + children = self.cache.graph.outputs[target] + if schema is not None and len(children) > 0: + if not keep_constituents: self.before_delete_cst(schema, schema.cache.constituents) + else: + items = schema.cache.constituents + ids = [cst.pk for cst in items] + inheritance_to_delete: list[Inheritance] = [] + for child_id in children: + child_operation = self.cache.operation_by_id[child_id] + child_schema = self.cache.get_schema(child_operation) + if child_schema is None: + continue + self._undo_substitutions_cst(items, child_operation, child_schema) + for item in self.cache.inheritance[child_id]: + if item.parent_id in ids: + inheritance_to_delete.append(item) + for item in inheritance_to_delete: + self.cache.remove_inheritance(item) + Inheritance.objects.filter(pk__in=[item.pk for item in inheritance_to_delete]).delete() self.cache.remove_operation(target) operation.delete() self.save(update_fields=['time_update']) diff --git a/rsconcept/backend/apps/oss/tests/s_propagation/t_operations.py b/rsconcept/backend/apps/oss/tests/s_propagation/t_operations.py index 4c3290f2..aa14bf10 100644 --- a/rsconcept/backend/apps/oss/tests/s_propagation/t_operations.py +++ b/rsconcept/backend/apps/oss/tests/s_propagation/t_operations.py @@ -250,6 +250,30 @@ class TestChangeOperations(EndpointTester): self.assertEqual(self.ks4D2.definition_formal, r'X1 X2 X3 S1 D1') self.assertEqual(self.ks5D4.definition_formal, r'X1 X2 X3 S1 D1 D2 D3') + @decl_endpoint('/api/oss/{item}/delete-operation', method='patch') + def test_delete_operation_keep_schema(self): + data = { + 'positions': [], + 'target': self.operation1.pk, + 'keep_constituents': True, + 'delete_schema': False + } + + self.executeOK(data=data, item=self.owned_id) + self.ks1.refresh_from_db() + self.ks4D2.refresh_from_db() + self.ks5D4.refresh_from_db() + subs1_2 = self.operation4.getQ_substitutions() + self.assertEqual(subs1_2.count(), 0) + subs3_4 = self.operation5.getQ_substitutions() + self.assertEqual(subs3_4.count(), 1) + self.assertEqual(self.ks1.constituents().count(), 3) + self.assertEqual(self.ks4.constituents().count(), 6) + self.assertEqual(self.ks5.constituents().count(), 8) + self.assertEqual(self.ks4D2.definition_formal, r'X1 X2 X3 S1 D1') + self.assertEqual(self.ks5D4.definition_formal, r'X1 X2 X3 S1 D1 D2 D3') + self.assertFalse(Constituenta.objects.filter(as_child__parent_id=self.ks1D1.pk).exists()) + @decl_endpoint('/api/oss/{item}/update-operation', method='patch') def test_change_substitutions(self): data = {