From b7e2404f98107b7cb5d3630605aa55b9ec2270c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C4=93teris=20Caune?=
Date: Tue, 18 Aug 2020 14:07:55 +0300
Subject: [PATCH] Host a read-only dashboard (from
github.com/healthchecks/dashboard/), link to it from "Project Settings" >
"Show API keys"
---
CHANGELOG.md | 1 +
hc/accounts/models.py | 8 +
hc/front/urls.py | 1 +
hc/front/views.py | 4 +
templates/accounts/project.html | 23 ++-
templates/front/dashboard.html | 266 ++++++++++++++++++++++++++++++++
6 files changed, 295 insertions(+), 8 deletions(-)
create mode 100644 templates/front/dashboard.html
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c13589a5..2f26e5f8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.
- Handle status callbacks from Twilio, show delivery failures in Integrations
- Removing unused /api/v1/notifications/{uuid}/bounce endpoint
- Less verbose output in the `senddeletionnotices` command
+- Host a read-only dashboard (from github.com/healthchecks/dashboard/)
## Bug Fixes
- Handle excessively long email addresses in the signup form.
diff --git a/hc/accounts/models.py b/hc/accounts/models.py
index 5a4af9c2..bd7cd909 100644
--- a/hc/accounts/models.py
+++ b/hc/accounts/models.py
@@ -1,5 +1,6 @@
from datetime import timedelta
from secrets import token_urlsafe
+from urllib.parse import quote, urlencode
import uuid
from django.conf import settings
@@ -359,6 +360,13 @@ class Project(models.Model):
def transfer_request(self):
return self.member_set.filter(transfer_request_date__isnull=False).first()
+ def dashboard_url(self):
+ if not self.api_key_readonly:
+ return None
+
+ frag = urlencode({self.api_key_readonly: str(self)}, quote_via=quote)
+ return reverse("hc-dashboard") + "#" + frag
+
class Member(models.Model):
user = models.ForeignKey(User, models.CASCADE, related_name="memberships")
diff --git a/hc/front/urls.py b/hc/front/urls.py
index bce15731..b99292b2 100644
--- a/hc/front/urls.py
+++ b/hc/front/urls.py
@@ -90,6 +90,7 @@ project_urls = [
urlpatterns = [
path("", views.index, name="hc-index"),
+ path("tv/", views.dashboard, name="hc-dashboard"),
path("checks/cron_preview/", views.cron_preview),
path("checks//", include(check_urls)),
path("integrations/", include(channel_urls)),
diff --git a/hc/front/views.py b/hc/front/views.py
index e892781c..74850e9a 100644
--- a/hc/front/views.py
+++ b/hc/front/views.py
@@ -279,6 +279,10 @@ def index(request):
return render(request, "front/welcome.html", ctx)
+def dashboard(request):
+ return render(request, "front/dashboard.html", {})
+
+
def serve_doc(request, doc="introduction"):
path = os.path.join(settings.BASE_DIR, "templates/docs", doc + ".html")
if not os.path.exists(path):
diff --git a/templates/accounts/project.html b/templates/accounts/project.html
index eb2c3eee..1479e617 100644
--- a/templates/accounts/project.html
+++ b/templates/accounts/project.html
@@ -80,17 +80,24 @@
{% if show_api_keys %}
API key:
- {{ project.api_key }}
+
{{ project.api_key }}
{% if project.api_key_readonly %}
API key (read-only):
- {{ project.api_key_readonly }}
-
-
- Prometheus metrics endpoint:
- here
+
{{ project.api_key_readonly }}
+ Related links:
+
{% endif %}
+ class="btn btn-default pull-right">Show API Keys
{% endif %}
{% else %}
@@ -117,7 +124,7 @@
+ class="btn btn-default pull-right">Create API Keys
{% endif %}
diff --git a/templates/front/dashboard.html b/templates/front/dashboard.html
new file mode 100644
index 00000000..89314286
--- /dev/null
+++ b/templates/front/dashboard.html
@@ -0,0 +1,266 @@
+
+
+
+
+ {{ site_name }}
+
+
+
+
+
+
+
+
+
+