Coverage for dcim/tables/power.py: 100%

32 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1import django_tables2 as tables 

2from django.utils.translation import gettext_lazy as _ 

3 

4from dcim.models import PowerFeed, PowerPanel 

5from netbox.tables import PrimaryModelTable, columns 

6from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin 

7 

8from .devices import CableTerminationTable 

9 

10__all__ = ( 

11 'PowerFeedTable', 

12 'PowerPanelTable', 

13) 

14 

15 

16# 

17# Power panels 

18# 

19 

20class PowerPanelTable(ContactsColumnMixin, PrimaryModelTable): 

21 name = tables.Column( 

22 verbose_name=_('Name'), 

23 linkify=True 

24 ) 

25 site = tables.Column( 

26 verbose_name=_('Site'), 

27 linkify=True 

28 ) 

29 location = tables.Column( 

30 verbose_name=_('Location'), 

31 linkify=True 

32 ) 

33 powerfeed_count = columns.LinkedCountColumn( 

34 viewname='dcim:powerfeed_list', 

35 url_params={'power_panel_id': 'pk'}, 

36 verbose_name=_('Power Feeds') 

37 ) 

38 tags = columns.TagColumn( 

39 url_name='dcim:powerpanel_list' 

40 ) 

41 

42 class Meta(PrimaryModelTable.Meta): 

43 model = PowerPanel 

44 fields = ( 

45 'pk', 'id', 'name', 'site', 'location', 'powerfeed_count', 'contacts', 'description', 'comments', 'tags', 

46 'created', 'last_updated', 

47 ) 

48 default_columns = ('pk', 'name', 'site', 'location', 'powerfeed_count') 

49 

50 

51# 

52# Power feeds 

53# 

54 

55# We're not using PathEndpointTable for PowerFeed because power connections 

56# cannot traverse pass-through ports. 

57class PowerFeedTable(TenancyColumnsMixin, CableTerminationTable, PrimaryModelTable): 

58 name = tables.Column( 

59 verbose_name=_('Name'), 

60 linkify=True 

61 ) 

62 power_panel = tables.Column( 

63 verbose_name=_('Power Panel'), 

64 linkify=True 

65 ) 

66 rack = tables.Column( 

67 verbose_name=_('Rack'), 

68 linkify=True 

69 ) 

70 status = columns.ChoiceFieldColumn( 

71 verbose_name=_('Status'), 

72 ) 

73 type = columns.ChoiceFieldColumn( 

74 verbose_name=_('Type'), 

75 ) 

76 max_utilization = tables.TemplateColumn( 

77 verbose_name=_('Max Utilization'), 

78 template_code="{{ value }}%" 

79 ) 

80 available_power = tables.Column( 

81 verbose_name=_('Available Power (VA)') 

82 ) 

83 tenant = tables.Column( 

84 linkify=True, 

85 verbose_name=_('Tenant') 

86 ) 

87 site = tables.Column( 

88 accessor='rack__site', 

89 linkify=True, 

90 verbose_name=_('Site'), 

91 ) 

92 tags = columns.TagColumn( 

93 url_name='dcim:powerfeed_list' 

94 ) 

95 

96 class Meta(CableTerminationTable.Meta, PrimaryModelTable.Meta): 

97 model = PowerFeed 

98 fields = ( 

99 'pk', 'id', 'name', 'power_panel', 'site', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 

100 'phase', 'max_utilization', 'mark_connected', 'cable', 'cable_color', 'link_peer', 'available_power', 

101 'tenant', 'tenant_group', 'description', 'comments', 'tags', 'created', 'last_updated', 

102 ) 

103 default_columns = ( 

104 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable', 

105 'link_peer', 

106 )