]> git.ipfire.org Git - pbs.git/commitdiff
users: Fix the totally broken disk usage query
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 12 Feb 2025 17:16:41 +0000 (17:16 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 12 Feb 2025 17:16:41 +0000 (17:16 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/users.py

index 45effed5b8b0eaa1bfc3d41089fb632715bc4f5b..53fe400405553e67b265d0acb7331894c1cbf02d 100644 (file)
@@ -718,6 +718,9 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                """
                        Returns the total disk usage of this user
                """
+               source_packages = sqlalchemy.orm.aliased(packages.Package)
+               binary_packages = sqlalchemy.orm.aliased(packages.Package)
+
                # Uploads
                upload_disk_usage = (
                        sqlalchemy
@@ -734,18 +737,25 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                source_package_disk_usage = (
                        sqlalchemy
                        .select(
-                               packages.Package.filesize
+                               source_packages.filesize
+                       )
+                       .select_from(
+                               builds.Build,
+                       )
+                       .join(
+                               source_packages,
+                               source_packages.id == builds.Build.pkg_id,
                        )
-                       .select_from(builds.Build)
-                       .join(builds.Build.pkg)
                        .where(
                                # All objects must exist
-                               packages.Package.deleted_at == None,
+                               source_packages.deleted_at == None,
                                builds.Build.deleted_at == None,
-                               jobs.Job.deleted_at == None,
 
                                # Don't consider test builds
                                builds.Build.test == False,
+
+                               # The build must be owned by the user
+                               builds.Build.owner == self,
                        )
                )
 
@@ -753,14 +763,26 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                binary_package_disk_usage = (
                        sqlalchemy
                        .select(
-                               packages.Package.filesize,
+                               binary_packages.filesize,
+                       )
+                       .select_from(
+                               builds.Build,
+                       )
+                       .join(
+                               jobs.Job,
+                               jobs.Job.build_id == builds.Build.id,
+                       )
+                       .join(
+                               jobs.JobPackage,
+                               jobs.JobPackage.job_id == jobs.Job.id,
+                       )
+                       .join(
+                               binary_packages,
+                               binary_packages.id == jobs.JobPackage.pkg_id,
                        )
-                       .select_from(builds.Build)
-                       .join(jobs.Job)
-                       #.join(jobs.JobPackages)
                        .where(
                                # All objects must exist
-                               packages.Package.deleted_at == None,
+                               binary_packages.deleted_at == None,
                                builds.Build.deleted_at == None,
                                jobs.Job.deleted_at == None,
 
@@ -778,8 +800,13 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                        .select(
                                jobs.Job.log_size
                        )
-                       .select_from(builds.Build)
-                       .join(jobs.Job)
+                       .select_from(
+                               builds.Build,
+                       )
+                       .join(
+                               jobs.Job,
+                               jobs.Job.build_id == builds.Build.id,
+                       )
                        .where(
                                # All objects must exist
                                builds.Build.deleted_at == None,
@@ -816,7 +843,7 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                )
 
                # Run the query
-               return await self.db.select_one(stmt, "disk_usage")
+               return await self.db.select_one(stmt, "disk_usage") or 0
 
        # Stats