diff --git a/master/custom/release_dashboard.py b/master/custom/release_dashboard.py index 83a9fd2a..37a5df11 100644 --- a/master/custom/release_dashboard.py +++ b/master/custom/release_dashboard.py @@ -301,20 +301,28 @@ def title(self): @cached_sorted_property() def problems(self): problems = [] + for builder in self.builders: + if builder.problems: + problems.extend(builder.problems) + else: + problems.append(NoProblem(builder)) + return problems + + @cached_sorted_property() + def builders(self): for builder in self._root.builders: if builder.branch == self: - if builder.problems: - problems.extend(builder.problems) - else: - problems.append(NoProblem(builder)) - return problems + yield builder @cached_property def featured_problem(self): try: return self.problems[0] except IndexError: - return NoProblem() + if self.builders: + return NoProblem() + else: + return NoBuilds() def get_grouped_problems(self): def key(problem): @@ -527,8 +535,9 @@ class Change(DashboardObject): class Severity(enum.IntEnum): # "Headings" and concrete values are all sortable enum items + NO_INFO = enum.auto() + NO_PROBLEM = enum.auto() - no_builds_yet = enum.auto() disconnected_unstable_builder = enum.auto() unstable_warnings = enum.auto() unstable_builder_failure = enum.auto() @@ -546,6 +555,8 @@ class Severity(enum.IntEnum): @cached_property def css_color_class(self): + if self == Severity.NO_INFO: + return 'none' if self >= Severity.BLOCKING: return 'danger' if self >= Severity.CONCERNING: @@ -554,6 +565,8 @@ def css_color_class(self): @cached_property def symbol(self): + if self == Severity.NO_INFO: + return '' if self >= Severity.BLOCKING: return '\N{HEAVY BALLOT X}' if self >= Severity.CONCERNING: @@ -562,6 +575,8 @@ def symbol(self): @cached_property def releasability(self): + if self == Severity.NO_INFO: + return 'N/A' if self >= Severity.BLOCKING: return 'Unreleasable' if self >= Severity.CONCERNING: @@ -650,15 +665,6 @@ def affected_builds(self): return {"Warning build": self.build} -@dataclass -class NoBuilds(Problem): - """Builder has no finished builds yet""" - builder: Builder - - description = "Builder has no builds" - severity = Severity.no_builds_yet - - @dataclass class BuilderDisconnected(Problem): """Builder has no finished builds yet""" @@ -696,6 +702,17 @@ class NoProblem(Problem): severity = Severity.NO_PROBLEM +@dataclass +class NoBuilds(Problem): + """Dummy problem""" + builder: None = None + + name = "Not built" + + description = "No builds" + severity = Severity.NO_INFO + + class ReleaseDashboard: # This doesn't get recreated for every render. # The Flask app and caches go here. diff --git a/master/custom/static/dashboard.css b/master/custom/static/dashboard.css index d61b10e5..37212a51 100644 --- a/master/custom/static/dashboard.css +++ b/master/custom/static/dashboard.css @@ -1,4 +1,6 @@ .release_status { + --none-color: #888; + background-color: white; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); @@ -107,6 +109,9 @@ .panel-danger & { background-color: var(--danger-color); } + .panel-none & { + background-color: var(--none-color); + } } .panel-body { @@ -163,6 +168,7 @@ &.status-success { --status-color: var(--success-color); } &.status-warning { --status-color: var(--warning-color); } &.status-danger { --status-color: var(--danger-color); } + &.status-none { --status-color: var(--none-color); } .build-dots { white-space: nowrap; overflow: hidden; diff --git a/master/custom/templates/releasedashboard.html b/master/custom/templates/releasedashboard.html index e23dac43..3ab6515c 100644 --- a/master/custom/templates/releasedashboard.html +++ b/master/custom/templates/releasedashboard.html @@ -143,10 +143,14 @@

{{ branch.featured_problem }}