diff --git a/swh/web/api/views/add_forge_now.py b/swh/web/api/views/add_forge_now.py index ebe08927..8e489cc5 100644 --- a/swh/web/api/views/add_forge_now.py +++ b/swh/web/api/views/add_forge_now.py @@ -1,226 +1,290 @@ # Copyright (C) 2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information import json from typing import Union from django.core.exceptions import ObjectDoesNotExist +from django.core.paginator import Paginator from django.db import transaction from django.forms import CharField, ModelForm from django.http import HttpResponseBadRequest from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseForbidden from rest_framework import serializers from rest_framework.request import Request 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 RequestActorRole as AddForgeNowRequestActorRole 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.api.apidoc import api_doc, format_docstring from swh.web.api.apiurls import api_route from swh.web.common.exc import BadInputExc +from swh.web.common.utils import reverse MODERATOR_ROLE = "swh.web.add_forge_now.moderator" def _block_while_testing(): """Replaced by tests to check concurrency behavior """ pass class AddForgeNowRequestForm(ModelForm): class Meta: model = AddForgeRequest fields = ( "forge_type", "forge_url", "forge_contact_email", "forge_contact_name", "forge_contact_comment", ) class AddForgeNowRequestHistoryForm(ModelForm): new_status = CharField(max_length=200, required=False,) class Meta: model = AddForgeNowRequestHistory fields = ("text", "new_status") class AddForgeNowRequestSerializer(serializers.ModelSerializer): class Meta: model = AddForgeRequest fields = "__all__" class AddForgeNowRequestPublicSerializer(serializers.ModelSerializer): """Serializes AddForgeRequest without private fields. """ class Meta: model = AddForgeRequest fields = ("forge_url", "forge_type", "status", "submission_date") @api_route( r"/add-forge/request/create", "api-1-add-forge-request-create", methods=["POST"], ) @api_doc("/add-forge/request/create") @format_docstring() def api_add_forge_request_create(request: Union[HttpRequest, Request]) -> HttpResponse: """ .. http:post:: /api/1/add-forge/request/create/ Create a new request to add a forge to the list of those crawled regularly by Software Heritage. .. warning:: That endpoint is not publicly available and requires authentication in order to be able to request it. {common_headers} :[0-9]+)/update/", "api-1-add-forge-request-update", methods=["POST"], ) @api_doc("/add-forge/request/update", tags=["hidden"]) @format_docstring() @transaction.atomic def api_add_forge_request_update( request: Union[HttpRequest, Request], id: int ) -> HttpResponse: """ .. http:post:: /api/1/add-forge/request/update/ Update a request to add a forge to the list of those crawled regularly by Software Heritage. .. warning:: That endpoint is not publicly available and requires authentication in order to be able to request it. {common_headers} :; rel="next"' + + resp = check_api_get_responses(api_client, next_url, 200) + + assert len(resp.data) == 1 + + prev_url = reverse( + "api-1-add-forge-request-list", + query_params={"page": 1, "per_page": 1}, + request=request, + ) + + assert resp["Link"] == f'<{prev_url}>; rel="previous"' + + +@pytest.mark.django_db(transaction=True, reset_sequences=True) +def test_add_forge_request_list_submitter_filtering( + api_client, regular_user, regular_user2 +): + _create_add_forge_request(api_client, regular_user) + _create_add_forge_request(api_client, regular_user2, data=ADD_OTHER_FORGE_DATA) + + api_client.force_login(regular_user) + url = reverse( + "api-1-add-forge-request-list", query_params={"user_requests_only": 1} + ) + resp = check_api_get_responses(api_client, url, status_code=200) + + assert len(resp.data) == 1