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

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

3from django_tables2.utils import Accessor 

4 

5from dcim.models import Rack, RackGroup, RackReservation, RackRole, RackType 

6from netbox.tables import OrganizationalModelTable, PrimaryModelTable, columns 

7from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin 

8 

9from .template_code import OUTER_UNIT, WEIGHT 

10 

11__all__ = ( 

12 'RackGroupTable', 

13 'RackReservationTable', 

14 'RackRoleTable', 

15 'RackTable', 

16 'RackTypeTable', 

17) 

18 

19 

20class RackGroupTable(OrganizationalModelTable): 

21 name = tables.Column( 

22 verbose_name=_('Name'), 

23 linkify=True, 

24 ) 

25 rack_count = columns.LinkedCountColumn( 

26 viewname='dcim:rack_list', 

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

28 verbose_name=_('Racks'), 

29 ) 

30 tags = columns.TagColumn( 

31 url_name='dcim:rackgroup_list', 

32 ) 

33 

34 class Meta(OrganizationalModelTable.Meta): 

35 model = RackGroup 

36 fields = ( 

37 'pk', 'id', 'name', 'rack_count', 'description', 'slug', 'comments', 'tags', 'actions', 'created', 

38 'last_updated', 

39 ) 

40 default_columns = ('pk', 'name', 'rack_count', 'description') 

41 

42 

43class RackRoleTable(OrganizationalModelTable): 

44 name = tables.Column( 

45 verbose_name=_('Name'), 

46 linkify=True 

47 ) 

48 rack_count = columns.LinkedCountColumn( 

49 viewname='dcim:rack_list', 

50 url_params={'role_id': 'pk'}, 

51 verbose_name=_('Racks') 

52 ) 

53 color = columns.ColorColumn( 

54 verbose_name=_('Color'), 

55 ) 

56 tags = columns.TagColumn( 

57 url_name='dcim:rackrole_list' 

58 ) 

59 

60 class Meta(OrganizationalModelTable.Meta): 

61 model = RackRole 

62 fields = ( 

63 'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'comments', 'tags', 'actions', 'created', 

64 'last_updated', 

65 ) 

66 default_columns = ('pk', 'name', 'rack_count', 'color', 'description') 

67 

68 

69class RackTypeTable(PrimaryModelTable): 

70 model = tables.Column( 

71 verbose_name=_('Model'), 

72 linkify=True 

73 ) 

74 manufacturer = tables.Column( 

75 verbose_name=_('Manufacturer'), 

76 linkify=True 

77 ) 

78 u_height = tables.TemplateColumn( 

79 template_code="{{ value }}U", 

80 verbose_name=_('Height') 

81 ) 

82 outer_width = columns.TemplateColumn( 

83 template_code=OUTER_UNIT, 

84 verbose_name=_('Outer Width') 

85 ) 

86 outer_height = columns.TemplateColumn( 

87 template_code=OUTER_UNIT, 

88 verbose_name=_('Outer Height') 

89 ) 

90 outer_depth = columns.TemplateColumn( 

91 template_code=OUTER_UNIT, 

92 verbose_name=_('Outer Depth') 

93 ) 

94 weight = columns.TemplateColumn( 

95 verbose_name=_('Weight'), 

96 template_code=WEIGHT, 

97 order_by=('_abs_weight', 'weight_unit') 

98 ) 

99 max_weight = columns.TemplateColumn( 

100 verbose_name=_('Max Weight'), 

101 template_code=WEIGHT, 

102 order_by=('_abs_max_weight', 'weight_unit') 

103 ) 

104 rack_count = columns.LinkedCountColumn( 

105 viewname='dcim:rack_list', 

106 url_params={'rack_type_id': 'pk'}, 

107 verbose_name=_('Rack Count'), 

108 ) 

109 cooling_capability = columns.ChoiceFieldColumn( 

110 verbose_name=_('Cooling Capability'), 

111 ) 

112 cooling_capacity = tables.Column( 

113 verbose_name=_('Cooling Capacity (kW)') 

114 ) 

115 tags = columns.TagColumn( 

116 url_name='dcim:rack_list' 

117 ) 

118 

119 class Meta(PrimaryModelTable.Meta): 

120 model = RackType 

121 fields = ( 

122 'pk', 'id', 'model', 'manufacturer', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width', 

123 'outer_height', 'outer_depth', 'mounting_depth', 'weight', 'max_weight', 'cooling_capability', 

124 'cooling_capacity', 'description', 'comments', 'rack_count', 'tags', 'created', 'last_updated', 

125 ) 

126 default_columns = ( 

127 'pk', 'model', 'manufacturer', 'type', 'u_height', 'description', 'rack_count', 

128 ) 

129 

130 

131class RackTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable): 

132 name = tables.Column( 

133 verbose_name=_('Name'), 

134 linkify=True 

135 ) 

136 location = tables.Column( 

137 verbose_name=_('Location'), 

138 linkify=True 

139 ) 

140 site = tables.Column( 

141 verbose_name=_('Site'), 

142 linkify=True 

143 ) 

144 group = tables.Column( 

145 verbose_name=_('Group'), 

146 linkify=True, 

147 ) 

