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 @@
|
|||||||
[
|
{
|
||||||
{
|
"count": 2,
|
||||||
"contact": {
|
"next": null,
|
||||||
"email": "org2@cvat.org"
|
"previous": null,
|
||||||
},
|
"results": [
|
||||||
"created_date": "2021-12-14T19:51:38.667000Z",
|
{
|
||||||
"description": "",
|
"contact": {
|
||||||
"id": 2,
|
"email": "org2@cvat.org"
|
||||||
"name": "Organization #2",
|
},
|
||||||
"owner": {
|
"created_date": "2021-12-14T19:51:38.667000Z",
|
||||||
"first_name": "Business",
|
"description": "",
|
||||||
"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",
|
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"last_name": "First",
|
"name": "Organization #2",
|
||||||
"url": "http://localhost:8080/api/users/2",
|
"owner": {
|
||||||
"username": "user1"
|
"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