utils.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import uuid
  2. from django.conf import settings
  3. from django.core.exceptions import ObjectDoesNotExist
  4. from netbox.registry import registry
  5. from extras.constants import DEFAULT_DASHBOARD
  6. __all__ = (
  7. 'get_dashboard',
  8. 'get_default_dashboard',
  9. 'get_widget_class',
  10. 'register_widget',
  11. )
  12. def register_widget(cls):
  13. """
  14. Decorator for registering a DashboardWidget class.
  15. """
  16. app_label = cls.__module__.split('.', maxsplit=1)[0]
  17. label = f'{app_label}.{cls.__name__}'
  18. registry['widgets'][label] = cls
  19. return cls
  20. def get_widget_class(name):
  21. """
  22. Return a registered DashboardWidget class identified by its name.
  23. """
  24. try:
  25. return registry['widgets'][name]
  26. except KeyError:
  27. raise ValueError(f"Unregistered widget class: {name}")
  28. def get_dashboard(user):
  29. """
  30. Return the Dashboard for a given User if one exists, or generate a default dashboard.
  31. """
  32. if user.is_anonymous:
  33. dashboard = get_default_dashboard()
  34. else:
  35. try:
  36. dashboard = user.dashboard
  37. except ObjectDoesNotExist:
  38. # Create a dashboard for this user
  39. dashboard = get_default_dashboard()
  40. dashboard.user = user
  41. dashboard.save()
  42. return dashboard
  43. def get_default_dashboard():
  44. from extras.models import Dashboard
  45. dashboard = Dashboard()
  46. default_config = settings.DEFAULT_DASHBOARD or DEFAULT_DASHBOARD
  47. for widget in default_config:
  48. id = str(uuid.uuid4())
  49. dashboard.layout.append({
  50. 'id': id,
  51. 'w': widget['width'],
  52. 'h': widget['height'],
  53. 'x': widget.get('x'),
  54. 'y': widget.get('y'),
  55. })
  56. dashboard.config[id] = {
  57. 'class': widget['widget'],
  58. 'title': widget.get('title'),
  59. 'color': widget.get('color'),
  60. 'config': widget.get('config', {}),
  61. }
  62. return dashboard