Coverage for utilities/tables.py: 27%

33 statements  

« 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 _ 

5 

6from core.models import ObjectType 

7from netbox.registry import registry 

8 

9__all__ = ( 

10 'get_table_configs', 

11 'get_table_for_model', 

12 'get_table_ordering', 

13 'linkify_phone', 

14 'register_table_column' 

15) 

16 

17 

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 ) 

29 

30 

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 

37 

38 

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 

47 

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 

53 

54 

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(' ', '')}" 

62 

63 

64def register_table_column(column, name, *tables): 

65 """ 

66 Register a custom column for use on one or more tables. 

67 

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