Files
mayan-edms/mayan/apps/metadata/serializers.py
Roberto Rosario 70dfb1561d Refactor the metadata API to conform to best practices.
Perform model validation on document type metadata type and
document type API endpoints.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2017-02-23 02:13:59 -04:00

160 lines
5.0 KiB
Python

from __future__ import unicode_literals
from django.core.exceptions import ValidationError as DjangoValidationError
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.reverse import reverse
from documents.serializers import DocumentSerializer, DocumentTypeSerializer
from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType
class MetadataTypeSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
extra_kwargs = {
'url': {
'lookup_field': 'pk', 'lookup_url_kwarg': 'metadata_type_pk',
'view_name': 'rest_api:metadatatype-detail'
},
}
fields = (
'default', 'id', 'label', 'lookup', 'name', 'parser', 'url',
'validation'
)
model = MetadataType
class DocumentTypeMetadataTypeSerializer(serializers.HyperlinkedModelSerializer):
document_type = DocumentTypeSerializer(read_only=True)
metadata_type = MetadataTypeSerializer(read_only=True)
url = serializers.SerializerMethodField()
class Meta:
fields = ('document_type', 'id', 'metadata_type', 'required', 'url')
model = DocumentTypeMetadataType
def get_url(self, instance):
return reverse(
'rest_api:documenttypemetadatatype-detail', args=(
instance.document_type.pk, instance.pk
), request=self.context['request'], format=self.context['format']
)
class NewDocumentTypeMetadataTypeSerializer(serializers.ModelSerializer):
metadata_type_pk = serializers.IntegerField(
help_text=_('Primary key of the metadata type to be added.'),
write_only=True
)
url = serializers.SerializerMethodField()
class Meta:
fields = (
'id', 'metadata_type_pk', 'required', 'url'
)
model = DocumentTypeMetadataType
def get_url(self, instance):
return reverse(
'rest_api:documenttypemetadatatype-detail', args=(
instance.document_type.pk, instance.pk
), request=self.context['request'], format=self.context['format']
)
def validate(self, attrs):
attrs['document_type'] = self.context['document_type']
attrs['metadata_type'] = MetadataType.objects.get(
pk=attrs.pop('metadata_type_pk')
)
instance = DocumentTypeMetadataType(**attrs)
try:
instance.full_clean()
except DjangoValidationError as exception:
raise ValidationError(exception)
return attrs
class WritableDocumentTypeMetadataTypeSerializer(serializers.ModelSerializer):
url = serializers.SerializerMethodField()
class Meta:
fields = (
'id', 'required', 'url'
)
model = DocumentTypeMetadataType
def get_url(self, instance):
return reverse(
'rest_api:documenttypemetadatatype-detail', args=(
instance.document_type.pk, instance.pk
), request=self.context['request'], format=self.context['format']
)
class DocumentMetadataSerializer(serializers.HyperlinkedModelSerializer):
document = DocumentSerializer(read_only=True)
metadata_type = MetadataTypeSerializer(read_only=True)
url = serializers.SerializerMethodField()
class Meta:
fields = ('document', 'id', 'metadata_type', 'url', 'value')
model = DocumentMetadata
read_only_fields = ('document', 'metadata_type',)
def get_url(self, instance):
return reverse(
'rest_api:documentmetadata-detail', args=(
instance.document.pk, instance.pk
), request=self.context['request'], format=self.context['format']
)
def validate(self, attrs):
self.instance.value = attrs['value']
try:
self.instance.full_clean()
except DjangoValidationError as exception:
raise ValidationError(exception)
return attrs
class NewDocumentMetadataSerializer(serializers.ModelSerializer):
metadata_type_pk = serializers.IntegerField(
help_text=_(
'Primary key of the metadata type to be added to the document.'
),
write_only=True
)
url = serializers.SerializerMethodField()
class Meta:
fields = ('id', 'metadata_type_pk', 'url', 'value')
model = DocumentMetadata
def get_url(self, instance):
return reverse(
'rest_api:documentmetadata-detail', args=(
instance.document.pk, instance.pk
), request=self.context['request'], format=self.context['format']
)
def validate(self, attrs):
attrs['document'] = self.context['document']
attrs['metadata_type'] = MetadataType.objects.get(
pk=attrs.pop('metadata_type_pk')
)
instance = DocumentMetadata(**attrs)
try:
instance.full_clean()
except DjangoValidationError as exception:
raise ValidationError(exception)
return attrs