]> git.ipfire.org Git - pbs.git/commitdiff
repos: Improve stats
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 May 2023 19:05:40 +0000 (19:05 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 11 May 2023 19:05:40 +0000 (19:05 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/repository.py
src/templates/repos/show.html

index 8f44b1c77811fed9e8a93a411cd7d284f337eaa8..a16036b456317b611ef52453f68b40cccfeec5b2 100644 (file)
@@ -529,6 +529,8 @@ class Repository(base.DataObject):
                                builds.deleted_at IS NULL
                        AND
                                repository_builds.repo_id = %s
+                       AND
+                               repository_builds.removed_at IS NULL
                        ORDER BY
                                packages.name, packages.evr""",
                        self.id,
@@ -536,6 +538,26 @@ class Repository(base.DataObject):
 
                return list(builds)
 
+       @lazy_property
+       def total_builds(self):
+               res = self.db.get("""
+                       SELECT
+                               COUNT(*) AS count
+                       FROM
+                               repository_builds
+                       LEFT JOIN
+                               builds ON repository_builds.build_id = builds.id
+                       WHERE
+                               builds.deleted_at IS NULL
+                       AND
+                               repository_builds.repo_id = %s
+                       AND
+                               repository_builds.removed_at IS NULL
+                       """, self.id,
+               )
+
+               return res.count
+
        def get_builds_by_name(self, name):
                """
                        Returns an ordered list of all builds that match this name
@@ -684,6 +706,67 @@ class Repository(base.DataObject):
 
                return { row.arch : row.size for row in res if row.arch in self.distro.arches }
 
+       @lazy_property
+       def total_size(self):
+               res = self.db.get("""
+                       WITH packages AS (
+                               -- Source Packages
+                               SELECT
+                                       packages.filesize AS size
+                               FROM
+                                       repository_builds
+                               LEFT JOIN
+                                       builds ON repository_builds.build_id = builds.id
+                               LEFT JOIN
+                                       packages ON builds.pkg_id = packages.id
+                               WHERE
+                                       builds.deleted_at IS NULL
+                               AND
+                                       packages.deleted_at IS NULL
+                               AND
+                                       repository_builds.repo_id = %s
+                               AND
+                                       repository_builds.removed_at IS NULL
+
+                               UNION ALL
+
+                               -- Binary Packages
+                               SELECT
+                                       packages.filesize AS size
+                               FROM
+                                       repository_builds
+                               LEFT JOIN
+                                       builds ON repository_builds.build_id = builds.id
+                               LEFT JOIN
+                                       jobs ON builds.id = jobs.build_id
+                               LEFT JOIN
+                                       job_packages ON jobs.id = job_packages.job_id
+                               LEFT JOIN
+                                       packages ON job_packages.pkg_id = packages.id
+                               WHERE
+                                       builds.deleted_at IS NULL
+                               AND
+                                       jobs.deleted_at IS NULL
+                               AND
+                                       packages.deleted_at IS NULL
+                               AND
+                                       repository_builds.repo_id = %s
+                               AND
+                                       repository_builds.removed_at IS NULL
+                       )
+
+                       SELECT
+                               SUM(packages.size) AS size
+                       FROM
+                               packages
+                       """, self.id, self.id,
+               )
+
+               if res:
+                       return res.size
+
+               return 0
+
        # Pakfire
 
        def pakfire(self, **kwargs):
index f2de048b87bfd7cdbfccdb1d297f957507316f9d..54d8b0b1624b99fcb106ce0a6029c58753b90b66 100644 (file)
                                        {# Description #}
                                        {% if repo.description %}
                                                {% module Text(repo.description) %}
+
+                                               <hr>
                                        {% end %}
 
                                        <nav class="level">
-                                               <div class="level-left">
-                                                       {# Sizes #}
-                                                       {% for arch, size in sorted(repo.size.items()) %}
-                                                               <div class="level-item has-text-centered">
-                                                                       <div>
-                                                                               <p class="heading">
-                                                                                       {{ _("Size") }} <span class="tag">{{ arch }}</span>
-                                                                               </p>
-                                                                               <p class="title">
-                                                                                       {{ format_size(size) }}
-                                                                               </p>
-                                                                       </div>
-                                                               </div>
-                                                       {% end %}
+                                               <div class="level-item has-text-centered">
+                                                       <div>
+                                                               <p class="heading">
+                                                                       {{ _("Total Builds") }}
+                                                               </p>
+                                                               <p class="title">
+                                                                       {{ repo.total_builds }}
+                                                               </p>
+                                                       </div>
+                                               </div>
+
+                                               <div class="level-item has-text-centered">
+                                                       <div>
+                                                               <p class="heading">
+                                                                       {{ _("Total Size") }}
+                                                               </p>
+                                                               <p class="title">
+                                                                       {{ format_size(repo.total_size) }}
+                                                               </p>
+                                                       </div>
                                                </div>
                                        </nav>
                                </div>