]> git.ipfire.org Git - pbs.git/commitdiff
builds: Fix adding/removing from repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 10 Feb 2025 16:15:59 +0000 (16:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 10 Feb 2025 16:15:59 +0000 (16:15 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/repos.py
src/templates/builds/repos/add.html
src/templates/builds/repos/remove.html
src/templates/builds/show.html
src/web/builds.py

index c1745bb9d019f28b4b02a40ee109eeb563852779..67987b3cd9d342e15c8c8be197c95167823e120b 100644 (file)
@@ -82,6 +82,19 @@ class RepoBuild(database.Base):
                "User", foreign_keys=[removed_by_id], lazy="selectin",
        )
 
+       # Remove!
+
+       def remove(self, removed_by=None):
+               """
+                       Removes the build from the repository
+               """
+               # Mark as removed
+               self.removed_at = sqlalchemy.func.current_timestamp()
+               if removed_by:
+                       self.removed_by = removed_by
+
+               log.debug("%s has been removed from %s by %s" % (self.build, self.repo, self.removed_by))
+
 
 class Repos(base.Object):
        def __aiter__(self):
index e4ae8109838dc809439a1f1f9b5fce0ab210a395..2cf51984f2cdf896cb2a8275c17d4d2503d76837 100644 (file)
@@ -1,6 +1,6 @@
-{% extends "../../modal.html" %}
+{% extends "modal.html" %}
 
-{% block title %}{{ build }} - {{ _("Add To Repository") }}{% end block %}
+{% block title %}{{ build }} - {{ _("Add To Repository") }}{% endblock %}
 
 {% block breadcrumbs %}
        <nav class="breadcrumb" aria-label="breadcrumbs">
                        </li>
                </ul>
        </nav>
-{% end block %}
+{% endblock %}
 
 {% block modal_title %}
        <h4 class="title is-4">{{ _("Add Build To A Repository") }}</h4>
        <h6 class="subtitle is-6">{{ build }}</h6>
-{% end block %}
+{% endblock %}
 
 {% block modal %}
        <form method="POST" action="">
-               {% raw xsrf_form_html() %}
+               {{ xsrf_form_html() | safe }}
 
                {# Repositories #}
                <div class="field">
                        <div class="control">
                                <div class="select is-fullwidth">
                                        <select name="repo" required>
-                                               <option value="">{{ _("- Select One -") }}</option>
+                                               <option value="">
+                                                       {{ _("- Select One -") }}
+                                               </option>
 
-                                               {% for repo in sorted(repos) %}
+                                               {% for repo in repos | sort %}
                                                        <option value="{{ repo.slug }}"
-                                                               {% if repo in build.repos %}disabled{% end %}>{{ repo }}</option>
-                                               {% end %}
+                                                               {% if repo in build.repos %}disabled{% endif %}>{{ repo }}</option>
+                                               {% endfor %}
                                        </select>
                                </div>
                        </div>
@@ -54,4 +56,4 @@
                        </button>
                </div>
        </form>
-{% end block %}
+{% endblock %}
index 43361c7758e8764b802194caee0f677217229122..61f364eceb4537b8348af0b34e9a7d8323db5ef3 100644 (file)
@@ -1,6 +1,6 @@
-{% extends "../../modal.html" %}
+{% extends "modal.html" %}
 
-{% block title %}{{ build }} - {{ _("Remove From Repository") }}{% end block %}
+{% block title %}{{ build }} - {{ _("Remove From Repository") }}{% endblock %}
 
 {% block breadcrumbs %}
        <nav class="breadcrumb" aria-label="breadcrumbs">
                        </li>
                </ul>
        </nav>
-{% end block %}
+{% endblock %}
 
 {% block modal_title %}
        <h4 class="title is-4">{{ _("Remove Build From A Repository") }}</h4>
        <h6 class="subtitle is-6">{{ build }}</h6>
-{% end block %}
+{% endblock %}
 
 {% block modal %}
        <form method="POST" action="">
-               {% raw xsrf_form_html() %}
+               {{ xsrf_form_html() | safe }}
 
-               {# When the build is in exactly one repository... #}
-               {% if len(build.repos) == 1 %}
-                       {% set repo = build.repos[0] %}
-
-                       <input type="hidden" name="repo" value="{{ repo.slug }}">
-
-                       <div class="block">
-                               <p>
-                                       {{ _("Do you want to remove this build from %s?") % repo }}
-                               </p>
-                       </div>
+               <div class="block">
+                       <p>
+                               {{ _("Please select the repository you want to remove this build from:") }}
+                       </p>
+               </div>
 
-               {# When the build is in multiple repositories... #}
-               {% else %}
-                       <div class="block">
-                               <p>
-                                               {{ _("Please select the repository you want to remove this build from:") }}
-                               </p>
-                       </div>
+               {# Repositories #}
+               <div class="field">
+                       <label class="label">
+                               {{ _("Repositories") }}
+                       </label>
 
-                       {# Repositories #}
-                       {% for repo in sorted(build.repos) %}
-                               <div class="field">
-                                       <label class="checkbox">
-                                               <input type="checkbox" name="repo" value="{{ repo.slug }}">
-                                               {{ repo }}
-                                       </label>
+                       <div class="control">
+                               <div class="select is-fullwidth">
+                                       <select name="repo" required>
+                                               {% for repo in build.repos | sort %}
+                                                       <option value="{{ repo.slug }}">
+                                                               {{ repo }}
+                                                       </option>
+                                               {% endfor %}
+                                       </select>
                                </div>
-                       {% end %}
-               {% end %}
+                       </div>
+               </div>
 
                {# Submit! #}
                <div class="field">
@@ -68,4 +62,4 @@
                        </button>
                </div>
        </form>
-{% end block %}
+{% endblock %}
index 2c31b94c984663b2a7e274d6c5191812964e12fe..3287ce19ec672c47d4d173c9300851a582963674 100644 (file)
 
                                {% if build.repos %}
                                        {{ RepoList(build.repos, build=build) }}
+                               {% else %}
+                                       <div class="notification has-text-centered">
+                                               {{ _("This build is in no repositories.") }}
+                                       </div>
                                {% endif %}
 
                                <div class="buttons">
index 759323b268f22c4b6507ba0f2f0509298bd9017a..18437c0593835501b2e64632e3461c1ee5e0c624 100644 (file)
@@ -290,34 +290,30 @@ class BugHandler(base.BaseHandler):
 
 class ReposAddHandler(base.BaseHandler):
        @base.authenticated
-       def get(self, uuid):
-               build = self.backend.builds.get_by_uuid(uuid)
+       async def get(self, uuid):
+               build = await self.backend.builds.get_by_uuid(uuid)
                if not build:
                        raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
 
                # Fetch all available repositories
                try:
-                       repos = self.current_user.repos[build.distro]
+                       repos = await self.current_user.get_repos(build.distro)
                except KeyError:
                        repos = None
 
-               self.render("builds/repos/add.html", build=build, repos=repos)
+               await self.render("builds/repos/add.html", build=build, repos=repos)
 
        @base.authenticated
        async def post(self, uuid):
-               build = self.backend.builds.get_by_uuid(uuid)
+               build = await self.backend.builds.get_by_uuid(uuid)
                if not build:
                        raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
 
-               slug = self.get_argument("repo")
-
                # Fetch the repository
-               repo = self.current_user.get_repo(build.distro, slug)
-               if not repo:
-                       raise tornado.web.HTTPError(400, "Could not find repository '%s'" % slug)
+               repo = await self.get_argument_repo("repo", distro=build.distro, user=self.current_user)
 
                # Add the build to the repository
-               with self.db.transaction():
+               async with await self.db.transaction():
                        await repo.add_build(build, user=self.current_user)
 
                self.redirect("/builds/%s" % build.uuid)
@@ -325,8 +321,8 @@ class ReposAddHandler(base.BaseHandler):
 
 class ReposRemoveHandler(base.BaseHandler):
        @base.authenticated
-       def get(self, uuid):
-               build = self.backend.builds.get_by_uuid(uuid)
+       async def get(self, uuid):
+               build = await self.backend.builds.get_by_uuid(uuid)
                if not build:
                        raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
 
@@ -334,28 +330,20 @@ class ReposRemoveHandler(base.BaseHandler):
                if not build.repos:
                        raise tornado.web.HTTPError(400)
 
-               self.render("builds/repos/remove.html", build=build)
+               await self.render("builds/repos/remove.html", build=build)
 
        @base.authenticated
        async def post(self, uuid):
-               build = self.backend.builds.get_by_uuid(uuid)
+               build = await self.backend.builds.get_by_uuid(uuid)
                if not build:
                        raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
 
-               # Fetch all selected repos
-               repos = self.get_arguments("repo")
-
-               # Raise an error if nothing has been selected
-               if not repos:
-                       raise tornado.web.HTTPError(400, "No repositories selected")
-
-               # Find all selected repositories
-               repos = [repo for repo in build.repos if repo.slug in repos]
+               # Fetch the repository
+               repo = await self.get_argument_repo("repo", distro=build.distro, user=self.current_user)
 
-               # Remove build from all repositories
-               with self.db.transaction():
-                       for repo in repos:
-                               await repo.remove_build(build, user=self.current_user)
+               # Remove build from the repository
+               async with await self.db.transaction():
+                       await repo.remove_build(build, user=self.current_user)
 
                self.redirect("/builds/%s" % build.uuid)