Simplify document metadata API endpoints, make document metadata endpoints more consistent, improve error reporting

This commit is contained in:
Roberto Rosario
2014-12-13 06:40:57 -04:00
parent 790c5745f8
commit cff4a97d34
3 changed files with 23 additions and 19 deletions

View File

@@ -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):

View File

@@ -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.'))

View File

@@ -27,8 +27,8 @@ urlpatterns = patterns('metadata.views',
api_urls = patterns('',
url(r'^metadatatypes/$', APIMetadataTypeListView.as_view(), name='metadatatype-list'),
url(r'^metadatatypes/(?P<pk>[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail'),
url(r'^document/metadata/(?P<pk>[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'),
url(r'^document/(?P<document_pk>[0-9]+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list'),
url(r'^document/(?P<document_pk>[0-9]+)/metadata/(?P<pk>[0-9]+)/$', APIDocumentMetadataView.as_view(), name='documentmetadata-detail'),
url(r'^document_type/(?P<document_type_pk>[0-9]+)/metadatatypes/optional/$', APIDocumentTypeMetadataTypeOptionalListView.as_view(), name='documenttypemetadatatype-list'),
url(r'^document_type/(?P<document_type_pk>[0-9]+)/metadatatypes/required/$', APIDocumentTypeMetadataTypeRequiredListView.as_view(), name='documenttypemetadatatype-list'),
url(r'^document_type/(?P<document_type_pk>[0-9]+)/metadatatypes/(?P<metadata_type_pk>[0-9]+)/$', APIDocumentTypeMetadataTypeRequiredView.as_view(), name='documenttypemetadatatype-detail'),