148 status = columns.ChoiceFieldColumn( 

149 verbose_name=_('Status'), 

150 ) 

151 role = columns.ColoredLabelColumn( 

152 verbose_name=_('Role'), 

153 ) 

154 manufacturer = tables.Column( 

155 verbose_name=_('Manufacturer'), 

156 accessor=Accessor('rack_type__manufacturer'), 

157 linkify=True 

158 ) 

159 rack_type = tables.Column( 

160 linkify=True, 

161 verbose_name=_('Type') 

162 ) 

163 u_height = tables.TemplateColumn( 

164 template_code="{{ value }}U", 

165 verbose_name=_('Height') 

166 ) 

167 device_count = columns.LinkedCountColumn( 

168 viewname='dcim:device_list', 

169 url_params={'rack_id': 'pk'}, 

170 verbose_name=_('Devices') 

171 ) 

172 get_utilization = columns.UtilizationColumn( 

173 orderable=False, 

174 verbose_name=_('Space') 

175 ) 

176 get_power_utilization = columns.UtilizationColumn( 

177 orderable=False, 

178 verbose_name=_('Power') 

179 ) 

180 tags = columns.TagColumn( 

181 url_name='dcim:rack_list' 

182 ) 

183 outer_width = columns.TemplateColumn( 

184 template_code=OUTER_UNIT, 

185 verbose_name=_('Outer Width') 

186 ) 

187 outer_height = columns.TemplateColumn( 

188 template_code=OUTER_UNIT, 

189 verbose_name=_('Outer Height') 

190 ) 

191 outer_depth = columns.TemplateColumn( 

192 template_code=OUTER_UNIT, 

193 verbose_name=_('Outer Depth') 

194 ) 

195 weight = columns.TemplateColumn( 

196 verbose_name=_('Weight'), 

197 template_code=WEIGHT, 

198 order_by=('_abs_weight', 'weight_unit') 

199 ) 

200 max_weight = columns.TemplateColumn( 

201 verbose_name=_('Max Weight'), 

202 template_code=WEIGHT, 

203 order_by=('_abs_max_weight', 'weight_unit') 

204 ) 

205 cooling_capability = columns.ChoiceFieldColumn( 

206 verbose_name=_('Cooling Capability'), 

207 ) 

208 cooling_capacity = tables.Column( 

209 verbose_name=_('Cooling Capacity (kW)') 

210 ) 

211 

212 class Meta(PrimaryModelTable.Meta): 

213 model = Rack 

214 fields = ( 

215 'pk', 'id', 'name', 'site', 'location', 'group', 'status', 'facility_id', 'tenant', 'tenant_group', 'role', 

216 'rack_type', 'serial', 'asset_tag', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width', 

217 'outer_height', 'outer_depth', 'mounting_depth', 'airflow', 'cooling_capability', 

218 'cooling_capacity', 'weight', 'max_weight', 'comments', 

219 'device_count', 'get_utilization', 'get_power_utilization', 'description', 'contacts', 

220 'tags', 'created', 'last_updated', 

221 ) 

222 default_columns = ( 

223 'pk', 'name', 'site', 'location', 'group', 'status', 'facility_id', 'tenant', 'role', 'rack_type', 

224 'u_height', 'device_count', 'get_utilization', 

225 ) 

226 

227 

228class RackReservationTable(TenancyColumnsMixin, PrimaryModelTable): 

229 reservation = tables.Column( 

230 verbose_name=_('Reservation'), 

231 accessor='pk', 

232 linkify=True 

233 ) 

234 site = tables.Column( 

235 verbose_name=_('Site'), 

236 accessor=Accessor('rack__site'), 

237 linkify=True 

238 ) 

239 location = tables.Column( 

240 verbose_name=_('Location'), 

241 accessor=Accessor('rack__location'), 

242 linkify=True 

243 ) 

244 group = tables.Column( 

245 verbose_name=_('Group'), 

246 accessor=Accessor('rack__group'), 

247 linkify=True 

248 ) 

249 rack = tables.Column( 

250 verbose_name=_('Rack'), 

251 linkify=True 

252 ) 

253 unit_list = tables.Column( 

254 orderable=False, 

255 verbose_name=_('Units') 

256 ) 

257 unit_count = tables.Column( 

258 verbose_name=_("Total U's") 

259 ) 

260 status = columns.ChoiceFieldColumn( 

261 verbose_name=_('Status'), 

262 ) 

263 tags = columns.TagColumn( 

264 url_name='dcim:rackreservation_list' 

265 ) 

266 

267 class Meta(PrimaryModelTable.Meta): 

268 model = RackReservation 

269 fields = ( 

270 'pk', 'id', 'reservation', 'site', 'location', 'group', 'rack', 'unit_list', 'unit_count', 'status', 

271 'user', 'tenant', 'tenant_group', 'description', 'comments', 'tags', 'actions', 'created', 'last_updated', 

272 ) 

273 default_columns = ( 

274 'pk', 'reservation', 'site', 'rack', 'unit_list', 'unit_count', 'status', 'user', 'description', 

275 )