racks.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import django_tables2 as tables
  2. from django.utils.translation import gettext_lazy as _
  3. from django_tables2.utils import Accessor
  4. from dcim.models import Rack, RackReservation, RackRole, RackType
  5. from netbox.tables import OrganizationalModelTable, PrimaryModelTable, columns
  6. from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
  7. from .template_code import OUTER_UNIT, WEIGHT
  8. __all__ = (
  9. 'RackTable',
  10. 'RackReservationTable',
  11. 'RackRoleTable',
  12. 'RackTypeTable',
  13. )
  14. class RackRoleTable(OrganizationalModelTable):
  15. name = tables.Column(
  16. verbose_name=_('Name'),
  17. linkify=True
  18. )
  19. rack_count = columns.LinkedCountColumn(
  20. viewname='dcim:rack_list',
  21. url_params={'role_id': 'pk'},
  22. verbose_name=_('Racks')
  23. )
  24. color = columns.ColorColumn(
  25. verbose_name=_('Color'),
  26. )
  27. tags = columns.TagColumn(
  28. url_name='dcim:rackrole_list'
  29. )
  30. class Meta(OrganizationalModelTable.Meta):
  31. model = RackRole
  32. fields = (
  33. 'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'comments', 'tags', 'actions', 'created',
  34. 'last_updated',
  35. )
  36. default_columns = ('pk', 'name', 'rack_count', 'color', 'description')
  37. class RackTypeTable(PrimaryModelTable):
  38. model = tables.Column(
  39. verbose_name=_('Model'),
  40. linkify=True
  41. )
  42. manufacturer = tables.Column(
  43. verbose_name=_('Manufacturer'),
  44. linkify=True
  45. )
  46. u_height = tables.TemplateColumn(
  47. template_code="{{ value }}U",
  48. verbose_name=_('Height')
  49. )
  50. outer_width = columns.TemplateColumn(
  51. template_code=OUTER_UNIT,
  52. verbose_name=_('Outer Width')
  53. )
  54. outer_height = columns.TemplateColumn(
  55. template_code=OUTER_UNIT,
  56. verbose_name=_('Outer Height')
  57. )
  58. outer_depth = columns.TemplateColumn(
  59. template_code=OUTER_UNIT,
  60. verbose_name=_('Outer Depth')
  61. )
  62. weight = columns.TemplateColumn(
  63. verbose_name=_('Weight'),
  64. template_code=WEIGHT,
  65. order_by=('_abs_weight', 'weight_unit')
  66. )
  67. max_weight = columns.TemplateColumn(
  68. verbose_name=_('Max Weight'),
  69. template_code=WEIGHT,
  70. order_by=('_abs_max_weight', 'weight_unit')
  71. )
  72. rack_count = columns.LinkedCountColumn(
  73. viewname='dcim:rack_list',
  74. url_params={'rack_type_id': 'pk'},
  75. verbose_name=_('Rack Count'),
  76. )
  77. tags = columns.TagColumn(
  78. url_name='dcim:rack_list'
  79. )
  80. class Meta(PrimaryModelTable.Meta):
  81. model = RackType
  82. fields = (
  83. 'pk', 'id', 'model', 'manufacturer', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width',
  84. 'outer_height', 'outer_depth', 'mounting_depth', 'weight', 'max_weight', 'description', 'comments',
  85. 'rack_count', 'tags', 'created', 'last_updated',
  86. )
  87. default_columns = (
  88. 'pk', 'model', 'manufacturer', 'type', 'u_height', 'description', 'rack_count',
  89. )
  90. class RackTable(TenancyColumnsMixin, ContactsColumnMixin, PrimaryModelTable):
  91. name = tables.Column(
  92. verbose_name=_('Name'),
  93. linkify=True
  94. )
  95. location = tables.Column(
  96. verbose_name=_('Location'),
  97. linkify=True
  98. )
  99. site = tables.Column(
  100. verbose_name=_('Site'),
  101. linkify=True
  102. )
  103. status = columns.ChoiceFieldColumn(
  104. verbose_name=_('Status'),
  105. )
  106. role = columns.ColoredLabelColumn(
  107. verbose_name=_('Role'),
  108. )
  109. manufacturer = tables.Column(
  110. verbose_name=_('Manufacturer'),
  111. accessor=Accessor('rack_type__manufacturer'),
  112. linkify=True
  113. )
  114. rack_type = tables.Column(
  115. linkify=True,
  116. verbose_name=_('Type')
  117. )
  118. u_height = tables.TemplateColumn(
  119. template_code="{{ value }}U",
  120. verbose_name=_('Height')
  121. )
  122. device_count = columns.LinkedCountColumn(
  123. viewname='dcim:device_list',
  124. url_params={'rack_id': 'pk'},
  125. verbose_name=_('Devices')
  126. )
  127. get_utilization = columns.UtilizationColumn(
  128. orderable=False,
  129. verbose_name=_('Space')
  130. )
  131. get_power_utilization = columns.UtilizationColumn(
  132. orderable=False,
  133. verbose_name=_('Power')
  134. )
  135. tags = columns.TagColumn(
  136. url_name='dcim:rack_list'
  137. )
  138. outer_width = columns.TemplateColumn(
  139. template_code=OUTER_UNIT,
  140. verbose_name=_('Outer Width')
  141. )
  142. outer_height = columns.TemplateColumn(
  143. template_code=OUTER_UNIT,
  144. verbose_name=_('Outer Height')
  145. )
  146. outer_depth = columns.TemplateColumn(
  147. template_code=OUTER_UNIT,
  148. verbose_name=_('Outer Depth')
  149. )
  150. weight = columns.TemplateColumn(
  151. verbose_name=_('Weight'),
  152. template_code=WEIGHT,
  153. order_by=('_abs_weight', 'weight_unit')
  154. )
  155. max_weight = columns.TemplateColumn(
  156. verbose_name=_('Max Weight'),
  157. template_code=WEIGHT,
  158. order_by=('_abs_max_weight', 'weight_unit')
  159. )
  160. class Meta(PrimaryModelTable.Meta):
  161. model = Rack
  162. fields = (
  163. 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'tenant_group', 'role',
  164. 'rack_type', 'serial', 'asset_tag', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width',
  165. 'outer_height', 'outer_depth', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'comments',
  166. 'device_count', 'get_utilization', 'get_power_utilization', 'description', 'contacts',
  167. 'tags', 'created', 'last_updated',
  168. )
  169. default_columns = (
  170. 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'rack_type', 'u_height',
  171. 'device_count', 'get_utilization',
  172. )
  173. class RackReservationTable(TenancyColumnsMixin, PrimaryModelTable):
  174. reservation = tables.Column(
  175. verbose_name=_('Reservation'),
  176. accessor='pk',
  177. linkify=True
  178. )
  179. site = tables.Column(
  180. verbose_name=_('Site'),
  181. accessor=Accessor('rack__site'),
  182. linkify=True
  183. )
  184. location = tables.Column(
  185. verbose_name=_('Location'),
  186. accessor=Accessor('rack__location'),
  187. linkify=True
  188. )
  189. rack = tables.Column(
  190. verbose_name=_('Rack'),
  191. linkify=True
  192. )
  193. unit_list = tables.Column(
  194. orderable=False,
  195. verbose_name=_('Units')
  196. )
  197. status = columns.ChoiceFieldColumn(
  198. verbose_name=_('Status'),
  199. )
  200. tags = columns.TagColumn(
  201. url_name='dcim:rackreservation_list'
  202. )
  203. class Meta(PrimaryModelTable.Meta):
  204. model = RackReservation
  205. fields = (
  206. 'pk', 'id', 'reservation', 'site', 'location', 'rack', 'unit_list', 'status', 'user', 'created', 'tenant',
  207. 'tenant_group', 'description', 'comments', 'tags', 'actions', 'created', 'last_updated',
  208. )
  209. default_columns = ('pk', 'reservation', 'site', 'rack', 'unit_list', 'status', 'user', 'description')