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