1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

75 lines
1.9 KiB
Python
Raw Normal View History

from django.contrib.auth import get_user_model
from django.db import models
from extras.dashboard.utils import get_widget_class
__all__ = (
'Dashboard',
)
class Dashboard(models.Model):
user = models.OneToOneField(
to=get_user_model(),
on_delete=models.CASCADE,
related_name='dashboard'
)
2023-03-22 15:44:01 -04:00
layout = models.JSONField(
default=list
)
config = models.JSONField(
default=dict
)
class Meta:
pass
def get_widget(self, id):
"""
Instantiate and return a widget by its ID
"""
id = str(id)
config = dict(self.config[id]) # Copy to avoid mutating instance data
widget_class = get_widget_class(config.pop('class'))
return widget_class(id=id, **config)
def get_layout(self):
"""
Return the dashboard's configured layout, suitable for rendering with gridstack.js.
"""
widgets = []
for grid_item in self.layout:
widget = self.get_widget(grid_item['id'])
widget.set_layout(grid_item)
widgets.append(widget)
return widgets
def add_widget(self, widget, x=None, y=None):
"""
Add a widget to the dashboard, optionally specifying its X & Y coordinates.
"""
id = str(widget.id)
self.config[id] = {
'class': widget.name,
'title': widget.title,
'color': widget.color,
'config': widget.config,
}
self.layout.append({
'id': id,
'h': widget.height,
'w': widget.width,
'x': x,
'y': y,
})
def delete_widget(self, id):
"""
Delete a widget from the dashboard.
"""
id = str(id)
del self.config[id]
self.layout = [
item for item in self.layout if item['id'] != id
]