diff --git a/downloads/admin.py b/downloads/admin.py index da5d94ad8..d0b93c3eb 100644 --- a/downloads/admin.py +++ b/downloads/admin.py @@ -31,3 +31,6 @@ def formfield_for_dbfield(self, db_field, request, **kwargs): if db_field.name == "name": field.widget.attrs["placeholder"] = "Python 3.X.YaN" return field + + class Media: + js = ["js/admin/releaseAdmin.js"] diff --git a/static/js/admin/releaseAdmin.js b/static/js/admin/releaseAdmin.js new file mode 100644 index 000000000..0eb13baac --- /dev/null +++ b/static/js/admin/releaseAdmin.js @@ -0,0 +1,53 @@ +'use strict'; + +function generateReleaseNotesUrl(name) { + // Match "Python X.Y.Z[aN]" + const match = name.match(/^Python (\d+)\.(\d+)\.(\d+)((?:a|b|rc)\d*)?$/); + if (!match) { + return ''; + } + + const major = match[1]; + const minor = match[2]; + const patch = match[3]; + const prerelease = match[4]; // e.g., "a2", "b1", "rc1" or undefined + + if (prerelease) { + // Prerelease: https://docs.python.org/3.15/whatsnew/3.15.html + return `https://docs.python.org/${major}.${minor}/whatsnew/${major}.${minor}.html`; + } else { + // Regular release: https://docs.python.org/release/3.13.9/whatsnew/changelog.html + return `https://docs.python.org/release/${major}.${minor}.${patch}/whatsnew/changelog.html`; + } +} + +document.addEventListener('DOMContentLoaded', function() { + // Only run on add page, not edit + if (!window.location.pathname.endsWith('/add/')) { + return; + } + + const nameField = document.getElementById('id_name'); + const releaseNotesUrlField = document.getElementById('id_release_notes_url'); + + if (!nameField || !releaseNotesUrlField) { + return; + } + + // Track if user has manually edited the field + let changed = false; + releaseNotesUrlField.addEventListener('change', function() { + changed = true; + }); + + nameField.addEventListener('keyup', populate); + nameField.addEventListener('change', populate); + nameField.addEventListener('focus', populate); + + function populate() { + if (changed) { + return; + } + releaseNotesUrlField.value = generateReleaseNotesUrl(nameField.value); + } +});