templates_modules_selectdir = $(templates_modulesdir)/select
dist_templates_repos_DATA = \
+ src/templates/repos/create-custom.html \
src/templates/repos/builds.html \
src/templates/repos/edit.html \
src/templates/repos/show.html
if isinstance(other, self.__class__):
return self.id == other.id
- raise NotImplemented
+ return NotImplemented
def __hash__(self):
return hash(self.id)
# Generate a slug
slug = self._make_slug(name, owner=owner)
- return self._get_repository("""
+ repo = self._get_repository("""
INSERT INTO
repositories
(
slug,
)
+ # Populate cache
+ if owner:
+ repo.owner = owner
+
+ return repo
+
def _make_slug(self, name, owner=None):
for i in misc.infinity():
slug = misc.normalize(name)
--- /dev/null
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Repositories") }} - {{ _("Create") }}{% end block %}
+
+{% block container %}
+ <nav aria-label="{{ _("You are here:") }}" role="navigation">
+ <ul class="breadcrumbs">
+ <li>
+ <a href="/">{{ _("Home") }}</a>
+ </li>
+ <li>
+ <a href="/users">{{ _("Users") }}</a>
+ </li>
+ <li>
+ <a href="/users/{{ user.name }}">{{ user }}</a>
+ </li>
+ <li>
+ {{ _("Repositories") }}
+ </li>
+ <li>
+ <span class="show-for-sr">{{ _("Current") }}: </span> {{ _("Create") }}
+ </li>
+ </ul>
+ </nav>
+
+ <div class="grid-x grid-padding-x">
+ <div class="cell large-6 float-center">
+ <form method="POST" action="">
+ <div class="callout">
+ {% raw xsrf_form_html() %}
+
+ <label>
+ {{ _("Distribution") }}
+
+ <select name="distro" required>
+ <option value="">{{ _("- Select -") }}</option>
+
+ {% for distro in distros %}
+ <option value="{{ distro.slug }}">{{ distro }}</option>
+ {% end %}
+ </select>
+ </label>
+
+ <label>
+ {{ _("Name") }}
+
+ <input type="text" name="name" required>
+ </label>
+ </div>
+
+ <button class="success button expanded" type="submit">{{ _("Create Repository") }}</button>
+ </form>
+ </div>
+ </div>
+{% end block %}
</a>
{% end %}
- {% if user.repos %}
- <h4>{{ _("Repositories") }}</h4>
+ {# Repositories #}
+
+ <h4>{{ _("Repositories") }}</h4>
+ {% if user.repos %}
{% module ReposList(user.repos) %}
{% end %}
+
+ <a class="success expanded button" href="/users/{{ user.name }}/repos/create">
+ {{ _("Create Repository") }}
+ </a>
{% end block %}
# User profiles
(r"/users", users.UsersHandler),
(r"/users/(\w+)", users.ShowHandler),
+ (r"/users/(\w+)/repos/create", repos.CreateCustomHandler),
(r"/users/(?P<user_slug>\w+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)",
repos.ShowHandler),
(r"/users/(?P<user_slug>\w+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)\.repo",
return int(arg)
except (TypeError, ValueError):
raise tornado.web.HTTPError(400, "%s is not an integer" % arg)
+
+ def get_argument_distro(self, *args, **kwargs):
+ slug = self.get_argument(*args, **kwargs)
+
+ if slug:
+ return self.backend.distros.get_by_slug(slug)
return repo
+
class ShowHandler(BaseHandler):
def get(self, **kwargs):
# Fetch the repository
self.render("repos/builds.html", repo=repo, distro=repo.distro)
+class CreateCustomHandler(BaseHandler):
+ @tornado.web.authenticated
+ def get(self, user_slug):
+ user = self.backend.users.get_by_name(user_slug)
+ if not user:
+ raise tornado.web.HTTPError(404, "Could not find user: %s" % user_slug)
+
+ # Check for permissions
+ if not user.has_perm(self.current_user):
+ raise tornado.web.HTTPError(403)
+
+ self.render("repos/create-custom.html", user=user, distros=self.backend.distros)
+
+ @tornado.web.authenticated
+ async def post(self, user_slug):
+ user = self.backend.users.get_by_name(user_slug)
+ if not user:
+ raise tornado.web.HTTPError(404, "Could not find user: %s" % user_slug)
+
+ # Check for permissions
+ if not user.has_perm(self.current_user):
+ raise tornado.web.HTTPError(403)
+
+ # Fetch arguments
+ name = self.get_argument("name")
+ distro = self.get_argument_distro("distro")
+
+ with self.db.transaction():
+ repo = self.backend.repos.create(distro, name, owner=user)
+
+ # Write repository metadata
+ await repo.write()
+
+ self.redirect("/users/%s/repos/%s" % (user.name, repo.slug))
+
+
class ConfigHandler(BaseHandler):
def get(self, **kwargs):
# Fetch the repository