Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9337078
D5778.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
D5778.diff
View Options
diff --git a/swh/deposit/api/collection.py b/swh/deposit/api/collection.py
--- a/swh/deposit/api/collection.py
+++ b/swh/deposit/api/collection.py
@@ -5,7 +5,9 @@
from typing import Optional, Tuple
+from django.shortcuts import render
from rest_framework import status
+from rest_framework.generics import ListAPIView
from ..config import DEPOSIT_STATUS_LOAD_SUCCESS, EDIT_IRI
from ..models import Deposit
@@ -22,14 +24,15 @@
Receipt,
get_collection_by_name,
)
+from .utils import DefaultPagination, DepositSerializer
-class CollectionAPI(APIPost):
+class CollectionAPI(ListAPIView, APIPost):
"""Deposit request class defining api endpoints for sword deposit.
What's known as 'Col-IRI' in the sword specification.
- HTTP verbs supported: POST
+ HTTP verbs supported: GET and POST
"""
@@ -40,6 +43,43 @@
SWHAtomEntryParser,
)
+ serializer_class = DepositSerializer
+ pagination_class = DefaultPagination
+
+ def get(self, request, *args, **kwargs):
+ """List the user's collection if the user has access to said collection.
+
+ """
+ self.checks(request, kwargs["collection_name"])
+ paginated_result = super().get(request, *args, **kwargs)
+ data = paginated_result.data
+ # Build pagination link headers
+ links = []
+ for link_name in ["next", "previous"]:
+ link = data.get(link_name)
+ if link is None:
+ continue
+ links.append(f'<{link}>; rel="{link_name}"')
+ response = render(
+ request,
+ "deposit/collection_list.xml",
+ context={
+ "count": data["count"],
+ "results": [dict(d) for d in data["results"]],
+ },
+ content_type="application/xml",
+ status=status.HTTP_200_OK,
+ )
+ response._headers["Link"] = ",".join(links)
+ return response
+
+ def get_queryset(self):
+ """List the deposits for the authenticated user (pagination is handled by the
+ `pagination_class` class attribute).
+
+ """
+ return Deposit.objects.filter(client=self.request.user.id).order_by("id")
+
def process_post(
self,
req,
diff --git a/swh/deposit/api/collection_list.py b/swh/deposit/api/collection_list.py
deleted file mode 100644
--- a/swh/deposit/api/collection_list.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) 2021 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 django.shortcuts import render
-from rest_framework import status
-from rest_framework.generics import ListAPIView
-
-from swh.deposit.api.common import APIBase
-from swh.deposit.api.utils import DefaultPagination, DepositSerializer
-from swh.deposit.models import Deposit
-
-
-class CollectionListAPI(ListAPIView, APIBase):
- """Deposit request class to list the user deposits.
-
- HTTP verbs supported: ``GET``
-
- """
-
- serializer_class = DepositSerializer
- pagination_class = DefaultPagination
-
- def get(self, request, *args, **kwargs):
- """List the user's collection if the user has access to said collection.
-
- """
- self.checks(request, kwargs["collection_name"])
- paginated_result = super().get(request, *args, **kwargs)
- data = paginated_result.data
- # Build pagination link headers
- links = []
- for link_name in ["next", "previous"]:
- link = data.get(link_name)
- if link is None:
- continue
- links.append(f'<{link}>; rel="{link_name}"')
- response = render(
- request,
- "deposit/collection_list.xml",
- context={
- "count": data["count"],
- "results": [dict(d) for d in data["results"]],
- },
- content_type="application/xml",
- status=status.HTTP_200_OK,
- )
- response._headers["Link"] = ",".join(links)
- return response
-
- def get_queryset(self):
- """List the deposits for the authenticated user (pagination is handled by the
- `pagination_class` class attribute).
-
- """
- return Deposit.objects.filter(client=self.request.user.id).order_by("id")
diff --git a/swh/deposit/api/urls.py b/swh/deposit/api/urls.py
--- a/swh/deposit/api/urls.py
+++ b/swh/deposit/api/urls.py
@@ -10,18 +10,8 @@
from django.conf.urls import url
from django.shortcuts import render
-from ..config import (
- COL_IRI,
- COLLECTION_LIST,
- CONT_FILE_IRI,
- EDIT_IRI,
- EM_IRI,
- SD_IRI,
- SE_IRI,
- STATE_IRI,
-)
+from ..config import COL_IRI, CONT_FILE_IRI, EDIT_IRI, EM_IRI, SD_IRI, SE_IRI, STATE_IRI
from .collection import CollectionAPI
-from .collection_list import CollectionListAPI
from .content import ContentAPI
from .edit import EditAPI
from .edit_media import EditMediaAPI
@@ -83,9 +73,4 @@
), # specification is not clear about
# File-IRI, we assume it's the same as
# the Cont-IRI one
- url(
- r"^(?P<collection_name>[^/]+)/list/$",
- CollectionListAPI.as_view(),
- name=COLLECTION_LIST,
- ),
]
diff --git a/swh/deposit/config.py b/swh/deposit/config.py
--- a/swh/deposit/config.py
+++ b/swh/deposit/config.py
@@ -22,7 +22,6 @@
SD_IRI = "servicedocument"
COL_IRI = "upload"
STATE_IRI = "state_iri"
-COLLECTION_LIST = "collection-list"
PRIVATE_GET_RAW_CONTENT = "private-download"
PRIVATE_CHECK_DEPOSIT = "check-deposit"
PRIVATE_PUT_DEPOSIT = "private-update"
diff --git a/swh/deposit/tests/api/test_collection_list.py b/swh/deposit/tests/api/test_collection_list.py
--- a/swh/deposit/tests/api/test_collection_list.py
+++ b/swh/deposit/tests/api/test_collection_list.py
@@ -9,11 +9,7 @@
from requests.utils import parse_header_links
from rest_framework import status
-from swh.deposit.config import (
- COLLECTION_LIST,
- DEPOSIT_STATUS_DEPOSITED,
- DEPOSIT_STATUS_PARTIAL,
-)
+from swh.deposit.config import COL_IRI, DEPOSIT_STATUS_DEPOSITED, DEPOSIT_STATUS_PARTIAL
from swh.deposit.models import DepositCollection
from swh.deposit.parsers import parse_xml
@@ -22,7 +18,7 @@
"""Deposit list should require authentication
"""
- url = reverse(COLLECTION_LIST, args=("test",))
+ url = reverse(COL_IRI, args=("test",))
response = anonymous_client.get(url)
assert response.status_code == status.HTTP_401_UNAUTHORIZED
assert b"protected by basic authentication" in response.content
@@ -40,7 +36,7 @@
coll2 = deposit_another_collection
assert coll.name != coll2.name
# but does not have access to that coll2 collection
- url = reverse(COLLECTION_LIST, args=(coll2.name,))
+ url = reverse(COL_IRI, args=(coll2.name,))
response = authenticated_client.get(url)
# so it gets rejected access to the listing of that coll2 collection
assert response.status_code == status.HTTP_403_FORBIDDEN
@@ -64,7 +60,7 @@
deposit_id2 = str(deposited_deposit.id)
coll = partial_deposit.collection
# requesting the listing of the deposit for the user's collection
- url = reverse(COLLECTION_LIST, args=(coll.name,))
+ url = reverse(COL_IRI, args=(coll.name,))
response = authenticated_client.get(f"{url}?page_size=1")
assert response.status_code == status.HTTP_200_OK
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Jul 3 2025, 7:52 AM (10 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3216287
Attached To
D5778: Make the collection list available with 'GET Col-IRI'
Event Timeline
Log In to Comment