Coverage for utilities/tables.py: 27%
33 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.apps import apps
2from django.db.models import Q
3from django.utils.module_loading import import_string
4from django.utils.translation import gettext_lazy as _
6from core.models import ObjectType
7from netbox.registry import registry
9__all__ = (
10 'get_table_configs',
11 'get_table_for_model',
12 'get_table_ordering',
13 'linkify_phone',
14 'register_table_column'
15)
18def get_table_configs(table, user):
19 """
20 Return any available TableConfigs applicable to the given table & user.
21 """
22 TableConfig = apps.get_model('extras', 'TableConfig')
23 return TableConfig.objects.filter(
24 Q(shared=True) | Q(user=user if user.is_authenticated else None),
25 object_type=ObjectType.objects.get_for_model(table.Meta.model),
26 table=table.name,
27 enabled=True,
28 )
31def get_table_for_model(model, name=None):
32 name = name or f'{model.__name__}Table'
33 try:
34 return import_string(f'{model._meta.app_label}.tables.{name}')
35 except ImportError:
36 return None
39def get_table_ordering(request, table):
40 """
41 Given a request, return the prescribed table ordering, if any.
42 This may be necessary to determine before rendering the table itself.
43 """
44 # Check for an explicit ordering
45 if 'sort' in request.GET:
46 return request.GET['sort'] or None
48 # Check for a configured preference
49 if request.user.is_authenticated:
50 if preference := request.user.config.get(f'tables.{table.__name__}.ordering'):
51 return preference
52 return None
55def linkify_phone(value):
56 """
57 Render a telephone number as a hyperlink.
58 """
59 if value is None:
60 return None
61 return f"tel:{value.replace(' ', '')}"
64def register_table_column(column, name, *tables):
65 """
66 Register a custom column for use on one or more tables.
68 Args:
69 column: The column instance to register
70 name: The name of the table column
71 tables: One or more table classes
72 """
73 for table in tables:
74 reg = registry['tables'][table]
75 if name in reg:
76 raise ValueError(_("A column named {name} is already defined for table {table_name}").format(
77 name=name, table_name=table.__name__
78 ))
79 reg[name] = column