From a6f252a096978d10069dc5b77e2c164dcef3119d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 12 Feb 2019 20:50:48 +0100 Subject: [PATCH 3/4] Create Release Notes archive in the Documentation section. This creates a consolidated area to reference all of the notes from previous releases of PostgreSQL, as current releases only keep the the notes for that specific major release of PostgreSQL. --- media/css/main.css | 7 +++ pgweb/docs/views.py | 93 +++++++++++++++++++++++++++++++++++++++ pgweb/urls.py | 2 + pgweb/util/contexts.py | 1 + pgweb/util/db.py | 7 +++ templates/docs/release_notes.html | 72 ++++++++++++++++++++++++++++++ 6 files changed, 182 insertions(+) create mode 100644 pgweb/util/db.py create mode 100644 templates/docs/release_notes.html diff --git a/media/css/main.css b/media/css/main.css index e0462ad2..de71eb34 100644 --- a/media/css/main.css +++ b/media/css/main.css @@ -1294,6 +1294,13 @@ table.sponsor-table tbody tr td:nth-child(3) { width: 30%; } +/** Release Notes */ +#release-notes .navheader, +#release-notes .navfooter, +#release-notes .titlepage, +#release-notes .toc { + display: none; +} /** ALL RESPONSIVE QUERIES HERE */ /* Small devices (landscape phones, 576px and up)*/ diff --git a/pgweb/docs/views.py b/pgweb/docs/views.py index 4577f0ce..815f3a37 100644 --- a/pgweb/docs/views.py +++ b/pgweb/docs/views.py @@ -13,6 +13,7 @@ from pgweb.util.helpers import template_to_string from pgweb.util.misc import send_template_mail from pgweb.core.models import Version +from pgweb.util.db import exec_to_dict from .models import DocPage from .forms import DocCommentForm @@ -140,6 +141,98 @@ def manualarchive(request): 'versions': [_VersionPdfWrapper(v) for v in versions], }) +def release_notes(request, major_version=None, minor_version=None): + """Contains the main archive of release notes.""" + # this query gets a list of a unique set of release notes for each version of + # PostgreSQL. From PostgreSQL 9.4+, release notes are only present for their + # specific version of PostgreSQL, so all legacy release notes are present in + # 9.3 and older + # First the query identifies all of the release note files that have been loaded + # into the docs. From there, it parses the version the release notes are for + # from the file name, and breaks it up into "major" and "minor" version from + # our understanding of how PostgreSQL version numbering is handled, which is + # in 3 camps: 1 and older, 6.0 - 9.6, 10 - + # From there, we take a unique set based on the filename + releaes version, + # and return the content + sql = """ + SELECT DISTINCT ON (file, major, minor) version, file, major, minor, content + FROM ( + SELECT + version, + file, + CASE + WHEN v[1]::int >= 10 THEN v[1]::numeric + WHEN v[1]::int <= 1 THEN v[1]::int + ELSE array_to_string(v[1:2], '.')::numeric END AS major, + COALESCE( + CASE + WHEN v[1]::int >= 10 THEN v[2] + WHEN v[1]::int <= 1 THEN '.' || v[2] + ELSE v[3] + END::numeric, 0 + ) AS minor, + content + FROM ( + SELECT + version, + file, + string_to_array(regexp_replace(file, 'release-(.*)\.htm.*', '\\1'), '-') AS v, + content + FROM docs + WHERE file ~ '^release-\d+' AND version > 0 + ) r + ) rr + """ + params = [] + # if the major + minor version are provided, then we want to narrow down + # the results to the exact release notes + # otherwise ensure the release notes are returned in order + if major_version is not None and minor_version is not None: + sql += """ + WHERE major = %s AND minor = %s; + """ + params += [major_version] + if major_version in ['0', '1']: + params += ['0.{}'.format(minor_version)] + else: + params += [minor_version] + elif major_version is not None: + sql += """ + WHERE major = %s + ORDER BY rr.minor DESC; + """ + params += [major_version] + else: + sql += """ + ORDER BY rr.major DESC, rr.minor DESC; + """ + # run the query, loading a list of dict that contain all of the release + # notes that are filtered out by the query + release_notes = exec_to_dict(sql, params) + # determine which set of data to pass to the template: + # if both major/minor versions are present, we will load the release notes + # if only major version is present, then we load all the releases for that major version + # if neither are present, we load the list of all major versions + if major_version is not None and minor_version is not None: + try: + release_note = release_notes[0] + except IndexError: + raise Http404() + context = { + 'major_version': major_version, + 'minor_version': minor_version, + 'release_note': release_note, + } + elif major_version is not None: + if not release_notes: + raise Http404() + context = { + 'major_version': major_version, + 'release_notes': release_notes, + } + else: + context = { 'release_notes': release_notes } + return render_pgweb(request, 'docs', 'docs/release_notes.html', context) @login_required def commentform(request, itemid, version, filename): diff --git a/pgweb/urls.py b/pgweb/urls.py index d8c664f2..6ded70b6 100644 --- a/pgweb/urls.py +++ b/pgweb/urls.py @@ -58,6 +58,8 @@ urlpatterns = [ url(r'^docs/$', pgweb.docs.views.root), url(r'^docs/manuals/$', pgweb.docs.views.manuals), url(r'^docs/manuals/archive/$', pgweb.docs.views.manualarchive), + url(r'^docs/release/$', pgweb.docs.views.release_notes), + url(r'^docs/release/((?P(\d\.\d)|\d+)(\.(?P\d+))?)/$', pgweb.docs.views.release_notes), # Legacy URLs for accessing the docs page; provides a permanent redirect url(r'^docs/(current|devel|\d+(?:\.\d)?)/(static|interactive)/((.*).html?)?$', pgweb.docs.views.docspermanentredirect), url(r'^docs/(current|devel|\d+(?:\.\d)?)/(.*).html?$', pgweb.docs.views.docpage), diff --git a/pgweb/util/contexts.py b/pgweb/util/contexts.py index 25c4787e..c38f2480 100644 --- a/pgweb/util/contexts.py +++ b/pgweb/util/contexts.py @@ -34,6 +34,7 @@ sitenav = { {'title': 'Japanese', 'link': 'http://www.postgresql.jp/document/'}, {'title': 'Russian', 'link': 'https://postgrespro.ru/docs/postgresql'}, ]}, + {'title': 'Release Notes', 'link': '/docs/release/'}, {'title': 'Books', 'link': '/docs/books/'}, {'title': 'Online Resources', 'link': '/docs/online-resources/'}, {'title': 'Wiki', 'link': 'https://wiki.postgresql.org'}, diff --git a/pgweb/util/db.py b/pgweb/util/db.py new file mode 100644 index 00000000..a1efae0a --- /dev/null +++ b/pgweb/util/db.py @@ -0,0 +1,7 @@ +from django.db import connection + +def exec_to_dict(query, params=None): + curs = connection.cursor() + curs.execute(query, params) + columns = [col[0] for col in curs.description] + return [dict(list(zip(columns, row))) for row in curs.fetchall()] diff --git a/templates/docs/release_notes.html b/templates/docs/release_notes.html new file mode 100644 index 00000000..d40565ad --- /dev/null +++ b/templates/docs/release_notes.html @@ -0,0 +1,72 @@ +{% extends "base/page.html" %} + +{% block extrahead %} +{% if major_version is not None and minor_version is not None %} + +{% endif %} +{% endblock extrahead %} + +{%block title%}Release Notes{%endblock%} + +{% block contents %} +{% regroup release_notes by major as release_note_groups %} + +
+ {% if major_version is not None and minor_version is not None %} +
+
+

Release Notes

+

+ {% if major_version == '0' %}Postgres95{% else %}PostgreSQL{% endif %} + {{ major_version }}.{% if major_version == '0' or major_version == '1' %}{{ release_note.minor|make_list|slice:"2:4"|join:"" }}{% else %}{{ release_note.minor }}{% endif %} +

+
+
+ {{ release_note.content|safe }} +
+

+ + Return to the {% if major_version == '0' %}Postgres95{% else %}PostgreSQL {{ major_version }}{% endif %} + Release Notes + +

+
+ {% elif major_version is not None %} +
+
+

Release Notes

+

{% if major_version == '0' %}Postgres95{% else %}PostgreSQL {{ major_version }}{% endif %}

+
+ +

+ Return to Release Notes +

+
+ {% else %} +
+
+

Release Notes

+
+

Below is the complete archive of release notes for every version of PostgreSQL.

+ +
+ {% endif %} +
+ +{% endblock %} -- 2.14.3 (Apple Git-98)