From f352efdd5f2f8ba3c2092f400c8ae9022af9dc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Wed, 11 Mar 2020 16:38:29 +0200 Subject: [PATCH] Experimental Zulip integration. Fixes #202 --- CHANGELOG.md | 1 + hc/api/models.py | 32 ++++ hc/api/tests/test_notify.py | 18 ++ hc/api/transports.py | 32 +++- hc/front/forms.py | 14 ++ hc/front/tests/test_add_zulip.py | 80 +++++++++ hc/front/urls.py | 1 + hc/front/views.py | 20 +++ static/css/channels.css | 4 + static/css/icomoon.css | 14 +- static/fonts/icomoon.eot | Bin 12012 -> 12172 bytes static/fonts/icomoon.svg | 1 + static/fonts/icomoon.ttf | Bin 11848 -> 12008 bytes static/fonts/icomoon.woff | Bin 11924 -> 12084 bytes static/img/integrations/setup_zulip_1.png | Bin 0 -> 28930 bytes static/img/integrations/setup_zulip_2.png | Bin 0 -> 25458 bytes static/img/integrations/setup_zulip_3.png | Bin 0 -> 22813 bytes static/img/integrations/zulip.png | Bin 0 -> 2967 bytes static/js/add_zulip.js | 17 ++ templates/front/channels.html | 16 ++ templates/integrations/add_zulip.html | 195 ++++++++++++++++++++++ 21 files changed, 439 insertions(+), 6 deletions(-) create mode 100644 hc/front/tests/test_add_zulip.py create mode 100644 static/img/integrations/setup_zulip_1.png create mode 100644 static/img/integrations/setup_zulip_2.png create mode 100644 static/img/integrations/setup_zulip_3.png create mode 100644 static/img/integrations/zulip.png create mode 100644 static/js/add_zulip.js create mode 100644 templates/integrations/add_zulip.html diff --git a/CHANGELOG.md b/CHANGELOG.md index acc520cb..933abdc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Don't store user's current project in DB, put it explicitly in page URLs (#336) - API reference in Markdown - Use Selectize.js for entering tags (#324) +- Zulip integration (#202) ### Bug Fixes - The "render_docs" command checks if markdown and pygments is installed (#329) diff --git a/hc/api/models.py b/hc/api/models.py index 013d745e..3f980b2c 100644 --- a/hc/api/models.py +++ b/hc/api/models.py @@ -48,6 +48,7 @@ CHANNEL_KINDS = ( ("mattermost", "Mattermost"), ("msteams", "Microsoft Teams"), ("shell", "Shell Command"), + ("zulip", "Zulip"), ) PO_PRIORITIES = {-2: "lowest", -1: "low", 0: "normal", 1: "high", 2: "emergency"} @@ -359,6 +360,11 @@ class Channel(models.Model): return "Slack %s" % self.slack_channel elif self.kind == "telegram": return "Telegram %s" % self.telegram_name + elif self.kind == "zulip": + if self.zulip_type == "stream": + return "Zulip stream %s" % self.zulip_to + if self.zulip_type == "private": + return "Zulip user %s" % self.zulip_to return self.get_kind_display() @@ -429,6 +435,8 @@ class Channel(models.Model): return transports.MsTeams(self) elif self.kind == "shell": return transports.Shell(self) + elif self.kind == "zulip": + return transports.Zulip(self) else: raise NotImplementedError("Unknown channel kind: %s" % self.kind) @@ -674,6 +682,30 @@ class Channel(models.Model): doc = json.loads(self.value) return doc["region"] + @property + def zulip_bot_email(self): + assert self.kind == "zulip" + doc = json.loads(self.value) + return doc["bot_email"] + + @property + def zulip_api_key(self): + assert self.kind == "zulip" + doc = json.loads(self.value) + return doc["api_key"] + + @property + def zulip_type(self): + assert self.kind == "zulip" + doc = json.loads(self.value) + return doc["mtype"] + + @property + def zulip_to(self): + assert self.kind == "zulip" + doc = json.loads(self.value) + return doc["to"] + class Notification(models.Model): class Meta: diff --git a/hc/api/tests/test_notify.py b/hc/api/tests/test_notify.py index b804c054..8ae686ae 100644 --- a/hc/api/tests/test_notify.py +++ b/hc/api/tests/test_notify.py @@ -798,3 +798,21 @@ class NotifyTestCase(BaseTestCase): n = Notification.objects.get() self.assertEqual(n.error, "Shell commands are not enabled") + + @patch("hc.api.transports.requests.request") + def test_zulip(self, mock_post): + definition = { + "bot_email": "bot@example.org", + "api_key": "fake-key", + "mtype": "stream", + "to": "general", + } + self._setup_data("zulip", json.dumps(definition)) + 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("DOWN", payload["topic"]) diff --git a/hc/api/transports.py b/hc/api/transports.py index 749bc0cf..39ef0e8f 100644 --- a/hc/api/transports.py +++ b/hc/api/transports.py @@ -140,6 +140,10 @@ class Shell(Transport): class HttpTransport(Transport): + @classmethod + def get_error(cls, r): + return "Received status code %d" % r.status_code + @classmethod def _request(cls, method, url, **kwargs): try: @@ -152,7 +156,7 @@ class HttpTransport(Transport): r = requests.request(method, url, **options) if r.status_code not in (200, 201, 202, 204): - return "Received status code %d" % r.status_code + return cls.get_error(r) except requests.exceptions.Timeout: # Well, we tried return "Connection timed out" @@ -538,3 +542,29 @@ class MsTeams(HttpTransport): text = tmpl("msteams_message.json", check=check) payload = json.loads(text) return self.post(self.channel.value, json=payload) + + +class Zulip(HttpTransport): + @classmethod + def get_error(cls, r): + try: + doc = r.json() + if "msg" in doc: + return doc["msg"] + except ValueError: + pass + + return super().get_error(r) + + def notify(self, check): + _, domain = self.channel.zulip_bot_email.split("@") + url = "https://%s/api/v1/messages" % domain + auth = (self.channel.zulip_bot_email, self.channel.zulip_api_key) + data = { + "type": self.channel.zulip_type, + "to": self.channel.zulip_to, + "topic": tmpl("zulip_topic.html", check=check), + "content": tmpl("zulip_content.html", check=check), + } + + return self.post(url, data=data, auth=auth) diff --git a/hc/front/forms.py b/hc/front/forms.py index 901bf06f..febca0d0 100644 --- a/hc/front/forms.py +++ b/hc/front/forms.py @@ -221,3 +221,17 @@ class AddAppriseForm(forms.Form): class AddPdForm(forms.Form): error_css_class = "has-error" value = forms.CharField(max_length=32) + + +ZULIP_TARGETS = (("stream", "Stream"), ("private", "Private")) + + +class AddZulipForm(forms.Form): + error_css_class = "has-error" + bot_email = forms.EmailField(max_length=100) + api_key = forms.CharField(max_length=50) + mtype = forms.ChoiceField(choices=ZULIP_TARGETS) + to = forms.CharField(max_length=100) + + def get_value(self): + return json.dumps(dict(self.cleaned_data), sort_keys=True) diff --git a/hc/front/tests/test_add_zulip.py b/hc/front/tests/test_add_zulip.py new file mode 100644 index 00000000..9c0d319f --- /dev/null +++ b/hc/front/tests/test_add_zulip.py @@ -0,0 +1,80 @@ +from hc.api.models import Channel +from hc.test import BaseTestCase + + +class AddZulipTestCase(BaseTestCase): + def setUp(self): + super(AddZulipTestCase, self).setUp() + self.url = "/projects/%s/add_zulip/" % self.project.code + + def test_instructions_work(self): + self.client.login(username="alice@example.org", password="password") + r = self.client.get(self.url) + self.assertContains(r, "open-source group chat app") + + def test_it_works(self): + form = { + "bot_email": "foo@example.org", + "api_key": "fake-key", + "mtype": "stream", + "to": "general", + } + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, form) + self.assertRedirects(r, self.channels_url) + + c = Channel.objects.get() + self.assertEqual(c.kind, "zulip") + self.assertEqual(c.zulip_bot_email, "foo@example.org") + self.assertEqual(c.zulip_api_key, "fake-key") + self.assertEqual(c.zulip_type, "stream") + self.assertEqual(c.zulip_to, "general") + + def test_it_rejects_bad_email(self): + form = { + "bot_email": "not@an@email", + "api_key": "fake-key", + "mtype": "stream", + "to": "general", + } + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, form) + self.assertContains(r, "Enter a valid email address.") + + def test_it_rejects_missing_api_key(self): + form = { + "bot_email": "foo@example.org", + "api_key": "", + "mtype": "stream", + "to": "general", + } + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, form) + self.assertContains(r, "This field is required.") + + def test_it_rejects_bad_mtype(self): + form = { + "bot_email": "foo@example.org", + "api_key": "fake-key", + "mtype": "this-should-not-work", + "to": "general", + } + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, form) + self.assertEqual(r.status_code, 200) + + def test_it_rejects_missing_stream_name(self): + form = { + "bot_email": "foo@example.org", + "api_key": "fake-key", + "mtype": "stream", + "to": "", + } + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, form) + self.assertContains(r, "This field is required.") diff --git a/hc/front/urls.py b/hc/front/urls.py index 5fdff5d1..0b344300 100644 --- a/hc/front/urls.py +++ b/hc/front/urls.py @@ -75,6 +75,7 @@ project_urls = [ path("add_victorops/", views.add_victorops, name="hc-add-victorops"), path("add_webhook/", views.add_webhook, name="hc-add-webhook"), path("add_whatsapp/", views.add_whatsapp, name="hc-add-whatsapp"), + path("add_zulip/", views.add_zulip, name="hc-add-zulip"), path("badges/", views.badges, name="hc-badges"), path("checks/", views.my_checks, name="hc-checks"), path("checks/add/", views.add_check, name="hc-add-check"), diff --git a/hc/front/views.py b/hc/front/views.py index 1bcb6c3a..e247ee0a 100644 --- a/hc/front/views.py +++ b/hc/front/views.py @@ -1353,6 +1353,26 @@ def add_victorops(request, code): return render(request, "integrations/add_victorops.html", ctx) +@login_required +def add_zulip(request, code): + project = _get_project_for_user(request, code) + + if request.method == "POST": + form = forms.AddZulipForm(request.POST) + if form.is_valid(): + channel = Channel(project=project, kind="zulip") + channel.value = form.get_value() + channel.save() + + channel.assign_all_checks() + return redirect("hc-p-channels", project.code) + else: + form = forms.AddZulipForm() + + ctx = {"page": "channels", "project": project, "form": form} + return render(request, "integrations/add_zulip.html", ctx) + + @csrf_exempt @require_POST def telegram_bot(request): diff --git a/static/css/channels.css b/static/css/channels.css index d18c947a..a7e0122a 100644 --- a/static/css/channels.css +++ b/static/css/channels.css @@ -226,6 +226,10 @@ table.channels-table > tbody > tr > th { animation: marker-ripple 1.2s ease-out infinite; } +.ai-step p { + margin-left: 80px; +} + @keyframes marker-ripple { 0%, 35% { transform: scale(0); diff --git a/static/css/icomoon.css b/static/css/icomoon.css index 57b353b3..8bd39cc0 100644 --- a/static/css/icomoon.css +++ b/static/css/icomoon.css @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('../fonts/icomoon.eot?pl16ut'); - src: url('../fonts/icomoon.eot?pl16ut#iefix') format('embedded-opentype'), - url('../fonts/icomoon.ttf?pl16ut') format('truetype'), - url('../fonts/icomoon.woff?pl16ut') format('woff'), - url('../fonts/icomoon.svg?pl16ut#icomoon') format('svg'); + src: url('../fonts/icomoon.eot?agj6xa'); + src: url('../fonts/icomoon.eot?agj6xa#iefix') format('embedded-opentype'), + url('../fonts/icomoon.ttf?agj6xa') format('truetype'), + url('../fonts/icomoon.woff?agj6xa') format('woff'), + url('../fonts/icomoon.svg?agj6xa#icomoon') format('svg'); font-weight: normal; font-style: normal; } @@ -24,6 +24,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-zulip:before { + content: "\e918"; + color: #1e9459; +} .icon-pd:before { content: "\e90b"; color: #04ac38; diff --git a/static/fonts/icomoon.eot b/static/fonts/icomoon.eot index b5de171af61ff02d4a38bf5d38c0e305b53b0d3d..51cf9fc6985669b9b349838b4b3ab05d209d690a 100644 GIT binary patch delta 331 zcmaD8+Y`^)qtC$bVj`Q_^P4g-Fzf;1gyh`Bf~v(6kIB`q^tI$=U|>AJ zz@R0Nk(!ty(fsoZ1B3PjpenNrpa2Iqiv{1kQTDpfA0oE&AKL7v# delta 247 zcmeB)e-q34MvsBPVker)XP_<~{F}eCpyNdTQFfblq zV9>0{NKH(UV31Z~V9>Szsxr#}3UF|Z~f&2wPJK75Ji%S@ofietw8X$QFX6DJs zj1G+Alb0~YGKz0zV!ExV%m|WaVBiM2IiBC + \ No newline at end of file diff --git a/static/fonts/icomoon.ttf b/static/fonts/icomoon.ttf index 62c037f6b69cb8e7945af07ab42ce63527305f3e..fc07fa48660e5167f1ead57ac7a989b755ad3eca 100644 GIT binary patch delta 395 zcmX>R^CGsMfsuiMft#U$ftkU;KUm+0Ux>{VD6$8L6OwZi3#t~Etz=+elmYVRq$d^^ z0BHdre+Q7}NYANETj^`b3*;YQV9*lCNKH(UX#V+yfkFEMP~I#9D8RwZV!^w z4s->`dIpA9k63@l^V@u7;AR2yZ}mkT12G`<|J5v>lasU!88s$P(VjC|M<+x?6chv? Y%^HmF7=%Dd8JH$7WE9@KSZ66C0MXQEb^rhX delta 281 zcmaD6dm^TufsuiMft#U$ftkU;KUm+0Ux>{FD6$8L6OwZi3#t~Ctz=+elmYVRq$d^^ z0BHdre+Q7}NYANE+qA2AACP~5fkCq(BQ-HafC~uYl6yV@yF$eNN`cyJ< zODZO*bMOQCQ-J(AIr+(!i4zlM1KBzTKq4SFv7&&%itz)G-vHz*|NN2x6atOw}GHV~fa#reA+zqkbGA(4rH{23)C`!L2bN^D-mcw3W~iGkt&0Tu@4 z0}MtCHj|f#m~yZyiZdFEE2>X+5S0mi!q{!~@AD=5f5oI$R$tUH7(ID~wmGB5sH2mo3vWIX@? delta 318 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 literal 0 HcmV?d00001 diff --git a/static/img/integrations/setup_zulip_3.png b/static/img/integrations/setup_zulip_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f55077317f62eefea68169290b6662f06fb9b0ac GIT binary patch literal 22813 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 DlYH0S literal 0 HcmV?d00001 diff --git a/static/img/integrations/zulip.png b/static/img/integrations/zulip.png new file mode 100644 index 0000000000000000000000000000000000000000..a42b855e82a9d69df91965668dab3411448bb263 GIT binary patch literal 2967 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 E0S6h$?f?J) literal 0 HcmV?d00001 diff --git a/static/js/add_zulip.js b/static/js/add_zulip.js new file mode 100644 index 00000000..0c18e6a4 --- /dev/null +++ b/static/js/add_zulip.js @@ -0,0 +1,17 @@ +$(function() { + function updateForm() { + var mType = $('input[name=mtype]:checked').val(); + if (mType == "stream") { + $("#z-to-label").text("Stream Name"); + $("#z-to-help").text('Example: "general"'); + } + if (mType == "private") { + $("#z-to-label").text("User's Email"); + $("#z-to-help").text('Example: "alice@example.org"'); + } + } + + // Update form labels when user clicks on radio buttons + $('input[type=radio][name=mtype]').change(updateForm); + +}); diff --git a/templates/front/channels.html b/templates/front/channels.html index 498abb73..5ecbe4a9 100644 --- a/templates/front/channels.html +++ b/templates/front/channels.html @@ -82,6 +82,13 @@ {% if ch.whatsapp_notify_up and not ch.whatsapp_notify_down %} (up only) {% endif %} + {% elif ch.kind == "zulip" %} + Zulip + {% if ch.zulip_type == "stream" %} + stream {{ ch.zulip_to}} + {% elif ch.zulip_type == "private" %} + user {{ ch.zulip_to}} + {% endif %} {% else %} {{ ch.get_kind_display }} {% endif %} @@ -380,6 +387,15 @@ {% endif %} +
  • + Zulip icon + +

    Zulip

    +

    Open-source group chat.

    + Add Integration +
  • +