Portal/rsconcept/backend/apps/oss/serializers/data_access.py

98 lines
2.9 KiB
Python
Raw Normal View History

''' Serializers for persistent data manipulation. '''
from typing import cast
from rest_framework import serializers
from apps.rsform.models import LibraryItem
from apps.rsform.serializers import LibraryItemDetailsSerializer
from shared import messages as msg
from ..models import Argument, Operation, OperationSchema
class OperationSerializer(serializers.ModelSerializer):
''' Serializer: Operation data. '''
class Meta:
''' serializer metadata. '''
model = Operation
fields = '__all__'
read_only_fields = ('id', 'oss')
class ArgumentSerializer(serializers.ModelSerializer):
''' Serializer: Operation data. '''
class Meta:
''' serializer metadata. '''
model = Argument
fields = ('operation', 'argument')
class OperationPositionSerializer(serializers.ModelSerializer):
''' Serializer: Positions of a single operations in OSS. '''
class Meta:
''' serializer metadata. '''
model = Operation
fields = 'id', 'position_x', 'position_y'
def validate(self, attrs):
oss = cast(LibraryItem, self.context['oss'])
operation = cast(Operation, self.instance)
if operation.oss != oss:
raise serializers.ValidationError({
'id': msg.operationNotOwned(oss.title)
})
return attrs
class OperationCreateSerializer(serializers.ModelSerializer):
''' Serializer: Constituenta creation. '''
positions = serializers.ListField(
child=OperationPositionSerializer(),
default=[]
)
class Meta:
''' serializer metadata. '''
model = Operation
fields = \
'alias', 'operation_type', 'title', \
'comment', 'position_x', 'position_y'
class OperationSchemaSerializer(serializers.ModelSerializer):
''' Serializer: Detailed data for OSS. '''
items = serializers.ListField(
child=OperationSerializer()
)
graph = serializers.ListField(
child=ArgumentSerializer()
)
class Meta:
''' serializer metadata. '''
model = LibraryItem
fields = '__all__'
def to_representation(self, instance: LibraryItem):
result = LibraryItemDetailsSerializer(instance).data
oss = OperationSchema(instance)
result['items'] = []
for operation in oss.operations():
result['items'].append(OperationSerializer(operation).data)
result['graph'] = []
for argument in oss.arguments():
result['graph'].append(ArgumentSerializer(argument).data)
result['substitutions'] = []
for substitution in oss.substitutions().values(
'original',
'original__alias',
'original__term_resolved',
'substitution',
'substitution__alias',
'substitution__term_resolved',
'transfer_term'
):
result['substitutions'].append(substitution)
return result