"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
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
# 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
</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 %}