from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer from seminar.models.treenode import * from seminar.models.pomocne import Text from seminar.models.odevzdavatko import Reseni, ReseniNode from seminar.models.tvorba import Problem, Uloha from treenode import treelib DEFAULT_NODE_DEPTH = 2 class TextSerializer(serializers.ModelSerializer): class Meta: model = Text fields = '__all__' class ProblemSerializer(serializers.ModelSerializer): class Meta: model = Problem fields = '__all__' class UlohaSerializer(serializers.ModelSerializer): class Meta: model = Uloha fields = '__all__' class ReseniSerializer(serializers.ModelSerializer): class Meta: model = Reseni fields = '__all__' class RocnikNodeSerializer(serializers.ModelSerializer): class Meta: model = RocnikNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class CisloNodeSerializer(serializers.ModelSerializer): class Meta: model = CisloNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class MezicisloNodeSerializer(serializers.ModelSerializer): class Meta: model = MezicisloNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class TemaVCisleNodeSerializer(serializers.ModelSerializer): class Meta: model = TemaVCisleNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class OrgTextNodeSerializer(serializers.ModelSerializer): class Meta: model = OrgTextNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class PohadkaNodeSerializer(serializers.ModelSerializer): class Meta: model = PohadkaNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class TextNodeSerializer(serializers.ModelSerializer): text = TextSerializer() class Meta: model = TextNode fields = ('id','text','polymorphic_ctype') depth = DEFAULT_NODE_DEPTH class TextNodeWriteSerializer(serializers.ModelSerializer): text = TextSerializer() def update(self,node,validated_data): node.text.na_web = validated_data.get('text').get('na_web') node.text.save() return node class Meta: model = TextNode fields = ('id','text') depth = DEFAULT_NODE_DEPTH class TextNodeCreateSerializer(serializers.ModelSerializer): text = TextSerializer() refnode = serializers.CharField() where = serializers.CharField() def create(self,validated_data): temp_text = validated_data.pop('text') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') refnode = TreeNode.objects.get(pk=refnode_id) text = Text.objects.create(**temp_text) if where == 'syn': node = treelib.create_child(refnode,TextNode,text=text) elif where == 'za': node = treelib.create_node_after(refnode,TextNode,text=text) elif where == 'pred': node = treelib.create_node_before(refnode,TextNode,text=text) node.where = None node.refnode = None return node class Meta: model = TextNode fields = ('text','where','refnode') depth = DEFAULT_NODE_DEPTH class CastNodeSerializer(serializers.ModelSerializer): class Meta: model = CastNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class CastNodeCreateSerializer(serializers.ModelSerializer): refnode = serializers.CharField() where = serializers.CharField() def create(self,validated_data): temp_nadpis = validated_data.pop('nadpis') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') refnode = TreeNode.objects.get(pk=refnode_id) if where == 'syn': node = treelib.create_child(refnode,CastNode,nadpis=temp_nadpis) elif where == 'za': node = treelib.create_node_after(refnode,CastNode,nadpis=temp_nadpis) elif where == 'pred': node = treelib.create_node_before(refnode,CastNode,nadpis=temp_nadpis) node.where = None node.refnode = None return node class Meta: model = CastNode fields = ('nadpis','where','refnode') depth = DEFAULT_NODE_DEPTH class UlohaZadaniNodeSerializer(serializers.ModelSerializer): class Meta: model = UlohaZadaniNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class UlohaZadaniNodeWriteSerializer(serializers.ModelSerializer): uloha = UlohaSerializer() def update(self,node,validated_data): node.uloha.max_body = validated_data.get('uloha').get('max_body') node.uloha.kod = validated_data.get('uloha').get('kod') node.uloha.nazev = validated_data.get('uloha').get('nazev') node.uloha.save() return node class Meta: model = TextNode fields = ('id','uloha') depth = DEFAULT_NODE_DEPTH class UlohaZadaniNodeCreateSerializer(serializers.ModelSerializer): uloha = UlohaSerializer() refnode = serializers.IntegerField() where = serializers.CharField() def create(self,validated_data): # text_zadani = validated_data.pop('text_zadani') temp_uloha = validated_data.pop('uloha') where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') refnode = TreeNode.objects.get(pk=refnode_id) # Z cesty ke koreni stromu zjistime, v jakem jsme tematu a v jakem cisle cislo = None tema = None travelnode = refnode while travelnode is not None: if isinstance(travelnode, TemaVCisleNode): tema = travelnode.tema if isinstance(travelnode, CisloNode): cislo = travelnode.cislo travelnode = treelib.get_parent(travelnode) # Vyrobime ulohu uloha = Uloha.objects.create(cislo_zadani=cislo, nadproblem = tema, **temp_uloha) # A vyrobime UlohaZadaniNode if where == 'syn': node = treelib.create_child(refnode,UlohaZadaniNode,uloha = uloha) elif where == 'za': node = treelib.create_node_after(refnode,UlohaZadaniNode,uloha = uloha) elif where == 'pred': node = treelib.create_node_before(refnode,UlohaZadaniNode,uloha = uloha) node.where = None node.refnode = None node.max_body = None node.kod = None return node class Meta: model = UlohaZadaniNode fields = ('uloha','where','refnode') depth = DEFAULT_NODE_DEPTH class UlohaVzorakNodeSerializer(serializers.ModelSerializer): class Meta: model = UlohaVzorakNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class UlohaVzorakNodeWriteSerializer(serializers.ModelSerializer): uloha = serializers.PrimaryKeyRelatedField(queryset=Uloha.objects.all(), many=False, read_only=False) class Meta: model = UlohaVzorakNode fields = ('id','uloha') depth = DEFAULT_NODE_DEPTH class UlohaVzorakNodeCreateSerializer(serializers.ModelSerializer): uloha_id = serializers.IntegerField() refnode = serializers.IntegerField() where = serializers.CharField() def create(self, validated_data): uloha_id = validated_data.pop('uloha_id') uloha = Uloha.objects.get(pk=uloha_id) where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') refnode = TreeNode.objects.get(pk=refnode_id) if where == 'syn': node = treelib.create_child(refnode,UlohaVzorakNode,uloha = uloha) elif where == 'za': node = treelib.create_node_after(refnode,UlohaVzorakNode,uloha = uloha) elif where == 'pred': node = treelib.create_node_before(refnode,UlohaVzorakNode,uloha = uloha) node.refnode = None node.where = None node.uloha_id = None return node class Meta: model = UlohaVzorakNode fields = ('refnode', 'uloha_id', 'where') depth = DEFAULT_NODE_DEPTH class ReseniNodeSerializer(serializers.ModelSerializer): class Meta: model = ReseniNode fields = '__all__' depth = DEFAULT_NODE_DEPTH class ReseniNodeWriteSerializer(serializers.ModelSerializer): reseni = serializers.PrimaryKeyRelatedField(queryset=Reseni.objects.all(), many=False, read_only=False) class Meta: model = ReseniNode fields = ('id','reseni') depth = DEFAULT_NODE_DEPTH class ReseniNodeCreateSerializer(serializers.ModelSerializer): reseni_id = serializers.IntegerField() refnode = serializers.IntegerField() where = serializers.CharField() def create(self,validated_data): # text_zadani = validated_data.pop('text_zadani') reseni_id = validated_data.pop('reseni_id') reseni = Reseni.objects.get(pk=reseni_id) where = validated_data.pop('where') refnode_id = validated_data.pop('refnode') refnode = TreeNode.objects.get(pk=refnode_id) # A vyrobime UlohaZadaniNode if where == 'syn': node = treelib.create_child(refnode,ReseniNode,reseni = reseni) elif where == 'za': node = treelib.create_node_after(refnode,ReseniNode,reseni = reseni) elif where == 'pred': node = treelib.create_node_before(refnode,ReseniNode,reseni = reseni) node.where = None node.refnode = None node.reseni_id = None return node class Meta: model = ReseniNode fields = ('reseni_id','where','refnode') depth = DEFAULT_NODE_DEPTH class TreeNodeSerializer(PolymorphicSerializer): model_serializer_mapping = { RocnikNode: RocnikNodeSerializer, CisloNode: CisloNodeSerializer, MezicisloNode: MezicisloNodeSerializer, TemaVCisleNode: TemaVCisleNodeSerializer, OrgTextNode: OrgTextNodeSerializer, UlohaZadaniNode: UlohaZadaniNodeSerializer, UlohaVzorakNode: UlohaVzorakNodeSerializer, PohadkaNode: PohadkaNodeSerializer, TextNode: TextNodeSerializer, CastNode: CastNodeSerializer, ReseniNode: ReseniNodeSerializer, }