Changeset View
Changeset View
Standalone View
Standalone View
swh/web/browse/views/origin.py
# Copyright (C) 2017-2020 The Software Heritage developers | # Copyright (C) 2017-2020 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.http import Http404 | |||||
from django.shortcuts import redirect, render | from django.shortcuts import redirect, render | ||||
from swh.web.browse.browseurls import browse_route | from swh.web.browse.browseurls import browse_route | ||||
from swh.web.browse.snapshot_context import ( | from swh.web.browse.snapshot_context import get_snapshot_context | ||||
browse_snapshot_branches, | |||||
browse_snapshot_content, | |||||
browse_snapshot_directory, | |||||
browse_snapshot_log, | |||||
browse_snapshot_releases, | |||||
get_snapshot_context, | |||||
) | |||||
from swh.web.common import archive | from swh.web.common import archive | ||||
from swh.web.common.exc import BadInputExc | from swh.web.common.exc import BadInputExc, NotFoundExc | ||||
from swh.web.common.origin_visits import get_origin_visits | from swh.web.common.origin_visits import get_origin_visits | ||||
from swh.web.common.utils import format_utc_iso_date, parse_iso8601_date_to_utc, reverse | from swh.web.common.utils import format_utc_iso_date, parse_iso8601_date_to_utc, reverse | ||||
def get_snapshot_or_raise(snapshot_params): | |||||
try: | |||||
snapshot_context = get_snapshot_context(**snapshot_params) | |||||
except NotFoundExc as e: | |||||
raise Http404("Requested snapshot does not exist", str(e)) | |||||
anlambert: That code is not needed, views exception handling is done at a global level by a [[ https… | |||||
return snapshot_context | |||||
def deprecate_route(alternate_route, args, params): | |||||
return redirect(reverse(alternate_route, url_args=args, query_params=params)) | |||||
@browse_route( | @browse_route( | ||||
r"origin/directory/", view_name="browse-origin-directory", | r"origin/directory/", view_name="browse-origin-directory", | ||||
) | ) | ||||
def origin_directory_browse(request): | def origin_directory_browse(request): | ||||
"""Django view for browsing the content of a directory associated | """ | ||||
This route is deprecated; use /browse/directory/<sha1>/ instead | |||||
Django view for browsing the content of a directory associated | |||||
to an origin for a given visit. | to an origin for a given visit. | ||||
The URL that points to it is :http:get:`/browse/origin/directory/` | The URL that points to it is :http:get:`/browse/origin/directory/` | ||||
""" | """ | ||||
return browse_snapshot_directory( | |||||
request, | snapshot_context = get_snapshot_or_raise( | ||||
origin_url=request.GET.get("origin_url"), | { | ||||
snapshot_id=request.GET.get("snapshot"), | "origin_url": request.GET.get("origin_url"), | ||||
timestamp=request.GET.get("timestamp"), | "snapshot_id": request.GET.get("snapshot"), | ||||
path=request.GET.get("path"), | "timestamp": request.GET.get("timestamp"), | ||||
"path": request.GET.get("path"), | |||||
} | |||||
) | |||||
return deprecate_route( | |||||
"browse-directory", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/directory/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/directory/", | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/directory/(?P<path>.+)/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/directory/(?P<path>.+)/", | ||||
r"origin/(?P<origin_url>.+)/directory/(?P<path>.+)/", | r"origin/(?P<origin_url>.+)/directory/(?P<path>.+)/", | ||||
r"origin/(?P<origin_url>.+)/directory/", | r"origin/(?P<origin_url>.+)/directory/", | ||||
view_name="browse-origin-directory-legacy", | view_name="browse-origin-directory-legacy", | ||||
) | ) | ||||
def origin_directory_browse_legacy(request, origin_url, timestamp=None, path=None): | def origin_directory_browse_legacy(request, origin_url, timestamp=None, path=None): | ||||
"""Django view for browsing the content of a directory associated | """ | ||||
This route is deprecated, use /browse/directory/<sha1>/ instead | |||||
Django view for browsing the content of a directory associated | |||||
to an origin for a given visit. | to an origin for a given visit. | ||||
The URLs that point to it are | The URLs that point to it are | ||||
:http:get:`/browse/origin/(origin_url)/directory/[(path)/]` and | :http:get:`/browse/origin/(origin_url)/directory/[(path)/]` and | ||||
:http:get:`/browse/origin/(origin_url)/visit/(timestamp)/directory/[(path)/]` | :http:get:`/browse/origin/(origin_url)/visit/(timestamp)/directory/[(path)/]` | ||||
""" | """ | ||||
return browse_snapshot_directory( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=origin_url, | "origin_url": origin_url, | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=timestamp, | "timestamp": timestamp, | ||||
path=path, | } | ||||
) | |||||
return deprecate_route( | |||||
"browse-directory", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/content/", view_name="browse-origin-content", | r"origin/content/", view_name="browse-origin-content", | ||||
) | ) | ||||
def origin_content_browse(request): | def origin_content_browse(request): | ||||
"""Django view that produces an HTML display of a content | """ | ||||
This route is deprecated, use /browse/content/<sha1>/ instead | |||||
Django view that produces an HTML display of a content | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URL that points to it is :http:get:`/browse/origin/content/` | The URL that points to it is :http:get:`/browse/origin/content/` | ||||
""" | """ | ||||
return browse_snapshot_content( | |||||
request, | snapshot_context = get_snapshot_or_raise( | ||||
origin_url=request.GET.get("origin_url"), | { | ||||
snapshot_id=request.GET.get("snapshot"), | "origin_url": request.GET.get("origin_url"), | ||||
timestamp=request.GET.get("timestamp"), | "snapshot_id": request.GET.get("snapshot"), | ||||
path=request.GET.get("path"), | "timestamp": request.GET.get("timestamp"), | ||||
selected_language=request.GET.get("language"), | } | ||||
) | |||||
# get the content sha1 | |||||
return deprecate_route( | |||||
"browse-content", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/content/(?P<path>.+)/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/content/(?P<path>.+)/", | ||||
r"origin/(?P<origin_url>.+)/content/(?P<path>.+)/", | r"origin/(?P<origin_url>.+)/content/(?P<path>.+)/", | ||||
r"origin/(?P<origin_url>.+)/content/", | r"origin/(?P<origin_url>.+)/content/", | ||||
view_name="browse-origin-content-legacy", | view_name="browse-origin-content-legacy", | ||||
) | ) | ||||
def origin_content_browse_legacy(request, origin_url, path=None, timestamp=None): | def origin_content_browse_legacy(request, origin_url, path=None, timestamp=None): | ||||
"""Django view that produces an HTML display of a content | """ | ||||
This route is deprecated, use /browse/content/<sha1>/ instead | |||||
Django view that produces an HTML display of a content | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URLs that point to it are | The URLs that point to it are | ||||
:http:get:`/browse/origin/(origin_url)/content/(path)/` and | :http:get:`/browse/origin/(origin_url)/content/(path)/` and | ||||
:http:get:`/browse/origin/(origin_url)/visit/(timestamp)/content/(path)/` | :http:get:`/browse/origin/(origin_url)/visit/(timestamp)/content/(path)/` | ||||
""" | """ | ||||
return browse_snapshot_content( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=origin_url, | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=timestamp, | "timestamp": timestamp, | ||||
path=path, | } | ||||
selected_language=request.GET.get("language"), | ) | ||||
# get the content sha1 | |||||
return deprecate_route( | |||||
"browse-content", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/log/", view_name="browse-origin-log", | r"origin/log/", view_name="browse-origin-log", | ||||
) | ) | ||||
def origin_log_browse(request): | def origin_log_browse(request): | ||||
"""Django view that produces an HTML display of revisions history (aka | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/log/ instead | |||||
Django view that produces an HTML display of revisions history (aka | |||||
the commit log) associated to a software origin. | the commit log) associated to a software origin. | ||||
The URL that points to it is :http:get:`/browse/origin/log/` | The URL that points to it is :http:get:`/browse/origin/log/` | ||||
""" | """ | ||||
return browse_snapshot_log( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=request.GET.get("origin_url"), | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=request.GET.get("timestamp"), | "timestamp": request.GET.get("timestamp"), | ||||
} | |||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-log", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/log/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/log/", | ||||
r"origin/(?P<origin_url>.+)/log/", | r"origin/(?P<origin_url>.+)/log/", | ||||
view_name="browse-origin-log-legacy", | view_name="browse-origin-log-legacy", | ||||
) | ) | ||||
def origin_log_browse_legacy(request, origin_url, timestamp=None): | def origin_log_browse_legacy(request, origin_url, timestamp=None): | ||||
"""Django view that produces an HTML display of revisions history (aka | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/log/ instead | |||||
Django view that produces an HTML display of revisions history (aka | |||||
the commit log) associated to a software origin. | the commit log) associated to a software origin. | ||||
The URLs that point to it are | The URLs that point to it are | ||||
:http:get:`/browse/origin/(origin_url)/log/` and | :http:get:`/browse/origin/(origin_url)/log/` and | ||||
:http:get:`/browse/origin/(origin_url)/visit/(timestamp)/log/` | :http:get:`/browse/origin/(origin_url)/visit/(timestamp)/log/` | ||||
""" | """ | ||||
return browse_snapshot_log( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=origin_url, | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=timestamp, | "timestamp": request.GET.get("timestamp"), | ||||
} | |||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-log", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/branches/", view_name="browse-origin-branches", | r"origin/branches/", view_name="browse-origin-branches", | ||||
) | ) | ||||
def origin_branches_browse(request): | def origin_branches_browse(request): | ||||
"""Django view that produces an HTML display of the list of branches | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/branches/ instead | |||||
Django view that produces an HTML display of the list of branches | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URL that points to it is :http:get:`/browse/origin/branches/` | The URL that points to it is :http:get:`/browse/origin/branches/` | ||||
""" | """ | ||||
return browse_snapshot_branches( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=request.GET.get("origin_url"), | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=request.GET.get("timestamp"), | "timestamp": request.GET.get("timestamp"), | ||||
branch_name_include=request.GET.get("name_include"), | } | ||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-branches", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/branches/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/branches/", | ||||
r"origin/(?P<origin_url>.+)/branches/", | r"origin/(?P<origin_url>.+)/branches/", | ||||
view_name="browse-origin-branches-legacy", | view_name="browse-origin-branches-legacy", | ||||
) | ) | ||||
def origin_branches_browse_legacy(request, origin_url, timestamp=None): | def origin_branches_browse_legacy(request, origin_url, timestamp=None): | ||||
"""Django view that produces an HTML display of the list of branches | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/branches/ instead | |||||
Django view that produces an HTML display of the list of branches | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URLs that point to it are | The URLs that point to it are | ||||
:http:get:`/browse/origin/(origin_url)/branches/` and | :http:get:`/browse/origin/(origin_url)/branches/` and | ||||
:http:get:`/browse/origin/(origin_url)/visit/(timestamp)/branches/` | :http:get:`/browse/origin/(origin_url)/visit/(timestamp)/branches/` | ||||
""" | """ | ||||
return browse_snapshot_branches( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=origin_url, | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=timestamp, | "timestamp": request.GET.get("timestamp"), | ||||
} | |||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-branches", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/releases/", view_name="browse-origin-releases", | r"origin/releases/", view_name="browse-origin-releases", | ||||
) | ) | ||||
def origin_releases_browse(request): | def origin_releases_browse(request): | ||||
"""Django view that produces an HTML display of the list of releases | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/releases/ instead | |||||
Django view that produces an HTML display of the list of releases | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URL that points to it is :http:get:`/browse/origin/releases/` | The URL that points to it is :http:get:`/browse/origin/releases/` | ||||
""" | """ | ||||
return browse_snapshot_releases( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=request.GET.get("origin_url"), | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=request.GET.get("timestamp"), | "timestamp": request.GET.get("timestamp"), | ||||
release_name_include=request.GET.get("name_include"), | } | ||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-releases", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
@browse_route( | @browse_route( | ||||
r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/releases/", | r"origin/(?P<origin_url>.+)/visit/(?P<timestamp>.+)/releases/", | ||||
r"origin/(?P<origin_url>.+)/releases/", | r"origin/(?P<origin_url>.+)/releases/", | ||||
view_name="browse-origin-releases-legacy", | view_name="browse-origin-releases-legacy", | ||||
) | ) | ||||
def origin_releases_browse_legacy(request, origin_url, timestamp=None): | def origin_releases_browse_legacy(request, origin_url, timestamp=None): | ||||
"""Django view that produces an HTML display of the list of releases | """ | ||||
This route is deprecated, | |||||
use /browse/snapshot/(?P<snapshot_id>[0-9a-f]+)/releases/ instead | |||||
Django view that produces an HTML display of the list of releases | |||||
associated to an origin for a given visit. | associated to an origin for a given visit. | ||||
The URLs that point to it are | The URLs that point to it are | ||||
:http:get:`/browse/origin/(origin_url)/releases/` and | :http:get:`/browse/origin/(origin_url)/releases/` and | ||||
:http:get:`/browse/origin/(origin_url)/visit/(timestamp)/releases/` | :http:get:`/browse/origin/(origin_url)/visit/(timestamp)/releases/` | ||||
""" | """ | ||||
return browse_snapshot_releases( | snapshot_context = get_snapshot_or_raise( | ||||
request, | { | ||||
origin_url=origin_url, | "origin_url": request.GET.get("origin_url"), | ||||
snapshot_id=request.GET.get("snapshot"), | "snapshot_id": request.GET.get("snapshot"), | ||||
timestamp=timestamp, | "timestamp": request.GET.get("timestamp"), | ||||
} | |||||
) | |||||
# get the snapshot sha1 and redirect | |||||
return deprecate_route( | |||||
"browse-snapshot-releases", | |||||
{"sha1_git": snapshot_context["root_directory"]}, | |||||
params=request.GET, | |||||
) | ) | ||||
def _origin_visits_browse(request, origin_url): | def _origin_visits_browse(request, origin_url): | ||||
if origin_url is None: | if origin_url is None: | ||||
raise BadInputExc("An origin URL must be provided as query parameter.") | raise BadInputExc("An origin URL must be provided as query parameter.") | ||||
origin_info = archive.lookup_origin({"url": origin_url}) | origin_info = archive.lookup_origin({"url": origin_url}) | ||||
▲ Show 20 Lines • Show All 82 Lines • Show Last 20 Lines |
That code is not needed, views exception handling is done at a global level by a django middleware. Every caught NotFoundExc will return a 404.