Source code for swh.deposit.api.edit_media

# Copyright (C) 2017-2020  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

from typing import Optional, Tuple

from rest_framework import status

from swh.deposit.api.common import (
    ACCEPT_ARCHIVE_CONTENT_TYPES,
    APIDelete,
    APIPost,
    APIPut,
    ParsedRequestHeaders,
    Receipt,
)
from swh.deposit.config import CONT_FILE_IRI
from swh.deposit.errors import BAD_REQUEST, DepositError
from swh.deposit.models import Deposit
from swh.deposit.parsers import SWHFileUploadTarParser, SWHFileUploadZipParser


[docs] class EditMediaAPI(APIPost, APIPut, APIDelete): """Deposit request class defining api endpoints for sword deposit. What's known as 'EM IRI' in the sword specification. HTTP verbs supported: PUT, POST, DELETE """ parser_classes = ( SWHFileUploadZipParser, SWHFileUploadTarParser, )
[docs] def process_put( self, req, headers: ParsedRequestHeaders, collection_name: str, deposit: Deposit ) -> None: """Replace existing content for the existing deposit. source: http://swordapp.github.io/SWORDv2-Profile/SWORDProfile.html#protocoloperations_editingcontent_binary # noqa Returns: 204 No content """ if req.content_type not in ACCEPT_ARCHIVE_CONTENT_TYPES: msg = "Packaging format supported is restricted to %s" % ( ", ".join(ACCEPT_ARCHIVE_CONTENT_TYPES) ) raise DepositError(BAD_REQUEST, msg) self._binary_upload( req, headers, collection_name, deposit=deposit, replace_archives=True )
[docs] def process_post( self, req, headers: ParsedRequestHeaders, collection_name: str, deposit: Optional[Deposit] = None, ) -> Tuple[int, str, Receipt]: """Add new content to the existing deposit. source: http://swordapp.github.io/SWORDv2-Profile/SWORDProfile.html#protocoloperations_addingcontent_mediaresource # noqa Returns: 201 Created Headers: Location: [Cont-File-IRI] Body: [optional Deposit Receipt] """ assert deposit is not None if req.content_type not in ACCEPT_ARCHIVE_CONTENT_TYPES: msg = "Packaging format supported is restricted to %s" % ( ", ".join(ACCEPT_ARCHIVE_CONTENT_TYPES) ) raise DepositError(BAD_REQUEST, msg) return ( status.HTTP_201_CREATED, CONT_FILE_IRI, self._binary_upload(req, headers, collection_name, deposit), )
[docs] def process_delete(self, req, collection_name: str, deposit: Deposit) -> None: """Delete content (archives) from existing deposit. source: http://swordapp.github.io/SWORDv2-Profile/SWORDProfile.html#protocoloperations_deletingcontent # noqa Returns: 204 Created """ self._delete_archives(collection_name, deposit)