Simple API for connecting bots.
[redakcja.git] / src / documents / api / serializers.py
diff --git a/src/documents/api/serializers.py b/src/documents/api/serializers.py
new file mode 100644 (file)
index 0000000..9ac5910
--- /dev/null
@@ -0,0 +1,92 @@
+from rest_framework import serializers
+from .. import models
+
+
+class TextField(serializers.Field):
+    def get_attribute(self, instance):
+        return instance
+
+    def to_representation(self, value):
+        return value.materialize()
+
+    def to_internal_value(self, data):
+        return data
+
+
+class BookSerializer(serializers.ModelSerializer):
+    id = serializers.HyperlinkedIdentityField(view_name='documents_api_book')
+
+    class Meta:
+        model = models.Book
+        fields = [
+            'id',
+            'title'
+        ]
+
+
+class ChunkSerializer(serializers.ModelSerializer):
+    id = serializers.HyperlinkedIdentityField(view_name='documents_api_chunk')
+    book = serializers.HyperlinkedRelatedField(view_name='documents_api_book', read_only=True)
+    revisions = serializers.HyperlinkedIdentityField(view_name='documents_api_chunk_revision_list')
+    head = serializers.HyperlinkedRelatedField(view_name='documents_api_revision', read_only=True)
+    ## RelatedField
+
+    class Meta:
+        model = models.Chunk
+        fields = ['id', 'book', 'revisions', 'head', 'user', 'stage']
+
+
+class RHRF(serializers.HyperlinkedRelatedField):
+    def get_queryset(self):
+        return self.context['chunk'].change_set.all();
+
+  
+class RevisionSerializer(serializers.ModelSerializer):
+    id = serializers.HyperlinkedIdentityField(view_name='documents_api_revision')
+    parent = RHRF(
+        view_name='documents_api_revision',
+        queryset=models.Chunk.change_model.objects.all()
+    )
+    merge_parent = RHRF(
+        view_name='documents_api_revision',
+        read_only=True
+    )
+    chunk = serializers.HyperlinkedRelatedField(view_name='documents_api_chunk', read_only=True, source='tree')
+    author = serializers.SerializerMethodField()
+
+    class Meta:
+        model = models.Chunk.change_model
+        fields = ['id', 'chunk', 'created_at', 'author', 'author_email', 'author_name', 'parent', 'merge_parent']
+        read_only_fields = ['author_email', 'author_name']
+
+    def get_author(self, obj):
+        return obj.author.username if obj.author is not None else None
+        
+
+class BookDetailSerializer(BookSerializer):
+    chunk = ChunkSerializer(many=True, source='chunk_set')
+
+    class Meta:
+        model = models.Book
+        fields = BookSerializer.Meta.fields + ['chunk']
+
+
+
+class ChunkDetailSerializer(ChunkSerializer):
+    pass
+
+
+class RevisionDetailSerializer(RevisionSerializer):
+    text = TextField()
+
+    class Meta(RevisionSerializer.Meta):
+        fields = RevisionSerializer.Meta.fields + ['description', 'text']
+
+    def create(self, validated_data):
+        chunk = self.context['chunk']
+        return chunk.commit(
+            validated_data['text'],
+            author=self.context['request'].user, # what if anonymous?
+            description=validated_data['description'],
+            parent=validated_data.get('parent'),
+        )