diff --git a/swh/web/misc/__init__.py b/swh/web/misc/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/swh/web/tests/test_urls.py b/swh/web/tests/test_urls.py index ff337094..be771132 100644 --- a/swh/web/tests/test_urls.py +++ b/swh/web/tests/test_urls.py @@ -1,27 +1,35 @@ # 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 pytest from django.urls import get_resolver +from swh.web.tests.helpers import check_http_get_response +from swh.web.utils import reverse + def test_swh_web_urls_have_trailing_slash(): urls = set( value[1] for key, value in get_resolver().reverse_dict.items() if key != "browse-swhid" # (see T3234) ) for url in urls: if url != "$": assert url.endswith("/$") def test_urls_registration_error_for_not_found_django_app(django_settings): app_name = "swh.web.foobar" with pytest.raises( AssertionError, match=f"Django application {app_name} not found !" ): django_settings.SWH_DJANGO_APPS = django_settings.SWH_DJANGO_APPS + [app_name] + + +def test_stat_counters_view(client): + url = reverse("stat-counters") + check_http_get_response(client, url, status_code=200) diff --git a/swh/web/misc/urls.py b/swh/web/tests/urls.py similarity index 50% rename from swh/web/misc/urls.py rename to swh/web/tests/urls.py index efebe0b9..d6c84218 100644 --- a/swh/web/misc/urls.py +++ b/swh/web/tests/urls.py @@ -1,86 +1,47 @@ -# Copyright (C) 2019-2022 The Software Heritage developers +# 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 -import json - -import requests - -from django.http import JsonResponse from django.urls import re_path as url from swh.web.config import get_config -from swh.web.utils import archive -from swh.web.utils.exc import sentry_capture_exception - - -def _stat_counters(request): - stat_counters = archive.stat_counters() - url = get_config()["history_counters_url"] - stat_counters_history = {} - try: - response = requests.get(url, timeout=5) - stat_counters_history = json.loads(response.text) - except Exception as exc: - sentry_capture_exception(exc) - - counters = { - "stat_counters": stat_counters, - "stat_counters_history": stat_counters_history, - } - return JsonResponse(counters) - - -urlpatterns = [ - url(r"^stat_counters/$", _stat_counters, name="stat-counters"), -] - - +from swh.web.tests.views import ( + get_content_code_data_all_exts, + get_content_code_data_all_filenames, + get_content_code_data_by_ext, + get_content_code_data_by_filename, + get_content_other_data_by_ext, +) + +urlpatterns = [] # when running end to end tests through cypress, declare some extra # endpoints to provide input data for some of those tests if get_config()["e2e_tests_mode"]: - - from swh.web.tests.views import ( - get_content_code_data_all_exts, - get_content_code_data_all_filenames, - get_content_code_data_by_ext, - get_content_code_data_by_filename, - get_content_other_data_by_ext, - ) - - urlpatterns.append( + urlpatterns = [ url( r"^tests/data/content/code/extension/(?P.+)/$", get_content_code_data_by_ext, name="tests-content-code-extension", - ) - ) - urlpatterns.append( + ), url( r"^tests/data/content/other/extension/(?P.+)/$", get_content_other_data_by_ext, name="tests-content-other-extension", - ) - ) - urlpatterns.append( + ), url( r"^tests/data/content/code/extensions/$", get_content_code_data_all_exts, name="tests-content-code-extensions", - ) - ) - urlpatterns.append( + ), url( r"^tests/data/content/code/filename/(?P.+)/$", get_content_code_data_by_filename, name="tests-content-code-filename", - ) - ) - urlpatterns.append( + ), url( r"^tests/data/content/code/filenames/$", get_content_code_data_all_filenames, name="tests-content-code-filenames", - ) - ) + ), + ] diff --git a/swh/web/urls.py b/swh/web/urls.py index 528e2efc..0be2d0fc 100644 --- a/swh/web/urls.py +++ b/swh/web/urls.py @@ -1,81 +1,101 @@ # Copyright (C) 2017-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 importlib.util import find_spec +import json from typing import List, Union from django_js_reverse.views import urls_js +import requests from django.conf import settings from django.conf.urls import handler400, handler403, handler404, handler500, include from django.contrib.staticfiles.views import serve +from django.http import JsonResponse from django.shortcuts import render from django.urls import URLPattern, URLResolver from django.urls import re_path as url from django.views.generic.base import RedirectView from swh.web.browse.identifiers import swhid_browse from swh.web.config import get_config -from swh.web.utils import origin_visit_types +from swh.web.utils import archive, origin_visit_types from swh.web.utils.exc import swh_handle400, swh_handle403, swh_handle404, swh_handle500 swh_web_config = get_config() favicon_view = RedirectView.as_view( url="/static/img/icons/swh-logo-32x32.png", permanent=True ) def _default_view(request): return render(request, "homepage.html", {"visit_types": origin_visit_types()}) +def _stat_counters(request): + stat_counters = archive.stat_counters() + url = get_config()["history_counters_url"] + stat_counters_history = {} + + if url: + response = requests.get(url, timeout=5) + stat_counters_history = json.loads(response.text) + + counters = { + "stat_counters": stat_counters, + "stat_counters_history": stat_counters_history, + } + return JsonResponse(counters) + + urlpatterns: List[Union[URLPattern, URLResolver]] = [] # Register URLs for each SWH Django application for app in settings.SWH_DJANGO_APPS: app_urls = app + ".urls" try: app_urls_spec = find_spec(app_urls) if app_urls_spec is not None: urlpatterns.append(url(r"^", include(app_urls))) except ModuleNotFoundError: assert False, f"Django application {app} not found !" urlpatterns += [ url(r"^favicon\.ico/$", favicon_view), url(r"^$", _default_view, name="swh-web-homepage"), url(r"^jsreverse/$", urls_js, name="js_reverse"), # keep legacy SWHID resolving URL with trailing slash for backward compatibility url( r"^(?P(swh|SWH):[0-9]+:[A-Za-z]+:[0-9A-Fa-f]+.*)/$", swhid_browse, name="browse-swhid-legacy", ), url( r"^(?P(swh|SWH):[0-9]+:[A-Za-z]+:[0-9A-Fa-f]+.*)$", swhid_browse, name="browse-swhid", ), - url(r"^", include("swh.web.misc.urls")), + url(r"^stat_counters/$", _stat_counters, name="stat-counters"), + url(r"^", include("swh.web.tests.urls")), ] # allow to serve assets through django staticfiles # even if settings.DEBUG is False def insecure_serve(request, path, **kwargs): return serve(request, path, insecure=True, **kwargs) # enable to serve compressed assets through django development server if swh_web_config["serve_assets"]: static_pattern = r"^%s(?P.*)/$" % settings.STATIC_URL[1:] urlpatterns.append(url(static_pattern, insecure_serve)) handler400 = swh_handle400 # noqa handler403 = swh_handle403 # noqa handler404 = swh_handle404 # noqa handler500 = swh_handle500 # noqa