Fix pagination in some endpoints (#5557)
- Added missing pagination or page parameters in `/projects/{id}/tasks`,
`/tasks/{id}/jobs`, `/jobs/{id}/issues`, `/jobs/{id}/commits`,
`/issues/{id}/comments`, `/organizations`
- Updated SDK, tests and UI
main
parent
330f123785
commit
58b05536f5
@ -0,0 +1,25 @@
|
||||
# Copyright (C) 2023 CVAT.ai Corporation
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
|
||||
import itertools
|
||||
from typing import Callable, Iterator, TypeVar
|
||||
|
||||
from django.http.response import HttpResponse
|
||||
|
||||
T = TypeVar('T')
|
||||
|
||||
def get_paginated_collection(
|
||||
request_chunk_callback: Callable[[int], HttpResponse]
|
||||
) -> Iterator[T]:
|
||||
values = []
|
||||
|
||||
for page in itertools.count(start=1):
|
||||
response = request_chunk_callback(page)
|
||||
data = response.json()
|
||||
values.extend(data["results"])
|
||||
if not data.get('next'):
|
||||
break
|
||||
|
||||
return values
|
||||
@ -0,0 +1,47 @@
|
||||
# Copyright (C) 2023 CVAT.ai Corporation
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# NOTE: importing in the header leads to circular importing
|
||||
from typing import Optional, Type
|
||||
from django.db.models.query import QuerySet
|
||||
from django.http.request import HttpRequest
|
||||
from django.http.response import HttpResponse
|
||||
from rest_framework.serializers import Serializer
|
||||
from rest_framework.viewsets import GenericViewSet
|
||||
|
||||
def make_paginated_response(
|
||||
queryset: QuerySet,
|
||||
*,
|
||||
viewset: GenericViewSet,
|
||||
response_type: Optional[Type[HttpResponse]] = None,
|
||||
serializer_type: Optional[Type[Serializer]] = None,
|
||||
request: Optional[Type[HttpRequest]] = None,
|
||||
**serializer_params
|
||||
):
|
||||
# Adapted from the mixins.ListModelMixin.list()
|
||||
|
||||
serializer_params.setdefault('many', True)
|
||||
|
||||
if response_type is None:
|
||||
from rest_framework.response import Response
|
||||
response_type = Response
|
||||
|
||||
if request is None:
|
||||
request = getattr(viewset, 'request', None)
|
||||
|
||||
if request is not None:
|
||||
context = serializer_params.setdefault('context', {})
|
||||
context.setdefault('request', request)
|
||||
|
||||
if serializer_type is None:
|
||||
serializer_type = viewset.get_serializer
|
||||
|
||||
page = viewset.paginate_queryset(queryset)
|
||||
if page is not None:
|
||||
serializer = serializer_type(page, **serializer_params)
|
||||
return viewset.get_paginated_response(serializer.data)
|
||||
|
||||
serializer = serializer_type(queryset, **serializer_params)
|
||||
|
||||
return response_type(serializer.data)
|
||||
@ -1,38 +1,43 @@
|
||||
[
|
||||
{
|
||||
"contact": {
|
||||
"email": "org2@cvat.org"
|
||||
},
|
||||
"created_date": "2021-12-14T19:51:38.667000Z",
|
||||
"description": "",
|
||||
"id": 2,
|
||||
"name": "Organization #2",
|
||||
"owner": {
|
||||
"first_name": "Business",
|
||||
"id": 10,
|
||||
"last_name": "First",
|
||||
"url": "http://localhost:8080/api/users/10",
|
||||
"username": "business1"
|
||||
},
|
||||
"slug": "org2",
|
||||
"updated_date": "2021-12-14T19:51:38.667000Z"
|
||||
},
|
||||
{
|
||||
"contact": {
|
||||
"email": "org1@cvat.org"
|
||||
},
|
||||
"created_date": "2021-12-14T18:45:40.172000Z",
|
||||
"description": "",
|
||||
"id": 1,
|
||||
"name": "organization #1",
|
||||
"owner": {
|
||||
"first_name": "User",
|
||||
{
|
||||
"count": 2,
|
||||
"next": null,
|
||||
"previous": null,
|
||||
"results": [
|
||||
{
|
||||
"contact": {
|
||||
"email": "org2@cvat.org"
|
||||
},
|
||||
"created_date": "2021-12-14T19:51:38.667000Z",
|
||||
"description": "",
|
||||
"id": 2,
|
||||
"last_name": "First",
|
||||
"url": "http://localhost:8080/api/users/2",
|
||||
"username": "user1"
|
||||
"name": "Organization #2",
|
||||
"owner": {
|
||||
"first_name": "Business",
|
||||
"id": 10,
|
||||
"last_name": "First",
|
||||
"url": "http://localhost:8080/api/users/10",
|
||||
"username": "business1"
|
||||
},
|
||||
"slug": "org2",
|
||||
"updated_date": "2021-12-14T19:51:38.667000Z"
|
||||
},
|
||||
"slug": "org1",
|
||||
"updated_date": "2021-12-14T18:45:40.172000Z"
|
||||
}
|
||||
]
|
||||
{
|
||||
"contact": {
|
||||
"email": "org1@cvat.org"
|
||||
},
|
||||
"created_date": "2021-12-14T18:45:40.172000Z",
|
||||
"description": "",
|
||||
"id": 1,
|
||||
"name": "organization #1",
|
||||
"owner": {
|
||||
"first_name": "User",
|
||||
"id": 2,
|
||||
"last_name": "First",
|
||||
"url": "http://localhost:8080/api/users/2",
|
||||
"username": "user1"
|
||||
},
|
||||
"slug": "org1",
|
||||
"updated_date": "2021-12-14T18:45:40.172000Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue