From 551b809a7c382640e997d9cf543898c951ee4dc0 Mon Sep 17 00:00:00 2001
From: Bjarke Madsen <bjarke.madsen@geant.org>
Date: Tue, 23 Mar 2021 16:11:58 +0100
Subject: [PATCH] Add public delete dashboard method

---
 brian_dashboard_manager/grafana/dashboard.py | 33 +++++++++++++++++---
 1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py
index 7763af5..3760314 100644
--- a/brian_dashboard_manager/grafana/dashboard.py
+++ b/brian_dashboard_manager/grafana/dashboard.py
@@ -24,16 +24,40 @@ def get_dashboard_definitions(dir=None):  # pragma: no cover
                 yield dashboard
 
 
+def delete_dashboard(request: TokenRequest, dashboard, folder_id=None):
+    try:
+        r = None
+        uid = dashboard.get('uid')
+        if uid:
+            return _delete_dashboard(request, uid)
+        elif dashboard.get('title') and folder_id:
+            dash = _search_dashboard(request, dashboard, folder_id)
+            if dash is None:
+                return True
+            r = request.delete(f'api/dashboards/uid/{dash.get("uid")}')
+
+        logger.info(f'Deleted dashboard: {dashboard.get("title")}')
+        return r is not None
+
+    except HTTPError:
+        dump = json.dumps(dashboard, indent=2)
+        logger.exception(
+            f'Error when deleting dashboard:\n{dump}')
+        return None
+
+
 # Deletes a single dashboard for the organization
 # the API token is registered to.
 def _delete_dashboard(request: TokenRequest, uid: int):
     try:
         r = request.delete(f'api/dashboards/uid/{uid}')
         if r and 'deleted' in r.get('message', ''):
-            return r
-    except HTTPError:
+            return True
+    except HTTPError as e:
+        if e.response is not None and e.response.status_code == 404:
+            return True
         logger.exception(f'Error when deleting dashboard with UID #{uid}')
-        return None
+        return False
 
 
 # Deletes all dashboards for the organization
@@ -55,10 +79,9 @@ def find_dashboard(request: TokenRequest, title):
         return r[0]
     return None
 
+
 # Searches Grafana for a dashboard
 # matching the title of the provided dashboard.
-
-
 def _search_dashboard(request: TokenRequest, dashboard: Dict, folder_id=None):
     try:
         r = request.get('api/search', params={
-- 
GitLab