Changeset View
Changeset View
Standalone View
Standalone View
swh/web/browse/views/release.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.shortcuts import render | from django.shortcuts import render | ||||
import sentry_sdk | import sentry_sdk | ||||
from swh.model.identifiers import CONTENT, DIRECTORY, RELEASE, REVISION, SNAPSHOT | |||||
from swh.web.browse.browseurls import browse_route | from swh.web.browse.browseurls import browse_route | ||||
from swh.web.browse.snapshot_context import get_snapshot_context | from swh.web.browse.snapshot_context import get_snapshot_context | ||||
from swh.web.browse.utils import ( | from swh.web.browse.utils import ( | ||||
gen_revision_link, | gen_revision_link, | ||||
gen_link, | gen_link, | ||||
gen_snapshot_link, | gen_snapshot_link, | ||||
get_swh_persistent_ids, | get_swh_persistent_ids, | ||||
gen_directory_link, | gen_directory_link, | ||||
gen_content_link, | gen_content_link, | ||||
gen_release_link, | gen_release_link, | ||||
gen_person_mail_link, | gen_person_mail_link, | ||||
) | ) | ||||
from swh.web.common import service | from swh.web.common import service | ||||
from swh.web.common.exc import NotFoundExc, handle_view_exception | from swh.web.common.exc import NotFoundExc, handle_view_exception | ||||
from swh.web.common.typing import ReleaseMetadata | |||||
from swh.web.common.utils import reverse, format_utc_iso_date | from swh.web.common.utils import reverse, format_utc_iso_date | ||||
@browse_route( | @browse_route( | ||||
r"release/(?P<sha1_git>[0-9a-f]+)/", | r"release/(?P<sha1_git>[0-9a-f]+)/", | ||||
view_name="browse-release", | view_name="browse-release", | ||||
checksum_args=["sha1_git"], | checksum_args=["sha1_git"], | ||||
) | ) | ||||
def release_browse(request, sha1_git): | def release_browse(request, sha1_git): | ||||
""" | """ | ||||
Django view that produces an HTML display of a release | Django view that produces an HTML display of a release | ||||
identified by its id. | identified by its id. | ||||
The url that points to it is :http:get:`/browse/release/(sha1_git)/`. | The url that points to it is :http:get:`/browse/release/(sha1_git)/`. | ||||
""" | """ | ||||
try: | try: | ||||
release = service.lookup_release(sha1_git) | release = service.lookup_release(sha1_git) | ||||
snapshot_context = None | snapshot_context = {} | ||||
origin_info = None | origin_info = None | ||||
snapshot_id = request.GET.get("snapshot_id", None) | snapshot_id = request.GET.get("snapshot_id", None) | ||||
origin_url = request.GET.get("origin_url", None) | origin_url = request.GET.get("origin_url", None) | ||||
if not origin_url: | if not origin_url: | ||||
origin_url = request.GET.get("origin", None) | origin_url = request.GET.get("origin", None) | ||||
timestamp = request.GET.get("timestamp", None) | timestamp = request.GET.get("timestamp", None) | ||||
visit_id = request.GET.get("visit_id", None) | visit_id = request.GET.get("visit_id", None) | ||||
if origin_url: | if origin_url: | ||||
Show All 15 Lines | try: | ||||
raise NotFoundExc(error_message) | raise NotFoundExc(error_message) | ||||
origin_info = snapshot_context["origin_info"] | origin_info = snapshot_context["origin_info"] | ||||
elif snapshot_id: | elif snapshot_id: | ||||
snapshot_context = get_snapshot_context(snapshot_id) | snapshot_context = get_snapshot_context(snapshot_id) | ||||
except Exception as exc: | except Exception as exc: | ||||
return handle_view_exception(request, exc) | return handle_view_exception(request, exc) | ||||
release_data = {} | target_url = None | ||||
if release["target_type"] == REVISION: | |||||
release_data["author"] = "None" | target_url = gen_revision_link(release["target"]) | ||||
if release["author"]: | elif release["target_type"] == CONTENT: | ||||
release_data["author"] = gen_person_mail_link(release["author"]) | target_url = gen_content_link(release["target"]) | ||||
release_data["date"] = format_utc_iso_date(release["date"]) | elif release["target_type"] == DIRECTORY: | ||||
release_data["release"] = sha1_git | target_url = gen_directory_link(release["target"]) | ||||
release_data["name"] = release["name"] | elif release["target_type"] == RELEASE: | ||||
release_data["synthetic"] = release["synthetic"] | target_url = gen_release_link(release["target"]) | ||||
release_data["target"] = release["target"] | |||||
release_data["target type"] = release["target_type"] | |||||
snapshot_id = None | |||||
browse_snp_link = None | |||||
if snapshot_context: | if snapshot_context: | ||||
if release["target_type"] == "revision": | snapshot_id = snapshot_context["snapshot_id"] | ||||
release_data["context-independent target"] = gen_revision_link( | browse_snp_link = gen_snapshot_link(snapshot_id) | ||||
release["target"] | |||||
) | release_metadata = ReleaseMetadata( | ||||
elif release["target_type"] == "content": | object_type=RELEASE, | ||||
release_data["context-independent target"] = gen_content_link( | release=sha1_git, | ||||
release["target"] | release_url=gen_release_link(release["id"]), | ||||
) | author=release["author"]["fullname"] if release["author"] else "None", | ||||
elif release["target_type"] == "directory": | author_url=gen_person_mail_link(release["author"]) | ||||
release_data["context-independent target"] = gen_directory_link( | if release["author"] | ||||
release["target"] | else "None", | ||||
) | date=format_utc_iso_date(release["date"]), | ||||
elif release["target_type"] == "release": | name=release["name"], | ||||
release_data["context-independent target"] = gen_release_link( | synthetic=release["synthetic"], | ||||
release["target"] | target=release["target"], | ||||
target_type=release["target_type"], | |||||
target_url=target_url, | |||||
snapshot=snapshot_context.get("snapshot_id", None), | |||||
snapshot_url=browse_snp_link, | |||||
origin_url=origin_url, | |||||
) | ) | ||||
release_note_lines = [] | release_note_lines = [] | ||||
if release["message"]: | if release["message"]: | ||||
release_note_lines = release["message"].split("\n") | release_note_lines = release["message"].split("\n") | ||||
vault_cooking = None | vault_cooking = None | ||||
rev_directory = None | rev_directory = None | ||||
target_link = None | target_link = None | ||||
if release["target_type"] == "revision": | if release["target_type"] == REVISION: | ||||
target_link = gen_revision_link( | target_link = gen_revision_link( | ||||
release["target"], | release["target"], | ||||
snapshot_context=snapshot_context, | snapshot_context=snapshot_context, | ||||
link_text=None, | link_text=None, | ||||
link_attrs=None, | link_attrs=None, | ||||
) | ) | ||||
try: | try: | ||||
revision = service.lookup_revision(release["target"]) | revision = service.lookup_revision(release["target"]) | ||||
rev_directory = revision["directory"] | rev_directory = revision["directory"] | ||||
vault_cooking = { | vault_cooking = { | ||||
"directory_context": True, | "directory_context": True, | ||||
"directory_id": rev_directory, | "directory_id": rev_directory, | ||||
"revision_context": True, | "revision_context": True, | ||||
"revision_id": release["target"], | "revision_id": release["target"], | ||||
} | } | ||||
except Exception as exc: | except Exception as exc: | ||||
sentry_sdk.capture_exception(exc) | sentry_sdk.capture_exception(exc) | ||||
elif release["target_type"] == "directory": | elif release["target_type"] == DIRECTORY: | ||||
target_link = gen_directory_link( | target_link = gen_directory_link( | ||||
release["target"], | release["target"], | ||||
snapshot_context=snapshot_context, | snapshot_context=snapshot_context, | ||||
link_text=None, | link_text=None, | ||||
link_attrs=None, | link_attrs=None, | ||||
) | ) | ||||
try: | try: | ||||
# check directory exists | # check directory exists | ||||
service.lookup_directory(release["target"]) | service.lookup_directory(release["target"]) | ||||
vault_cooking = { | vault_cooking = { | ||||
"directory_context": True, | "directory_context": True, | ||||
"directory_id": release["target"], | "directory_id": release["target"], | ||||
"revision_context": False, | "revision_context": False, | ||||
"revision_id": None, | "revision_id": None, | ||||
} | } | ||||
except Exception as exc: | except Exception as exc: | ||||
sentry_sdk.capture_exception(exc) | sentry_sdk.capture_exception(exc) | ||||
elif release["target_type"] == "content": | elif release["target_type"] == CONTENT: | ||||
target_link = gen_content_link( | target_link = gen_content_link( | ||||
release["target"], | release["target"], | ||||
snapshot_context=snapshot_context, | snapshot_context=snapshot_context, | ||||
link_text=None, | link_text=None, | ||||
link_attrs=None, | link_attrs=None, | ||||
) | ) | ||||
elif release["target_type"] == "release": | elif release["target_type"] == RELEASE: | ||||
target_link = gen_release_link( | target_link = gen_release_link( | ||||
release["target"], | release["target"], | ||||
snapshot_context=snapshot_context, | snapshot_context=snapshot_context, | ||||
link_text=None, | link_text=None, | ||||
link_attrs=None, | link_attrs=None, | ||||
) | ) | ||||
rev_directory_url = None | rev_directory_url = None | ||||
Show All 18 Lines | if rev_directory is not None: | ||||
) | ) | ||||
directory_link = None | directory_link = None | ||||
if rev_directory_url is not None: | if rev_directory_url is not None: | ||||
directory_link = gen_link(rev_directory_url, rev_directory) | directory_link = gen_link(rev_directory_url, rev_directory) | ||||
release["directory_link"] = directory_link | release["directory_link"] = directory_link | ||||
release["target_link"] = target_link | release["target_link"] = target_link | ||||
if snapshot_context: | swh_objects = [{"type": RELEASE, "id": sha1_git}] | ||||
release_data["snapshot"] = snapshot_context["snapshot_id"] | |||||
if origin_info: | |||||
release_data["context-independent release"] = gen_release_link(release["id"]) | |||||
release_data["origin url"] = gen_link(origin_info["url"], origin_info["url"]) | |||||
browse_snapshot_link = gen_snapshot_link(snapshot_context["snapshot_id"]) | |||||
release_data["context-independent snapshot"] = browse_snapshot_link | |||||
swh_objects = [{"type": "release", "id": sha1_git}] | |||||
if snapshot_context: | if snapshot_context: | ||||
snapshot_id = snapshot_context["snapshot_id"] | snapshot_id = snapshot_context["snapshot_id"] | ||||
if snapshot_id: | if snapshot_id: | ||||
swh_objects.append({"type": "snapshot", "id": snapshot_id}) | swh_objects.append({"type": SNAPSHOT, "id": snapshot_id}) | ||||
swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) | swh_ids = get_swh_persistent_ids(swh_objects, snapshot_context) | ||||
note_header = "None" | note_header = "None" | ||||
if len(release_note_lines) > 0: | if len(release_note_lines) > 0: | ||||
note_header = release_note_lines[0] | note_header = release_note_lines[0] | ||||
release["note_header"] = note_header | release["note_header"] = note_header | ||||
release["note_body"] = "\n".join(release_note_lines[1:]) | release["note_body"] = "\n".join(release_note_lines[1:]) | ||||
heading = "Release - %s" % release["name"] | heading = "Release - %s" % release["name"] | ||||
if snapshot_context: | if snapshot_context: | ||||
context_found = "snapshot: %s" % snapshot_context["snapshot_id"] | context_found = "snapshot: %s" % snapshot_context["snapshot_id"] | ||||
if origin_info: | if origin_info: | ||||
context_found = "origin: %s" % origin_info["url"] | context_found = "origin: %s" % origin_info["url"] | ||||
heading += " - %s" % context_found | heading += " - %s" % context_found | ||||
return render( | return render( | ||||
request, | request, | ||||
"browse/release.html", | "browse/release.html", | ||||
{ | { | ||||
"heading": heading, | "heading": heading, | ||||
"swh_object_id": swh_ids[0]["swh_id"], | "swh_object_id": swh_ids[0]["swh_id"], | ||||
"swh_object_name": "Release", | "swh_object_name": "Release", | ||||
"swh_object_metadata": release_data, | "swh_object_metadata": release_metadata, | ||||
"release": release, | "release": release, | ||||
"snapshot_context": snapshot_context, | "snapshot_context": snapshot_context, | ||||
"show_actions_menu": True, | "show_actions_menu": True, | ||||
"breadcrumbs": None, | "breadcrumbs": None, | ||||
"vault_cooking": vault_cooking, | "vault_cooking": vault_cooking, | ||||
"top_right_link": None, | "top_right_link": None, | ||||
"swh_ids": swh_ids, | "swh_ids": swh_ids, | ||||
}, | }, | ||||
) | ) |