''' 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