diff --git a/mamweb/routers.py b/mamweb/routers.py index cd9907a4..ee310427 100644 --- a/mamweb/routers.py +++ b/mamweb/routers.py @@ -4,4 +4,6 @@ from seminar import viewsets as vs router = routers.DefaultRouter() router.register(r'ulohavzoraknode', vs.UlohaVzorakNodeViewSet) +router.register(r'text', vs.TextViewSet) +router.register(r'textnode', vs.TextNodeViewSet) diff --git a/seminar/views/views_rest.py b/seminar/views/views_rest.py index 0224383b..8cee4fd1 100644 --- a/seminar/views/views_rest.py +++ b/seminar/views/views_rest.py @@ -2,9 +2,17 @@ from rest_framework import serializers from rest_polymorphic.serializers import PolymorphicSerializer import seminar.models as m +from seminar import treelib DEFAULT_NODE_DEPTH = 2 +class TextSerializer(serializers.ModelSerializer): + class Meta: + model = m.Text + fields = '__all__' + + + class UlohaVzorakNodeSerializer(serializers.ModelSerializer): class Meta: model = m.UlohaVzorakNode @@ -54,9 +62,44 @@ class PohadkaNodeSerializer(serializers.ModelSerializer): depth = DEFAULT_NODE_DEPTH class TextNodeSerializer(serializers.ModelSerializer): + text = TextSerializer() + class Meta: model = m.TextNode - fields = '__all__' + 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') + return node + + class Meta: + model = m.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 = m.TreeNode.objects.get(pk=refnode_id) + text = m.Text.objects.create(**temp_text) + node = treelib.create_child(refnode,m.TextNode,text=text) + node.where = None + node.refnode = None + return node + + class Meta: + model = m.TextNode + fields = ('text','where','refnode') depth = DEFAULT_NODE_DEPTH class CastNodeSerializer(serializers.ModelSerializer): @@ -85,5 +128,5 @@ class TreeNodeSerializer(PolymorphicSerializer): m.TextNode: TextNodeSerializer, m.CastNode: CastNodeSerializer, m.ReseniNode: ReseniNodeSerializer, - } + diff --git a/seminar/viewsets.py b/seminar/viewsets.py index aab12b7d..a0c0750d 100644 --- a/seminar/viewsets.py +++ b/seminar/viewsets.py @@ -2,6 +2,59 @@ from rest_framework import viewsets,filters from . import models as m from . import views +class ReadWriteSerializerMixin(object): + """ + Overrides get_serializer_class to choose the read serializer + for GET requests and the write serializer for POST requests. + + Set read_serializer_class and write_serializer_class attributes on a + viewset. + """ + + read_serializer_class = None + create_serializer_class = None + write_serializer_class = None + + def get_serializer_class(self): + if self.action == "create": + return self.get_create_serializer_class() + if self.action in ["update", "partial_update", "destroy"]: + return self.get_write_serializer_class() + return self.get_read_serializer_class() + + def get_read_serializer_class(self): + assert self.read_serializer_class is not None, ( + "'%s' should either include a `read_serializer_class` attribute," + "or override the `get_read_serializer_class()` method." + % self.__class__.__name__ + ) + return self.read_serializer_class + + def get_write_serializer_class(self): + assert self.write_serializer_class is not None, ( + "'%s' should either include a `write_serializer_class` attribute," + "or override the `get_write_serializer_class()` method." + % self.__class__.__name__ + ) + return self.write_serializer_class + + def get_create_serializer_class(self): + assert self.create_serializer_class is not None, ( + "'%s' should either include a `create_serializer_class` attribute," + "or override the `get_create_serializer_class()` method." + % self.__class__.__name__ + ) + return self.create_serializer_class + class UlohaVzorakNodeViewSet(viewsets.ModelViewSet): queryset = m.UlohaVzorakNode.objects.all() serializer_class = views.UlohaVzorakNodeSerializer + +class TextViewSet(viewsets.ModelViewSet): + queryset = m.Text.objects.all() + serializer_class = views.TextSerializer + +class TextNodeViewSet(ReadWriteSerializerMixin,viewsets.ModelViewSet): + queryset = m.TextNode.objects.all() + read_serializer_class = views.TextNodeSerializer + write_serializer_class = views.TextNodeWriteSerializer diff --git a/vue_frontend/src/components/AddNewNode.vue b/vue_frontend/src/components/AddNewNode.vue index e948f1cd..ffbd33ef 100644 --- a/vue_frontend/src/components/AddNewNode.vue +++ b/vue_frontend/src/components/AddNewNode.vue @@ -6,7 +6,7 @@