From: Michael Tremer Date: Sat, 25 Jun 2022 15:38:53 +0000 (+0000) Subject: repos: Add UI to create new repositories X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98ee671413c3339eaa424ac0aeb75ef58d3fb381;p=pbs.git repos: Add UI to create new repositories Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 64d734a2..61dc34d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/src/buildservice/base.py b/src/buildservice/base.py index 13160fdc..dbb6ec14 100644 --- a/src/buildservice/base.py +++ b/src/buildservice/base.py @@ -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) diff --git a/src/buildservice/repository.py b/src/buildservice/repository.py index 1b7180ff..30af6263 100644 --- a/src/buildservice/repository.py +++ b/src/buildservice/repository.py @@ -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 index 00000000..d6a16609 --- /dev/null +++ b/src/templates/repos/create-custom.html @@ -0,0 +1,55 @@ +{% extends "../base.html" %} + +{% block title %}{{ _("Repositories") }} - {{ _("Create") }}{% end block %} + +{% block container %} + + +
+
+
+
+ {% raw xsrf_form_html() %} + + + + +
+ + +
+
+
+{% end block %} diff --git a/src/templates/users/show.html b/src/templates/users/show.html index 89427664..25dad918 100644 --- a/src/templates/users/show.html +++ b/src/templates/users/show.html @@ -33,9 +33,15 @@ {% end %} - {% if user.repos %} -

{{ _("Repositories") }}

+ {# Repositories #} + +

{{ _("Repositories") }}

+ {% if user.repos %} {% module ReposList(user.repos) %} {% end %} + + + {{ _("Create Repository") }} + {% end block %} diff --git a/src/web/__init__.py b/src/web/__init__.py index e537b889..8199b63c 100644 --- a/src/web/__init__.py +++ b/src/web/__init__.py @@ -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\w+)/repos/(?P[A-Za-z0-9\-]+)", repos.ShowHandler), (r"/users/(?P\w+)/repos/(?P[A-Za-z0-9\-]+)\.repo", diff --git a/src/web/base.py b/src/web/base.py index 59eaec2f..859b9c9a 100644 --- a/src/web/base.py +++ b/src/web/base.py @@ -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) diff --git a/src/web/repos.py b/src/web/repos.py index 02edd765..512369ad 100644 --- a/src/web/repos.py +++ b/src/web/repos.py @@ -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