]> git.ipfire.org Git - pbs.git/commitdiff
repos: Add UI to create new repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 25 Jun 2022 15:38:53 +0000 (15:38 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 25 Jun 2022 15:38:53 +0000 (15:38 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/buildservice/base.py
src/buildservice/repository.py
src/templates/repos/create-custom.html [new file with mode: 0644]
src/templates/users/show.html
src/web/__init__.py
src/web/base.py
src/web/repos.py

index 64d734a2cf46ff394e95ee031675856b74674a2d..61dc34d3885dc3fc409b4862b871b5b2b2a4f263 100644 (file)
@@ -309,6 +309,7 @@ dist_templates_modules_select_DATA = \
 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
index 13160fdc76363d152e531de9df22a9b7dbb03c60..dbb6ec14b409657dfff590cafba92d8f3c57b00c 100644 (file)
@@ -51,7 +51,7 @@ class DataObject(Object):
                if isinstance(other, self.__class__):
                        return self.id == other.id
 
-               raise NotImplemented
+               return NotImplemented
 
        def __hash__(self):
                return hash(self.id)
index 1b7180ffa18b1cfe3a6f2e80e1e7a735eea58730..30af62637ef72e238edd183752111060aff7fd56 100644 (file)
@@ -42,7 +42,7 @@ class Repositories(base.Object):
                # Generate a slug
                slug = self._make_slug(name, owner=owner)
 
-               return self._get_repository("""
+               repo = self._get_repository("""
                        INSERT INTO
                                repositories
                        (
@@ -65,6 +65,12 @@ class Repositories(base.Object):
                        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)
diff --git a/src/templates/repos/create-custom.html b/src/templates/repos/create-custom.html
new file mode 100644 (file)
index 0000000..d6a1660
--- /dev/null
@@ -0,0 +1,55 @@
+{% 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 %}
index 8942766498d9801aa45f580c88a89cd20c16d377..25dad91883298d63435b72a36ae1b02453f6a05b 100644 (file)
                </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 %}
index e537b8892ef7f358241504f5bbd582cba330d6fd..8199b63c07317b7033bae56e72450bd37df48de7 100644 (file)
@@ -111,6 +111,7 @@ class Application(tornado.web.Application):
                        # 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",
index 59eaec2fc5f7c1c01a9bbcf103b4f40ed196b9d3..859b9c9a1b668828c00f065e296b548709cc6fa4 100644 (file)
@@ -126,3 +126,9 @@ class BaseHandler(tornado.web.RequestHandler):
                        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)
index 02edd7659514bc212d13412416a8fca4dd68df98..512369ad36266a5979279d17f547acc4b24a471b 100644 (file)
@@ -49,6 +49,7 @@ class BaseHandler(base.BaseHandler):
 
                return repo
 
+
 class ShowHandler(BaseHandler):
        def get(self, **kwargs):
                # Fetch the repository
@@ -65,6 +66,42 @@ class BuildsHandler(BaseHandler):
                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