From: Michael Tremer Date: Wed, 14 Jun 2023 13:27:38 +0000 (+0000) Subject: releases: Add controls to create and edit releases X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b270cf737f61a6bfb3cd9a41735a8c1fbeba8cdc;p=pbs.git releases: Add controls to create and edit releases Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index b3ad549b..8e948aa7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -234,6 +234,7 @@ dist_templates_distros_modules_DATA = \ templates_distros_modulesdir = $(templates_distrosdir)/modules dist_templates_distros_releases_DATA = \ + src/templates/distros/releases/edit.html \ src/templates/distros/releases/index.html \ src/templates/distros/releases/show.html diff --git a/src/buildservice/distribution.py b/src/buildservice/distribution.py index f45d92b8..5e9b0fed 100644 --- a/src/buildservice/distribution.py +++ b/src/buildservice/distribution.py @@ -482,6 +482,10 @@ class Release(base.DataObject): def __str__(self): return self.name + def has_perm(self, *args, **kwargs): + # Inherit all permissions from the distribution + return self.distro.has_perm(*args, **kwargs) + # Distro @lazy_property @@ -490,10 +494,14 @@ class Release(base.DataObject): # Name - @property - def name(self): + def get_name(self): return self.data.name + def set_name(self, name): + self._set_attribute("name", name) + + name = property(get_name, set_name) + # Slug @property @@ -526,14 +534,18 @@ class Release(base.DataObject): # Stable? - @property - def stable(self): + def get_stable(self): return self.data.stable + def set_stable(self, stable): + self._set_attribute("stable", stable) + + stable = property(get_stable, set_stable) + # Announcement def get_announcement(self): - return self.data.announcement + return self.data.announcement or "" def set_announcement(self, text): self._set_attribute("announcement", text) diff --git a/src/templates/distros/releases/edit.html b/src/templates/distros/releases/edit.html new file mode 100644 index 00000000..3851807f --- /dev/null +++ b/src/templates/distros/releases/edit.html @@ -0,0 +1,96 @@ +{% extends "../../modal.html" %} + +{% block title %}{{ distro }} - {{ _("Create Release")}}{% end block %} + +{% block breadcrumbs %} + +{% end block %} + +{% block modal_title %} +

+ {% if release %} + {{ _("Edit Release") }} + {% else %} + {{ _("Create Release") }} + {% end %} +

+
{{ distro }}
+{% end block %} + +{% block modal %} +
+ {% raw xsrf_form_html() %} + + {# Name #} +
+ +
+ +
+
+ + {# Stable? #} +
+ +

+ {{ _("Check this box, if this release is a stable release") }} +

+
+ + {# Announcement #} +
+ +
+ +
+
+ + {# Submit! #} +
+ {% if release %} + + {% else %} + + {% end %} +
+
+{% end block %} diff --git a/src/templates/distros/releases/index.html b/src/templates/distros/releases/index.html index 1519c3d2..31cddb22 100644 --- a/src/templates/distros/releases/index.html +++ b/src/templates/distros/releases/index.html @@ -28,6 +28,18 @@ + {% if distro.has_perm(current_user) %} +
+ +
+ {% end %} +
{% module ReleasesList(releases) %} diff --git a/src/templates/distros/releases/show.html b/src/templates/distros/releases/show.html index b921a3e8..d7965903 100644 --- a/src/templates/distros/releases/show.html +++ b/src/templates/distros/releases/show.html @@ -39,6 +39,18 @@
+ {% if release.has_perm(current_user) %} +
+ +
+ {% end %} + {# Announcement #} {% if release.announcement %}
diff --git a/src/web/__init__.py b/src/web/__init__.py index d8a868c9..de3dbc28 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -223,7 +223,9 @@ class Application(tornado.web.Application): # Distro Releases (r"/distros/([A-Za-z0-9\-\.]+)/releases", distributions.ReleasesIndexHandler), + (r"/distros/([A-Za-z0-9\-\.]+)/releases/create", distributions.ReleasesCreateHandler), (r"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)", distributions.ReleasesShowHandler), + (r"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)/edit", distributions.ReleasesEditHandler), # Mirrors (r"/mirrors", mirrors.IndexHandler), diff --git a/src/web/distributions.py b/src/web/distributions.py index 5e9604c5..36144794 100644 --- a/src/web/distributions.py +++ b/src/web/distributions.py @@ -87,6 +87,93 @@ class ReleasesShowHandler(base.BaseHandler): self.render("distros/releases/show.html", distro=distro, release=release) +class ReleasesCreateHandler(base.BaseHandler): + @tornado.web.authenticated + def get(self, distro_slug): + distro = self.backend.distros.get_by_slug(distro_slug) + if not distro: + raise tornado.web.HTTPError(404, "Could not find distro: %s" % distro_slug) + + # Check permissions + if not distro.has_perm(self.current_user): + raise tornado.web.HTTPError(403) + + self.render("distros/releases/edit.html", release=None, distro=distro) + + @tornado.web.authenticated + def post(self, distro_slug): + distro = self.backend.distros.get_by_slug(distro_slug) + if not distro: + raise tornado.web.HTTPError(404, "Could not find distro: %s" % distro_slug) + + # Check permissions + if not distro.has_perm(self.current_user): + raise tornado.web.HTTPError(403) + + # Fetch arguments + name = self.get_argument("name") + stable = self.get_argument_bool("stable") + + with self.db.transaction(): + # Create the new release + release = self.backend.distros.releases.create( + distro=distro, name=name, stable=stable, user=self.current_user, + ) + + # Store announcement + release.announcement = self.get_argument("announcement", None) + + # Redirect to the new release page + self.redirect(release.url) + + +class ReleasesEditHandler(base.BaseHandler): + @tornado.web.authenticated + def get(self, distro_slug, release_slug): + distro = self.backend.distros.get_by_slug(distro_slug) + if not distro: + raise tornado.web.HTTPError(404, "Could not find distro: %s" % distro_slug) + + # Fetch the release + release = distro.get_release(release_slug) + if not release: + raise tornado.web.HTTPError(404, "Could not find release %s" % release_slug) + + # Check permissions + if not release.has_perm(self.current_user): + raise tornado.web.HTTPError(403) + + self.render("distros/releases/edit.html", release=release, distro=distro) + + @tornado.web.authenticated + def post(self, distro_slug, release_slug): + distro = self.backend.distros.get_by_slug(distro_slug) + if not distro: + raise tornado.web.HTTPError(404, "Could not find distro: %s" % distro_slug) + + # Fetch the release + release = distro.get_release(release_slug) + if not release: + raise tornado.web.HTTPError(404, "Could not find release %s" % release_slug) + + # Check permissions + if not release.has_perm(self.current_user): + raise tornado.web.HTTPError(403) + + with self.db.transaction(): + # Store name + release.name = self.get_argument("name") + + # Store stable? + release.stable = self.get_argument_bool("stable") + + # Store announcement + release.announcement = self.get_argument("announcement", None) + + # Redirect back to the release + self.redirect(release.url) + + class ListModule(ui_modules.UIModule): def render(self, distros): return self.render_string("distros/modules/list.html", distros=distros)