]> git.ipfire.org Git - pbs.git/commitdiff
releases: Add controls to create and edit releases
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 14 Jun 2023 13:27:38 +0000 (13:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 14 Jun 2023 13:27:38 +0000 (13:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/buildservice/distribution.py
src/templates/distros/releases/edit.html [new file with mode: 0644]
src/templates/distros/releases/index.html
src/templates/distros/releases/show.html
src/web/__init__.py
src/web/distributions.py

index b3ad549b7cea56d4be565ea4a7ed559d2c058087..8e948aa753d3b423b18bedcfc9df874b72a5523f 100644 (file)
@@ -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
 
index f45d92b82cdec287e82156d03f0bb08562888f8d..5e9b0fed2b233540fbc8028c3925d71d212e2de0 100644 (file)
@@ -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 (file)
index 0000000..3851807
--- /dev/null
@@ -0,0 +1,96 @@
+{% extends "../../modal.html" %}
+
+{% block title %}{{ distro }} - {{ _("Create Release")}}{% end block %}
+
+{% block breadcrumbs %}
+       <nav class="breadcrumb" aria-label="breadcrumbs">
+               <ul>
+                       <li>
+                               <a href="/distros">{{ _("Distributions") }}</a>
+                       </li>
+                       <li>
+                               <a href="/distros/{{ distro.slug }}">{{ distro }}</a>
+                       </li>
+                       <li>
+                               <a href="/distros/{{ distro.slug }}/releases">
+                                       {{ _("Releases") }}
+                               </a>
+                       </li>
+                       {% if release %}
+                               <li>
+                                       <a href="{{ release.url }}">
+                                               {{ release }}
+                                       </a>
+                               </li>
+                               <li class="is-active">
+                                       <a href="#" aria-current="page">{{ _("Edit") }}</a>
+                               </li>
+                       {% else %}
+                               <li class="is-active">
+                                       <a href="#" aria-current="page">{{ _("Create") }}</a>
+                               </li>
+                       {% end %}
+               </ul>
+       </nav>
+{% end block %}
+
+{% block modal_title %}
+       <h4 class="title is-4">
+               {% if release %}
+                       {{ _("Edit Release") }}
+               {% else %}
+                       {{ _("Create Release") }}
+               {% end %}
+       </h4>
+       <h6 class="subtitle is-6">{{ distro }}</h6>
+{% end block %}
+
+{% block modal %}
+       <form method="POST" action="">
+               {% raw xsrf_form_html() %}
+
+               {# Name #}
+               <div class="field">
+                       <label class="label">{{ _("Name") }}</label>
+                       <div class="control">
+                               <input class="input" type="text" name="name"
+                                       placeholder="{{ _("Name") }}" required
+                                       {% if release %}value="{{ release.name }}"{% end %}>
+                       </div>
+               </div>
+
+               {# Stable? #}
+               <div class="field">
+                       <label class="checkbox">
+                               <input type="checkbox" name="stable"
+                                               {% if release and release.stable %}checked{% end %}>
+                                       {{ _("Stable Release")}}
+                       </label>
+                       <p class="help">
+                               {{ _("Check this box, if this release is a stable release") }}
+                       </p>
+               </div>
+
+               {# Announcement #}
+               <div class="field">
+                       <label class="label">{{ _("Announcement") }}</label>
+                       <div class="control">
+                               <textarea class="input" name="announcement" placeholder="{{ _("Announcement") }}"
+                                       rows="16">{% if release %}{{ release.announcement }}{% end %}</textarea>
+                       </div>
+               </div>
+
+               {# Submit! #}
+               <div class="field">
+                       {% if release %}
+                               <button type="submit" class="button is-warning is-fullwidth">
+                                       {{ _("Save") }}
+                               </button>
+                       {% else %}
+                               <button type="submit" class="button is-success is-fullwidth">
+                                       {{ _("Create") }}
+                               </button>
+                       {% end %}
+               </div>
+       </form>
+{% end block %}
index 1519c3d2610dc54ebf577be6083297de203c8564..31cddb228e4bd780c6f57209fe038be484d32f7b 100644 (file)
                </div>
        </section>
 
+       {% if distro.has_perm(current_user) %}
+               <section class="section">
+                       <div class="container">
+                               <div class="buttons">
+                                       <a class="button is-success" href="/distros/{{ distro.slug }}/releases/create">
+                                               {{ _("Create Release") }}
+                                       </a>
+                               </div>
+                       </div>
+               </section>
+       {% end %}
+
        <section class="section">
                <div class="container">
                        {% module ReleasesList(releases) %}
index b921a3e8093619c105a0b4cf50baa3f41897f553..d79659031e5da0249ff05f431a973b3fb3df982e 100644 (file)
                </div>
        </section>
 
+       {% if release.has_perm(current_user) %}
+               <section class="section">
+                       <div class="container">
+                               <div class="buttons">
+                                       <a class="button is-warning" href="{{ release.url }}/edit">
+                                               {{ _("Edit") }}
+                                       </a>
+                               </div>
+                       </div>
+               </section>
+       {% end %}
+
        {# Announcement #}
        {% if release.announcement %}
                <section class="section">
index d8a868c91420b78fe7d286eb607b6a82c3b47eb8..de3dbc28081959e454814e1d47bf85284dc65e77 100644 (file)
@@ -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),
index 5e9604c5bacbde501c09f7627be1b8abee16a50f..3614479430059baf107de980cc6c8204997fe10b 100644 (file)
@@ -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)