diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py index efc4a72300..6dfbf40db2 100644 --- a/mayan/apps/metadata/api_views.py +++ b/mayan/apps/metadata/api_views.py @@ -15,7 +15,7 @@ from permissions import Permission from rest_api.filters import MayanObjectPermissionsFilter from rest_api.permissions import MayanPermission -from .models import DocumentMetadata, MetadataType +from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType from .permissions import ( permission_metadata_document_add, permission_metadata_document_remove, permission_metadata_document_edit, permission_metadata_document_view, @@ -265,10 +265,15 @@ class APIDocumentTypeMetadataTypeOptionalListView(generics.ListCreateAPIView): metadata_type = get_object_or_404( MetadataType, pk=serializer.data['metadata_type_pk'] ) - document_type.metadata_type.add( - metadata_type, required=self.required_metadata + document_type_metadata_type = document_type.metadata.create( + metadata_type=metadata_type, required=self.required_metadata + ) + return Response( + status=status.HTTP_201_CREATED, + data={ + 'pk': document_type_metadata_type.pk + } ) - return Response(status=status.HTTP_201_CREATED) else: return Response(status=status.HTTP_400_BAD_REQUEST) @@ -291,18 +296,19 @@ class APIDocumentTypeMetadataTypeRequiredListView(APIDocumentTypeMetadataTypeOpt """ return super( APIDocumentTypeMetadataTypeRequiredListView, self - ).get(*args, **kwargs) + ).post(request, *args, **kwargs) -class APIDocumentTypeMetadataTypeRequiredView(views.APIView): +class APIDocumentTypeMetadataTypeView(views.APIView): def delete(self, request, *args, **kwargs): """ Remove a metadata type from a document type. """ - document_type = get_object_or_404( - DocumentType, pk=self.kwargs['document_type_pk'] + document_type_metadata_type = get_object_or_404( + DocumentTypeMetadataType, pk=self.kwargs['pk'] ) + try: Permission.check_permissions( self.request.user, (permission_document_type_edit,) @@ -310,11 +316,8 @@ class APIDocumentTypeMetadataTypeRequiredView(views.APIView): except PermissionDenied: AccessControlList.objects.check_access( permission_document_type_edit, self.request.user, - document_type + document_type_metadata_type.document_type ) - metadata_type = get_object_or_404( - MetadataType, pk=self.kwargs['metadata_type_pk'] - ) - document_type.metadata_type.remove(metadata_type) + document_type_metadata_type.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index bdecbabd68..cb59e3678a 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -38,6 +38,6 @@ class DocumentNewMetadataSerializer(serializers.Serializer): class DocumentTypeNewMetadataTypeSerializer(serializers.Serializer): - metadata_type = serializers.IntegerField( + metadata_type_pk = serializers.IntegerField( help_text=_('Primary key of the metadata type to be added.') ) diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py index bfa049db46..652bd3e70a 100644 --- a/mayan/apps/metadata/tests/test_api.py +++ b/mayan/apps/metadata/tests/test_api.py @@ -84,3 +84,98 @@ class MetadataTypeAPITestCase(APITestCase): self.assertEqual(metadata_type.label, TEST_METADATA_TYPE_LABEL_2) self.assertEqual(metadata_type.name, TEST_METADATA_TYPE_NAME_2) + + +class DocumentTypeMetadataTypeAPITestCase(APITestCase): + def setUp(self): + self.admin_user = get_user_model().objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE + ) + + self.metadata_type = MetadataType.objects.create( + label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME + ) + + def tearDown(self): + self.admin_user.delete() + self.document_type.delete() + + def test_document_type_metadata_type_optional_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttypeoptionalmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=False).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + def test_document_type_metadata_type_required_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttyperequiredmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + + def test_document_type_metadata_type_required_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttyperequiredmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + def test_document_type_metadata_type_delete(self): + document_type_metadata_type = self.document_type.metadata.create( + metadata_type=self.metadata_type, required=True + ) + + response = self.client.delete( + reverse( + 'rest_api:documenttypemetadatatype-detail', + args=(document_type_metadata_type.pk,) + ), + ) + + self.assertEqual(response.status_code, 204) + + self.assertEqual(self.document_type.metadata.all().count(), 0) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index e0eea49a8a..79e1505a20 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -6,7 +6,7 @@ from .api_views import ( APIDocumentMetadataListView, APIDocumentMetadataView, APIDocumentTypeMetadataTypeOptionalListView, APIDocumentTypeMetadataTypeRequiredListView, - APIDocumentTypeMetadataTypeRequiredView, APIMetadataTypeListView, + APIDocumentTypeMetadataTypeView, APIMetadataTypeListView, APIMetadataTypeView ) from .views import ( @@ -93,16 +93,16 @@ api_urls = patterns( url( r'^document_type/(?P[0-9]+)/metadatatypes/optional/$', APIDocumentTypeMetadataTypeOptionalListView.as_view(), - name='documenttypemetadatatype-list' + name='documenttypeoptionalmetadatatype-list' ), url( r'^document_type/(?P[0-9]+)/metadatatypes/required/$', APIDocumentTypeMetadataTypeRequiredListView.as_view(), - name='documenttypemetadatatype-list' + name='documenttyperequiredmetadatatype-list' ), url( - r'^document_type/(?P[0-9]+)/metadatatypes/(?P[0-9]+)/$', - APIDocumentTypeMetadataTypeRequiredView.as_view(), + r'^document_type_metadata_type/(?P\d+)/$', + APIDocumentTypeMetadataTypeView.as_view(), name='documenttypemetadatatype-detail' ), )