From 79bcc6448e41345788cf61ac715058cf2809bcd2 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Thu, 24 Mar 2022 15:38:33 -0500 Subject: [PATCH] feat: redirect to release information at github (#3746) * chore: remove unused import * feat: redirect to release information at github. --- ietf/release/tests.py | 24 +---- ietf/release/urls.py | 12 +-- ietf/release/views.py | 156 ---------------------------- ietf/templates/release/release.html | 91 ---------------- ietf/templates/release/stats.html | 117 --------------------- ietf/utils/tests.py | 1 - 6 files changed, 6 insertions(+), 395 deletions(-) delete mode 100644 ietf/release/views.py delete mode 100644 ietf/templates/release/release.html delete mode 100644 ietf/templates/release/stats.html diff --git a/ietf/release/tests.py b/ietf/release/tests.py index 710d2b356..6322c2089 100644 --- a/ietf/release/tests.py +++ b/ietf/release/tests.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved +# Copyright The IETF Trust 2012-2022, All Rights Reserved # -*- coding: utf-8 -*- @@ -12,14 +12,6 @@ from ietf.utils.test_utils import TestCase class ReleasePagesTest(TestCase): - def test_release(self): - url = reverse('ietf.release.views.release', kwargs={'version':'6.0.0'}) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) - releases = [ e.text.strip() for e in q('#content table td a') if e.text ] - for num in ["2.00", "3.00", "4.00", "5.0.0"]: - self.assertIn(num, releases) def test_about(self): url = reverse('ietf.release.views.release')+"about" @@ -29,17 +21,3 @@ class ReleasePagesTest(TestCase): text = q('#content').text() for word in ["About", "2.00", "3.00", "4.00", "5.0.0"]: self.assertIn(word, text) - - def test_stats(self): - url = reverse('ietf.release.views.stats') - - r = self.client.get(url) - q = PyQuery(r.content) - # grab the script element text, split off the json data - s = q('#coverage-data').text() - self.assertIn("type: 'line',", s) - self.assertIn('"data": [[1426018457000, ', s) - - s = q('#frequency-data').text() - self.assertIn("type: 'column',", s) - self.assertIn('"data": [[2007, 7], ', s) \ No newline at end of file diff --git a/ietf/release/urls.py b/ietf/release/urls.py index 994f41190..3ff3574df 100644 --- a/ietf/release/urls.py +++ b/ietf/release/urls.py @@ -1,16 +1,14 @@ -# Copyright The IETF Trust 2015-2020, All Rights Reserved +# Copyright The IETF Trust 2015-2022, All Rights Reserved # -*- coding: utf-8 -*- -from django.views.generic import TemplateView +from django.views.generic import RedirectView, TemplateView -from ietf.release import views from ietf.utils.urls import url urlpatterns = [ - url(r'^$', views.release), - url(r'^(?P[0-9.]+.*)/$', views.release), + url(r'^$', RedirectView.as_view(url='https://github.com/ietf-tools/datatracker/releases', permanent=False), name='ietf.release.views.release'), + url(r'^(?P[0-9.]+.*)/$', RedirectView.as_view(url='https://github.com/ietf-tools/datatracker/releases/tag/%(version)s', permanent=False)), url(r'^about/?$', TemplateView.as_view(template_name='release/about.html'), name='releaseabout'), - url(r'^stats/?$', views.stats), + url(r'^stats/?$', RedirectView.as_view(url='https://github.com/ietf-tools/datatracker/releases', permanent=False)), ] - diff --git a/ietf/release/views.py b/ietf/release/views.py deleted file mode 100644 index 5ac970398..000000000 --- a/ietf/release/views.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright The IETF Trust 2012-2020, All Rights Reserved -# -*- coding: utf-8 -*- - - -import io -import os -import re -import json -import datetime -import gzip -from tzparse import tzparse -from calendar import timegm - -from django.shortcuts import render -from django.conf import settings -from django.core.cache import cache -from django.http import HttpResponse -from django.utils.html import escape -from django.utils.safestring import mark_safe - -import changelog -import debug # pyflakes:ignore - -# workaround for thread import lock problem, http://bugs.python.org/issue7980 -import time -time.strptime('1984', '%Y') # we do this to force lib loading, instead of it happening lazily when changelog calls tzparse later - - -def trac_links(text): - # changeset links - text = re.sub(r'\[(\d+)\]', r'[\1]', text) - # issue links - text = re.sub(r'([^&])#(\d+)', r'\1#\2', text) - return text - - -def get_coverage_data(): - cache_key = 'release:get_coverage_data' - coverage_data = cache.get(cache_key) - if not coverage_data: - coverage_data = {} - if os.path.exists(settings.TEST_COVERAGE_MASTER_FILE): - if settings.TEST_COVERAGE_MASTER_FILE.endswith(".gz"): - with gzip.open(settings.TEST_COVERAGE_MASTER_FILE, "rb") as file: - coverage_data = json.load(file) - else: - with io.open(settings.TEST_COVERAGE_MASTER_FILE) as file: - coverage_data = json.load(file) - cache.set(cache_key, coverage_data, 60*60*24) - return coverage_data - -def get_changelog_entries(): - cache_key = 'release:get_changelog_entries' - log_entries = cache.get(cache_key) - if not log_entries: - if os.path.exists(settings.CHANGELOG_PATH): - log_entries = changelog.parse(settings.CHANGELOG_PATH) - cache.set(cache_key, log_entries, 60*60*24) - return log_entries - -entries = None -log_entries = None -coverage_data = None -def release(request, version=None): - global entries, log_entries, coverage_data - if not entries: - log_entries = get_changelog_entries() - if not log_entries: - return HttpResponse("Error: changelog file %s not found" % settings.CHANGELOG_PATH) - next = None - for entry in log_entries: - if next: - next.prev = entry - entry.next = next - next = entry - entries = dict((entry.version, entry) for entry in log_entries) - - if version == None or version not in entries: - version = log_entries[0].version - if not hasattr(entries[version], 'html'): - entries[version].html = trac_links(escape(entries[version].logentry.strip('\n'))) - - code_coverage_url = None - code_coverage_time = None - if os.path.exists(settings.TEST_CODE_COVERAGE_REPORT_FILE) and version == log_entries[0].version: - code_coverage_url = settings.TEST_CODE_COVERAGE_REPORT_URL - code_coverage_time = datetime.datetime.fromtimestamp(os.path.getmtime(settings.TEST_CODE_COVERAGE_REPORT_FILE)) - - coverage = {} - if not coverage_data: - coverage_data = get_coverage_data() - if version in coverage_data: - coverage = coverage_data[version] - for key in coverage: - if "coverage" in coverage[key]: - coverage[key]["percentage"] = coverage[key]["coverage"] * 100 - - return render(request, 'release/release.html', - { - 'releases': log_entries, - 'version': version, - 'entry': entries[version], - 'coverage': coverage, - 'code_coverage_url': code_coverage_url, - 'code_coverage_time': code_coverage_time, - } ) - - -def stats(request): - - coverage_chart_data = [] - frequency_chart_data = [] - - coverage_data = get_coverage_data() - coverage_series_data = {} - for version in coverage_data: - if 'time' in coverage_data[version]: - t = coverage_data[version]['time'] - secs = timegm(tzparse(t, "%Y-%m-%dT%H:%M:%SZ").timetuple()) * 1000 - for coverage_type in coverage_data[version]: - if 'coverage' in coverage_data[version][coverage_type]: - cov = round(coverage_data[version][coverage_type]['coverage'], 3) - if not coverage_type in coverage_series_data: - coverage_series_data[coverage_type] = [] - coverage_series_data[coverage_type].append([secs, cov]) - - for coverage_type in coverage_series_data: - coverage_series_data[coverage_type].sort() - # skip some early values - coverage_series_data[coverage_type] = coverage_series_data[coverage_type][2:] - coverage_chart_data.append({ - 'data': coverage_series_data[coverage_type], - 'name': coverage_type, - }) - - log_entries = get_changelog_entries() - frequency = {} - frequency_series_data = [] - for entry in log_entries: - year = entry.time.year - if not year in frequency: - frequency[year] = 0 - frequency[year] += 1 - for year in frequency: - frequency_series_data.append([year, frequency[year]]) - frequency_series_data.sort() - frequency_chart_data.append({ - 'data': frequency_series_data, - 'name': 'Releases', - }) - - return render(request, 'release/stats.html', - { - 'coverage_chart_data': mark_safe(json.dumps(coverage_chart_data)), - 'frequency_chart_data': mark_safe(json.dumps(frequency_chart_data)), - }) diff --git a/ietf/templates/release/release.html b/ietf/templates/release/release.html deleted file mode 100644 index 7df74f7b5..000000000 --- a/ietf/templates/release/release.html +++ /dev/null @@ -1,91 +0,0 @@ -{# Copyright The IETF Trust 2015, All Rights Reserved #} -{% extends "base.html" %} -{% load origin textfilters ietf_filters %} -{% load cache %} -{% block title %}Release information{% endblock %} -{% block content %} - {% origin %} -
-

- - Version {{ entry.version }} - -
- Released {{ entry.date }} -

-
- - - -
-
- -

- {% if coverage %} - Tested: - Code: {{ coverage.code.percentage|stringformat:".2f" }}%, - Templates: {{ coverage.template.percentage|stringformat:".2f" }}%, - URLs: {{ coverage.url.percentage|stringformat:".2f" }}% - {% endif %} - {% if code_coverage_url %} - (A - code test coverage report - dated {{ code_coverage_time }} is available.) - {% endif %} -

-

{{ entry.version }} release notes

- {% if entry.title %}

{{ entry.title }}

{% endif %} -
{{ entry.html|linkify|urlize_ietf_docs }}
-
— {{ entry.author }} <{{ entry.email|linkify }}> {{ entry.date }}
- {% cache 3600 ietf_release_list %} -
-

Release list

- - - - - - - - - - {% for item in releases %} - {% ifchanged %} - - - - - - {% endifchanged %} - - - - - - {% endfor %} - -
VersionRelease dateFeature summary
{{ item.date|slice:"7:11" }}
- {{ item.version }} - {{ item.date|slice:":11" }}{{ item.title|linkify|urlize_ietf_docs }}
-{% endcache %} -{% endblock %} -{% block footer %} -

- Contractor instructions -

- {{ block.super }} -{% endblock %} \ No newline at end of file diff --git a/ietf/templates/release/stats.html b/ietf/templates/release/stats.html deleted file mode 100644 index e926b456d..000000000 --- a/ietf/templates/release/stats.html +++ /dev/null @@ -1,117 +0,0 @@ -{# Copyright The IETF Trust 2017, All Rights Reserved #} -{% extends "base.html" %} -{% load origin %} -{% load ietf_filters static django_bootstrap5 %} -{% block title %}Release Statistics{% endblock %} -{% block pagehead %}{% endblock %} -{% block content %} - {% origin %} -

Release Statistics

-
- -
- -{% endblock %} -{% block js %} - - - - -{% endblock %} \ No newline at end of file diff --git a/ietf/utils/tests.py b/ietf/utils/tests.py index 8ad2abec6..b24a24c2e 100644 --- a/ietf/utils/tests.py +++ b/ietf/utils/tests.py @@ -5,7 +5,6 @@ import io import os.path import shutil -import sys import types from pyquery import PyQuery