From fca8eb71e14295d9588c9d6788eea788fd18849b Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 7 Nov 2025 12:53:32 +0300 Subject: [PATCH] B: Fix self-attribution after substitution --- .../apps/rsform/models/RSFormCached.py | 3 ++- .../rsform/tests/s_models/t_RSFormCached.py | 22 ++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/rsconcept/backend/apps/rsform/models/RSFormCached.py b/rsconcept/backend/apps/rsform/models/RSFormCached.py index 87b99059..fd6b4ad6 100644 --- a/rsconcept/backend/apps/rsform/models/RSFormCached.py +++ b/rsconcept/backend/apps/rsform/models/RSFormCached.py @@ -276,7 +276,8 @@ class RSFormCached: container_id = container_id if container_id is not None else attr.container_id attr_id = orig_to_sub.get(attr.attribute_id) attr_id = attr_id if attr_id is not None else attr.attribute_id - if not any(a.container_id == container_id and a.attribute_id == attr_id for a in attributions): + if attr_id != container_id and not any( + a.container_id == container_id and a.attribute_id == attr_id for a in attributions): attr.attribute_id = attr_id attr.container_id = container_id attr.save() 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 b7a3f4c6..1d1be937 100644 --- a/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py +++ b/rsconcept/backend/apps/rsform/tests/s_models/t_RSFormCached.py @@ -1,7 +1,5 @@ ''' Testing models: api_RSForm. ''' -from django.forms import ValidationError - -from apps.rsform.models import Constituenta, CstType, OrderManager, RSFormCached +from apps.rsform.models import Attribution, Constituenta, CstType, OrderManager, RSFormCached from apps.users.models import User from shared.DBTester import DBTester @@ -170,6 +168,24 @@ class TestRSFormCached(DBTester): self.assertEqual(d1.definition_formal, x2.alias) + def test_substitute_attributions(self): + x1 = self.schema.insert_last(alias='X1') + x2 = self.schema.insert_last(alias='X2') + d1 = self.schema.insert_last(alias='D1') + d2 = self.schema.insert_last(alias='D2') + + Attribution.objects.create(container=x1, attribute=d2) + Attribution.objects.create(container=x2, attribute=d2) + Attribution.objects.create(container=x1, attribute=x2) + Attribution.objects.create(container=x1, attribute=d1) + + self.schema.substitute([(x1, x2)]) + self.assertEqual(self.schema.constituentsQ().count(), 3) + self.assertEqual(Attribution.objects.filter(container__schema=self.schema.model).count(), 2) + self.assertTrue(Attribution.objects.filter(container=x2, attribute=d2).exists()) + self.assertTrue(Attribution.objects.filter(container=x2, attribute=d1).exists()) + + def test_restore_order(self): d2 = self.schema.insert_last( alias='D2',