]> git.ipfire.org Git - pbs.git/commitdiff
users: Show used daily build quota
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Sep 2023 15:43:54 +0000 (15:43 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 20 Sep 2023 15:43:54 +0000 (15:43 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/users.py
src/templates/users/show.html

index 6d21f89d7b537f9a3bdde87f606a96039a960fca..84e3a8c7433ee1ff3008e199655d9ca176f9accf 100644 (file)
@@ -52,11 +52,11 @@ LDAP_ATTRS = (
        "mailAlternateAddress",
 )
 
-WITH_EXCEEDED_QUOTAS_CTE = """
-       users_with_exceeded_quotas AS (
+WITH_USED_BUILD_TIME_CTE = """
+       user_build_times AS (
                SELECT
                        users.id AS user_id,
-                       SUM(jobs.finished_at - jobs.started_at) AS used_quota
+                       SUM(jobs.finished_at - jobs.started_at) AS used
                FROM
                        users
                LEFT JOIN
@@ -75,11 +75,27 @@ WITH_EXCEEDED_QUOTAS_CTE = """
                        jobs.finished_at >= CURRENT_TIMESTAMP - INTERVAL '24 hours'
                GROUP BY
                        users.id
-               HAVING
-                       SUM(jobs.finished_at - jobs.started_at) >= users.daily_build_quota
        )
 """
 
+WITH_EXCEEDED_QUOTAS_CTE = """
+       -- Include used build time
+       %s,
+
+       users_with_exceeded_quotas AS (
+               SELECT
+                       *
+               FROM
+                       user_build_times build_times
+               LEFT JOIN
+                       users ON build_times.user_id = users.id
+               WHERE
+                       users.daily_build_quota IS NOT NULL
+               AND
+                       build_times.used >= users.daily_build_quota
+       )
+""" % WITH_USED_BUILD_TIME_CTE
+
 class QuotaExceededError(Exception):
        pass
 
@@ -668,30 +684,49 @@ class User(base.DataObject):
        # Build Quota
 
        def get_daily_build_quota(self):
-               return self.data.build_quota
+               return self.data.daily_build_quota
 
        def set_daily_build_quota(self, quota):
                self._set_attribute("daily_build_quota", quota)
 
        daily_build_quota = property(get_daily_build_quota, set_daily_build_quota)
 
-       def has_exceeded_build_quota(self):
+       @property
+       def _build_times(self):
+               return self.db.get("""
+                       WITH %s
+
+                       SELECT
+                               *
+                       FROM
+                               user_build_times
+                       WHERE
+                               user_build_times.user_id = %%s
+                       """ % WITH_BUILD_TIMES_CTE, self.id,
+               )
+
+       @property
+       def used_daily_build_quota(self):
                res = self.db.get("""
                        WITH %s
 
                        SELECT
-                               1 AS result
+                               user_build_times.used AS used
                        FROM
-                               users_with_exceeded_quotas
+                               user_build_times
                        WHERE
-                               users_with_exceeded_quotas.user_id = %%s
-                       """ % WITH_EXCEEDED_QUOTAS_CTE, self.id,
+                               user_build_times.user_id = %%s
+                       """ % WITH_USED_BUILD_TIME_CTE, self.id,
                )
 
-               if res and res.result:
-                       return True
+               if res:
+                       return res.used
 
-               return False
+       def has_exceeded_build_quota(self):
+               if not self.daily_build_quota:
+                       return False
+
+               return self.used_daily_build_quota >= self.daily_build_quota
 
        # Storage Quota
 
index b4b5c56387b1957fbe3665cb2a2d357de6ab1b41..0fff9e4cbef5a6d2d317d37607292651c7e6d9b5 100644 (file)
                                                        </div>
                                                {% end %}
 
-                                               {# Quota/Disk Usage #}
+                                               {# Quotas #}
                                                {% if user.has_perm(current_user) %}
+                                                       {# Build Time #}
+                                                       <div class="level-item has-text-centered">
+                                                               <div>
+                                                                       {% if user.daily_build_quota %}
+                                                                               <p class="heading">{{ _("Daily Build Quota") }}</p>
+                                                                               <p class="title {% if user.has_exceeded_build_quota() %}has-text-danger{% end %}">
+                                                                                       {{ format_time(user.used_daily_build_quota) }}/{{ format_time(user.daily_build_quota) }}
+                                                                               </p>
+                                                                       {% else %}
+                                                                               <p class="heading">{{ _("Daily Build Usage") }}</p>
+                                                                               <p class="title">
+                                                                                       {{ format_time(user.used_daily_build_quota) }}
+                                                                               </p>
+                                                                       {% end %}
+                                                               </div>
+                                                       </div>
+
+
+                                                       {# Disk Usage #}
                                                        <div class="level-item has-text-centered">
                                                                <div>
                                                                        {% if user.storage_quota %}