From cff4a97d340493f252b1779ee12e3775f0af696a Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 13 Dec 2014 06:40:57 -0400 Subject: [PATCH] Simplify document metadata API endpoints, make document metadata endpoints more consistent, improve error reporting --- mayan/apps/metadata/api_views.py | 27 +++++++++++++++++---------- mayan/apps/metadata/serializers.py | 13 +++++-------- mayan/apps/metadata/urls.py | 2 +- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py index 7bfa95293a..b341f80d83 100644 --- a/mayan/apps/metadata/api_views.py +++ b/mayan/apps/metadata/api_views.py @@ -25,7 +25,7 @@ from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_TYPE_EDIT, PERMISSION_METADATA_TYPE_VIEW) from .serializers import (DocumentMetadataSerializer, - DocumentMetadataNestedSerializer, + DocumentNewMetadataSerializer, DocumentTypeNewMetadataTypeSerializer, MetadataTypeSerializer) @@ -94,9 +94,9 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): def get_serializer_class(self): if self.request.method == 'GET': - return DocumentMetadataNestedSerializer - elif self.request.method == 'POST': return DocumentMetadataSerializer + elif self.request.method == 'POST': + return DocumentNewMetadataSerializer def get(self, *args, **kwargs): """Returns a list of selected document's metadata types and values.""" @@ -114,15 +114,15 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): serializer = self.get_serializer(data=self.request.POST) if serializer.is_valid(): - metadata_type = get_object_or_404(MetadataType, pk=serializer.data['metadata_type']) + metadata_type = get_object_or_404(MetadataType, pk=serializer.data['metadata_type_pk']) try: - document.document_metadata.create(metadata_type=metadata_type, value=serializer.data['value']) + document.metadata.create(metadata_type=metadata_type, value=serializer.data['value']) except Exception as exception: - return Response(status=status.HTTP_400_BAD_REQUEST) + return Response(status=status.HTTP_400_BAD_REQUEST, data={'non_field_errors': unicode(exception)}) else: return Response(status=status.HTTP_201_CREATED) else: - return Response(status=status.HTTP_400_BAD_REQUEST) + return Response(status=status.HTTP_400_BAD_REQUEST, data=serializer.errors) class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): @@ -142,7 +142,7 @@ class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): try: return super(APIDocumentMetadataView, self).delete(*args, **kwargs) except Exception as exception: - return Response(status=status.HTTP_400_BAD_REQUEST) + return Response(status=status.HTTP_400_BAD_REQUEST, data={'non_fields_errors': unicode(exception)}) def get(self, *args, **kwargs): """Return the details of the selected document metadata type and value.""" @@ -150,11 +150,18 @@ class APIDocumentMetadataView(generics.RetrieveUpdateDestroyAPIView): def patch(self, *args, **kwargs): """Edit the selected document metadata type and value.""" - return super(APIDocumentMetadataView, self).patch(*args, **kwargs) + try: + return super(APIDocumentMetadataView, self).patch(*args, **kwargs) + except Exception as exception: + return Response(status=status.HTTP_400_BAD_REQUEST, data={'non_fields_errors': unicode(exception)}) def put(self, *args, **kwargs): """Edit the selected document metadata type and value.""" - return super(APIDocumentMetadataView, self).put(*args, **kwargs) + try: + return super(APIDocumentMetadataView, self).put(*args, **kwargs) + except Exception as exception: + return Response(status=status.HTTP_400_BAD_REQUEST, data={'non_fields_errors': unicode(exception)}) + class APIDocumentTypeMetadataTypeOptionalListView(generics.ListCreateAPIView): diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index 0005161869..b322c6d43c 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -13,19 +13,16 @@ class MetadataTypeSerializer(serializers.ModelSerializer): model = MetadataType -class DocumentMetadataNestedSerializer(serializers.ModelSerializer): - metadata_type = MetadataTypeSerializer() - - class Meta: - fields = ('id', 'metadata_type', 'value') - model = DocumentMetadata - - class DocumentMetadataSerializer(serializers.ModelSerializer): class Meta: fields = ('id', 'metadata_type', 'value') model = DocumentMetadata +class DocumentNewMetadataSerializer(serializers.Serializer): + metadata_type_pk = serializers.IntegerField(help_text=_('Primary key of the metadata type to be added.')) + value = serializers.CharField(max_length=255, help_text=_('Value of the corresponding metadata type instance.')) + + class DocumentTypeNewMetadataTypeSerializer(serializers.Serializer): metadata_type_pk = serializers.IntegerField(help_text=_('Primary key of the metadata type to be added.')) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index 527e557c1b..accf23142f 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -27,8 +27,8 @@ urlpatterns = patterns('metadata.views', api_urls = patterns('', url(r'^metadatatypes/$', APIMetadataTypeListView.as_view(), name='metadatatype-list'), url(r'^metadatatypes/(?P[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'), + url(r'^document/metadata/(?P[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'), url(r'^document/(?P[0-9]+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list'), - url(r'^document/(?P[0-9]+)/metadata/(?P[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'), url(r'^document_type/(?P[0-9]+)/metadatatypes/optional/$', APIDocumentTypeMetadataTypeOptionalListView.as_view(), name='documenttypemetadatatype-list'), url(r'^document_type/(?P[0-9]+)/metadatatypes/required/$', APIDocumentTypeMetadataTypeRequiredListView.as_view(), name='documenttypemetadatatype-list'), url(r'^document_type/(?P[0-9]+)/metadatatypes/(?P[0-9]+)/$', APIDocumentTypeMetadataTypeRequiredView.as_view(), name='documenttypemetadatatype-detail'),