tables.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from django.apps import apps
  2. from django.db.models import Q
  3. from django.utils.module_loading import import_string
  4. from django.utils.translation import gettext_lazy as _
  5. from core.models import ObjectType
  6. from netbox.registry import registry
  7. __all__ = (
  8. 'get_table_configs',
  9. 'get_table_for_model',
  10. 'get_table_ordering',
  11. 'linkify_phone',
  12. 'register_table_column'
  13. )
  14. def get_table_configs(table, user):
  15. """
  16. Return any available TableConfigs applicable to the given table & user.
  17. """
  18. TableConfig = apps.get_model('extras', 'TableConfig')
  19. return TableConfig.objects.filter(
  20. Q(shared=True) | Q(user=user if user.is_authenticated else None),
  21. object_type=ObjectType.objects.get_for_model(table.Meta.model),
  22. table=table.name,
  23. enabled=True,
  24. )
  25. def get_table_for_model(model, name=None):
  26. name = name or f'{model.__name__}Table'
  27. try:
  28. return import_string(f'{model._meta.app_label}.tables.{name}')
  29. except ImportError:
  30. return
  31. def get_table_ordering(request, table):
  32. """
  33. Given a request, return the prescribed table ordering, if any. This may be necessary to determine prior to rendering
  34. the table itself.
  35. """
  36. # Check for an explicit ordering
  37. if 'sort' in request.GET:
  38. return request.GET['sort'] or None
  39. # Check for a configured preference
  40. if request.user.is_authenticated:
  41. if preference := request.user.config.get(f'tables.{table.__name__}.ordering'):
  42. return preference
  43. def linkify_phone(value):
  44. """
  45. Render a telephone number as a hyperlink.
  46. """
  47. if value is None:
  48. return None
  49. return f"tel:{value.replace(' ', '')}"
  50. def register_table_column(column, name, *tables):
  51. """
  52. Register a custom column for use on one or more tables.
  53. Args:
  54. column: The column instance to register
  55. name: The name of the table column
  56. tables: One or more table classes
  57. """
  58. for table in tables:
  59. reg = registry['tables'][table]
  60. if name in reg:
  61. raise ValueError(_("A column named {name} is already defined for table {table_name}").format(
  62. name=name, table_name=table.__name__
  63. ))
  64. reg[name] = column