]> git.ipfire.org Git - pbs.git/commitdiff
users: Fix showing total builds/build time
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 15:17:14 +0000 (15:17 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 15:17:14 +0000 (15:17 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/users.py
src/templates/users/show.html

index 42c6b8e3232e16b3f94f0623c0e383e6e6033cb3..7920e6aa78e3a224d094a4bac1ffe3e32f2889ca 100644 (file)
@@ -850,26 +850,32 @@ class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                # Run the query
                return await self.db.select_one(stmt, "count")
 
-       @lazy_property
-       def total_build_time(self):
-               res = self.db.get("""
-                       SELECT
-                               SUM(jobs.finished_at - jobs.started_at) AS total_time
-                       FROM
-                               jobs
-                       LEFT JOIN
-                               builds ON jobs.build_id = builds.id
-                       WHERE
-                               jobs.finished_at IS NOT NULL
-                       AND
-                               jobs.started_at IS NOT NULL
-                       AND
-                               builds.owner_id = %s
-                       """, self.id,
+       async def get_total_build_time(self):
+               """
+                       Returns the total build time
+               """
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               sqlalchemy.func.sum(
+                                       sqlalchemy.func.coalesce(
+                                               jobs.Job.finished_at,
+                                               sqlalchemy.func.current_timestamp()
+                                       )
+                                       - jobs.Job.started_at,
+                               ).label("total_build_time")
+                       )
+                       .join(
+                               builds.Build,
+                               builds.Build.id == jobs.Job.build_id,
+                       )
+                       .where(
+                               jobs.Job.started_at != None,
+                               builds.Build.owner == self,
+                       )
                )
 
-               if res:
-                       return res.total_time
+               return await self.db.select_one(stmt, "total_build_time")
 
        # Custom repositories
 
index a70311ba8d584d9348dae45401b52c548953334d..b12f1280458b861de6ebbd0e74668abe048f01e3 100644 (file)
                                <div class="block">
                                        <nav class="level">
                                                {# Total Builds #}
+                                               {% set total_builds = user.get_total_builds() %}
+
                                                <div class="level-item has-text-centered">
                                                        <div>
                                                                <p class="heading">{{ _("Total Builds") }}</p>
-                                                               <p class="title">{{ user.total_builds }}</p>
+                                                               <p class="title">{{ total_builds }}</p>
                                                        </div>
                                                </div>
 
                                                {# Total Build Time #}
-                                               {% if user.total_build_time %}
+                                               {% set total_build_time = user.get_total_build_time() %}
+
+                                               {% if total_build_time %}
                                                        <div class="level-item has-text-centered">
                                                                <div>
                                                                        <p class="heading">{{ _("Total Build Time") }}</p>
                                                                        <p class="title">
-                                                                               {{ user.total_build_time | format_time }}
+                                                                               {{ total_build_time | format_time }}
                                                                        </p>
                                                                </div>
                                                        </div>