Changeset View
Changeset View
Standalone View
Standalone View
swh/deposit/api/common.py
Show All 11 Lines | |||||
from django.utils import timezone | from django.utils import timezone | ||||
from rest_framework import status | from rest_framework import status | ||||
from rest_framework.authentication import BasicAuthentication | from rest_framework.authentication import BasicAuthentication | ||||
from rest_framework.permissions import IsAuthenticated, AllowAny | from rest_framework.permissions import IsAuthenticated, AllowAny | ||||
from rest_framework.views import APIView | from rest_framework.views import APIView | ||||
from swh.model import hashutil | from swh.model import hashutil | ||||
from ..config import SWHDefaultConfig, EDIT_SE_IRI, EM_IRI, CONT_FILE_IRI | from ..config import ( | ||||
from ..config import ARCHIVE_KEY, METADATA_KEY, STATE_IRI | SWHDefaultConfig, EDIT_SE_IRI, EM_IRI, CONT_FILE_IRI, | ||||
from ..config import DEPOSIT_STATUS_DEPOSITED, DEPOSIT_STATUS_PARTIAL | ARCHIVE_KEY, METADATA_KEY, RAW_METADATA_KEY, STATE_IRI, | ||||
from ..config import DEPOSIT_STATUS_LOAD_SUCCESS | DEPOSIT_STATUS_DEPOSITED, DEPOSIT_STATUS_PARTIAL, | ||||
from ..errors import MAX_UPLOAD_SIZE_EXCEEDED, BAD_REQUEST, ERROR_CONTENT | DEPOSIT_STATUS_LOAD_SUCCESS | ||||
from ..errors import CHECKSUM_MISMATCH, make_error_dict, MEDIATION_NOT_ALLOWED | ) | ||||
from ..errors import make_error_response_from_dict, FORBIDDEN | from ..errors import ( | ||||
from ..errors import NOT_FOUND, make_error_response, METHOD_NOT_ALLOWED | MAX_UPLOAD_SIZE_EXCEEDED, BAD_REQUEST, ERROR_CONTENT, | ||||
from ..models import Deposit, DepositRequest, DepositCollection | CHECKSUM_MISMATCH, make_error_dict, MEDIATION_NOT_ALLOWED, | ||||
from ..models import DepositRequestType, DepositClient | make_error_response_from_dict, FORBIDDEN, | ||||
NOT_FOUND, make_error_response, METHOD_NOT_ALLOWED | |||||
) | |||||
from ..models import ( | |||||
Deposit, DepositRequest, DepositCollection, DepositRequestType, | |||||
DepositClient | |||||
) | |||||
from ..parsers import parse_xml | from ..parsers import parse_xml | ||||
ACCEPT_PACKAGINGS = ['http://purl.org/net/sword/package/SimpleZip'] | ACCEPT_PACKAGINGS = ['http://purl.org/net/sword/package/SimpleZip'] | ||||
ACCEPT_ARCHIVE_CONTENT_TYPES = ['application/zip', 'application/x-tar'] | ACCEPT_ARCHIVE_CONTENT_TYPES = ['application/zip', 'application/x-tar'] | ||||
class SWHAPIView(APIView): | class SWHAPIView(APIView): | ||||
▲ Show 20 Lines • Show All 175 Lines • ▼ Show 20 Lines | def _deposit_request_put(self, deposit, deposit_request_data, | ||||
deposit_request = DepositRequest( | deposit_request = DepositRequest( | ||||
type=self.deposit_request_types[ARCHIVE_KEY], | type=self.deposit_request_types[ARCHIVE_KEY], | ||||
deposit=deposit, | deposit=deposit, | ||||
archive=archive_file) | archive=archive_file) | ||||
deposit_request.save() | deposit_request.save() | ||||
metadata = deposit_request_data.get(METADATA_KEY) | metadata = deposit_request_data.get(METADATA_KEY) | ||||
if metadata: | if metadata: | ||||
raw_metadata = deposit_request_data.get(RAW_METADATA_KEY) | |||||
deposit_request = DepositRequest( | deposit_request = DepositRequest( | ||||
type=self.deposit_request_types[METADATA_KEY], | type=self.deposit_request_types[METADATA_KEY], | ||||
deposit=deposit, | deposit=deposit, | ||||
metadata=metadata) | metadata=metadata, | ||||
raw_metadata=raw_metadata) | |||||
deposit_request.save() | deposit_request.save() | ||||
assert deposit_request is not None | assert deposit_request is not None | ||||
def _delete_archives(self, collection_name, deposit_id): | def _delete_archives(self, collection_name, deposit_id): | ||||
"""Delete archives reference from the deposit id. | """Delete archives reference from the deposit id. | ||||
""" | """ | ||||
▲ Show 20 Lines • Show All 167 Lines • ▼ Show 20 Lines | def _binary_upload(self, req, headers, collection_name, deposit_id=None, | ||||
return { | return { | ||||
'deposit_id': deposit.id, | 'deposit_id': deposit.id, | ||||
'deposit_date': deposit.reception_date, | 'deposit_date': deposit.reception_date, | ||||
'status': deposit.status, | 'status': deposit.status, | ||||
'archive': filehandler.name, | 'archive': filehandler.name, | ||||
} | } | ||||
def _read_metadata(self, metadata_stream): | |||||
"""Given a metadata stream, reads the metadata and returns both the | |||||
parsed and the raw metadata. | |||||
""" | |||||
raw_metadata = metadata_stream.read() | |||||
metadata = parse_xml(raw_metadata) | |||||
return raw_metadata, metadata | |||||
def _multipart_upload(self, req, headers, collection_name, | def _multipart_upload(self, req, headers, collection_name, | ||||
deposit_id=None, replace_metadata=False, | deposit_id=None, replace_metadata=False, | ||||
replace_archives=False): | replace_archives=False): | ||||
"""Multipart upload supported with exactly: | """Multipart upload supported with exactly: | ||||
- 1 archive (zip) | - 1 archive (zip) | ||||
- 1 atom entry | - 1 atom entry | ||||
Other than such a request, a 415 response is returned. | Other than such a request, a 415 response is returned. | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | def _multipart_upload(self, req, headers, collection_name, | ||||
precondition_status_response = self._check_preconditions_on( | precondition_status_response = self._check_preconditions_on( | ||||
filehandler, | filehandler, | ||||
headers['content-md5sum']) | headers['content-md5sum']) | ||||
if precondition_status_response: | if precondition_status_response: | ||||
return precondition_status_response | return precondition_status_response | ||||
raw_metadata, metadata = self._read_metadata( | |||||
data['application/atom+xml']) | |||||
# actual storage of data | # actual storage of data | ||||
atom_metadata = parse_xml(data['application/atom+xml']) | |||||
deposit = self._deposit_put(deposit_id=deposit_id, | deposit = self._deposit_put(deposit_id=deposit_id, | ||||
in_progress=headers['in-progress'], | in_progress=headers['in-progress'], | ||||
external_id=external_id) | external_id=external_id) | ||||
deposit_request_data = { | deposit_request_data = { | ||||
ARCHIVE_KEY: filehandler, | ARCHIVE_KEY: filehandler, | ||||
METADATA_KEY: atom_metadata, | METADATA_KEY: metadata, | ||||
RAW_METADATA_KEY: raw_metadata, | |||||
} | } | ||||
self._deposit_request_put( | self._deposit_request_put( | ||||
deposit, deposit_request_data, replace_metadata, replace_archives) | deposit, deposit_request_data, replace_metadata, replace_archives) | ||||
return { | return { | ||||
'deposit_id': deposit.id, | 'deposit_id': deposit.id, | ||||
'deposit_date': deposit.reception_date, | 'deposit_date': deposit.reception_date, | ||||
'archive': filehandler.name, | 'archive': filehandler.name, | ||||
Show All 31 Lines | def _atom_entry(self, req, headers, collection_name, | ||||
associated failures, either: | associated failures, either: | ||||
- 400 (bad request) if the request is not providing an external | - 400 (bad request) if the request is not providing an external | ||||
identifier | identifier | ||||
- 400 (bad request) if the request's body is empty | - 400 (bad request) if the request's body is empty | ||||
- 415 (unsupported media type) if a wrong media type is provided | - 415 (unsupported media type) if a wrong media type is provided | ||||
""" | """ | ||||
if not req.data: | raw_metadata, metadata = self._read_metadata(req.data) | ||||
if not metadata: | |||||
return make_error_dict( | return make_error_dict( | ||||
BAD_REQUEST, | BAD_REQUEST, | ||||
'Empty body request is not supported', | 'Empty body request is not supported', | ||||
'Atom entry deposit is supposed to send for metadata. ' | 'Atom entry deposit is supposed to send for metadata. ' | ||||
'If the body is empty, there is no metadata.') | 'If the body is empty, there is no metadata.') | ||||
external_id = req.data.get('external_identifier', headers['slug']) | external_id = metadata.get('external_identifier', headers['slug']) | ||||
deposit = self._deposit_put(deposit_id=deposit_id, | deposit = self._deposit_put(deposit_id=deposit_id, | ||||
in_progress=headers['in-progress'], | in_progress=headers['in-progress'], | ||||
external_id=external_id) | external_id=external_id) | ||||
self._deposit_request_put( | self._deposit_request_put( | ||||
deposit, {METADATA_KEY: req.data}, | deposit, {METADATA_KEY: metadata, RAW_METADATA_KEY: raw_metadata}, | ||||
replace_metadata, replace_archives) | replace_metadata, replace_archives) | ||||
return { | return { | ||||
'deposit_id': deposit.id, | 'deposit_id': deposit.id, | ||||
'deposit_date': deposit.reception_date, | 'deposit_date': deposit.reception_date, | ||||
'archive': None, | 'archive': None, | ||||
'status': deposit.status, | 'status': deposit.status, | ||||
} | } | ||||
▲ Show 20 Lines • Show All 291 Lines • Show Last 20 Lines |