def patch(self, request, registry_id):
        """Update oai-pmh information for a given registry (Data provider)

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 200
              content: Success message
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            registry = oai_registry_api.update_registry_info(registry,
                                                             request=request)
            content = OaiPmhMessage.get_message_labelled(
                "Registry {0} information updated with success.".format(
                    registry.name))

            return Response(content, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def get(self, request, set_id):
        """Get a OaiProviderSet

        Args:

            request: HTTP request
            set_id: ObjectId

        Returns:

            - code: 200
              content: Registry
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            set_ = oai_provider_set_api.get_by_id(set_id)
            serializer = serializers.OaiProviderSetSerializer(
                set_, context={"request": request}
            )

            return Response(serializer.data, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                "No Set found with the given id."
            )
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#3
0
    def patch(self, request, registry_id):
        """ Deactivate a given registry (Data provider)

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 200
              content: Success message
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            registry.is_activated = False
            oai_registry_api.upsert(registry)
            content = OaiPmhMessage.get_message_labelled(
                'Registry {0} deactivated with success.'.format(registry.name))

            return Response(content, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                'No registry found with the given id.')
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def get(self, request):
        """Check if the registry is available to answer OAI-PMH requests

        Args:

            request: HTTP request

        Returns:

            - code: 200
              content: Success label
            - code: 500
              content: Internal server error
        """
        try:
            base_url = request.build_absolute_uri(
                reverse("core_oaipmh_provider_app_server_index"))
            http_response = send_get_request(base_url)
            is_available = http_response.status_code == status.HTTP_200_OK
            content = OaiPmhMessage.get_message_labelled(
                "Registry available? : {0}.".format(is_available))

            return Response(content, status=http_response.status_code)
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#5
0
def sickle_list_metadata_formats(url):
    """Performs an Oai-Pmh listMetadataFormat request.

    Args:
        url: URL of the Data Provider.

    Returns:
        Data.
        Status code.

    """
    try:
        sickle = _sickle_init(url)
        list_metadata_formats = sickle.ListMetadataFormats()
        serializer = sickle_serializers.MetadataFormatSerializer(
            list_metadata_formats, many=True)
        return serializer.data, status.HTTP_200_OK
    except NoMetadataFormat as e:
        # This repository does not support sets
        content = OaiPmhMessage.get_message_labelled("%s" % str(e))
        return content, status.HTTP_204_NO_CONTENT
    except Exception as e:
        content = OaiPmhMessage.get_message_labelled(
            "An error occurred when attempting to get the metadata formats: %s"
            % str(e))
        return content, status.HTTP_500_INTERNAL_SERVER_ERROR
    def delete(self, request, set_id):
        """Delete a OaiProviderSet

        Args:

            request: HTTP request
            set_id: ObjectId

        Returns:

            - code: 204
              content: Deletion succeed
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            set_ = oai_provider_set_api.get_by_id(set_id)
            oai_provider_set_api.delete(set_)

            return Response(status=status.HTTP_204_NO_CONTENT)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                "No Set found with the given id."
            )
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#7
0
    def get(self, request, registry_id):
        """ Retrieve a Registry (Data provider)

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 200
              content: Registry
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            serializer = serializers.RegistrySerializer(registry)

            return Response(serializer.data, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                'No registry found with the given id.')
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def delete(self, request, registry_id):
        """ Delete a Registry (Data provider)

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 204
              content: Deletion succeed
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            oai_registry_api.delete(registry)

            return Response(status=status.HTTP_204_NO_CONTENT)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled('No registry found with the given id.')
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(e.message)
            return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def delete(self, request):
        """Remove the mapping between a template, a metadata format and a XSLT

        Parameters:

            {
                "template_id": "value",
                "metadata_format_id": "value"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 204
              content: Deletion succeed
            - code: 400
              content: Validation error
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            # Build serializer
            serializer = serializers.TemplateToMFUnMappingXSLTSerializer(
                data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Get template id
            template_id = serializer.data.get("template_id")
            # Get metadata format id
            metadata_format_id = serializer.data.get("metadata_format_id")
            # Get mapping
            oai_xsl_template = (
                oai_xsl_template_api.get_by_template_id_and_metadata_format_id(
                    template_id, metadata_format_id))
            # Delete the mapping
            oai_xsl_template_api.delete(oai_xsl_template)

            return Response(status=status.HTTP_204_NO_CONTENT)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions.DoesNotExist as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#10
0
    def patch(self, request, metadata_format_id):
        """Update a MetadataFormat

        Parameters:

            {
                "metadata_prefix" : "value"
            }

        Args:

            request: HTTP request
            metadata_format_id: ObjectId

        Returns:

            - code: 200
              content: Success message
            - code: 400
              content: Validation error
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            metadata_format = oai_provider_metadata_format_api.get_by_id(
                metadata_format_id)
            # Build serializer
            serializer = serializers.UpdateMetadataFormatSerializer(
                instance=metadata_format,
                data=request.data,
                context={"request": request},
            )
            # Validate data
            serializer.is_valid(True)
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                "Metadata Format updated with success.")

            return Response(content, status=status.HTTP_200_OK)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                "No Metadata Format found with the given id.")
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def patch(self, request, set_id):
        """ Update a OaiProviderSet

        Parameters:

            {
                "set_spec":"value",
                "set_name":"value",
                "templates_manager": ["id1", "id2"],
                "description":"value"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 200
              content: Success message
            - code: 400
              content: Validation error
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            set_ = oai_provider_set_api.get_by_id(set_id)
            # Build serializer
            serializer = serializers.OaiProviderSetSerializer(
                instance=set_, data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                'Set updated with success.')

            return Response(content, status=status.HTTP_200_OK)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                'No Set found with the given id.')
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(e.message)
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#12
0
    def post(self, request):
        """Map a template, a metadata format and a XSLT. Used for the transformation of the
        template toward the metadata format thanks to the XSLT.

        Parameters:

            {
                "template": "value",
                "oai_metadata_format": "value",
                "xslt": "value"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 200
              content: Success Label
            - code: 400
              content: Validation error
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            # Build serializer
            serializer = serializers.TemplateToMFMappingXSLTSerializer(
                data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Try to set the instance
            serializer.init_instance()
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                "Mapping configured with success.")

            return Response(content, status=status.HTTP_200_OK)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions.DoesNotExist as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def patch(self, request, registry_id):
        """Update oai-pmh configuration for a given registry (Data provider)

        Parameters:

            {
                "harvest_rate" : "value",
                "harvest" : "True or False"
            }

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 200
              content: Success message
            - code: 400
              content: Validation error
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            # Build serializer
            serializer = serializers.UpdateRegistrySerializer(
                instance=registry, data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                "Registry {0} updated with success.".format(registry.name))

            return Response(content, status=status.HTTP_200_OK)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                "No registry found with the given id.")
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#14
0
    def test_update_registry_info_raises_exception_if_bad_sets(
            self, mock_get, mock_registry, mock_sets, mock_identify):
        """

        Args:
            mock_get:
            mock_registry:
            mock_sets:
            mock_identify:

        Returns:

        """
        # Arrange
        mock_user = create_mock_user("1", is_superuser=True)
        mock_request = create_mock_request(user=mock_user)
        mock_oai_registry = _create_mock_oai_registry()
        mock_get.return_value = mock_oai_registry
        mock_identify.return_value = [], status.HTTP_200_OK
        mock_registry.return_value = False
        mock_sets.return_value = (
            OaiPmhMessage.get_message_labelled(self.error_message % "sets"),
            status.HTTP_500_INTERNAL_SERVER_ERROR,
        )

        # Act + Assert
        with self.assertRaises(
                oai_pmh_exceptions.OAIAPILabelledException) as ex:
            oai_registry_api.update_registry_info(mock_oai_registry,
                                                  request=mock_request)

        self.assertEqual(ex.exception.message, self.error_message % "sets")
        self.assertEqual(ex.exception.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#15
0
    def test_harvest_records_returns_errors_if_not_HTTP_200_OK(
            self, mock_list_records):
        """

        Args:
            mock_list_records:

        Returns:

        """
        # Arrange
        resumption_token = None
        content = OaiPmhMessage.get_message_labelled("Error")
        status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
        mock_list_records.return_value = (
            Response(content, status=status_code),
            resumption_token,
        )
        expected_error = [{"status_code": status_code, "error": "Error"}]
        registry = Mock(spec=OaiRegistry())
        registry.url = "dummy_url"
        metadata_format = Mock(spec=OaiHarvesterMetadataFormat())
        metadata_format.metadata_prefix = "oai_dummy"
        last_update = registry_all_sets = None

        # Act
        result = oai_registry_api._harvest_records(registry, metadata_format,
                                                   last_update,
                                                   registry_all_sets)

        # Assert
        self.assertEquals(result, expected_error)
    def test_update_registry_info_raises_exception_if_bad_metadata_formats(
            self, mock_get, mock_registry, mock_metadata_formats,
            mock_identify, mock_sets):
        """

        Args:
            mock_get:
            mock_registry:
            mock_metadata_formats:
            mock_identify:
            mock_sets:

        Returns:

        """
        # Arrange
        mock_oai_registry = _create_mock_oai_registry()
        mock_get.return_value = mock_oai_registry
        mock_sets.return_value = [], status.HTTP_200_OK
        mock_identify.return_value = [], status.HTTP_200_OK
        mock_registry.return_value = False
        mock_metadata_formats.return_value = OaiPmhMessage.get_message_labelled(self.error_message % "metadataFormat"),\
            status.HTTP_500_INTERNAL_SERVER_ERROR

        # Act + Assert
        with self.assertRaises(
                oai_pmh_exceptions.OAIAPILabelledException) as ex:
            oai_registry_api.update_registry_info(mock_oai_registry)

        self.assertEqual(ex.exception.message,
                         self.error_message % "metadataFormat")
        self.assertEqual(ex.exception.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)
    def test_add_registry_by_url_raises_exception_if_bad_metadata_formats(
            self, mock_registry, mock_metadata_formats, mock_identify,
            mock_sets):
        """

        Args:
            mock_registry:
            mock_metadata_formats:
            mock_identify:
            mock_sets:

        Returns:

        """
        # Arrange
        mock_sets.return_value = [], status.HTTP_200_OK
        mock_identify.return_value = [], status.HTTP_200_OK
        mock_registry.return_value = False
        mock_metadata_formats.return_value = OaiPmhMessage.get_message_labelled(self.error_message % "metadataFormats"),\
                                                status.HTTP_500_INTERNAL_SERVER_ERROR

        # Act + Assert
        with self.assertRaises(
                oai_pmh_exceptions.OAIAPILabelledException) as ex:
            oai_registry_api.add_registry_by_url(self.url, self.harvest_rate,
                                                 self.harvest)

        self.assertEqual(ex.exception.message,
                         self.error_message % "metadataFormats")
        self.assertEqual(ex.exception.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#18
0
    def test_add_registry_by_url_raises_exception_if_bad_identify(
            self, mock_registry, mock):
        """

        Args:
            mock_registry:
            mock:

        Returns:

        """
        # Arrange
        mock_user = create_mock_user("1", is_superuser=True)
        mock_request = create_mock_request(user=mock_user)
        mock_registry.return_value = False
        mock.return_value = (
            OaiPmhMessage.get_message_labelled(self.error_message %
                                               "identify"),
            status.HTTP_500_INTERNAL_SERVER_ERROR,
        )

        # Act + Assert
        with self.assertRaises(
                oai_pmh_exceptions.OAIAPILabelledException) as ex:
            oai_registry_api.add_registry_by_url(self.url,
                                                 self.harvest_rate,
                                                 self.harvest,
                                                 request=mock_request)

        self.assertEqual(ex.exception.message, self.error_message % "identify")
        self.assertEqual(ex.exception.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#19
0
    def test_get_metadata_formats_as_object_raises_exception_if_not_200_OK(
            self, mock):
        """

        Args:
            mock:

        Returns:

        """
        # Arrange
        mock.return_value = (
            OaiPmhMessage.get_message_labelled(self.error_message %
                                               "metadata formats"),
            status.HTTP_500_INTERNAL_SERVER_ERROR,
        )

        # Act + Assert
        with self.assertRaises(
                oai_pmh_exceptions.OAIAPILabelledException) as ex:
            oai_registry_api._get_metadata_formats_as_object("dummy_url")

        self.assertEqual(ex.exception.message,
                         self.error_message % "metadata formats")
        self.assertEqual(ex.exception.status_code,
                         status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#20
0
    def patch(self, request):
        """Edit the OAI-PMH server settings

        Parameters:

            {
                "repository_name":"value",
                "repository_identifier":"value",
                "enable_harvesting":"True or False"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 200
              content: Success message
            - code: 400
              content: Validation error
            - code: 500
              content: Internal server error
        """
        try:
            settings_ = oai_settings_api.get()
            # Build serializer
            serializer = serializers.SettingsSerializer(instance=settings_,
                                                        data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                "OAI-PMH Settings updated with success.")

            return Response(content, status=status.HTTP_200_OK)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def post(self, request):
        """ Create a OaiProviderSet

        Parameters:

            {
                "set_spec": "value", 
                "set_name":"value", 
                "templates_manager": ["id1", "id2"], 
                "description":"value"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 201
              content: Success Label
            - code: 400
              content: Validation error
            - code: 500
              content: Internal server error
        """
        try:
            # Build serializer
            serializer = serializers.OaiProviderSetSerializer(
                data=request.data)
            # Validate data
            serializer.is_valid(True)
            # Save data
            serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                'Set added with success.')

            return Response(content, status=status.HTTP_201_CREATED)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(e.message)
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    def post(self, request):
        """Create a Registry (Data provider)

        Parameters:

            {
                "url" : "value",
                "harvest_rate" : "number",
                "harvest" : "True or False"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 201
              content: Created Registry
            - code: 400
              content: Validation error
            - code: 500
              content: Internal server error
        """
        try:
            # Build serializer
            serializer = serializers.RegistrySerializer(
                data=request.data, context={"request": request})
            # Validate data
            serializer.is_valid(True)
            # Save data
            registry = serializer.save()
            content = OaiPmhMessage.get_message_labelled(
                "Registry {0} added with success.".format(registry.name))

            return Response(content, status=status.HTTP_201_CREATED)
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#23
0
    def post(self, request):
        """Add a new MetadataFormat

        Parameters:

            {
                "metadata_prefix" : "value",
                "schema_url" : "URL"
            }

        Args:

            request: HTTP request

        Returns:

            - code: 201
              content: Success Label
            - code: 400
              content: Bad request
            - code: 500
              content: Internal server error
        """
        try:
            # Build serializer
            serializer = serializers.OaiProviderMetadataFormatSerializer(
                data=request.data, context={"request": request})
            # Validate data
            serializer.is_valid(True)
            # Save data
            return serializer.save()
        except ValidationError as validation_exception:
            content = OaiPmhMessage.get_message_labelled(
                validation_exception.detail)
            return Response(content, status=status.HTTP_400_BAD_REQUEST)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#24
0
    def get(self, request, metadata_format_id):
        """Get a MetadataFormat

        Parameters:

            {
                "metadata_prefix" : "value",
                "schema_url" : "URL"
            }

        Args:

            request: HTTP request
            metadata_format_id: ObjectId

        Returns:

            - code: 200
              content: MetadataFormat
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            metadata_format = oai_provider_metadata_format_api.get_by_id(
                metadata_format_id)
            serializer = serializers.OaiProviderMetadataFormatSerializer(
                metadata_format, context={"request": request})

            return Response(serializer.data, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist:
            content = OaiPmhMessage.get_message_labelled(
                "No Metadata Format found with the given id.")
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#25
0
def add_template_metadata_format(metadata_prefix, template_id, request):
    """Add a new template metadata format.
    Args:
        metadata_prefix: Metadata Prefix.
        template_id: Id of the template.
        request:

    Returns: Response.

    """
    try:
        template = template_api.get(template_id, request=request)
        version_manager = version_manager_api.get_from_version(template,
                                                               request=request)
        xml_schema = template.content
        target_namespace = _get_target_namespace(xml_schema)
        version_number = version_manager_api.get_version_number(
            version_manager, template_id, request=request)
        schema_url = _get_simple_template_metadata_format_schema_url(
            version_manager.title, version_number)
        obj = OaiProviderMetadataFormat(
            metadata_prefix=metadata_prefix,
            schema=schema_url,
            xml_schema=xml_schema,
            is_default=False,
            is_template=True,
            metadata_namespace=target_namespace,
            template=template,
        )
        upsert(obj, request=request)
        content = OaiPmhMessage.get_message_labelled(
            "Metadata format added with success.")

        return Response(content, status=status.HTTP_201_CREATED)
    except oai_pmh_exceptions.OAIAPILabelledException as e:
        raise e
    except DoesNotExist:
        raise oai_pmh_exceptions.OAIAPILabelledException(
            message="Unable to add the new metadata format. "
            "Impossible to retrieve the template with the "
            "given template",
            status_code=status.HTTP_404_NOT_FOUND,
        )
    except exceptions.XMLError as e:
        raise oai_pmh_exceptions.OAIAPILabelledException(
            message="Unable to add the new metadata format.%s" % str(e),
            status_code=status.HTTP_400_BAD_REQUEST,
        )
    except Exception as e:
        raise oai_pmh_exceptions.OAIAPILabelledException(
            message="Unable to add the new metadata format.%s" % str(e),
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
        )
示例#26
0
def add_metadata_format(metadata_prefix, schema_url, request):
    """Add a new metadata format.
    Args:
        metadata_prefix: Metadata Prefix.
        schema_url: URL of the schema.
        request:

    Returns: Response.

    """
    try:
        # TODO: refactor send request with cookies (same code in other apps)
        try:
            session_id = request.session.session_key
        except:
            session_id = None
        http_response = send_get_request(schema_url,
                                         cookies={"sessionid": session_id})
        if http_response.status_code == status.HTTP_200_OK:
            xml_schema = http_response.text
            target_namespace = _get_target_namespace(xml_schema)
            obj = OaiProviderMetadataFormat(
                metadata_prefix=metadata_prefix,
                schema=schema_url,
                xml_schema=xml_schema,
                is_default=False,
                metadata_namespace=target_namespace,
                is_template=False,
            )
            upsert(obj, request=request)
            content = OaiPmhMessage.get_message_labelled(
                "Metadata format added with success.")

            return Response(content, status=status.HTTP_201_CREATED)
        else:
            raise oai_pmh_exceptions.OAIAPILabelledException(
                message="Unable to add the new metadata format. Impossible"
                " to retrieve the schema at the given URL",
                status_code=status.HTTP_400_BAD_REQUEST,
            )
    except oai_pmh_exceptions.OAIAPILabelledException as e:
        raise e
    except (exceptions.XMLError, XSDError) as e:
        raise oai_pmh_exceptions.OAIAPILabelledException(
            message="Unable to add the new metadata format. %s" % str(e),
            status_code=status.HTTP_400_BAD_REQUEST,
        )
    except Exception as e:
        raise oai_pmh_exceptions.OAIAPILabelledException(
            message="Unable to add the new metadata format.%s" % str(e),
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
        )
示例#27
0
    def patch(self, request, registry_id):
        """ Harvest a given registry (Data provider)

        Args:

            request: HTTP request
            registry_id: ObjectId

        Returns:

            - code: 200
              content: Success message
            - code: 404
              content: Object was not found
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_by_id(registry_id)
            all_errors = oai_registry_api.harvest_registry(registry)
            if len(all_errors) > 0:
                raise exceptions_oai.\
                    OAIAPISerializeLabelledException(errors=all_errors,
                                                     status_code=status.HTTP_400_BAD_REQUEST)
            else:
                content = OaiPmhMessage.get_message_labelled(
                    'Registry {0} harvested with success.'.format(
                        registry.name))
                return Response(content, status=status.HTTP_200_OK)
        except exceptions.DoesNotExist as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content, status=status.HTTP_404_NOT_FOUND)
        except exceptions_oai.OAIAPIException as e:
            return e.response()
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(str(e))
            return Response(content,
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
示例#28
0
def sickle_list_sets(url):
    """ Performs an Oai-Pmh listSet request.

    Args:
        url: URL of the Data Provider.

    Returns:
        Data.
        Status code.

    """
    try:
        sickle = _sickle_init(url)
        list_sets = sickle.ListSets()
        serializer = sickle_serializers.SetSerializer(list_sets, many=True)
        return serializer.data, status.HTTP_200_OK
    except NoSetHierarchy as e:
        content = OaiPmhMessage.get_message_labelled('%s' % str(e))
        return content, status.HTTP_204_NO_CONTENT
    except Exception as e:
        content = OaiPmhMessage.get_message_labelled(
            'An error occurred when attempting to get the sets: %s' % str(e))
        return content, status.HTTP_500_INTERNAL_SERVER_ERROR
示例#29
0
def sickle_identify(url):
    """ Performs an Oai-Pmh identity request.

    Args:
        url: URL of the Data Provider.

    Returns:
        Data.
        Status code.

    """
    try:
        sickle = _sickle_init(url)
        identify = sickle.Identify()
        serializer = sickle_serializers.IdentifySerializer(identify)
        return serializer.data, status.HTTP_200_OK
    except Exception as e:
        content = OaiPmhMessage.get_message_labelled('An error occurred when attempting to identify resource: %s'
                                                     % e.message)
        return content, status.HTTP_500_INTERNAL_SERVER_ERROR
    def get(self, request):
        """ Get all Registries (Data provider)

        Args:

            request: HTTP request

        Returns:

            - code: 200
              content: List of Registries
            - code: 500
              content: Internal server error
        """
        try:
            registry = oai_registry_api.get_all()
            serializer = serializers.RegistrySerializer(registry, many=True)

            return Response(serializer.data, status=status.HTTP_200_OK)
        except Exception as e:
            content = OaiPmhMessage.get_message_labelled(e.message)
            return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)