From aaadf6031f81ef44d347fc0a6dc7e77d1fe99887 Mon Sep 17 00:00:00 2001 From: James Kirsop Date: Fri, 27 Mar 2020 09:30:26 +1100 Subject: [PATCH] Sample work for review --- hc/api/models.py | 26 +++++++++++++++++++++++++- hc/api/views.py | 2 ++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/hc/api/models.py b/hc/api/models.py index 3962a1ad..8e9ccf64 100644 --- a/hc/api/models.py +++ b/hc/api/models.py @@ -16,6 +16,7 @@ from hc.api import transports from hc.lib import emails from hc.lib.date import month_boundaries import pytz +import re STATUSES = (("up", "Up"), ("down", "Down"), ("new", "New"), ("paused", "Paused")) DEFAULT_TIMEOUT = td(days=1) @@ -206,7 +207,7 @@ class Check(models.Model): code_half = self.code.hex[:16] return hashlib.sha1(code_half.encode()).hexdigest() - def to_dict(self, readonly=False): + def to_dict(self, readonly=False, history=None): result = { "name": self.name, @@ -223,6 +224,29 @@ class Check(models.Model): if self.last_duration: result["last_duration"] = int(self.last_duration.total_seconds()) + if history: + split = re.split(r'(h|d|w)$',history,maxsplit=0) + if len(split) == 3: # re.split should return a list of 3 items if the parameter is set correctly + zone = pytz.timezone(self.tz) + current_now = datetime.now(tz=zone) + + if split[1] == 'd': + cutoff = current_now - td(days=int(split[0])) + elif split[1] == 'h': + cutoff = current_now - td(hours=int(split[0])) + elif split[1] == 'w': + cutoff = current_now - td(weeks=int(split[0])) + + pings = Ping.objects.filter(owner=self, created__gte=cutoff).order_by("-id")#[:limit] + pings = list(pings) + + alerts = Notification.objects.select_related("channel").filter( + owner=self, check_status="down", created__gt=cutoff + ) + + events = pings + list(alerts) + events.sort(key=lambda el: el.created, reverse=True) + result['history'] = list(map(lambda x: {'timestamp':x.created,'status':x.kind}, events)) if readonly: result["unique_key"] = self.unique_key else: diff --git a/hc/api/views.py b/hc/api/views.py index 9c876fc2..ada86f5a 100644 --- a/hc/api/views.py +++ b/hc/api/views.py @@ -189,6 +189,8 @@ def get_check(request, code): if check.project_id != request.project.id: return HttpResponseForbidden() + if 'history' in request.GET: + return JsonResponse(check.to_dict(readonly=request.readonly, history=request.GET['history'])) return JsonResponse(check.to_dict(readonly=request.readonly))