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
« 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
5from dcim.models import Rack, RackGroup, RackReservation, RackRole, RackType
6from netbox.tables import OrganizationalModelTable, PrimaryModelTable, columns
7from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
9from .template_code import OUTER_UNIT, WEIGHT
11__all__ = (
12 'RackGroupTable',
13 'RackReservationTable',
14 'RackRoleTable',
15 'RackTable',
16 'RackTypeTable',
17)
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 )
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')
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 )
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')
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 )
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 )
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 )
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 )
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 )
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 )