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
# 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
--- /dev/null
+{% 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 %}
<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>
(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
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)