From fb45b678929ff0c1be23e4a5d87c43cb813ce150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Wed, 28 Nov 2018 21:40:46 +0200 Subject: [PATCH] Set Pushover alert priorities for "down" and "up" events separately. Fixes #204 --- CHANGELOG.md | 4 + hc/api/models.py | 8 +- hc/api/tests/test_notify.py | 15 +++ hc/api/transports.py | 8 +- hc/front/tests/test_add_pushover.py | 15 ++- hc/front/views.py | 7 +- static/css/add_pushover.css | 7 +- static/img/integrations/setup_pushover_1.png | Bin 12636 -> 20445 bytes templates/front/channels.html | 2 +- templates/integrations/add_pushover.html | 127 +++++++++++-------- 10 files changed, 122 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a132e58b..3483bb48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. ## Unreleased +### Improvements +- Set Pushover alert priorities for "down" and "up" events separately + + ### Bug Fixes - Fix after-login redirects for users landing in the "Add Slack" page diff --git a/hc/api/models.py b/hc/api/models.py index 358031e2..f87ac01d 100644 --- a/hc/api/models.py +++ b/hc/api/models.py @@ -339,11 +339,11 @@ class Channel(models.Model): return 'img/integrations/%s.png' % self.kind @property - def po_value(self): + def po_priority(self): assert self.kind == "po" - user_key, prio = self.value.split("|") - prio = int(prio) - return user_key, prio, PO_PRIORITIES[prio] + parts = self.value.split("|") + prio = int(parts[1]) + return PO_PRIORITIES[prio] @property def url_down(self): diff --git a/hc/api/tests/test_notify.py b/hc/api/tests/test_notify.py index c145f3d5..b92ba911 100644 --- a/hc/api/tests/test_notify.py +++ b/hc/api/tests/test_notify.py @@ -405,6 +405,21 @@ class NotifyTestCase(BaseTestCase): payload = kwargs["data"] self.assertIn("DOWN", payload["title"]) + @patch("hc.api.transports.requests.request") + def test_pushover_up_priority(self, mock_post): + self._setup_data("po", "123|0|2", status="up") + mock_post.return_value.status_code = 200 + + self.channel.notify(self.check) + assert Notification.objects.count() == 1 + + args, kwargs = mock_post.call_args + payload = kwargs["data"] + self.assertIn("UP", payload["title"]) + self.assertEqual(payload["priority"], 2) + self.assertIn("retry", payload) + self.assertIn("expire", payload) + @patch("hc.api.transports.requests.request") def test_victorops(self, mock_post): self._setup_data("victorops", "123") diff --git a/hc/api/transports.py b/hc/api/transports.py index fad1ffd8..6e67546a 100644 --- a/hc/api/transports.py +++ b/hc/api/transports.py @@ -304,7 +304,13 @@ class Pushover(HttpTransport): } text = tmpl("pushover_message.html", **ctx) title = tmpl("pushover_title.html", **ctx) - user_key, prio = self.channel.value.split("|") + + pieces = self.channel.value.split("|") + user_key, prio = pieces[0], pieces[1] + # The third element, if present, is the priority for "up" events + if len(pieces) == 3 and check.status == "up": + prio = pieces[2] + payload = { "token": settings.PUSHOVER_API_TOKEN, "user": user_key, diff --git a/hc/front/tests/test_add_pushover.py b/hc/front/tests/test_add_pushover.py index 6f6d6be7..17ce471f 100644 --- a/hc/front/tests/test_add_pushover.py +++ b/hc/front/tests/test_add_pushover.py @@ -39,13 +39,13 @@ class AddPushoverTestCase(BaseTestCase): session["pushover"] = "foo" session.save() - params = "pushover_user_key=a&state=foo&prio=0" + params = "pushover_user_key=a&state=foo&prio=0&prio_up=-1" r = self.client.get("/integrations/add_pushover/?%s" % params) self.assertEqual(r.status_code, 302) channels = list(Channel.objects.all()) assert len(channels) == 1 - assert channels[0].value == "a|0" + assert channels[0].value == "a|0|-1" def test_it_validates_priority(self): self.client.login(username="alice@example.org", password="password") @@ -58,6 +58,17 @@ class AddPushoverTestCase(BaseTestCase): r = self.client.get("/integrations/add_pushover/?%s" % params) self.assertEqual(r.status_code, 400) + def test_it_validates_priority_up(self): + self.client.login(username="alice@example.org", password="password") + + session = self.client.session + session["pushover"] = "foo" + session.save() + + params = "pushover_user_key=a&state=foo&prio_up=abc" + r = self.client.get("/integrations/add_pushover/?%s" % params) + self.assertEqual(r.status_code, 400) + def test_it_validates_state(self): self.client.login(username="alice@example.org", password="password") diff --git a/hc/front/views.py b/hc/front/views.py index 826e33c7..72f14392 100644 --- a/hc/front/views.py +++ b/hc/front/views.py @@ -873,6 +873,7 @@ def add_pushover(request): success_url = settings.SITE_ROOT + reverse("hc-add-pushover") + "?" + urlencode({ "state": state, "prio": request.POST.get("po_priority", "0"), + "prio_up": request.POST.get("po_priority_up", "0") }) subscription_url = settings.PUSHOVER_SUBSCRIPTION_URL + "?" + urlencode({ "success": success_url, @@ -892,6 +893,10 @@ def add_pushover(request): if prio not in ("-2", "-1", "0", "1", "2"): return HttpResponseBadRequest() + prio_up = request.GET.get("prio_up") + if prio_up not in ("-2", "-1", "0", "1", "2"): + return HttpResponseBadRequest() + if request.GET.get("pushover_unsubscribed") == "1": # Unsubscription: delete all Pushover channels for this user Channel.objects.filter(user=request.user, kind="po").delete() @@ -899,7 +904,7 @@ def add_pushover(request): # Subscription channel = Channel(user=request.team.user, kind="po") - channel.value = "%s|%s" % (key, prio) + channel.value = "%s|%s|%s" % (key, prio, prio_up) channel.save() channel.assign_all_checks() diff --git a/static/css/add_pushover.css b/static/css/add_pushover.css index db0268e0..ef49591f 100644 --- a/static/css/add_pushover.css +++ b/static/css/add_pushover.css @@ -1,8 +1,3 @@ -#add-pushover .radio { - margin-bottom: 1em; -} - #add-pushover .help { - display: block; - color: #888; + opacity: 0.6; } \ No newline at end of file diff --git a/static/img/integrations/setup_pushover_1.png b/static/img/integrations/setup_pushover_1.png index 0daaf9123b9fa608108c00ad0e98eb3e4fa7cc5d..e72902ad8c113c296214b44960a6b8dbce67586f 100644 GIT binary patch literal 20445 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%0D>B<*NP&~10J_eqsZ3C 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 literal 12636 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 After logging in, go to "Integrations → Add Pushover". Pushover supports different notification priorities from - silent to "Emergency". Select your preferred priority + silent to "Emergency". Select your preferred priorities and click "Subscribe with Pushover".

@@ -106,65 +106,72 @@ {% else %}

Integration Settings

-
+ {% csrf_token %}
- -
-
- -
- -
- -
- -
- -
- -
- -
+ +
+ +
+
-
- -
-
+
+ +
+ +
+
-
+
{% endblock %} + +{% block scripts %} +{% compress js %} + + + +{% endcompress %} +{% endblock %}