]> git.ipfire.org Git - pbs.git/commitdiff
builds: Fix deleting builds
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Jan 2025 16:52:16 +0000 (16:52 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Jan 2025 16:52:16 +0000 (16:52 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py
src/buildservice/jobs.py
src/buildservice/packages.py
src/templates/builds/delete.html
src/web/builds.py

index ae343b175140bdbe035a2e7ea88826a6ea668bba..0d15051a7164d8187145b0c34de81437d9ce5409 100644 (file)
@@ -383,26 +383,28 @@ class Build(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                # You can't touch this
                return False
 
-       async def delete(self, user=None):
+       async def delete(self, deleted_by):
                """
                        Deletes this build including all jobs,
                        packages and the source package.
                """
+               # Check if we can actually delete
+               if not self.can_be_deleted(deleted_by):
+                       raise PermissionError
+
                # Delete all test builds
-               if self.test_builds:
-                       await self.test_builds.delete(user=user)
+               #if self.test_builds:
+               #       await self.test_builds.delete(user=user)
 
                # Delete all jobs
-               for job in self._jobs:
-                       await job.delete(user=user)
+               for job in self.alljobs:
+                       await job.delete(deleted_by=deleted_by)
 
                # Mark as deleted
-               self._set_attribute_now("deleted_at")
-               if user:
-                       await self._set_attribute("deleted_by", user)
+               await super().delete(deleted_by=deleted_by)
 
                # Delete source package
-               await self.pkg.delete(user=user)
+               await self.pkg.delete(deleted_by=deleted_by)
 
                # All repositories this build has been in have been changed
                await self._update_repos(build=True)
index dcfc357cc55248f294ab0fd0af0151a760dd5a68..c343c012e82008cb7a03305ee41bf721be36ffae 100644 (file)
@@ -865,18 +865,16 @@ class Job(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        message = Column(Text, nullable=False, default="")
 
-       async def delete(self, user=None):
+       async def delete(self, deleted_by=None):
                """
                        Deletes a job
                """
                # Delete all binary packages
                for pkg in self.packages:
-                       await pkg.delete(user=user)
+                       await pkg.delete(deleted_by=deleted_by)
 
                # Mark as deleted
-               self._set_attribute_now("deleted_at")
-               if user:
-                       self._set_attribute("deleted_by", user)
+               await super().delete(deleted_by=deleted_by)
 
                # Delete the log
                await self._delete_log()
index 8add22a9b9502ceedeb672237d5aea4b8317e9bc..c8dae35096c3a1bbf63f9ee180f0e4acec74786d 100644 (file)
@@ -289,7 +289,7 @@ class Package(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                DateTime(timezone=False), nullable=False, server_default=sqlalchemy.func.current_timestamp(),
        )
 
-       async def delete(self, *args, **kwargs):
+       async def delete(self, deleted_by=None):
                """
                        Deletes this package
                """
@@ -301,7 +301,7 @@ class Package(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                log.info("Deleting package %s" % self)
 
                # Delete from the database
-               await super().delete(*args, **kwargs)
+               await super().delete(deleted_by=deleted_by)
 
                # Unlink the payload
                if self.path:
index 5e359663cf0b219824ab59c4665817fdc5b09321..a4010b2bec735a4a4d5f66091c6c5ea2ece14cdc 100644 (file)
@@ -1,6 +1,6 @@
-{% extends "../modal.html" %}
+{% extends "modal.html" %}
 
-{% block title %}{{ _("Delete Build") }} - {{ build }}{% end block %}
+{% block title %}{{ _("Delete Build") }} - {{ build }}{% endblock %}
 
 {% block breadcrumbs %}
        <nav class="breadcrumb" aria-label="breadcrumbs">
                        </li>
                </ul>
        </nav>
-{% end block %}
+{% endblock %}
 
 {% block modal_title %}
        <h4 class="title is-4">{{ _("Delete Build") }}</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 }}
 
                <div class="content">
                        <p>
@@ -43,4 +43,4 @@
                        </button>
                </div>
        </form>
-{% end block %}
+{% endblock %}
index cc97feea8fa8fd571e22fdd660974366ced6402b..6b3991fe8f7d90e87b92ad375c418f6489d186c1 100644 (file)
@@ -166,8 +166,8 @@ class CloneHandler(base.BaseHandler):
 
 class DeleteHandler(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)
 
@@ -176,22 +176,19 @@ class DeleteHandler(base.BaseHandler):
                        raise tornado.web.HTTPError(403, "%s cannot delete build %s" \
                                % (self.current_user, build))
 
-               self.render("builds/delete.html", build=build)
+               await self.render("builds/delete.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)
 
-               # Check permissions
-               if not build.can_be_deleted(self.current_user):
-                       raise tornado.web.HTTPError(403, "%s cannot delete build %s" \
-                               % (self.current_user, build))
-
-               # Perform Deletion
-               with self.db.transaction():
-                       await build.delete(self.current_user)
+               # Delete the build
+               try:
+                       await build.delete(deleted_by=self.current_user)
+               except PermissionError as e:
+                       raise tornado.web.HTTPError(403) from e
 
                self.redirect("/builds")