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

index 8e948aa753d3b423b18bedcfc9df874b72a5523f..678b85f9f6fe1b3b33cbe1e02ae9f31ce1af3db5 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/delete.html \
        src/templates/distros/releases/edit.html \
        src/templates/distros/releases/index.html \
        src/templates/distros/releases/show.html
index 5e9b0fed2b233540fbc8028c3925d71d212e2de0..9ca316ed278e6105ce07bc58139e3e9560357168 100644 (file)
@@ -581,6 +581,18 @@ class Release(base.DataObject):
 
                # XXX TODO
 
+       # Delete
+
+       async def delete(self, user=None):
+               """
+                       Deletes this release
+               """
+               self._set_attribute_now("deleted_at")
+               if user:
+                       self._set_attribute("deleted_by", user)
+
+               # XXX TODO delete images
+
        # Images
 
        @lazy_property
diff --git a/src/templates/distros/releases/delete.html b/src/templates/distros/releases/delete.html
new file mode 100644 (file)
index 0000000..1e37cc6
--- /dev/null
@@ -0,0 +1,53 @@
+{% extends "../../modal.html" %}
+
+{% block title %}{{ release }} - {{ _("Delete") }}{% 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>
+                       <li>
+                               <a href="{{ release.url }}">
+                                       {{ release }}
+                               </a>
+                       </li>
+                       <li class="is-active">
+                               <a href="#" aria-current="page">{{ _("Delete") }}</a>
+                       </li>
+               </ul>
+       </nav>
+{% end block %}
+
+{% block modal_title %}
+       <h4 class="title is-4">{{ _("Delete Release") }}</h4>
+       <h6 class="subtitle is-6">{{ release }}</h6>
+{% end block %}
+
+{% block modal %}
+       <form method="POST" action="">
+               {% raw xsrf_form_html() %}
+
+               <div class="content">
+                       <p>
+                               {{ _("Are you sure you want to delete %s?") % release }}
+                       </p>
+               </div>
+
+               {# Submit! #}
+               <div class="field">
+                       <button type="submit" class="button is-danger is-fullwidth">
+                               {{ _("Delete Release") }}
+                       </button>
+               </div>
+       </form>
+{% end block %}
index d79659031e5da0249ff05f431a973b3fb3df982e..c2c9fae093c731b1ebfa7f451733849c1fbe64e0 100644 (file)
                                        <a class="button is-warning" href="{{ release.url }}/edit">
                                                {{ _("Edit") }}
                                        </a>
+
+                                       <a class="button is-danger" href="{{ release.url }}/delete">
+                                               {{ _("Delete") }}
+                                       </a>
                                </div>
                        </div>
                </section>
index de3dbc28081959e454814e1d47bf85284dc65e77..a4c46f0aea37f72b0b7d19f2279299612ea6beca 100644 (file)
@@ -225,6 +225,7 @@ class Application(tornado.web.Application):
                        (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\-_]+)/delete", distributions.ReleasesDeleteHandler),
                        (r"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)/edit", distributions.ReleasesEditHandler),
 
                        # Mirrors
index 3614479430059baf107de980cc6c8204997fe10b..1ea990e3dcdd901595166ff41a2b368dc84b388b 100644 (file)
@@ -174,6 +174,46 @@ class ReleasesEditHandler(base.BaseHandler):
                self.redirect(release.url)
 
 
+class ReleasesDeleteHandler(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/delete.html", release=release, distro=distro)
+
+       @tornado.web.authenticated
+       async 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():
+                       await release.delete(self.current_user)
+
+               # Redirect back to all releases
+               self.redirect("/distros/%s/releases" % distro.slug)
+
+
 class ListModule(ui_modules.UIModule):
        def render(self, distros):
                return self.render_string("distros/modules/list.html", distros=distros)