diff --git a/rsconcept/backend/apps/oss/admin.py b/rsconcept/backend/apps/oss/admin.py index 3a028708..93080537 100644 --- a/rsconcept/backend/apps/oss/admin.py +++ b/rsconcept/backend/apps/oss/admin.py @@ -60,9 +60,9 @@ class InheritanceAdmin(admin.ModelAdmin): search_fields = ['id', 'operation', 'parent', 'child'] -@admin.register(models.Reference) -class ReferenceAdmin(admin.ModelAdmin): - ''' Admin model: Reference. ''' - ordering = ['reference', 'target'] - list_display = ['id', 'reference', 'target'] - search_fields = ['id', 'reference', 'target'] +@admin.register(models.Replica) +class ReplicaAdmin(admin.ModelAdmin): + ''' Admin model: Replica. ''' + ordering = ['replica', 'original'] + list_display = ['id', 'replica', 'original'] + search_fields = ['id', 'replica', 'original'] diff --git a/rsconcept/backend/apps/oss/migrations/0016_alter_operation_operation_type_replica_and_more.py b/rsconcept/backend/apps/oss/migrations/0016_alter_operation_operation_type_replica_and_more.py new file mode 100644 index 00000000..e8088550 --- /dev/null +++ b/rsconcept/backend/apps/oss/migrations/0016_alter_operation_operation_type_replica_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 5.2.4 on 2025-08-06 09:10 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('oss', '0015_reference'), + ] + + operations = [ + migrations.AlterField( + model_name='operation', + name='operation_type', + field=models.CharField(choices=[('input', 'Input'), ('synthesis', 'Synthesis'), ('replica', 'Replica')], default='input', max_length=10, verbose_name='Тип'), + ), + migrations.CreateModel( + name='Replica', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('original', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='targets', to='oss.operation', verbose_name='Целевая Операция')), + ('replica', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='replicas', to='oss.operation', verbose_name='Реплика')), + ], + options={ + 'verbose_name': 'Реплика', + 'verbose_name_plural': 'Реплики', + 'unique_together': {('replica', 'original')}, + }, + ), + migrations.DeleteModel( + name='Reference', + ), + ] diff --git a/rsconcept/backend/apps/oss/models/Operation.py b/rsconcept/backend/apps/oss/models/Operation.py index df4b07f2..b4601dc2 100644 --- a/rsconcept/backend/apps/oss/models/Operation.py +++ b/rsconcept/backend/apps/oss/models/Operation.py @@ -16,7 +16,7 @@ from django.db.models import ( from apps.library.models import LibraryItem from .Argument import Argument -from .Reference import Reference +from .Replica import Replica from .Substitution import Substitution @@ -24,7 +24,7 @@ class OperationType(TextChoices): ''' Type of operation. ''' INPUT = 'input' SYNTHESIS = 'synthesis' - REFERENCE = 'reference' + REPLICA = 'replica' class Operation(Model): @@ -93,13 +93,13 @@ class Operation(Model): ''' Operation substitutions. ''' return Substitution.objects.filter(operation=self) - def getQ_references(self) -> QuerySet[Reference]: - ''' Operation references. ''' - return Reference.objects.filter(target=self) + def getQ_replicas(self) -> QuerySet[Replica]: + ''' Operation replicas. ''' + return Replica.objects.filter(original=self) - def getQ_reference_target(self) -> list['Operation']: - ''' Operation target for current reference. ''' - return [x.target for x in Reference.objects.filter(reference=self)] + def getQ_replica_original(self) -> list['Operation']: + ''' Operation source for current replica. ''' + return [x.original for x in Replica.objects.filter(replica=self)] def setQ_result(self, result: Optional[LibraryItem]) -> None: ''' Set result schema. ''' @@ -107,12 +107,12 @@ class Operation(Model): return self.result = result self.save(update_fields=['result']) - for reference in self.getQ_references(): - reference.reference.result = result - reference.reference.save(update_fields=['result']) + for rep in self.getQ_replicas(): + rep.replica.result = result + rep.replica.save(update_fields=['result']) def delete(self, *args, **kwargs): ''' Delete operation. ''' - for ref in self.getQ_references(): - ref.reference.delete() + for rep in self.getQ_replicas(): + rep.replica.delete() super().delete(*args, **kwargs) diff --git a/rsconcept/backend/apps/oss/models/OperationSchema.py b/rsconcept/backend/apps/oss/models/OperationSchema.py index d02b7922..aac87047 100644 --- a/rsconcept/backend/apps/oss/models/OperationSchema.py +++ b/rsconcept/backend/apps/oss/models/OperationSchema.py @@ -11,7 +11,7 @@ from .Block import Block from .Inheritance import Inheritance from .Layout import Layout from .Operation import Operation, OperationType -from .Reference import Reference +from .Replica import Replica from .Substitution import Substitution @@ -67,15 +67,15 @@ class OperationSchema: result = Operation.objects.create(oss=self.model, **kwargs) return result - def create_reference(self, target: Operation) -> Operation: - ''' Create Reference Operation. ''' + def create_replica(self, target: Operation) -> Operation: + ''' Create Replica Operation. ''' result = Operation.objects.create( oss=self.model, - operation_type=OperationType.REFERENCE, + operation_type=OperationType.REPLICA, result=target.result, parent=target.parent ) - Reference.objects.create(reference=result, target=target) + Replica.objects.create(replica=result, original=target) return result def create_block(self, **kwargs) -> Block: diff --git a/rsconcept/backend/apps/oss/models/OperationSchemaCached.py b/rsconcept/backend/apps/oss/models/OperationSchemaCached.py index 01f310d5..433ca611 100644 --- a/rsconcept/backend/apps/oss/models/OperationSchemaCached.py +++ b/rsconcept/backend/apps/oss/models/OperationSchemaCached.py @@ -24,17 +24,17 @@ class OperationSchemaCached: self.cache = OssCache(model.pk) self.engine = PropagationEngine(self.cache) - def delete_reference(self, target: int, keep_connections: bool = False, keep_constituents: bool = False): - ''' Delete Reference Operation. ''' + def delete_replica(self, target: int, keep_connections: bool = False, keep_constituents: bool = False): + ''' Delete Replica Operation. ''' if not keep_connections: self.delete_operation(target, keep_constituents) return self.cache.ensure_loaded_subs() operation = self.cache.operation_by_id[target] - reference_target = self.cache.reference_target.get(target) - if reference_target: + original = self.cache.replica_original.get(target) + if original: for arg in operation.getQ_as_argument(): - arg.argument_id = reference_target + arg.argument_id = original arg.save() self.cache.remove_operation(target) operation.delete() diff --git a/rsconcept/backend/apps/oss/models/OssCache.py b/rsconcept/backend/apps/oss/models/OssCache.py index cd5a2f0e..7daa4f74 100644 --- a/rsconcept/backend/apps/oss/models/OssCache.py +++ b/rsconcept/backend/apps/oss/models/OssCache.py @@ -8,7 +8,7 @@ from apps.rsform.models import RSFormCached from .Argument import Argument from .Inheritance import Inheritance from .Operation import Operation, OperationType -from .Reference import Reference +from .Replica import Replica from .Substitution import Substitution @@ -28,8 +28,8 @@ class OssCache: self.graph.add_node(operation.pk) self.extend_graph.add_node(operation.pk) - references = Reference.objects.filter(reference__oss_id=self._item_id).only('reference_id', 'target_id') - self.reference_target = {ref.reference_id: ref.target_id for ref in references} + replicas = Replica.objects.filter(replica__oss_id=self._item_id).only('replica_id', 'original_id') + self.replica_original = {rep.replica_id: rep.original_id for rep in replicas} arguments = Argument.objects \ .filter(operation__oss_id=self._item_id) \ .only('operation_id', 'argument_id') \ @@ -37,9 +37,9 @@ class OssCache: for argument in arguments: self.graph.add_edge(argument.argument_id, argument.operation_id) self.extend_graph.add_edge(argument.argument_id, argument.operation_id) - target = self.reference_target.get(argument.argument_id) - if target is not None: - self.extend_graph.add_edge(target, argument.operation_id) + original = self.replica_original.get(argument.argument_id) + if original is not None: + self.extend_graph.add_edge(original, argument.operation_id) self.is_loaded_subs = False self.substitutions: dict[int, list[Substitution]] = {} @@ -85,7 +85,7 @@ class OssCache: def get_operation(self, schemaID: int) -> Operation: ''' Get operation by schema. ''' for operation in self.operations: - if operation.result_id == schemaID and operation.operation_type != OperationType.REFERENCE: + if operation.result_id == schemaID and operation.operation_type != OperationType.REPLICA: return operation raise ValueError(f'Operation for schema {schemaID} not found') @@ -121,7 +121,7 @@ class OssCache: ''' Insert new argument. ''' self.graph.add_edge(argument.argument_id, argument.operation_id) self.extend_graph.add_edge(argument.argument_id, argument.operation_id) - target = self.reference_target.get(argument.argument_id) + target = self.replica_original.get(argument.argument_id) if target is not None: self.extend_graph.add_edge(target, argument.operation_id) @@ -160,8 +160,8 @@ class OssCache: del self._schema_by_id[target.result_id] self.operations.remove(self.operation_by_id[operation]) del self.operation_by_id[operation] - if operation in self.reference_target: - del self.reference_target[operation] + if operation in self.replica_original: + del self.replica_original[operation] if self.is_loaded_subs: del self.substitutions[operation] del self.inheritance[operation] @@ -170,7 +170,7 @@ class OssCache: ''' Remove argument from cache. ''' self.graph.remove_edge(argument.argument_id, argument.operation_id) self.extend_graph.remove_edge(argument.argument_id, argument.operation_id) - target = self.reference_target.get(argument.argument_id) + target = self.replica_original.get(argument.argument_id) if target is not None: if not Argument.objects.filter(argument_id=target, operation_id=argument.operation_id).exists(): self.extend_graph.remove_edge(target, argument.operation_id) diff --git a/rsconcept/backend/apps/oss/models/Reference.py b/rsconcept/backend/apps/oss/models/Reference.py deleted file mode 100644 index 40215002..00000000 --- a/rsconcept/backend/apps/oss/models/Reference.py +++ /dev/null @@ -1,27 +0,0 @@ -''' Models: Operation Reference in OSS. ''' -from django.db.models import CASCADE, ForeignKey, Model - - -class Reference(Model): - ''' Operation Reference. ''' - reference = ForeignKey( - verbose_name='Отсылка', - to='oss.Operation', - on_delete=CASCADE, - related_name='references' - ) - target = ForeignKey( - verbose_name='Целевая Операция', - to='oss.Operation', - on_delete=CASCADE, - related_name='targets' - ) - - class Meta: - ''' Model metadata. ''' - verbose_name = 'Отсылка' - verbose_name_plural = 'Отсылки' - unique_together = [['reference', 'target']] - - def __str__(self) -> str: - return f'{self.reference} -> {self.target}' diff --git a/rsconcept/backend/apps/oss/models/Replica.py b/rsconcept/backend/apps/oss/models/Replica.py new file mode 100644 index 00000000..bf73a5e4 --- /dev/null +++ b/rsconcept/backend/apps/oss/models/Replica.py @@ -0,0 +1,27 @@ +''' Models: Operation Replica in OSS. ''' +from django.db.models import CASCADE, ForeignKey, Model + + +class Replica(Model): + ''' Operation Replica. ''' + replica = ForeignKey( + verbose_name='Реплика', + to='oss.Operation', + on_delete=CASCADE, + related_name='replicas' + ) + original = ForeignKey( + verbose_name='Целевая Операция', + to='oss.Operation', + on_delete=CASCADE, + related_name='targets' + ) + + class Meta: + ''' Model metadata. ''' + verbose_name = 'Реплика' + verbose_name_plural = 'Реплики' + unique_together = [['replica', 'original']] + + def __str__(self) -> str: + return f'{self.replica} -> {self.original}' diff --git a/rsconcept/backend/apps/oss/models/__init__.py b/rsconcept/backend/apps/oss/models/__init__.py index 2a5d44ed..49e3300d 100644 --- a/rsconcept/backend/apps/oss/models/__init__.py +++ b/rsconcept/backend/apps/oss/models/__init__.py @@ -8,5 +8,5 @@ from .Operation import Operation, OperationType from .OperationSchema import OperationSchema from .OperationSchemaCached import OperationSchemaCached from .PropagationFacade import PropagationFacade -from .Reference import Reference +from .Replica import Replica from .Substitution import Substitution diff --git a/rsconcept/backend/apps/oss/serializers/__init__.py b/rsconcept/backend/apps/oss/serializers/__init__.py index 98ddfe21..6fd87a42 100644 --- a/rsconcept/backend/apps/oss/serializers/__init__.py +++ b/rsconcept/backend/apps/oss/serializers/__init__.py @@ -6,18 +6,18 @@ from .data_access import ( BlockSerializer, CloneSchemaSerializer, CreateBlockSerializer, - CreateReferenceSerializer, + CreateReplicaSerializer, CreateSchemaSerializer, CreateSynthesisSerializer, DeleteBlockSerializer, DeleteOperationSerializer, - DeleteReferenceSerializer, + DeleteReplicaSerializer, ImportSchemaSerializer, MoveItemsSerializer, OperationSchemaSerializer, OperationSerializer, - ReferenceSerializer, RelocateConstituentsSerializer, + ReplicaSerializer, SetOperationInputSerializer, TargetOperationSerializer, UpdateBlockSerializer, diff --git a/rsconcept/backend/apps/oss/serializers/data_access.py b/rsconcept/backend/apps/oss/serializers/data_access.py index 07893003..9c3a266a 100644 --- a/rsconcept/backend/apps/oss/serializers/data_access.py +++ b/rsconcept/backend/apps/oss/serializers/data_access.py @@ -20,7 +20,7 @@ from ..models import ( Layout, Operation, OperationType, - Reference, + Replica, Substitution ) from .basics import NodeSerializer, PositionSerializer, SubstitutionExSerializer @@ -54,12 +54,12 @@ class ArgumentSerializer(StrictModelSerializer): fields = ('operation', 'argument') -class ReferenceSerializer(StrictModelSerializer): - ''' Serializer: Reference data. ''' +class ReplicaSerializer(StrictModelSerializer): + ''' Serializer: Replica data. ''' class Meta: ''' serializer metadata. ''' - model = Reference - fields = ('reference', 'target') + model = Replica + fields = ('replica', 'original') class CreateBlockSerializer(StrictSerializer): @@ -251,15 +251,15 @@ class CloneSchemaSerializer(StrictSerializer): raise serializers.ValidationError({ 'source_operation': msg.operationResultEmpty(source_operation.alias) }) - if source_operation.operation_type == OperationType.REFERENCE: + if source_operation.operation_type == OperationType.REPLICA: raise serializers.ValidationError({ - 'source_operation': msg.referenceTypeNotAllowed() + 'source_operation': msg.replicaNotAllowed() }) return attrs -class CreateReferenceSerializer(StrictSerializer): - ''' Serializer: Create reference operation. ''' +class CreateReplicaSerializer(StrictSerializer): + ''' Serializer: Create Replica operation. ''' layout = serializers.ListField(child=NodeSerializer()) target = PKField(many=False, queryset=Operation.objects.all()) position = PositionSerializer() @@ -269,11 +269,11 @@ class CreateReferenceSerializer(StrictSerializer): target = cast(Operation, attrs['target']) if target.oss_id != oss.pk: raise serializers.ValidationError({ - 'target_operation': msg.operationNotInOSS() + 'target': msg.operationNotInOSS() }) - if target.operation_type == OperationType.REFERENCE: + if target.operation_type == OperationType.REPLICA: raise serializers.ValidationError({ - 'target_operation': msg.referenceTypeNotAllowed() + 'target': msg.replicaNotAllowed() }) return attrs @@ -432,7 +432,7 @@ class UpdateOperationSerializer(StrictSerializer): class DeleteOperationSerializer(StrictSerializer): - ''' Serializer: Delete non-reference operation. ''' + ''' Serializer: Delete non-replica operation. ''' layout = serializers.ListField( child=NodeSerializer() ) @@ -447,15 +447,15 @@ class DeleteOperationSerializer(StrictSerializer): raise serializers.ValidationError({ 'target': msg.operationNotInOSS() }) - if operation.operation_type == OperationType.REFERENCE: + if operation.operation_type == OperationType.REPLICA: raise serializers.ValidationError({ - 'target': msg.referenceTypeNotAllowed() + 'target': msg.replicaNotAllowed() }) return attrs -class DeleteReferenceSerializer(StrictSerializer): - ''' Serializer: Delete reference operation. ''' +class DeleteReplicaSerializer(StrictSerializer): + ''' Serializer: Delete Replica operation. ''' layout = serializers.ListField( child=NodeSerializer() ) @@ -470,9 +470,9 @@ class DeleteReferenceSerializer(StrictSerializer): raise serializers.ValidationError({ 'target': msg.operationNotInOSS() }) - if operation.operation_type != OperationType.REFERENCE: + if operation.operation_type != OperationType.REPLICA: raise serializers.ValidationError({ - 'target': msg.referenceTypeRequired() + 'target': msg.replicaRequired() }) return attrs @@ -535,8 +535,8 @@ class OperationSchemaSerializer(StrictModelSerializer): substitutions = serializers.ListField( child=SubstitutionExSerializer() ) - references = serializers.ListField( - child=ReferenceSerializer() + replicas = serializers.ListField( + child=ReplicaSerializer() ) layout = serializers.ListField( child=NodeSerializer() @@ -555,7 +555,7 @@ class OperationSchemaSerializer(StrictModelSerializer): result['blocks'] = [] result['arguments'] = [] result['substitutions'] = [] - result['references'] = [] + result['replicas'] = [] for operation in Operation.objects.filter(oss=instance).order_by('pk'): operation_data = OperationSerializer(operation).data operation_result = operation.result @@ -578,8 +578,8 @@ class OperationSchemaSerializer(StrictModelSerializer): substitution_term=F('substitution__term_resolved'), ).order_by('pk'): result['substitutions'].append(substitution) - for reference in Reference.objects.filter(target__oss=instance).order_by('pk'): - result['references'].append(ReferenceSerializer(reference).data) + for replication in Replica.objects.filter(original__oss=instance).order_by('pk'): + result['replicas'].append(ReplicaSerializer(replication).data) return result diff --git a/rsconcept/backend/apps/oss/tests/s_models/__init__.py b/rsconcept/backend/apps/oss/tests/s_models/__init__.py index ebfbdc83..ec95815a 100644 --- a/rsconcept/backend/apps/oss/tests/s_models/__init__.py +++ b/rsconcept/backend/apps/oss/tests/s_models/__init__.py @@ -3,5 +3,5 @@ from .t_Argument import * from .t_Inheritance import * from .t_Layout import * from .t_Operation import * -from .t_Reference import * +from .t_Replica import * from .t_Substitution import * diff --git a/rsconcept/backend/apps/oss/tests/s_models/t_Reference.py b/rsconcept/backend/apps/oss/tests/s_models/t_Replica.py similarity index 56% rename from rsconcept/backend/apps/oss/tests/s_models/t_Reference.py rename to rsconcept/backend/apps/oss/tests/s_models/t_Replica.py index 13a7a986..e10048cf 100644 --- a/rsconcept/backend/apps/oss/tests/s_models/t_Reference.py +++ b/rsconcept/backend/apps/oss/tests/s_models/t_Replica.py @@ -1,12 +1,12 @@ -''' Testing models: Reference. ''' +''' Testing models: Replica. ''' from django.test import TestCase -from apps.oss.models import Operation, OperationSchema, OperationType, Reference +from apps.oss.models import Operation, OperationSchema, OperationType, Replica from apps.rsform.models import RSForm -class TestReference(TestCase): - ''' Testing Reference model. ''' +class TestReplica(TestCase): + ''' Testing Replica model. ''' def setUp(self): @@ -19,26 +19,26 @@ class TestReference(TestCase): ) self.operation2 = Operation.objects.create( oss=self.oss.model, - operation_type=OperationType.REFERENCE, + operation_type=OperationType.REPLICA, ) - self.reference = Reference.objects.create( - reference=self.operation2, - target=self.operation1 + self.replicas = Replica.objects.create( + replica=self.operation2, + original=self.operation1 ) def test_str(self): testStr = f'{self.operation2} -> {self.operation1}' - self.assertEqual(str(self.reference), testStr) + self.assertEqual(str(self.replicas), testStr) def test_cascade_delete_operation(self): - self.assertEqual(Reference.objects.count(), 1) + self.assertEqual(Replica.objects.count(), 1) self.operation2.delete() - self.assertEqual(Reference.objects.count(), 0) + self.assertEqual(Replica.objects.count(), 0) def test_cascade_delete_target(self): - self.assertEqual(Reference.objects.count(), 1) + self.assertEqual(Replica.objects.count(), 1) self.operation1.delete() - self.assertEqual(Reference.objects.count(), 0) + self.assertEqual(Replica.objects.count(), 0) diff --git a/rsconcept/backend/apps/oss/tests/s_propagation/t_references.py b/rsconcept/backend/apps/oss/tests/s_propagation/t_references.py index 1bf0c5f7..51d088cf 100644 --- a/rsconcept/backend/apps/oss/tests/s_propagation/t_references.py +++ b/rsconcept/backend/apps/oss/tests/s_propagation/t_references.py @@ -50,7 +50,7 @@ class ReferencePropagationTestCase(EndpointTester): operation_type=OperationType.INPUT, result=self.ks2.model ) - self.operation3 = self.owned.create_reference(self.operation1) + self.operation3 = self.owned.create_replica(self.operation1) self.operation4 = self.owned.create_operation( alias='4', @@ -175,8 +175,8 @@ class ReferencePropagationTestCase(EndpointTester): self.assertEqual(self.ks6.constituentsQ().count(), 5) - @decl_endpoint('/api/oss/{item}/delete-reference', method='patch') - def test_delete_reference_redirection(self): + @decl_endpoint('/api/oss/{item}/delete-replica', method='patch') + def test_delete_replica_redirection(self): data = { 'layout': self.layout_data, 'target': self.operation3.pk, @@ -188,8 +188,8 @@ class ReferencePropagationTestCase(EndpointTester): self.assertEqual(self.ks5.constituentsQ().count(), 9) self.assertEqual(self.ks6.constituentsQ().count(), 6) - @decl_endpoint('/api/oss/{item}/delete-reference', method='patch') - def test_delete_reference_constituents(self): + @decl_endpoint('/api/oss/{item}/delete-replica', method='patch') + def test_delete_replica_constituents(self): data = { 'layout': self.layout_data, 'target': self.operation3.pk, diff --git a/rsconcept/backend/apps/oss/tests/s_views/t_operations.py b/rsconcept/backend/apps/oss/tests/s_views/t_operations.py index 66077f77..1f9406d1 100644 --- a/rsconcept/backend/apps/oss/tests/s_views/t_operations.py +++ b/rsconcept/backend/apps/oss/tests/s_views/t_operations.py @@ -1,6 +1,6 @@ ''' Testing API: Operation Schema - operations manipulation. ''' from apps.library.models import AccessPolicy, Editor, LibraryItem, LibraryItemType -from apps.oss.models import Argument, Operation, OperationSchema, OperationType, Reference +from apps.oss.models import Argument, Operation, OperationSchema, OperationType, Replica from apps.rsform.models import Constituenta, RSForm from shared.EndpointTester import EndpointTester, decl_endpoint @@ -209,8 +209,8 @@ class TestOssOperations(EndpointTester): self.assertEqual(new_operation['parent'], block_owned.id) - @decl_endpoint('/api/oss/{item}/create-reference', method='post') - def test_create_reference(self): + @decl_endpoint('/api/oss/{item}/create-replica', method='post') + def test_create_replica(self): self.populateData() data = { 'target': self.invalid_id, @@ -232,10 +232,10 @@ class TestOssOperations(EndpointTester): self.owned.model.refresh_from_db() new_operation_id = response.data['new_operation'] new_operation = next(op for op in response.data['oss']['operations'] if op['id'] == new_operation_id) - self.assertEqual(new_operation['operation_type'], OperationType.REFERENCE) + self.assertEqual(new_operation['operation_type'], OperationType.REPLICA) self.assertEqual(new_operation['parent'], self.operation1.parent_id) self.assertEqual(new_operation['result'], self.operation1.result_id) - ref = Reference.objects.filter(reference_id=new_operation_id, target_id=self.operation1.pk).first() + ref = Replica.objects.filter(replica_id=new_operation_id, original_id=self.operation1.pk).first() self.assertIsNotNone(ref) self.assertTrue(Operation.objects.filter(pk=new_operation_id, oss=self.owned.model).exists()) @@ -301,7 +301,7 @@ class TestOssOperations(EndpointTester): @decl_endpoint('/api/oss/{item}/delete-operation', method='patch') def test_delete_reference_operation_invalid(self): self.populateData() - reference_operation = self.owned.create_reference(self.operation1) + reference_operation = self.owned.create_replica(self.operation1) data = { 'layout': self.layout_data, 'target': reference_operation.pk @@ -309,8 +309,8 @@ class TestOssOperations(EndpointTester): self.executeBadData(data=data, item=self.owned_id) - @decl_endpoint('/api/oss/{item}/delete-reference', method='patch') - def test_delete_reference_operation(self): + @decl_endpoint('/api/oss/{item}/delete-replica', method='patch') + def test_delete_replica_operation(self): self.populateData() data = { 'layout': self.layout_data, @@ -318,8 +318,8 @@ class TestOssOperations(EndpointTester): } self.executeBadData(data=data, item=self.owned_id) - reference_operation = self.owned.create_reference(self.operation1) - self.assertEqual(len(self.operation1.getQ_references()), 1) + reference_operation = self.owned.create_replica(self.operation1) + self.assertEqual(len(self.operation1.getQ_replicas()), 1) data['target'] = reference_operation.pk self.executeForbidden(data=data, item=self.unowned_id) @@ -328,7 +328,7 @@ class TestOssOperations(EndpointTester): data['target'] = reference_operation.pk self.executeOK(data=data, item=self.owned_id) - self.assertEqual(len(self.operation1.getQ_references()), 0) + self.assertEqual(len(self.operation1.getQ_replicas()), 0) @decl_endpoint('/api/oss/{item}/create-input', method='patch') diff --git a/rsconcept/backend/apps/oss/views/oss.py b/rsconcept/backend/apps/oss/views/oss.py index 9e9adc9f..d3e7b399 100644 --- a/rsconcept/backend/apps/oss/views/oss.py +++ b/rsconcept/backend/apps/oss/views/oss.py @@ -65,11 +65,11 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev 'create_schema', 'clone_schema', 'import_schema', - 'create_reference', + 'create_replica', 'create_synthesis', 'update_operation', 'delete_operation', - 'delete_reference', + 'delete_replica', 'create_input', 'set_input', 'execute_operation', @@ -465,9 +465,9 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev @extend_schema( - summary='create reference for operation', + summary='create replica for operation', tags=['OSS'], - request=s.CreateReferenceSerializer(), + request=s.CreateReplicaSerializer(), responses={ c.HTTP_201_CREATED: s.OperationCreatedResponse, c.HTTP_400_BAD_REQUEST: None, @@ -475,11 +475,11 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev c.HTTP_404_NOT_FOUND: None } ) - @action(detail=True, methods=['post'], url_path='create-reference') - def create_reference(self, request: Request, pk) -> HttpResponse: - ''' Clone schema. ''' + @action(detail=True, methods=['post'], url_path='create-replica') + def create_replica(self, request: Request, pk) -> HttpResponse: + ''' Replicate schema. ''' item = self._get_item() - serializer = s.CreateReferenceSerializer( + serializer = s.CreateReplicaSerializer( data=request.data, context={'oss': item} ) @@ -490,7 +490,7 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev with transaction.atomic(): oss = m.OperationSchema(item) target = cast(m.Operation, serializer.validated_data['target']) - new_operation = oss.create_reference(target) + new_operation = oss.create_replica(target) layout.append({ 'nodeID': 'o' + str(new_operation.pk), 'x': position['x'], @@ -657,9 +657,9 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev ) @extend_schema( - summary='delete reference', + summary='delete replica', tags=['OSS'], - request=s.DeleteReferenceSerializer(), + request=s.DeleteReplicaSerializer(), responses={ c.HTTP_200_OK: s.OperationSchemaSerializer, c.HTTP_400_BAD_REQUEST: None, @@ -667,11 +667,11 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev c.HTTP_404_NOT_FOUND: None } ) - @action(detail=True, methods=['patch'], url_path='delete-reference') - def delete_reference(self, request: Request, pk) -> HttpResponse: - ''' Endpoint: Delete Reference Operation. ''' + @action(detail=True, methods=['patch'], url_path='delete-replica') + def delete_replica(self, request: Request, pk) -> HttpResponse: + ''' Endpoint: Delete Replica Operation. ''' item = self._get_item() - serializer = s.DeleteReferenceSerializer( + serializer = s.DeleteReplicaSerializer( data=request.data, context={'oss': item} ) @@ -685,7 +685,7 @@ class OssViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retriev with transaction.atomic(): oss = m.OperationSchemaCached(item) m.Layout.update_data(pk, layout) - oss.delete_reference(operation.pk, keep_connections, keep_constituents) + oss.delete_replica(operation.pk, keep_connections, keep_constituents) item.save(update_fields=['time_update']) return Response( diff --git a/rsconcept/backend/shared/messages.py b/rsconcept/backend/shared/messages.py index 41ddb324..d8e66b95 100644 --- a/rsconcept/backend/shared/messages.py +++ b/rsconcept/backend/shared/messages.py @@ -86,12 +86,12 @@ def operationInputAlreadyConnected(): return 'Схема уже подключена к другой операции' -def referenceTypeNotAllowed(): - return 'Ссылки не поддерживаются' +def replicaNotAllowed(): + return 'Реплики не поддерживаются' -def referenceTypeRequired(): - return 'Операция должна быть ссылкой' +def replicaRequired(): + return 'Операция должна быть репликацией' def operationNotSynthesis(title: str): diff --git a/rsconcept/frontend/src/app/global-dialogs.tsx b/rsconcept/frontend/src/app/global-dialogs.tsx index 366d6465..bf40d824 100644 --- a/rsconcept/frontend/src/app/global-dialogs.tsx +++ b/rsconcept/frontend/src/app/global-dialogs.tsx @@ -46,8 +46,8 @@ const DlgDeleteOperation = React.lazy(() => })) ); const DlgDeleteReference = React.lazy(() => - import('@/features/oss/dialogs/dlg-delete-reference').then(module => ({ - default: module.DlgDeleteReference + import('@/features/oss/dialogs/dlg-delete-replica').then(module => ({ + default: module.DlgDeleteReplica })) ); const DlgEditEditors = React.lazy(() => diff --git a/rsconcept/frontend/src/features/help/items/help-thesaurus.tsx b/rsconcept/frontend/src/features/help/items/help-thesaurus.tsx index 1e639316..1f88b453 100644 --- a/rsconcept/frontend/src/features/help/items/help-thesaurus.tsx +++ b/rsconcept/frontend/src/features/help/items/help-thesaurus.tsx @@ -1,5 +1,6 @@ import { IconChild, + IconConceptBlock, IconConsolidation, IconCrucial, IconCstAxiom, @@ -254,12 +255,19 @@ export function HelpThesaurus() {
Граф синтеза – ориентированный граф, где вершины — операции, а ребра — зависимости по результатам операций.
+
Операция – выделенная часть ОСС, определяющая способ получения КС в рамках ОСС.
+
+