Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
9.0 KiB
317 lines
9.0 KiB
from rest_framework import serializers
|
|
from rest_polymorphic.serializers import PolymorphicSerializer
|
|
|
|
from odevzdavatko.models import Reseni
|
|
from tvorba.models import Problem, Uloha
|
|
|
|
from .models import RocnikNode, CisloNode, MezicisloNode, TemaVCisleNode, OrgTextNode, PohadkaNode, TextNode, TreeNode, CastNode, UlohaZadaniNode, UlohaVzorakNode, ReseniNode
|
|
from .models import Text
|
|
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,
|
|
}
|
|
|
|
|