From: Michael Tremer Date: Wed, 22 Jan 2025 17:46:39 +0000 (+0000) Subject: repos: Fix deleting a repository X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4cbbbf10174f90a2569392bbadf316e1523f2eab;p=pbs.git repos: Fix deleting a repository Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/repos.py b/src/buildservice/repos.py index b038a549..ce0ec098 100644 --- a/src/buildservice/repos.py +++ b/src/buildservice/repos.py @@ -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() diff --git a/src/templates/repos/delete.html b/src/templates/repos/delete.html index e8f27070..9f7b3d53 100644 --- a/src/templates/repos/delete.html +++ b/src/templates/repos/delete.html @@ -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 %} -{% end block %} +{% endblock %} {% block modal_title %}

{{ _("Delete Repository") }}

{{ repo }}
-{% end block %} +{% endblock %} {% block modal %}
- {% raw xsrf_form_html() %} + {{ xsrf_form_html() | safe }}

@@ -61,4 +61,4 @@

-{% end block %} +{% endblock %} diff --git a/src/web/repos.py b/src/web/repos.py index ecdd6977..88c66d2b 100644 --- a/src/web/repos.py +++ b/src/web/repos.py @@ -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)