Skip to content
Snippets Groups Projects
Verified Commit c1ca9435 authored by Antoine R. Dumont's avatar Antoine R. Dumont
Browse files

swh.deposit.api: Add private api to update deposit's status

parent 5287e321
No related branches found
No related tags found
No related merge requests found
......@@ -619,12 +619,9 @@ class SWHBaseDeposit(SWHDefaultConfig, SWHAPIView, metaclass=ABCMeta):
'Deposit with id %s does not exist' %
deposit_id)
if req.method != 'GET' and deposit.status != 'partial':
summary = "You can only act on deposit with status 'partial'"
description = "This deposit has status '%s'" % deposit.status
return make_error_dict(
BAD_REQUEST, summary=summary,
verbose_description=description)
checks = self.restrict_access(req, deposit)
if checks:
return checks
headers = self._read_headers(req)
if headers['on-behalf-of']:
......@@ -633,6 +630,15 @@ class SWHBaseDeposit(SWHDefaultConfig, SWHAPIView, metaclass=ABCMeta):
return {'headers': headers}
def restrict_access(self, req, deposit=None):
if deposit:
if req.method != 'GET' and deposit.status != 'partial':
summary = "You can only act on deposit with status 'partial'"
description = "This deposit has status '%s'" % deposit.status
return make_error_dict(
BAD_REQUEST, summary=summary,
verbose_description=description)
def get(self, req, *args, **kwargs):
return make_error_response(req, METHOD_NOT_ALLOWED)
......
......@@ -4,10 +4,12 @@
# See top-level LICENSE file for more information
from rest_framework import status
from rest_framework.parsers import JSONParser
from .common import SWHPostDepositAPI, SWHPutDepositAPI, SWHDeleteDepositAPI
from ..config import CONT_FILE_IRI, EDIT_SE_IRI, EM_IRI
from ..errors import make_error_response, BAD_REQUEST
from ..errors import make_error_response, make_error_dict, BAD_REQUEST
from ..models import Deposit, DEPOSIT_STATUS_DETAIL
from ..parsers import SWHFileUploadParser, SWHAtomEntryParser
from ..parsers import SWHMultiPartParser
......@@ -153,3 +155,42 @@ class SWHUpdateMetadataDeposit(SWHPostDepositAPI, SWHPutDepositAPI,
#protocoloperations_deleteconteiner
"""
return self._delete_deposit(collection_name, deposit_id)
class SWHUpdateStatusDeposit(SWHPutDepositAPI):
"""Deposit request class to update the deposit's status.
HTTP verbs supported: PUT
"""
parser_classes = (JSONParser, )
def restrict_access(self, req, deposit=None):
"""Remove restriction modification to 'partial' deposit.
Update is possible regardless of the existing status.
"""
return None
def process_put(self, req, headers, collection_name, deposit_id):
"""Update the deposit's status
Returns:
204 No content
"""
status = req.data.get('status')
if not status:
msg = 'The status key is mandatory with possible values %s' % list(
DEPOSIT_STATUS_DETAIL.keys())
return make_error_dict(BAD_REQUEST, msg)
if status not in DEPOSIT_STATUS_DETAIL:
msg = 'Possible status in %s' % list(DEPOSIT_STATUS_DETAIL.keys())
return make_error_dict(BAD_REQUEST, msg)
deposit = Deposit.objects.get(pk=deposit_id)
deposit.status = status
deposit.save()
return {}
......@@ -16,6 +16,7 @@ SD_IRI = 'servicedocument'
COL_IRI = 'upload'
STATE_IRI = 'status'
PRIVATE_GET_RAW_CONTENT = 'private-download'
PRIVATE_PUT_DEPOSIT = 'private-update'
ARCHIVE_KEY = 'archive'
METADATA_KEY = 'metadata'
......
......@@ -4,13 +4,14 @@
# See top-level LICENSE file for more information
import hashlib
import json
from django.core.urlresolvers import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from swh.deposit.models import Deposit, DepositRequest
from swh.deposit.config import EDIT_SE_IRI, EM_IRI
from swh.deposit.models import Deposit, DepositRequest, DEPOSIT_STATUS_DETAIL
from swh.deposit.config import EDIT_SE_IRI, EM_IRI, PRIVATE_PUT_DEPOSIT
from ..common import BasicTestCase, WithAuthTestCase, CommonCreationRoutine
......@@ -330,3 +331,62 @@ class DepositUpdateFailuresTest(APITestCase, WithAuthTestCase, BasicTestCase,
data=self.atom_entry_data0)
# then
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
class UpdateDepositStatusTest(APITestCase, WithAuthTestCase,
BasicTestCase, CommonCreationRoutine):
"""Failure scenario about add/replace (post/put) query on deposit.
"""
def setUp(self):
super().setUp()
deposit_id = self.create_deposit_ready()
self.deposit = Deposit.objects.get(pk=deposit_id)
assert self.deposit.status == 'ready'
def test_update_deposit_status(self):
"""Existing status for update should return a 204 response
"""
url = reverse(PRIVATE_PUT_DEPOSIT, args=[
self.username, self.deposit.id])
for _status in DEPOSIT_STATUS_DETAIL.keys():
response = self.client.put(
url,
content_type='application/json',
data=json.dumps({'status': _status}))
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
deposit = Deposit.objects.get(pk=self.deposit.id)
self.assertEquals(deposit.status, _status)
def test_update_deposit_status_will_fail_with_unknown_status(self):
"""Unknown status for update should return a 400 response
"""
url = reverse(PRIVATE_PUT_DEPOSIT, args=[
self.username, self.deposit.id])
response = self.client.put(
url,
content_type='application/json',
data=json.dumps({'status': 'unknown'}))
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_update_deposit_status_will_fail_with_no_status_key(self):
"""No status provided for update should return a 400 response
"""
url = reverse(PRIVATE_PUT_DEPOSIT, args=[
self.username, self.deposit.id])
response = self.client.put(
url,
content_type='application/json',
data=json.dumps({'something': 'something'}))
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
......@@ -23,12 +23,12 @@ from rest_framework.urlpatterns import format_suffix_patterns
from .config import EDIT_SE_IRI, EM_IRI, CONT_FILE_IRI
from .config import SD_IRI, COL_IRI, STATE_IRI, PRIVATE_GET_RAW_CONTENT
from .config import PRIVATE_DEPOSIT_UPDATE
from .config import PRIVATE_PUT_DEPOSIT
from .api.common import index
from .api.deposit import SWHDeposit
from .api.deposit_status import SWHDepositStatus
from .api.deposit_update import SWHUpdateMetadataDeposit
from .api.deposit_update import SWHUpdateArchiveDeposit
from .api.deposit_update import SWHUpdateArchiveDeposit, SWHUpdateStatusDeposit
from .api.deposit_content import SWHDepositContent
from .api.service_document import SWHServiceDocument
from .api.deposit_read import SWHDepositReadArchives
......@@ -73,6 +73,9 @@ urlpatterns = [
url(r'^1/(?P<collection_name>[^/]+)/(?P<deposit_id>[^/]+)/raw/$',
SWHDepositReadArchives.as_view(),
name=PRIVATE_GET_RAW_CONTENT),
url(r'^1/(?P<collection_name>[^/]+)/(?P<deposit_id>[^/]+)/update/$',
SWHUpdateStatusDeposit.as_view(),
name=PRIVATE_PUT_DEPOSIT),
]
urlpatterns = format_suffix_patterns(urlpatterns)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment