From b30a72e9973db520fa13ed5a381c05add6dc0c03 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:54:29 +0300 Subject: [PATCH] M: Improve restore ordering --- .../apps/rsform/models/OrderManager.py | 12 +++-- .../apps/rsform/tests/s_models/t_RSForm.py | 2 +- .../rsform/tests/s_models/t_RSFormCached.py | 51 +++++++++++++++---- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/rsconcept/backend/apps/rsform/models/OrderManager.py b/rsconcept/backend/apps/rsform/models/OrderManager.py index 0c5020fa..61c6bab0 100644 --- a/rsconcept/backend/apps/rsform/models/OrderManager.py +++ b/rsconcept/backend/apps/rsform/models/OrderManager.py @@ -22,14 +22,11 @@ class OrderManager: self._fix_semantic_children() self._override_order() - def _fix_topological(self) -> None: - sorted_ids = self._semantic.graph.sort_stable([cst.pk for cst in self._items]) - sorted_items = [next(cst for cst in self._items if cst.pk == id) for id in sorted_ids] - self._items = sorted_items - def _fix_kernel(self) -> None: result = [cst for cst in self._items if cst.cst_type == CstType.BASE] result = result + [cst for cst in self._items if cst.cst_type == CstType.CONSTANT] + result = result + \ + [cst for cst in self._items if result.count(cst) == 0 and len(self._semantic.graph.inputs[cst.pk]) == 0] kernel = [ cst.pk for cst in self._items if cst.cst_type in [CstType.STRUCTURED, CstType.AXIOM] or @@ -40,6 +37,11 @@ class OrderManager: result = result + [cst for cst in self._items if result.count(cst) == 0] self._items = result + def _fix_topological(self) -> None: + sorted_ids = self._semantic.graph.sort_stable([cst.pk for cst in self._items]) + sorted_items = [next(cst for cst in self._items if cst.pk == id) for id in sorted_ids] + self._items = sorted_items + def _fix_semantic_children(self) -> None: result: list[Constituenta] = [] marked: set[Constituenta] = set() diff --git a/rsconcept/backend/apps/rsform/tests/s_models/t_RSForm.py b/rsconcept/backend/apps/rsform/tests/s_models/t_RSForm.py index d292451a..83366e02 100644 --- a/rsconcept/backend/apps/rsform/tests/s_models/t_RSForm.py +++ b/rsconcept/backend/apps/rsform/tests/s_models/t_RSForm.py @@ -1,4 +1,4 @@ -''' Testing models: api_RSForm. ''' +''' Testing models: RSForm. ''' from django.forms import ValidationError from apps.rsform.models import Constituenta, CstType, RSForm diff --git a/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py b/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py index 1d1be937..4dcacb19 100644 --- a/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py +++ b/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py @@ -1,4 +1,4 @@ -''' Testing models: api_RSForm. ''' +''' Testing models: RSFormCached. ''' from apps.rsform.models import Attribution, Constituenta, CstType, OrderManager, RSFormCached from apps.users.models import User from shared.DBTester import DBTester @@ -106,6 +106,25 @@ class TestRSFormCached(DBTester): self.assertEqual(s2.definition_raw, '@{X11|plur}') + def test_insert_from(self): + self.schema.insert_last('X2') + self.schema.insert_last('D2') + self.schema.insert_last('X3') + self.schema.insert_last( + alias='D1', + definition_formal='X2 = X3' + ) + test_ks = RSFormCached.create(title='Test') + test_ks.insert_from(self.schema.model.pk) + items = Constituenta.objects.filter(schema=test_ks.model).order_by('order') + self.assertEqual(len(items), 4) + self.assertEqual(items[0].alias, 'X2') + self.assertEqual(items[1].alias, 'D2') + self.assertEqual(items[2].alias, 'X3') + self.assertEqual(items[3].alias, 'D1') + self.assertEqual(items[3].definition_formal, 'X2 = X3') + + def test_delete_cst(self): x1 = self.schema.insert_last('X1') x2 = self.schema.insert_last('X2') @@ -210,6 +229,10 @@ class TestRSFormCached(DBTester): alias='A1', definition_formal=r'D3=∅', ) + a2 = self.schema.insert_last( + alias='A2', + definition_formal=r'P1[S1]', + ) d3 = self.schema.insert_last( alias='D3', definition_formal=r'Pr2(S2)', @@ -226,6 +249,10 @@ class TestRSFormCached(DBTester): alias='F2', definition_formal=r'[α∈ℬ(X1)] X1\α', ) + p1 = self.schema.insert_last( + alias='P1', + definition_formal=r'[α∈ℬ(R1)] card(α)=0', + ) OrderManager(self.schema).restore_order() x1.refresh_from_db() @@ -240,19 +267,23 @@ class TestRSFormCached(DBTester): f1.refresh_from_db() f2.refresh_from_db() a1.refresh_from_db() + a2.refresh_from_db() + p1.refresh_from_db() self.assertEqual(x1.order, 0) self.assertEqual(x2.order, 1) self.assertEqual(c1.order, 2) - self.assertEqual(s1.order, 3) - self.assertEqual(d1.order, 4) - self.assertEqual(s2.order, 5) - self.assertEqual(d3.order, 6) - self.assertEqual(a1.order, 7) - self.assertEqual(d4.order, 8) - self.assertEqual(d2.order, 9) - self.assertEqual(f1.order, 10) - self.assertEqual(f2.order, 11) + self.assertEqual(p1.order, 3) + self.assertEqual(s1.order, 4) + self.assertEqual(a2.order, 5) + self.assertEqual(d1.order, 6) + self.assertEqual(s2.order, 7) + self.assertEqual(d3.order, 8) + self.assertEqual(a1.order, 9) + self.assertEqual(d4.order, 10) + self.assertEqual(d2.order, 11) + self.assertEqual(f1.order, 12) + self.assertEqual(f2.order, 13) def test_reset_aliases(self):