Changeset View
Changeset View
Standalone View
Standalone View
swh/web/misc/origin_save.py
# Copyright (C) 2018-2021 The Software Heritage developers | # Copyright (C) 2018-2021 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 | ||||
from django.conf.urls import url | from django.conf.urls import url | ||||
from django.core.paginator import Paginator | from django.core.paginator import Paginator | ||||
from django.db.models import Q | from django.db.models import Q | ||||
from django.http import JsonResponse | from django.http import JsonResponse | ||||
from django.shortcuts import render | from django.shortcuts import render | ||||
from rest_framework.decorators import api_view, authentication_classes | |||||
from swh.web.api.throttling import throttle_scope | |||||
from swh.web.common.exc import ForbiddenExc | |||||
from swh.web.common.models import SaveOriginRequest | from swh.web.common.models import SaveOriginRequest | ||||
from swh.web.common.origin_save import ( | from swh.web.common.origin_save import ( | ||||
create_save_origin_request, | |||||
get_savable_visit_types, | get_savable_visit_types, | ||||
get_save_origin_task_info, | get_save_origin_task_info, | ||||
) | ) | ||||
from swh.web.common.utils import EnforceCSRFAuthentication | |||||
def _origin_save_view(request): | def _origin_save_view(request): | ||||
return render( | return render( | ||||
request, | request, | ||||
"misc/origin-save.html", | "misc/origin-save.html", | ||||
{"heading": ("Request the saving of a software origin into " "the archive")}, | {"heading": ("Request the saving of a software origin into " "the archive")}, | ||||
) | ) | ||||
@api_view(["POST"]) | |||||
@authentication_classes((EnforceCSRFAuthentication,)) | |||||
@throttle_scope("swh_save_origin") | |||||
def _origin_save_request(request, visit_type, origin_url): | |||||
""" | |||||
This view is called through AJAX from the save code now form of swh-web. | |||||
We use DRF here as we want to rate limit the number of submitted requests | |||||
per user to avoid being possibly flooded by bots. | |||||
""" | |||||
try: | |||||
response = create_save_origin_request(visit_type, origin_url) | |||||
return JsonResponse(response) | |||||
except ForbiddenExc as exc: | |||||
return JsonResponse({"detail": str(exc)}, status=403) | |||||
except Exception as exc: | |||||
return JsonResponse({"detail": str(exc)}, status=500) | |||||
def _visit_save_types_list(request): | def _visit_save_types_list(request): | ||||
visit_types = get_savable_visit_types() | visit_types = get_savable_visit_types() | ||||
return JsonResponse(visit_types, safe=False) | return JsonResponse(visit_types, safe=False) | ||||
def _origin_save_requests_list(request, status): | def _origin_save_requests_list(request, status): | ||||
if status != "all": | if status != "all": | ||||
Show All 39 Lines | def _save_origin_task_info(request, save_request_id): | ||||
for date_field in ("scheduled", "started", "ended"): | for date_field in ("scheduled", "started", "ended"): | ||||
if date_field in request_info and request_info[date_field] is not None: | if date_field in request_info and request_info[date_field] is not None: | ||||
request_info[date_field] = request_info[date_field].isoformat() | request_info[date_field] = request_info[date_field].isoformat() | ||||
return JsonResponse(request_info) | return JsonResponse(request_info) | ||||
urlpatterns = [ | urlpatterns = [ | ||||
url(r"^save/$", _origin_save_view, name="origin-save"), | url(r"^save/$", _origin_save_view, name="origin-save"), | ||||
url( | |||||
r"^save/(?P<visit_type>.+)/url/(?P<origin_url>.+)/$", | |||||
_origin_save_request, | |||||
name="origin-save-request", | |||||
), | |||||
url(r"^save/types/list/$", _visit_save_types_list, name="origin-save-types-list"), | url(r"^save/types/list/$", _visit_save_types_list, name="origin-save-types-list"), | ||||
url( | url( | ||||
r"^save/requests/list/(?P<status>.+)/$", | r"^save/requests/list/(?P<status>.+)/$", | ||||
_origin_save_requests_list, | _origin_save_requests_list, | ||||
name="origin-save-requests-list", | name="origin-save-requests-list", | ||||
), | ), | ||||
url( | url( | ||||
r"^save/task/info/(?P<save_request_id>.+)/", | r"^save/task/info/(?P<save_request_id>.+)/", | ||||
_save_origin_task_info, | _save_origin_task_info, | ||||
name="origin-save-task-info", | name="origin-save-task-info", | ||||
), | ), | ||||
] | ] |