diff --git a/api/tacticalrmm/agents/models.py b/api/tacticalrmm/agents/models.py index 50de1b6c..1661a170 100644 --- a/api/tacticalrmm/agents/models.py +++ b/api/tacticalrmm/agents/models.py @@ -187,7 +187,7 @@ class Agent(BaseAuditModel): "failing": failing, "warning": warning, "info": info, - "has_failing_checks": failing > 0, + "has_failing_checks": failing > 0 or warning > 0, } return ret diff --git a/api/tacticalrmm/checks/views.py b/api/tacticalrmm/checks/views.py index 1c9680de..e52f062b 100644 --- a/api/tacticalrmm/checks/views.py +++ b/api/tacticalrmm/checks/views.py @@ -113,7 +113,8 @@ class GetUpdateDeleteCheck(APIView): # resolve any alerts that are open if "check_reset" in request.data.keys(): - obj.alert.filter(resolved=False).get().resolve() + if obj.alert.filter(resolved=False).exists(): + obj.alert.get(resolved=False).resolve() return Response(f"{obj.readable_desc} was edited!") diff --git a/api/tacticalrmm/clients/models.py b/api/tacticalrmm/clients/models.py index 2afe9e9b..facaa2c9 100644 --- a/api/tacticalrmm/clients/models.py +++ b/api/tacticalrmm/clients/models.py @@ -86,16 +86,24 @@ class Client(BaseAuditModel): .prefetch_related("agentchecks") ) - failing = 0 + data = {"error": False, "warning": False} + for agent in agents: if agent.checks["has_failing_checks"]: - failing += 1 + + if agent.checks["warning"]: + data["warning"] = True + + if agent.checks["failing"]: + data["error"] = True + break if agent.overdue_email_alert or agent.overdue_text_alert: if agent.status == "overdue": - failing += 1 + data["error"] = True + break - return failing > 0 + return data @staticmethod def serialize(client): @@ -184,16 +192,24 @@ class Site(BaseAuditModel): .prefetch_related("agentchecks") ) - failing = 0 + data = {"error": False, "warning": False} + for agent in agents: + if agent.checks["has_failing_checks"]: - failing += 1 + if agent.checks["warning"]: + data["warning"] = True + + if agent.checks["failing"]: + data["error"] = True + break if agent.overdue_email_alert or agent.overdue_text_alert: if agent.status == "overdue": - failing += 1 + data["error"] = True + break - return failing > 0 + return data @staticmethod def serialize(site): diff --git a/api/tacticalrmm/clients/serializers.py b/api/tacticalrmm/clients/serializers.py index 52044c57..7244be11 100644 --- a/api/tacticalrmm/clients/serializers.py +++ b/api/tacticalrmm/clients/serializers.py @@ -95,7 +95,6 @@ class SiteTreeSerializer(ModelSerializer): class Meta: model = Site fields = "__all__" - ordering = ("failing_checks",) class ClientTreeSerializer(ModelSerializer): @@ -106,7 +105,6 @@ class ClientTreeSerializer(ModelSerializer): class Meta: model = Client fields = "__all__" - ordering = ("failing_checks",) class DeploymentSerializer(ModelSerializer): diff --git a/web/src/components/AgentTable.vue b/web/src/components/AgentTable.vue index 0702b036..a6716986 100644 --- a/web/src/components/AgentTable.vue +++ b/web/src/components/AgentTable.vue @@ -306,14 +306,15 @@ Maintenance Mode Enabled - + Checks failing + + Checks warning + + + Checks info + Checks passing diff --git a/web/src/components/ChecksTab.vue b/web/src/components/ChecksTab.vue index 957d19ec..bd9d3b2b 100644 --- a/web/src/components/ChecksTab.vue +++ b/web/src/components/ChecksTab.vue @@ -447,6 +447,7 @@ export default { axios .patch(`/checks/${check}/check/`, data) .then(r => { + this.$emit("refreshEdit"); this.$store.dispatch("loadChecks", this.selectedAgentPk); this.notifySuccess("The check was reset"); }) @@ -455,6 +456,7 @@ export default { }); }, onRefresh(id) { + this.$emit("refreshEdit"); this.$store.dispatch("loadChecks", id); this.$store.dispatch("loadAutomatedTasks", id); }, diff --git a/web/src/components/SubTableTabs.vue b/web/src/components/SubTableTabs.vue index 943f48c1..befbd6ab 100644 --- a/web/src/components/SubTableTabs.vue +++ b/web/src/components/SubTableTabs.vue @@ -25,7 +25,7 @@ - + diff --git a/web/src/store/index.js b/web/src/store/index.js index 223d20cd..21c10a23 100644 --- a/web/src/store/index.js +++ b/web/src/store/index.js @@ -257,7 +257,8 @@ export default function () { } if (site.maintenance_mode) { siteNode["color"] = "green" } - else if (site.failing_checks) { siteNode["color"] = "negative" } + else if (site.failing_checks.error) { siteNode["color"] = "negative" } + else if (site.failing_checks.warning) { siteNode["color"] = "warning" } childSites.push(siteNode); } @@ -275,7 +276,8 @@ export default function () { } if (client.maintenance_mode) clientNode["color"] = "green" - else if (client.failing_checks) clientNode["color"] = "negative" + else if (client.failing_checks.error) { clientNode["color"] = "negative" } + else if (client.failing_checks.warning) { clientNode["color"] = "warning" } output.push(clientNode); } diff --git a/web/src/views/Dashboard.vue b/web/src/views/Dashboard.vue index 6a1d1773..50070074 100644 --- a/web/src/views/Dashboard.vue +++ b/web/src/views/Dashboard.vue @@ -343,7 +343,7 @@ @@ -727,7 +727,7 @@ export default { let data = { id: node.id, type: node.raw.split("|")[0], - action: node.color === "warning" ? false : true, + action: node.color === "green" ? false : true, }; const text = node.color === "warning" ? "Maintenance mode was disabled" : "Maintenance mode was enabled"; @@ -742,7 +742,7 @@ export default { }); }, menuMaintenanceText(node) { - return node.color === "warning" ? "Disable Maintenance Mode" : "Enable Maintenance Mode"; + return node.color === "green" ? "Disable Maintenance Mode" : "Enable Maintenance Mode"; }, clearFilter() { this.filterTextLength = 0;