Browse Source

Allow specific channel uuid to be specified in create/update check api

pull/199/head
Andrew DeMaria 6 years ago
parent
commit
824729707e
2 changed files with 58 additions and 2 deletions
  1. +45
    -0
      hc/api/tests/test_update_check.py
  2. +13
    -2
      hc/api/views.py

+ 45
- 0
hc/api/tests/test_update_check.py View File

@ -1,3 +1,5 @@
import uuid
from hc.api.models import Channel, Check
from hc.test import BaseTestCase
@ -88,3 +90,46 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.refresh_from_db()
self.assertEqual(self.check.kind, "simple")
def test_it_updates_specific_channels(self):
channel1 = Channel(user=self.alice)
channel1.save()
channel2 = Channel(user=self.alice)
channel2.save()
r = self.post(self.check.code, {
"api_key": "X" * 32,
"channels": str(channel1.code)
})
self.assertEqual(r.status_code, 200)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 1)
self.assertEqual(check.channel_set.first().code, channel1.code)
# Change to the other channel
r = self.post(self.check.code, {
"api_key": "X" * 32,
"channels": str(channel2.code)
})
self.assertEqual(r.status_code, 200)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 1)
self.assertEqual(check.channel_set.first().code, channel2.code)
# Now set both channels
r = self.post(self.check.code, {
"api_key": "X" * 32,
"channels": str(channel2.code) + "," + str(channel1.code)
})
self.assertEqual(r.status_code, 200)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 2)
# Try to use channel that does not exist
r = self.post(self.check.code, {
"api_key": "X" * 32,
"channels": str(uuid.uuid4())
})
self.assertEqual(r.status_code, 400)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 0)

+ 13
- 2
hc/api/views.py View File

@ -1,6 +1,8 @@
from datetime import timedelta as td
from uuid import UUID
from django.conf import settings
from django.core.exceptions import SuspiciousOperation
from django.db import connection
from django.http import (HttpResponse, HttpResponseForbidden,
HttpResponseNotFound, JsonResponse)
@ -12,7 +14,7 @@ from django.views.decorators.http import require_POST
from hc.api import schemas
from hc.api.decorators import authorize, authorize_read, validate_json
from hc.api.models import Check, Notification
from hc.api.models import Check, Notification, Channel
from hc.lib.badges import check_signature, get_badge_svg
@ -81,8 +83,17 @@ def _update(check, spec):
if "channels" in spec:
if spec["channels"] == "*":
check.assign_all_channels()
elif spec["channels"] == "":
else:
check.channel_set.clear()
if spec["channels"] is not None and spec["channels"] != "":
channels = []
for raw_channel in spec["channels"].split(","):
try:
channel = Channel.objects.get(code=UUID(raw_channel))
channels.append(channel)
except Channel.objects.model.DoesNotExist:
raise SuspiciousOperation("One of the specified channels is missing")
check.channel_set.add(*channels)
return check


Loading…
Cancel
Save