98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
![]() |
''' 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
|