]> git.ipfire.org Git - pbs.git/commitdiff
repos: Fix deleting a repository
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 17:46:39 +0000 (17:46 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 17:46:39 +0000 (17:46 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/repos.py
src/templates/repos/delete.html
src/web/repos.py

index b038a549b21f19dd57d995f65c27e7dc185aae3f..ce0ec098d28b291dab5cd5ce9185adb7ae7c297a 100644 (file)
@@ -910,34 +910,45 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                                # Move the new repository data to its destination
                                await self.backend.move(t, path)
 
-       # Delete
+       # Clear!
 
-       async def delete(self, user=None):
+       async def clear(self, removed_by=None):
+               """
+                       Removes all builds from this repository
+               """
+               stmt = (
+                       sqlalchemy
+                       .update(
+                               RepoBuild,
+                       )
+                       .where(
+                               RepoBuild.removed_at == None,
+                               RepoBuild.repo == self,
+                       )
+                       .values(
+                               removed_at    = sqlalchemy.func.current_timestamp(),
+                               removed_by_id = removed_by.id if removed_by else None,
+                       )
+               )
+
+               # Run the query
+               await self.db.execute(stmt)
+
+       # Delete!
+
+       async def delete(self, deleted_by=None):
                """
                        Deletes this repository
                """
                # Mark as deleted
-               await self._set_attribute_now("deleted_at")
-               if user:
-                       await self._set_attribute("deleted_by", user)
+               await super().delete(deleted_by)
 
                # Delete the key
                if self.key:
                        await self.key.delete()
 
                # Remove all builds from this repository
-               await self.db.execute("""
-                       UPDATE
-                               repository_builds
-                       SET
-                               removed_at = CURRENT_TIMESTAMP,
-                               removed_by = %s
-                       WHERE
-                               repo_id = %s
-                       AND
-                               removed_at IS NULL
-                       """, user, self.id,
-               )
+               await self.clear(deleted_by)
 
                # Local path
                path = self.local_path()
index e8f270707b2962674fae9dacdf5f846b47e13834..9f7b3d5393b921cebfc6e920e880981bac86c892 100644 (file)
@@ -1,6 +1,6 @@
-{% extends "../modal.html" %}
+{% extends "modal.html" %}
 
-{% block title %}{{ _("Delete Repository") }} - {{ repo }}{% end block %}
+{% block title %}{{ _("Delete Repository") }} - {{ repo }}{% endblock %}
 
 {% block breadcrumbs %}
        <nav class="breadcrumb" aria-label="breadcrumbs">
@@ -25,7 +25,7 @@
                                <li>
                                        <a href="/distros/{{ repo.distro.slug }}">{{ repo.distro }}</a>
                                </li>
-                       {% end %}
+                       {% endif %}
                        <li>
                                <a href="#" disabled>{{ _("Repositories") }}</a>
                        </li>
                        </li>
                </ul>
        </nav>
-{% end block %}
+{% endblock %}
 
 {% block modal_title %}
        <h4 class="title is-4">{{ _("Delete Repository") }}</h4>
        <h6 class="subtitle is-6">{{ repo }}</h6>
-{% end block %}
+{% endblock %}
 
 {% block modal %}
        <form method="POST" action="">
-               {% raw xsrf_form_html() %}
+               {{ xsrf_form_html() | safe }}
 
                <div class="content">
                        <p>
@@ -61,4 +61,4 @@
                        </button>
                </div>
        </form>
-{% end block %}
+{% endblock %}
index ecdd697742324b7ec4a97e9685d987f3229145cf..88c66d2bca0c5a42729c01f8d983bc028590d78e 100644 (file)
@@ -241,27 +241,27 @@ class EditHandler(BaseHandler):
 
 class DeleteHandler(BaseHandler):
        @base.authenticated
-       def get(self, **kwargs):
+       async def get(self, **kwargs):
                # Fetch the repository
-               repo = self._get_repo(**kwargs)
+               repo = await self._get_repo(**kwargs)
 
                # Check for permissions
                if not repo.has_perm(self.current_user):
                        raise tornado.web.HTTPError(403)
 
-               self.render("repos/delete.html", repo=repo)
+               await self.render("repos/delete.html", repo=repo)
 
        @base.authenticated
        async def post(self, **kwargs):
                # Fetch the repository
-               repo = self._get_repo(**kwargs)
+               repo = await self._get_repo(**kwargs)
 
                # Check for permissions
                if not repo.has_perm(self.current_user):
                        raise tornado.web.HTTPError(403)
 
-               with self.db.transaction():
-                       await repo.delete(user=self.current_user)
+               async with await self.db.transaction():
+                       await repo.delete(deleted_by=self.current_user)
 
                if repo.owner:
                        self.redirect("/users/%s" % repo.owner.name)