From e69638799aa86d7ca571b396c39eb2b5e7a24392 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:45:53 +0300 Subject: [PATCH] F: Implement constituenta mark for backend --- .../oss/tests/s_propagation/t_constituents.py | 5 ++++- rsconcept/backend/apps/rsform/admin.py | 2 +- .../migrations/0004_constituenta_crucial.py | 18 ++++++++++++++++++ .../backend/apps/rsform/models/Constituenta.py | 5 +++++ rsconcept/backend/apps/rsform/models/RSForm.py | 4 ++++ .../apps/rsform/serializers/data_access.py | 7 ++++--- .../apps/rsform/tests/s_views/t_rsforms.py | 6 +++++- 7 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 rsconcept/backend/apps/rsform/migrations/0004_constituenta_crucial.py diff --git a/rsconcept/backend/apps/oss/tests/s_propagation/t_constituents.py b/rsconcept/backend/apps/oss/tests/s_propagation/t_constituents.py index e72ed1b4..0813d8ea 100644 --- a/rsconcept/backend/apps/oss/tests/s_propagation/t_constituents.py +++ b/rsconcept/backend/apps/oss/tests/s_propagation/t_constituents.py @@ -121,7 +121,8 @@ class TestChangeConstituents(EndpointTester): 'term_raw': 'Test1', 'definition_formal': r'X4\X4', 'definition_raw': '@{X5|sing,datv}', - 'convention': 'test' + 'convention': 'test', + 'crucial': True, } } response = self.executeOK(data=data, schema=self.ks1.model.pk) @@ -132,9 +133,11 @@ class TestChangeConstituents(EndpointTester): self.assertEqual(self.ks1X1.definition_formal, data['item_data']['definition_formal']) self.assertEqual(self.ks1X1.definition_raw, data['item_data']['definition_raw']) self.assertEqual(self.ks1X1.convention, data['item_data']['convention']) + self.assertEqual(self.ks1X1.crucial, data['item_data']['crucial']) self.assertEqual(d2.definition_resolved, data['item_data']['term_raw']) self.assertEqual(inherited_cst.term_raw, data['item_data']['term_raw']) self.assertEqual(inherited_cst.convention, data['item_data']['convention']) + self.assertEqual(inherited_cst.crucial, False) self.assertEqual(inherited_cst.definition_formal, r'X1\X1') self.assertEqual(inherited_cst.definition_raw, r'@{X2|sing,datv}') diff --git a/rsconcept/backend/apps/rsform/admin.py b/rsconcept/backend/apps/rsform/admin.py index d2d6d48c..ec4759fb 100644 --- a/rsconcept/backend/apps/rsform/admin.py +++ b/rsconcept/backend/apps/rsform/admin.py @@ -8,5 +8,5 @@ from . import models class ConstituentaAdmin(admin.ModelAdmin): ''' Admin model: Constituenta. ''' ordering = ['schema', 'order'] - list_display = ['schema', 'order', 'alias', 'term_resolved', 'definition_resolved'] + list_display = ['schema', 'order', 'alias', 'term_resolved', 'definition_resolved', 'crucial'] search_fields = ['term_resolved', 'definition_resolved'] diff --git a/rsconcept/backend/apps/rsform/migrations/0004_constituenta_crucial.py b/rsconcept/backend/apps/rsform/migrations/0004_constituenta_crucial.py new file mode 100644 index 00000000..38b5a631 --- /dev/null +++ b/rsconcept/backend/apps/rsform/migrations/0004_constituenta_crucial.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.4 on 2025-07-29 09:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rsform', '0003_alter_constituenta_order'), + ] + + operations = [ + migrations.AddField( + model_name='constituenta', + name='crucial', + field=models.BooleanField(default=False, verbose_name='Ключевая'), + ), + ] diff --git a/rsconcept/backend/apps/rsform/models/Constituenta.py b/rsconcept/backend/apps/rsform/models/Constituenta.py index 8acffe2f..c845cd2a 100644 --- a/rsconcept/backend/apps/rsform/models/Constituenta.py +++ b/rsconcept/backend/apps/rsform/models/Constituenta.py @@ -4,6 +4,7 @@ import re from cctext import extract_entities from django.db.models import ( CASCADE, + BooleanField, CharField, ForeignKey, JSONField, @@ -103,6 +104,10 @@ class Constituenta(Model): default='', blank=True ) + crucial = BooleanField( + verbose_name='Ключевая', + default=False + ) class Meta: ''' Model metadata. ''' diff --git a/rsconcept/backend/apps/rsform/models/RSForm.py b/rsconcept/backend/apps/rsform/models/RSForm.py index 1c721bec..39fae1f5 100644 --- a/rsconcept/backend/apps/rsform/models/RSForm.py +++ b/rsconcept/backend/apps/rsform/models/RSForm.py @@ -144,6 +144,7 @@ class RSForm: self.cache.ensure_loaded() position = self.cache.constituents.index(self.cache.by_id[insert_after.pk]) + 1 result = self.insert_new(data['alias'], data['cst_type'], position) + result.crucial = data.get('crucial', False) result.convention = data.get('convention', '') result.definition_formal = data.get('definition_formal', '') result.term_forms = data.get('term_forms', []) @@ -247,6 +248,9 @@ class RSForm: else: old_data['convention'] = cst.convention cst.convention = data['convention'] + if 'crucial' in data: + cst.crucial = data['crucial'] + del data['crucial'] if 'definition_formal' in data: if cst.definition_formal == data['definition_formal']: del data['definition_formal'] diff --git a/rsconcept/backend/apps/rsform/serializers/data_access.py b/rsconcept/backend/apps/rsform/serializers/data_access.py index 8a5063c2..a93074a4 100644 --- a/rsconcept/backend/apps/rsform/serializers/data_access.py +++ b/rsconcept/backend/apps/rsform/serializers/data_access.py @@ -46,12 +46,13 @@ class CstUpdateSerializer(StrictSerializer): class Meta: ''' serializer metadata. ''' model = Constituenta - fields = 'alias', 'cst_type', 'convention', 'definition_formal', 'definition_raw', 'term_raw', 'term_forms' + fields = 'alias', 'cst_type', 'convention', 'crucial', 'definition_formal', \ + 'definition_raw', 'term_raw', 'term_forms' target = PKField( many=False, queryset=Constituenta.objects.all().only( - 'alias', 'cst_type', 'convention', 'definition_formal', 'definition_raw', 'term_raw') + 'alias', 'cst_type', 'convention', 'crucial', 'definition_formal', 'definition_raw', 'term_raw') ) item_data = ConstituentaUpdateData() @@ -96,7 +97,7 @@ class CstCreateSerializer(StrictModelSerializer): ''' serializer metadata. ''' model = Constituenta fields = \ - 'alias', 'cst_type', 'convention', \ + 'alias', 'cst_type', 'convention', 'crucial', \ 'term_raw', 'definition_raw', 'definition_formal', \ 'insert_after', 'term_forms' diff --git a/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py b/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py index f119d367..bd1a983e 100644 --- a/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py +++ b/rsconcept/backend/apps/rsform/tests/s_views/t_rsforms.py @@ -225,7 +225,9 @@ class TestRSFormViewset(EndpointTester): 'cst_type': CstType.BASE, 'insert_after': x2.pk, 'term_raw': 'test', - 'term_forms': [{'text': 'form1', 'tags': 'sing,datv'}] + 'term_forms': [{'text': 'form1', 'tags': 'sing,datv'}], + 'definition_formal': 'invalid', + 'crucial': True } response = self.executeCreated(data=data, item=self.owned_id) self.assertEqual(response.data['new_cst']['alias'], data['alias']) @@ -233,6 +235,8 @@ class TestRSFormViewset(EndpointTester): self.assertEqual(x4.order, 2) self.assertEqual(x4.term_raw, data['term_raw']) self.assertEqual(x4.term_forms, data['term_forms']) + self.assertEqual(x4.definition_formal, data['definition_formal']) + self.assertEqual(x4.crucial, data['crucial']) data = { 'alias': 'X5',