# Copyright (C) 2018-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
from typing import Optional
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect
from swh.web.browse.browseurls import browse_route
from swh.web.browse.snapshot_context import (
browse_snapshot_branches,
browse_snapshot_directory,
browse_snapshot_log,
browse_snapshot_releases,
get_snapshot_context,
)
from swh.web.utils import redirect_to_new_route, reverse
from swh.web.utils.exc import BadInputExc
[docs]
def get_snapshot_from_request(request: HttpRequest) -> str:
snapshot = request.GET.get("snapshot")
if snapshot:
return snapshot
if request.GET.get("origin_url") is None:
raise BadInputExc("An origin URL must be provided as a query parameter.")
return get_snapshot_context(
origin_url=request.GET.get("origin_url"),
timestamp=request.GET.get("timestamp"),
visit_type=request.GET.get("visit_type"),
)["snapshot_id"]
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/",
view_name="browse-snapshot",
checksum_args=["snapshot_id"],
)
def snapshot_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
"""Django view for browsing the content of a snapshot.
The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/`
"""
browse_snapshot_url = reverse(
"browse-snapshot-directory",
url_args={"snapshot_id": snapshot_id},
query_params=request.GET.dict(),
)
return redirect(browse_snapshot_url)
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/directory/",
view_name="browse-snapshot-directory",
checksum_args=["snapshot_id"],
)
def snapshot_directory_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
"""Django view for browsing the content of a directory collected
in a snapshot.
The URL that points to it is :http:get:`/browse/snapshot/(snapshot_id)/directory/`
"""
return browse_snapshot_directory(
request,
snapshot_id=snapshot_id,
path=request.GET.get("path"),
origin_url=request.GET.get("origin_url"),
)
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/directory/(?P<path>.+)/",
view_name="browse-snapshot-directory-legacy",
checksum_args=["snapshot_id"],
)
def snapshot_directory_browse_legacy(
request: HttpRequest, snapshot_id: str, path: Optional[str] = None
) -> HttpResponse:
"""Django view for browsing the content of a directory collected
in a snapshot.
The URL that points to it is
:http:get:`/browse/snapshot/(snapshot_id)/directory/(path)/`
"""
origin_url = request.GET.get("origin_url", None)
if not origin_url:
origin_url = request.GET.get("origin", None)
return browse_snapshot_directory(
request, snapshot_id=snapshot_id, path=path, origin_url=origin_url
)
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/content/",
view_name="browse-snapshot-content",
checksum_args=["snapshot_id"],
)
def snapshot_content_browse(request: HttpRequest, snapshot_id: str) -> HttpResponse:
"""
This route is deprecated; use http:get:`/browse/content` instead
Django view that produces an HTML display of a content
collected in a snapshot.
The url that points to it is :http:get:`/browse/snapshot/(snapshot_id)/content/`
"""
return redirect_to_new_route(request, "browse-content")
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/content/(?P<path>.+)/",
view_name="browse-snapshot-content-legacy",
checksum_args=["snapshot_id"],
)
def snapshot_content_browse_legacy(
request: HttpRequest, snapshot_id: str, path: str
) -> HttpResponse:
"""
This route is deprecated; use http:get:`/browse/content` instead
Django view that produces an HTML display of a content
collected in a snapshot.
The url that points to it is
:http:get:`/browse/snapshot/(snapshot_id)/content/(path)/`
"""
return redirect_to_new_route(request, "browse-content")
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/log/",
r"snapshot/log/",
view_name="browse-snapshot-log",
checksum_args=["snapshot_id"],
)
def snapshot_log_browse(
request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
"""Django view that produces an HTML display of revisions history (aka
the commit log) collected in a snapshot.
The URLs that point to it are
:http:get:`/browse/snapshot/(snapshot_id)/log/` and
:http:get:`/browse/snapshot/log/`
"""
if snapshot_id is None:
# This case happens when redirected from /origin/log
snapshot_id = get_snapshot_from_request(request)
# Redirect to the same route with snapshot_id
return redirect(
reverse(
"browse-snapshot-log",
url_args={"snapshot_id": snapshot_id},
query_params=request.GET,
),
)
return browse_snapshot_log(
request,
snapshot_id=snapshot_id,
origin_url=request.GET.get("origin_url"),
timestamp=request.GET.get("timestamp"),
)
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/branches/",
r"snapshot/branches/",
view_name="browse-snapshot-branches",
checksum_args=["snapshot_id"],
)
def snapshot_branches_browse(
request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
"""Django view that produces an HTML display of the list of branches
collected in a snapshot.
The URLs that point to it are
:http:get:`/browse/snapshot/(snapshot_id)/branches/` and
:http:get:`/browse/snapshot/branches/`
"""
if snapshot_id is None:
# This case happens when redirected from /origin/branches
snapshot_id = get_snapshot_from_request(request)
# Redirect to the same route with the newest snapshot_id
# for the given origin
return redirect(
reverse(
"browse-snapshot-branches",
url_args={"snapshot_id": snapshot_id},
query_params=request.GET,
),
)
return browse_snapshot_branches(
request,
snapshot_id=snapshot_id,
origin_url=request.GET.get("origin_url"),
timestamp=request.GET.get("timestamp"),
branch_name_include=request.GET.get("name_include"),
)
[docs]
@browse_route(
r"snapshot/(?P<snapshot_id>[0-9a-f]+)/releases/",
r"snapshot/releases/",
view_name="browse-snapshot-releases",
checksum_args=["snapshot_id"],
)
def snapshot_releases_browse(
request: HttpRequest, snapshot_id: Optional[str] = None
) -> HttpResponse:
"""Django view that produces an HTML display of the list of releases
collected in a snapshot.
The URLs that point to it are
:http:get:`/browse/snapshot/(snapshot_id)/releases/`
:http:get:`/browse/snapshot/releases/`
"""
if snapshot_id is None:
# This case happens when redirected from /origin/releases
snapshot_id = get_snapshot_from_request(request)
# Redirect to the same route with the newest snapshot_id
# for the given origin
return redirect(
reverse(
"browse-snapshot-releases",
url_args={"snapshot_id": snapshot_id},
query_params=request.GET,
),
)
return browse_snapshot_releases(
request,
snapshot_id=snapshot_id,
origin_url=request.GET.get("origin_url"),
timestamp=request.GET.get("timestamp"),
release_name_include=request.GET.get("name_include"),
)