B: Fix self-attribution after substitution

This commit is contained in:
Ivan 2025-11-07 12:54:31 +03:00
parent f43916a483
commit 81e61a945c
2 changed files with 21 additions and 4 deletions

View File

@ -276,7 +276,8 @@ class RSFormCached:
container_id = container_id if container_id is not None else attr.container_id 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 = orig_to_sub.get(attr.attribute_id)
attr_id = attr_id if attr_id is not None else 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.attribute_id = attr_id
attr.container_id = container_id attr.container_id = container_id
attr.save() attr.save()

View File

@ -1,7 +1,5 @@
''' Testing models: api_RSForm. ''' ''' Testing models: api_RSForm. '''
from django.forms import ValidationError from apps.rsform.models import Attribution, Constituenta, CstType, OrderManager, RSFormCached
from apps.rsform.models import Constituenta, CstType, OrderManager, RSFormCached
from apps.users.models import User from apps.users.models import User
from shared.DBTester import DBTester from shared.DBTester import DBTester
@ -170,6 +168,24 @@ class TestRSFormCached(DBTester):
self.assertEqual(d1.definition_formal, x2.alias) 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): def test_restore_order(self):
d2 = self.schema.insert_last( d2 = self.schema.insert_last(
alias='D2', alias='D2',