Changeset View
Changeset View
Standalone View
Standalone View
swh/web/api/views/add_forge_now.py
# Copyright (C) 2022 The Software Heritage developers | # Copyright (C) 2022 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU Affero General Public License version 3, or any later version | # License: GNU Affero General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import json | import json | ||||
from typing import Union | from typing import Union | ||||
from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||
from django.core.paginator import Paginator | |||||
from django.db import transaction | from django.db import transaction | ||||
from django.forms import CharField, ModelForm | from django.forms import CharField, ModelForm | ||||
from django.http import HttpResponseBadRequest | from django.http import HttpResponseBadRequest | ||||
from django.http.request import HttpRequest | from django.http.request import HttpRequest | ||||
from django.http.response import HttpResponse, HttpResponseForbidden | from django.http.response import HttpResponse, HttpResponseForbidden | ||||
from rest_framework import serializers | from rest_framework import serializers | ||||
from rest_framework.request import Request | from rest_framework.request import Request | ||||
from rest_framework.response import Response | from rest_framework.response import Response | ||||
from swh.web.add_forge_now.models import Request as AddForgeRequest | from swh.web.add_forge_now.models import Request as AddForgeRequest | ||||
from swh.web.add_forge_now.models import RequestActorRole as AddForgeNowRequestActorRole | from swh.web.add_forge_now.models import RequestActorRole as AddForgeNowRequestActorRole | ||||
from swh.web.add_forge_now.models import RequestHistory as AddForgeNowRequestHistory | from swh.web.add_forge_now.models import RequestHistory as AddForgeNowRequestHistory | ||||
from swh.web.add_forge_now.models import RequestStatus as AddForgeNowRequestStatus | from swh.web.add_forge_now.models import RequestStatus as AddForgeNowRequestStatus | ||||
from swh.web.api.apidoc import api_doc, format_docstring | from swh.web.api.apidoc import api_doc, format_docstring | ||||
from swh.web.api.apiurls import api_route | from swh.web.api.apiurls import api_route | ||||
from swh.web.common.exc import BadInputExc | from swh.web.common.exc import BadInputExc | ||||
from swh.web.common.utils import reverse | |||||
MODERATOR_ROLE = "swh.web.add_forge_now.moderator" | MODERATOR_ROLE = "swh.web.add_forge_now.moderator" | ||||
def _block_while_testing(): | def _block_while_testing(): | ||||
"""Replaced by tests to check concurrency behavior | """Replaced by tests to check concurrency behavior | ||||
""" | """ | ||||
pass | pass | ||||
▲ Show 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | ) -> HttpResponse: | ||||
request_history.save() | request_history.save() | ||||
if request_history.new_status is not None: | if request_history.new_status is not None: | ||||
add_forge_request.status = request_history.new_status | add_forge_request.status = request_history.new_status | ||||
add_forge_request.save() | add_forge_request.save() | ||||
data = AddForgeNowRequestSerializer(add_forge_request).data | data = AddForgeNowRequestSerializer(add_forge_request).data | ||||
return Response(data=data, status=200) | return Response(data=data, status=200) | ||||
@api_route( | |||||
r"/add-forge/request/list", "api-1-add-forge-request-list", methods=["GET"], | |||||
) | |||||
@api_doc("/add-forge/request/list") | |||||
@format_docstring() | |||||
def api_add_forge_request_list(request: Union[HttpRequest, Request]): | |||||
""" | |||||
.. http:get:: /api/1/add-forge/request/list/ | |||||
List requests to add forges to the list of those crawled regularly | |||||
by Software Heritage. | |||||
{common_headers} | |||||
{resheader_link} | |||||
:query int page: optional page number | |||||
:query int per_page: optional number of elements per page (bounded to 1000) | |||||
:statuscode 200: always | |||||
""" | |||||
add_forge_requests = AddForgeRequest.objects.order_by("-id") | |||||
if ( | |||||
int(request.GET.get("user_requests_only", "0")) | |||||
and request.user.is_authenticated | |||||
): | |||||
add_forge_requests = add_forge_requests.filter( | |||||
submitter_name=request.user.username | |||||
) | |||||
page_num = int(request.GET.get("page", 1)) | |||||
per_page = int(request.GET.get("per_page", 10)) | |||||
per_page = min(per_page, 1000) | |||||
paginator = Paginator(add_forge_requests, per_page) | |||||
page = paginator.page(page_num) | |||||
if request.user.has_perm(MODERATOR_ROLE): | |||||
results = AddForgeNowRequestSerializer(page.object_list, many=True).data | |||||
else: | |||||
results = AddForgeNowRequestPublicSerializer(page.object_list, many=True).data | |||||
response = {"results": results, "headers": {}} | |||||
if page.has_previous(): | |||||
response["headers"]["link-prev"] = reverse( | |||||
"api-1-add-forge-request-list", | |||||
query_params={"page": page.previous_page_number(), "per_page": per_page}, | |||||
request=request, | |||||
) | |||||
if page.has_next(): | |||||
response["headers"]["link-next"] = reverse( | |||||
"api-1-add-forge-request-list", | |||||
query_params={"page": page.next_page_number(), "per_page": per_page}, | |||||
request=request, | |||||
) | |||||
return response |