ConceptPortal-public/rsconcept/backend/apps/rsform/serializers.py

177 lines
5.9 KiB
Python
Raw Normal View History

''' Serializers for conceptual schema API. '''
import json
2023-07-15 17:46:19 +03:00
from rest_framework import serializers
import pyconcept
2023-07-18 14:55:40 +03:00
from .models import Constituenta, RSForm
2023-07-15 17:46:19 +03:00
class FileSerializer(serializers.Serializer):
''' Serializer: File input. '''
2023-07-15 17:46:19 +03:00
file = serializers.FileField(allow_empty_file=False)
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')
2023-07-15 17:46:19 +03:00
class ExpressionSerializer(serializers.Serializer):
''' Serializer: RSLang expression. '''
2023-07-15 17:46:19 +03:00
expression = serializers.CharField()
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')
2023-07-15 17:46:19 +03:00
class RSFormSerializer(serializers.ModelSerializer):
''' Serializer: General purpose RSForm data. '''
2023-07-15 17:46:19 +03:00
class Meta:
''' serializer metadata. '''
2023-07-15 17:46:19 +03:00
model = RSForm
fields = '__all__'
read_only_fields = ('owner', 'id')
2023-07-18 14:55:40 +03:00
2023-07-27 22:04:25 +03:00
class RSFormUploadSerializer(serializers.Serializer):
''' Upload data for RSForm serializer. '''
2023-07-27 22:04:25 +03:00
file = serializers.FileField()
load_metadata = serializers.BooleanField()
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')
2023-07-27 22:04:25 +03:00
class RSFormContentsSerializer(serializers.ModelSerializer):
''' Serializer: Detailed data for RSForm. '''
2023-07-27 22:04:25 +03:00
class Meta:
''' serializer metadata. '''
2023-07-27 22:04:25 +03:00
model = RSForm
def to_representation(self, instance: RSForm):
result = RSFormSerializer(instance).data
result['items'] = []
for cst in instance.constituents().order_by('order'):
result['items'].append(ConstituentaSerializer(cst).data)
return result
class RSFormDetailsSerlializer(serializers.BaseSerializer):
''' Serializer: Processed data for RSForm. '''
class Meta:
''' serializer metadata. '''
model = RSForm
def to_representation(self, instance: RSForm):
trs = pyconcept.check_schema(json.dumps(instance.to_trs()))
trs = trs.replace('entityUID', 'id')
result = json.loads(trs)
2023-08-17 21:23:54 +03:00
result['id'] = instance.pk
result['time_update'] = instance.time_update
result['time_create'] = instance.time_create
result['is_common'] = instance.is_common
result['owner'] = (instance.owner.pk if instance.owner is not None else None)
return result
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')
2023-07-18 14:55:40 +03:00
class ConstituentaSerializer(serializers.ModelSerializer):
''' Serializer: Constituenta data. '''
2023-07-18 14:55:40 +03:00
class Meta:
''' serializer metadata. '''
2023-07-18 14:55:40 +03:00
model = Constituenta
fields = '__all__'
read_only_fields = ('id', 'order', 'alias', 'cst_type')
2023-07-18 14:55:40 +03:00
2023-08-08 18:29:35 +03:00
def update(self, instance: Constituenta, validated_data) -> Constituenta:
if 'term_raw' in validated_data:
2023-08-08 18:29:35 +03:00
validated_data['term_resolved'] = validated_data['term_raw']
if 'definition_raw' in validated_data:
2023-08-08 18:29:35 +03:00
validated_data['definition_resolved'] = validated_data['definition_raw']
2023-08-17 21:23:54 +03:00
result: Constituenta = super().update(instance, validated_data)
2023-07-18 14:55:40 +03:00
instance.schema.save()
2023-08-08 18:29:35 +03:00
return result
class StandaloneCstSerializer(serializers.ModelSerializer):
''' Serializer: Constituenta in current context. '''
id = serializers.IntegerField()
class Meta:
''' serializer metadata. '''
model = Constituenta
exclude = ('schema', )
def validate(self, attrs):
try:
attrs['object'] = Constituenta.objects.get(pk=attrs['id'])
except Constituenta.DoesNotExist as exception:
raise serializers.ValidationError({f"{attrs['id']}": 'Конституента не существует'}) from exception
return attrs
class CstCreateSerializer(serializers.ModelSerializer):
''' Serializer: Constituenta creation. '''
insert_after = serializers.IntegerField(required=False, allow_null=True)
class Meta:
''' serializer metadata. '''
model = Constituenta
fields = 'alias', 'cst_type', 'convention', 'term_raw', 'definition_raw', 'definition_formal', 'insert_after'
def validate(self, attrs):
if 'term_raw' in attrs:
attrs['term_resolved'] = attrs['term_raw']
if 'definition_raw' in attrs:
attrs['definition_resolved'] = attrs['definition_raw']
return attrs
class CstListSerlializer(serializers.Serializer):
''' Serializer: List of constituents from one origin. '''
items = serializers.ListField(
child=StandaloneCstSerializer()
)
def validate(self, attrs):
schema = self.context['schema']
cstList = []
for item in attrs['items']:
cst = item['object']
if cst.schema != schema:
raise serializers.ValidationError(
{'items': f'Конституенты должны относиться к данной схеме: {item}'})
cstList.append(cst)
attrs['constituents'] = cstList
return attrs
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')
class CstMoveSerlializer(CstListSerlializer):
''' Serializer: Change constituenta position. '''
move_to = serializers.IntegerField()
def create(self, validated_data):
raise NotImplementedError('unexpected `create()` call')
def update(self, instance, validated_data):
raise NotImplementedError('unexpected `update()` call')