Browse Source

Add the ZULIP_ENABLED setting

pull/476/head
Pēteris Caune 4 years ago
parent
commit
65ace8238a
No known key found for this signature in database GPG Key ID: E28D7679E9A9EDE2
11 changed files with 54 additions and 17 deletions
  1. +1
    -10
      CHANGELOG.md
  2. +2
    -1
      docker/.env
  3. +21
    -5
      hc/api/tests/test_notify_zulip.py
  4. +3
    -0
      hc/api/transports.py
  5. +7
    -0
      hc/front/tests/test_add_zulip.py
  6. +3
    -0
      hc/front/views.py
  7. +3
    -0
      hc/settings.py
  8. +4
    -1
      templates/docs/self_hosted_configuration.html
  9. +6
    -0
      templates/docs/self_hosted_configuration.md
  10. +2
    -0
      templates/front/channels.html
  11. +2
    -0
      templates/front/welcome.html

+ 1
- 10
CHANGELOG.md View File

@ -13,16 +13,7 @@ All notable changes to this project will be documented in this file.
- Add a section in Docs about running self-hosted instances - Add a section in Docs about running self-hosted instances
- Add experimental Dockerfile and docker-compose.yml - Add experimental Dockerfile and docker-compose.yml
- Add rate limiting for Pushover notifications (6 notifications / user / minute) - Add rate limiting for Pushover notifications (6 notifications / user / minute)
- Add the WEBHOOKS_ENABLED setting (#471)
- Add the SLACK_ENABLED setting (#471)
- Add the MATTERMOST_ENABLED setting (#471)
- Add the MSTEAMS_ENABLED setting (#471)
- Add the OPSGENIE_ENABLED setting (#471)
- Add the PD_ENABLED setting (#471)
- Add the PAGERTREE_ENABLED setting (#471)
- Add the PROMETHEUS_ENABLED setting (#471)
- Add the SPIKE_ENABLED setting (#471)
- Add the VICTOROPS_ENABLED setting (#471)
- Add support for disabling specific integration types (#471)
## Bug Fixes ## Bug Fixes
- Fix unwanted HTML escaping in SMS and WhatsApp notifications - Fix unwanted HTML escaping in SMS and WhatsApp notifications


+ 2
- 1
docker/.env View File

@ -62,4 +62,5 @@ TWILIO_FROM=
TWILIO_USE_WHATSAPP=False TWILIO_USE_WHATSAPP=False
USE_PAYMENTS=False USE_PAYMENTS=False
VICTOROPS_ENABLED=True VICTOROPS_ENABLED=True
WEBHOOKS_ENABLED=True
WEBHOOKS_ENABLED=True
ZULIP_ENABLED=True

+ 21
- 5
hc/api/tests/test_notify_zulip.py View File

@ -4,20 +4,21 @@ from datetime import timedelta as td
import json import json
from unittest.mock import patch from unittest.mock import patch
from django.test.utils import override_settings
from django.utils.timezone import now from django.utils.timezone import now
from hc.api.models import Channel, Check, Notification from hc.api.models import Channel, Check, Notification
from hc.test import BaseTestCase from hc.test import BaseTestCase
class NotifyTestCase(BaseTestCase): class NotifyTestCase(BaseTestCase):
def _setup_data(self, kind, value, status="down", email_verified=True):
def _setup_data(self, value, status="down", email_verified=True):
self.check = Check(project=self.project) self.check = Check(project=self.project)
self.check.status = status self.check.status = status
self.check.last_ping = now() - td(minutes=61) self.check.last_ping = now() - td(minutes=61)
self.check.save() self.check.save()
self.channel = Channel(project=self.project) self.channel = Channel(project=self.project)
self.channel.kind = kind
self.channel.kind = "zulip"
self.channel.value = value self.channel.value = value
self.channel.email_verified = email_verified self.channel.email_verified = email_verified
self.channel.save() self.channel.save()
@ -31,7 +32,7 @@ class NotifyTestCase(BaseTestCase):
"mtype": "stream", "mtype": "stream",
"to": "general", "to": "general",
} }
self._setup_data("zulip", json.dumps(definition))
self._setup_data(json.dumps(definition))
mock_post.return_value.status_code = 200 mock_post.return_value.status_code = 200
self.channel.notify(self.check) self.channel.notify(self.check)
@ -53,7 +54,7 @@ class NotifyTestCase(BaseTestCase):
"mtype": "stream", "mtype": "stream",
"to": "general", "to": "general",
} }
self._setup_data("zulip", json.dumps(definition))
self._setup_data(json.dumps(definition))
mock_post.return_value.status_code = 403 mock_post.return_value.status_code = 403
mock_post.return_value.json.return_value = {"msg": "Nice try"} mock_post.return_value.json.return_value = {"msg": "Nice try"}
@ -71,7 +72,7 @@ class NotifyTestCase(BaseTestCase):
"mtype": "stream", "mtype": "stream",
"to": "general", "to": "general",
} }
self._setup_data("zulip", json.dumps(definition))
self._setup_data(json.dumps(definition))
mock_post.return_value.status_code = 200 mock_post.return_value.status_code = 200
self.channel.notify(self.check) self.channel.notify(self.check)
@ -84,3 +85,18 @@ class NotifyTestCase(BaseTestCase):
payload = kwargs["data"] payload = kwargs["data"]
self.assertIn("DOWN", payload["topic"]) self.assertIn("DOWN", payload["topic"])
@override_settings(ZULIP_ENABLED=False)
def test_it_requires_zulip_enabled(self):
definition = {
"bot_email": "[email protected]",
"api_key": "fake-key",
"mtype": "stream",
"to": "general",
}
self._setup_data(json.dumps(definition))
self.channel.notify(self.check)
n = Notification.objects.get()
self.assertEqual(n.error, "Zulip notifications are not enabled.")

+ 3
- 0
hc/api/transports.py View File

@ -657,6 +657,9 @@ class Zulip(HttpTransport):
pass pass
def notify(self, check): def notify(self, check):
if not settings.ZULIP_ENABLED:
return "Zulip notifications are not enabled."
url = self.channel.zulip_site + "/api/v1/messages" url = self.channel.zulip_site + "/api/v1/messages"
auth = (self.channel.zulip_bot_email, self.channel.zulip_api_key) auth = (self.channel.zulip_bot_email, self.channel.zulip_api_key)
data = { data = {


+ 7
- 0
hc/front/tests/test_add_zulip.py View File

@ -1,3 +1,4 @@
from django.test.utils import override_settings
from hc.api.models import Channel from hc.api.models import Channel
from hc.test import BaseTestCase from hc.test import BaseTestCase
@ -80,3 +81,9 @@ class AddZulipTestCase(BaseTestCase):
self.client.login(username="[email protected]", password="password") self.client.login(username="[email protected]", password="password")
r = self.client.get(self.url) r = self.client.get(self.url)
self.assertEqual(r.status_code, 403) self.assertEqual(r.status_code, 403)
@override_settings(ZULIP_ENABLED=False)
def test_it_handles_disabled_integration(self):
self.client.login(username="[email protected]", password="password")
r = self.client.get(self.url)
self.assertEqual(r.status_code, 404)

+ 3
- 0
hc/front/views.py View File

@ -315,6 +315,7 @@ def index(request):
"enable_victorops": settings.VICTOROPS_ENABLED is True, "enable_victorops": settings.VICTOROPS_ENABLED is True,
"enable_webhooks": settings.WEBHOOKS_ENABLED is True, "enable_webhooks": settings.WEBHOOKS_ENABLED is True,
"enable_whatsapp": settings.TWILIO_USE_WHATSAPP, "enable_whatsapp": settings.TWILIO_USE_WHATSAPP,
"enable_zulip": settings.ZULIP_ENABLED is True,
"registration_open": settings.REGISTRATION_OPEN, "registration_open": settings.REGISTRATION_OPEN,
} }
@ -791,6 +792,7 @@ def channels(request, code):
"enable_victorops": settings.VICTOROPS_ENABLED is True, "enable_victorops": settings.VICTOROPS_ENABLED is True,
"enable_webhooks": settings.WEBHOOKS_ENABLED is True, "enable_webhooks": settings.WEBHOOKS_ENABLED is True,
"enable_whatsapp": settings.TWILIO_USE_WHATSAPP, "enable_whatsapp": settings.TWILIO_USE_WHATSAPP,
"enable_zulip": settings.ZULIP_ENABLED is True,
"use_payments": settings.USE_PAYMENTS, "use_payments": settings.USE_PAYMENTS,
} }
@ -1492,6 +1494,7 @@ def add_victorops(request, code):
return render(request, "integrations/add_victorops.html", ctx) return render(request, "integrations/add_victorops.html", ctx)
@require_setting("ZULIP_ENABLED")
@login_required @login_required
def add_zulip(request, code): def add_zulip(request, code):
project = _get_rw_project_for_user(request, code) project = _get_rw_project_for_user(request, code)


+ 3
- 0
hc/settings.py View File

@ -261,6 +261,9 @@ VICTOROPS_ENABLED = envbool("VICTOROPS_ENABLED", "True")
# Webhooks # Webhooks
WEBHOOKS_ENABLED = envbool("WEBHOOKS_ENABLED", "True") WEBHOOKS_ENABLED = envbool("WEBHOOKS_ENABLED", "True")
# Zulip
ZULIP_ENABLED = envbool("ZULIP_ENABLED", "True")
# Read additional configuration from hc/local_settings.py if it exists # Read additional configuration from hc/local_settings.py if it exists
if os.path.exists(os.path.join(BASE_DIR, "hc/local_settings.py")): if os.path.exists(os.path.join(BASE_DIR, "hc/local_settings.py")):
from .local_settings import * from .local_settings import *

+ 4
- 1
templates/docs/self_hosted_configuration.html View File

@ -355,4 +355,7 @@ scheme.</p>
Enabled by default.</p> Enabled by default.</p>
<h2 id="WEBHOOKS_ENABLED"><code>WEBHOOKS_ENABLED</code></h2> <h2 id="WEBHOOKS_ENABLED"><code>WEBHOOKS_ENABLED</code></h2>
<p>Default: <code>True</code></p> <p>Default: <code>True</code></p>
<p>A boolean that turns on/off the Webhooks integration. Enabled by default.</p>
<p>A boolean that turns on/off the Webhooks integration. Enabled by default.</p>
<h2 id="ZULIP_ENABLED"><code>ZULIP_ENABLED</code></h2>
<p>Default: <code>True</code></p>
<p>A boolean that turns on/off the Zulip integration. Enabled by default.</p>

+ 6
- 0
templates/docs/self_hosted_configuration.md View File

@ -573,3 +573,9 @@ Enabled by default.
Default: `True` Default: `True`
A boolean that turns on/off the Webhooks integration. Enabled by default. A boolean that turns on/off the Webhooks integration. Enabled by default.
## `ZULIP_ENABLED` {: #ZULIP_ENABLED }
Default: `True`
A boolean that turns on/off the Zulip integration. Enabled by default.

+ 2
- 0
templates/front/channels.html View File

@ -457,6 +457,7 @@
</li> </li>
{% endif %} {% endif %}
{% if enable_zulip %}
<li> <li>
<img src="{% static 'img/integrations/zulip.png' %}" <img src="{% static 'img/integrations/zulip.png' %}"
class="icon" alt="Zulip icon" /> class="icon" alt="Zulip icon" />
@ -465,6 +466,7 @@
<p>Open-source group chat.</p> <p>Open-source group chat.</p>
<a href="{% url 'hc-add-zulip' project.code %}" class="btn btn-primary">Add Integration</a> <a href="{% url 'hc-add-zulip' project.code %}" class="btn btn-primary">Add Integration</a>
</li> </li>
{% endif %}
<li class="link-to-github"> <li class="link-to-github">
<img src="{% static 'img/integrations/missing.png' %}" <img src="{% static 'img/integrations/missing.png' %}"


+ 2
- 0
templates/front/welcome.html View File

@ -674,6 +674,7 @@
</div> </div>
{% endif %} {% endif %}
{% if enable_zulip %}
<div class="col-lg-2 col-md-3 col-sm-4 col-xs-6"> <div class="col-lg-2 col-md-3 col-sm-4 col-xs-6">
<div class="integration"> <div class="integration">
<img src="{% static 'img/integrations/zulip.png' %}" class="icon" alt="" /> <img src="{% static 'img/integrations/zulip.png' %}" class="icon" alt="" />
@ -683,6 +684,7 @@
</h3> </h3>
</div> </div>
</div> </div>
{% endif %}
</div> </div>
<div class="row tour-section"> <div class="row tour-section">


Loading…
Cancel
Save