from sisense.resource import Resource
from .widget import Widget
import json
[docs]class Dashboard(Resource):
@property
def widgets(self) -> list:
"""
Get dashboard's widgets.
:return: (list) A list of widgets.
"""
dashboard = self._expanded()
return [Widget(self._api, content) for content in dashboard.json['widgets']]
[docs] def all(self, **kwargs) -> list:
"""
Get all dashboards.
:param kwargs: Keywords optional arguments.
- parentFolder: (str) Folder ID.
- name: (str) Dashboard's name.
- datasourceTitle: (str) Elasticube title used as datasource.
- datasourceAddress: (str) Elasticube address.
- fields: (list) List of fields to retrieve for each dashboard.
- expand: (list) List of fields to be expanded (convert IDs to the actual object).
:return: (list) List of Dashboard objects.
"""
content = self._api.get('dashboards', query=kwargs)
dashboards = [Dashboard(self._api, rjson) for rjson in content]
return dashboards
[docs] def get(self, oid: str = None, name: str = None, folder: str = None, expand: list = None) -> Resource:
"""
Get the specified dashboard. At least, one of the parameters must be set.
If found more than one dashboard with the same name, the first one is returned.
:param oid: (str, default None) Dashboard's ID.
:param name: (str, default None) Dashboard's name.
:param folder: (str, default None) Parent folder's ID. Used when 'name' is set.
:param expand: (list, default None) List of fields that should be expanded (replace their IDs with actual objects). May be nested using the resource.subResource format.
:return: (Dashboard) Dashboard, if found. None, otherwise.
"""
if not oid and not name:
raise ValueError('At least, one of the parameters must be set. Both oid and name are None.')
expand = ','.join(expand) if type(expand) is list else []
query = {'expand': expand}
if oid:
content = self._api.get(f'dashboards/{oid}', query=query)
else:
query.update({'name': name, 'parentFolder': folder})
content = self._api.get('dashboards', query=query)
content = content[0] if len(content) else None
if not content:
return None
result = Dashboard(self._api, content)
return result
[docs] def get_shares(self) -> list:
"""Get shares for the current dashboard."""
content = self._api.get(f'dashboards/{self.oid}/shares')
return content
[docs] def update(self, **kwargs):
"""
Update the current dashboard information according to the specified parameters.
For more information, check "PATCH /dashboards/{id}" on https://sisense.dev/reference/rest/v1.html.
"""
data = kwargs
content = self._api.patch(f'dashboards/{self.oid}', data=data)
self.json = content
[docs] def exists(self, oid: str = None) -> bool:
"""
Check whether a specific dashboard exists.
:param oid: (str, default self.oid) Dashboard's ID.
:return: (bool) True, if dashboard exists.
"""
oid = oid if oid else self.oid
content = self._api.get(f'dashboards/{oid}/exists')
return content['exists']
[docs] def do_import(self, filepath: str, action: str = 'duplicate', folder: str = None) -> Resource:
"""
Import dashboard from file in filepath.
:param filepath: (str) Relative/absolute path to a .dash file.
:param action: (str, default 'duplicate') Determines if the existing dashboard should be overwritten. Possible values : skip, overwrite, duplicate.
:param folder: (str, default None) Folder's ID where the dashboard should be imported.
:return: (Dashboard) The new dashboard.
"""
with open(filepath, 'r') as file:
rjson = json.load(file)
query = {'action': action, 'importFolder': folder}
content = self._api.post('dashboards/import/bulk', query=query, data=[rjson])
return Dashboard(self._api, content['succeded'][0])
[docs] def do_export(self, filepath: str, filetype: str = 'dash', **kwargs):
"""
Export the current dashboard.
:param filepath: (str) Where to save the file including file's name and extension.
:param filetype: (str, default 'dash') Type of export. Possible values: dash.
For more details on other parameters, check:
<GET /dashboards/{id}/export/*> on https://sisense.dev/reference/rest/v1.html.
PNG and PDF export is currently not supported.
"""
content = self._api.get(f'dashboards/{self.oid}/export/{filetype}', query=kwargs)
dashboard = Dashboard(self._api, content)
dashboard.save(filepath)
[docs] def publish(self):
"""Publish the current dashboard."""
self._api.post(f'dashboards/{self.oid}/publish')
[docs] def delete(self):
"""Delete the current dashboard."""
self._api.delete(f'dashboards/{self.oid}')
def _expanded(self) -> Resource:
"""
Get dashboard's expanded information, including widgets.
:return: (Dashboard) The expanded dashboard.
"""
content = self._api.get(f'dashboards/{self.oid}/export/dash')
return Dashboard(self._api, content)