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

46 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 Location, Region, Site, SiteGroup 

5from netbox.tables import NestedGroupModelTable, PrimaryModelTable, columns 

6from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin 

7 

8from .template_code import LOCATION_BUTTONS 

9 

10__all__ = ( 

11 'LocationTable', 

12 'RegionTable', 

13 'SiteGroupTable', 

14 'SiteTable', 

15) 

16 

17 

18class RegionTable(ContactsColumnMixin, NestedGroupModelTable): 

19 site_count = columns.LinkedCountColumn( 

20 viewname='dcim:site_list', 

21 url_params={'region_id': 'pk'}, 

22 verbose_name=_('Sites') 

23 ) 

24 tags = columns.TagColumn( 

25 url_name='dcim:region_list' 

26 ) 

27 

28 class Meta(NestedGroupModelTable.Meta): 

29 model = Region 

30 fields = ( 

31 'pk', 'id', 'name', 'parent', 'slug', 'site_count', 'description', 'comments', 'contacts', 'tags', 

32 'created', 'last_updated', 'actions', 

33 ) 

34 default_columns = ('pk', 'name', 'site_count', 'description') 

35 

36 

37class SiteGroupTable(ContactsColumnMixin, NestedGroupModelTable): 

38 site_count = columns.LinkedCountColumn( 

39 viewname='dcim:site_list', 

40 url_params={'group_id': 'pk'}, 

41 verbose_name=_('Sites') 

42 ) 

43 tags = columns.TagColumn( 

44 url_name='dcim:sitegroup_list' 

45 ) 

46 

47 class Meta(NestedGroupModelTable.Meta): 

48 model = SiteGroup 

49 fields = ( 

50 'pk', 'id', 'name', 'parent', 'slug', 'site_count', 'description', 'comments', 'contacts', 'tags', 

51 'created', 'last_updated', 'actions', 

52 ) 

53 default_columns = ('pk', 'name', 'site_count', 'description') 

54 

55 

56class SiteTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): 

57 name = tables.Column( 

58 verbose_name=_('Name'), 

59 linkify=True 

60 ) 

61 status = columns.ChoiceFieldColumn( 

62 verbose_name=_('Status'), 

63 ) 

64 region = tables.Column( 

65 verbose_name=_('Region'), 

66 linkify=True 

67 ) 

68 group = tables.Column( 

69 verbose_name=_('Group'), 

70 linkify=True 

71 ) 

72 asns = columns.ManyToManyColumn( 

73 linkify_item=True, 

74 verbose_name=_('ASNs') 

75 ) 

76 asn_count = columns.LinkedCountColumn( 

77 viewname='ipam:asn_list', 

78 url_params={'site_id': 'pk'}, 

79 verbose_name=_('ASN Count') 

80 ) 

81 device_count = columns.LinkedCountColumn( 

82 viewname='dcim:device_list', 

83 url_params={'site_id': 'pk'}, 

84 verbose_name=_('Devices') 

85 ) 

86 tags = columns.TagColumn( 

87 url_name='dcim:site_list' 

88 ) 

89 

90 class Meta(PrimaryModelTable.Meta): 

91 model = Site 

92 fields = ( 

93 'pk', 'id', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'tenant_group', 'asns', 

94 'asn_count', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 

95 'comments', 'contacts', 'tags', 'created', 'last_updated', 'actions', 

96 ) 

97 default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'description') 

98 

99 

100class LocationTable(TenancyColumnsMixin, ContactsColumnMixin, NestedGroupModelTable): 

101 site = tables.Column( 

102 verbose_name=_('Site'), 

103 linkify=True 

104 ) 

105 status = columns.ChoiceFieldColumn( 

106 verbose_name=_('Status'), 

107 ) 

108 rack_count = columns.LinkedCountColumn( 

109 viewname='dcim:rack_list', 

110 url_params={'location_id': 'pk'}, 

111 verbose_name=_('Racks') 

112 ) 

113 device_count = columns.LinkedCountColumn( 

114 viewname='dcim:device_list', 

115 url_params={'location_id': 'pk'}, 

116 verbose_name=_('Devices') 

117 ) 

118 vlangroup_count = columns.LinkedCountColumn( 

119 viewname='ipam:vlangroup_list', 

120 url_params={'location': 'pk'}, 

121 verbose_name=_('VLAN Groups') 

122 ) 

123 tags = columns.TagColumn( 

124 url_name='dcim:location_list' 

125 ) 

126 actions = columns.ActionsColumn( 

127 extra_buttons=LOCATION_BUTTONS 

128 ) 

129 

130 class Meta(NestedGroupModelTable.Meta): 

131 model = Location 

132 fields = ( 

133 'pk', 'id', 'name', 'parent', 'site', 'status', 'facility', 'tenant', 'tenant_group', 'rack_count', 

134 'device_count', 'description', 'slug', 'comments', 'contacts', 'tags', 'actions', 'created', 'last_updated', 

135 'vlangroup_count', 

136 ) 

137 default_columns = ( 

138 'pk', 'name', 'site', 'status', 'facility', 'tenant', 'rack_count', 'device_count', 'vlangroup_count', 

139 'description' 

140 )