Files
mayan-edms/mayan/apps/linking/serializers.py
Roberto Rosario 36a51eeb73 Switch to full app paths
Instead of inserting the path of the apps into the Python app,
the apps are now referenced by their full import path.

This solves name clashes with external or native Python libraries.
Example: Mayan statistics app vs. Python new statistics library.

Every app reference is now prepended with 'mayan.apps'.

Existing config.yml files need to be updated manually.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2019-04-05 02:02:57 -04:00

150 lines
5.2 KiB
Python

from __future__ import absolute_import, unicode_literals
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 mayan.apps.documents.models import DocumentType
from mayan.apps.documents.serializers import (
DocumentSerializer, DocumentTypeSerializer
)
from .models import SmartLink, SmartLinkCondition
class SmartLinkConditionSerializer(serializers.HyperlinkedModelSerializer):
smart_link_url = serializers.SerializerMethodField()
url = serializers.SerializerMethodField()
class Meta:
fields = (
'enabled', 'expression', 'foreign_document_data', 'inclusion',
'id', 'negated', 'operator', 'smart_link_url', 'url'
)
model = SmartLinkCondition
def create(self, validated_data):
validated_data['smart_link'] = self.context['smart_link']
return super(SmartLinkConditionSerializer, self).create(validated_data)
def get_smart_link_url(self, instance):
return reverse(
'rest_api:smartlink-detail', args=(instance.smart_link.pk,),
request=self.context['request'], format=self.context['format']
)
def get_url(self, instance):
return reverse(
'rest_api:smartlinkcondition-detail', args=(
instance.smart_link.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
class SmartLinkSerializer(serializers.HyperlinkedModelSerializer):
conditions_url = serializers.HyperlinkedIdentityField(
view_name='rest_api:smartlinkcondition-list'
)
document_types = DocumentTypeSerializer(read_only=True, many=True)
class Meta:
extra_kwargs = {
'url': {'view_name': 'rest_api:smartlink-detail'},
}
fields = (
'conditions_url', 'document_types', 'dynamic_label', 'enabled',
'label', 'id', 'url'
)
model = SmartLink
class ResolvedSmartLinkDocumentSerializer(DocumentSerializer):
resolved_smart_link_url = serializers.SerializerMethodField()
class Meta(DocumentSerializer.Meta):
fields = DocumentSerializer.Meta.fields + (
'resolved_smart_link_url',
)
read_only_fields = DocumentSerializer.Meta.fields
def get_resolved_smart_link_url(self, instance):
return reverse(
'rest_api:resolvedsmartlink-detail', args=(
self.context['document'].pk, self.context['smart_link'].pk
), request=self.context['request'],
format=self.context['format']
)
class ResolvedSmartLinkSerializer(SmartLinkSerializer):
resolved_dynamic_label = serializers.SerializerMethodField()
resolved_smart_link_url = serializers.SerializerMethodField()
resolved_documents_url = serializers.SerializerMethodField()
class Meta(SmartLinkSerializer.Meta):
fields = SmartLinkSerializer.Meta.fields + (
'resolved_dynamic_label', 'resolved_smart_link_url',
'resolved_documents_url'
)
read_only_fields = SmartLinkSerializer.Meta.fields
def get_resolved_documents_url(self, instance):
return reverse(
'rest_api:resolvedsmartlinkdocument-list',
args=(self.context['document'].pk, instance.pk,),
request=self.context['request'], format=self.context['format']
)
def get_resolved_dynamic_label(self, instance):
return instance.get_dynamic_label(document=self.context['document'])
def get_resolved_smart_link_url(self, instance):
return reverse(
'rest_api:resolvedsmartlink-detail',
args=(self.context['document'].pk, instance.pk,),
request=self.context['request'], format=self.context['format']
)
class WritableSmartLinkSerializer(serializers.ModelSerializer):
conditions_url = serializers.HyperlinkedIdentityField(
view_name='rest_api:smartlinkcondition-list'
)
document_types_pk_list = serializers.CharField(
help_text=_(
'Comma separated list of document type primary keys to which this '
'smart link will be attached.'
), required=False
)
class Meta:
extra_kwargs = {
'url': {'view_name': 'rest_api:smartlink-detail'},
}
fields = (
'conditions_url', 'document_types_pk_list', 'dynamic_label',
'enabled', 'label', 'id', 'url'
)
model = SmartLink
def validate(self, attrs):
document_types_pk_list = attrs.pop('document_types_pk_list', None)
document_types_result = []
if document_types_pk_list:
for pk in document_types_pk_list.split(','):
try:
document_type = DocumentType.objects.get(pk=pk)
except DocumentType.DoesNotExist:
raise ValidationError(_('No such document type: %s') % pk)
else:
# Accumulate valid stored document_type pks
document_types_result.append(document_type.pk)
attrs['document_types'] = DocumentType.objects.filter(
pk__in=document_types_result
)
return attrs