paperless-ngx/src/documents/serialisers.py

254 lines
6.4 KiB
Python
Raw Normal View History

import magic
from django.utils.text import slugify
2016-02-16 09:28:34 +00:00
from rest_framework import serializers
2020-12-07 21:51:00 +01:00
from rest_framework.fields import SerializerMethodField
2016-02-16 09:28:34 +00:00
2020-12-12 15:46:56 +01:00
from .models import Correspondent, Tag, Document, Log, DocumentType, \
SavedView, SavedViewFilterRule
from .parsers import is_mime_type_supported
2016-02-16 09:28:34 +00:00
class CorrespondentSerializer(serializers.ModelSerializer):
2016-02-16 09:28:34 +00:00
2020-10-21 12:53:14 +02:00
document_count = serializers.IntegerField(read_only=True)
last_correspondence = serializers.DateTimeField(read_only=True)
def get_slug(self, obj):
return slugify(obj.name)
slug = SerializerMethodField()
2018-09-02 21:26:06 +01:00
class Meta:
model = Correspondent
2019-01-27 12:52:15 +00:00
fields = (
"id",
"slug",
"name",
"match",
"matching_algorithm",
"is_insensitive",
2020-10-21 12:53:14 +02:00
"document_count",
"last_correspondence"
2019-05-21 13:06:16 +02:00
)
2016-02-16 09:28:34 +00:00
class DocumentTypeSerializer(serializers.ModelSerializer):
2018-09-05 15:25:14 +02:00
2020-10-21 12:53:14 +02:00
document_count = serializers.IntegerField(read_only=True)
def get_slug(self, obj):
return slugify(obj.name)
slug = SerializerMethodField()
2018-12-11 12:26:44 +01:00
class Meta:
2018-09-05 15:25:14 +02:00
model = DocumentType
2019-05-21 13:06:16 +02:00
fields = (
"id",
"slug",
"name",
"match",
"matching_algorithm",
"is_insensitive",
2020-10-21 12:53:14 +02:00
"document_count"
2019-01-27 12:52:15 +00:00
)
2018-09-05 15:25:14 +02:00
class TagSerializer(serializers.ModelSerializer):
2016-02-16 09:28:34 +00:00
2020-10-21 12:53:14 +02:00
document_count = serializers.IntegerField(read_only=True)
def get_slug(self, obj):
return slugify(obj.name)
slug = SerializerMethodField()
2018-09-02 21:26:06 +01:00
class Meta:
2016-02-16 09:28:34 +00:00
model = Tag
2016-02-21 00:14:50 +00:00
fields = (
2019-01-27 12:52:15 +00:00
"id",
"slug",
"name",
"colour",
"match",
"matching_algorithm",
"is_insensitive",
2020-10-21 12:53:14 +02:00
"is_inbox_tag",
"document_count"
2019-01-27 12:52:15 +00:00
)
2016-02-16 09:28:34 +00:00
class CorrespondentField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
return Correspondent.objects.all()
class TagsField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
return Tag.objects.all()
class DocumentTypeField(serializers.PrimaryKeyRelatedField):
2018-09-05 15:25:14 +02:00
def get_queryset(self):
return DocumentType.objects.all()
2016-02-16 09:28:34 +00:00
class DocumentSerializer(serializers.ModelSerializer):
2020-12-03 19:56:52 +01:00
correspondent = CorrespondentField(allow_null=True)
tags = TagsField(many=True)
document_type = DocumentTypeField(allow_null=True)
2020-12-07 21:51:00 +01:00
original_file_name = SerializerMethodField()
archived_file_name = SerializerMethodField()
def get_original_file_name(self, obj):
return obj.get_public_filename()
def get_archived_file_name(self, obj):
if obj.archive_checksum:
return obj.get_public_filename(archive=True)
else:
return None
2018-09-02 21:26:06 +01:00
class Meta:
2016-02-16 09:28:34 +00:00
model = Document
2020-10-21 12:16:25 +02:00
depth = 1
2016-02-16 09:28:34 +00:00
fields = (
"id",
2016-03-04 09:14:50 +00:00
"correspondent",
2018-09-05 15:25:14 +02:00
"document_type",
2016-02-16 09:28:34 +00:00
"title",
"content",
"tags",
"created",
"modified",
"added",
2020-12-07 21:51:00 +01:00
"archive_serial_number",
"original_file_name",
"archived_file_name",
2016-02-16 09:28:34 +00:00
)
2016-03-01 18:57:12 +00:00
class LogSerializer(serializers.ModelSerializer):
2018-09-02 21:26:06 +01:00
class Meta:
2016-03-01 18:57:12 +00:00
model = Log
fields = (
2020-11-02 01:24:56 +01:00
"id",
"created",
"message",
"group",
"level"
2016-03-01 18:57:12 +00:00
)
2020-12-12 15:46:56 +01:00
class SavedViewFilterRuleSerializer(serializers.ModelSerializer):
class Meta:
model = SavedViewFilterRule
fields = ["rule_type", "value"]
class SavedViewSerializer(serializers.ModelSerializer):
filter_rules = SavedViewFilterRuleSerializer(many=True)
class Meta:
model = SavedView
depth = 1
fields = ["id", "name", "show_on_dashboard", "show_in_sidebar",
"sort_field", "sort_reverse", "filter_rules"]
def update(self, instance, validated_data):
2020-12-15 02:35:04 +01:00
if 'filter_rules' in validated_data:
rules_data = validated_data.pop('filter_rules')
else:
rules_data = None
2020-12-12 15:46:56 +01:00
super(SavedViewSerializer, self).update(instance, validated_data)
2020-12-15 02:35:04 +01:00
if rules_data:
SavedViewFilterRule.objects.filter(saved_view=instance).delete()
for rule_data in rules_data:
2020-12-15 12:06:24 +01:00
SavedViewFilterRule.objects.create(
saved_view=instance, **rule_data)
2020-12-12 15:46:56 +01:00
return instance
def create(self, validated_data):
rules_data = validated_data.pop('filter_rules')
saved_view = SavedView.objects.create(**validated_data)
for rule_data in rules_data:
2020-12-15 12:06:24 +01:00
SavedViewFilterRule.objects.create(
saved_view=saved_view, **rule_data)
2020-12-12 15:46:56 +01:00
return saved_view
class PostDocumentSerializer(serializers.Serializer):
document = serializers.FileField(
label="Document",
write_only=True,
)
title = serializers.CharField(
label="Title",
write_only=True,
required=False,
)
correspondent = serializers.PrimaryKeyRelatedField(
queryset=Correspondent.objects.all(),
label="Correspondent",
allow_null=True,
write_only=True,
required=False,
)
document_type = serializers.PrimaryKeyRelatedField(
queryset=DocumentType.objects.all(),
label="Document type",
allow_null=True,
write_only=True,
required=False,
)
tags = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Tag.objects.all(),
label="Tags",
write_only=True,
required=False,
)
def validate_document(self, document):
document_data = document.file.read()
mime_type = magic.from_buffer(document_data, mime=True)
if not is_mime_type_supported(mime_type):
raise serializers.ValidationError(
"This file type is not supported.")
return document.name, document_data
def validate_title(self, title):
if title:
return title
else:
# do not return empty strings.
return None
def validate_correspondent(self, correspondent):
if correspondent:
return correspondent.id
else:
return None
def validate_document_type(self, document_type):
if document_type:
return document_type.id
else:
return None
def validate_tags(self, tags):
if tags:
return [tag.id for tag in tags]
else:
return None