devicetypes.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. import django_tables2 as tables
  2. from django.utils.translation import gettext_lazy as _
  3. from dcim import models
  4. from netbox.tables import NetBoxTable, columns
  5. from tenancy.tables import ContactsColumnMixin
  6. from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS, WEIGHT
  7. __all__ = (
  8. 'ConsolePortTemplateTable',
  9. 'ConsoleServerPortTemplateTable',
  10. 'DeviceBayTemplateTable',
  11. 'DeviceTypeTable',
  12. 'FrontPortTemplateTable',
  13. 'InterfaceTemplateTable',
  14. 'InventoryItemTemplateTable',
  15. 'ManufacturerTable',
  16. 'ModuleBayTemplateTable',
  17. 'PowerOutletTemplateTable',
  18. 'PowerPortTemplateTable',
  19. 'RearPortTemplateTable',
  20. )
  21. #
  22. # Manufacturers
  23. #
  24. class ManufacturerTable(ContactsColumnMixin, NetBoxTable):
  25. name = tables.Column(
  26. verbose_name=_('Name'),
  27. linkify=True
  28. )
  29. devicetype_count = columns.LinkedCountColumn(
  30. viewname='dcim:devicetype_list',
  31. url_params={'manufacturer_id': 'pk'},
  32. verbose_name=_('Device Types')
  33. )
  34. moduletype_count = columns.LinkedCountColumn(
  35. viewname='dcim:moduletype_list',
  36. url_params={'manufacturer_id': 'pk'},
  37. verbose_name=_('Module Types')
  38. )
  39. inventoryitem_count = columns.LinkedCountColumn(
  40. viewname='dcim:inventoryitem_list',
  41. url_params={'manufacturer_id': 'pk'},
  42. verbose_name=_('Inventory Items')
  43. )
  44. platform_count = columns.LinkedCountColumn(
  45. viewname='dcim:platform_list',
  46. url_params={'manufacturer_id': 'pk'},
  47. verbose_name=_('Platforms')
  48. )
  49. tags = columns.TagColumn(
  50. url_name='dcim:manufacturer_list'
  51. )
  52. class Meta(NetBoxTable.Meta):
  53. model = models.Manufacturer
  54. fields = (
  55. 'pk', 'id', 'name', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', 'platform_count',
  56. 'description', 'slug', 'tags', 'contacts', 'actions', 'created', 'last_updated',
  57. )
  58. default_columns = (
  59. 'pk', 'name', 'devicetype_count', 'moduletype_count', 'inventoryitem_count', 'platform_count',
  60. 'description', 'slug',
  61. )
  62. #
  63. # Device types
  64. #
  65. class DeviceTypeTable(NetBoxTable):
  66. model = tables.Column(
  67. linkify=True,
  68. verbose_name=_('Device Type')
  69. )
  70. manufacturer = tables.Column(
  71. verbose_name=_('Manufacturer'),
  72. linkify=True
  73. )
  74. default_platform = tables.Column(
  75. verbose_name=_('Default Platform'),
  76. linkify=True
  77. )
  78. is_full_depth = columns.BooleanColumn(
  79. verbose_name=_('Full Depth'),
  80. false_mark=None
  81. )
  82. comments = columns.MarkdownColumn(
  83. verbose_name=_('Comments'),
  84. )
  85. tags = columns.TagColumn(
  86. url_name='dcim:devicetype_list'
  87. )
  88. u_height = columns.TemplateColumn(
  89. verbose_name=_('U Height'),
  90. template_code='{{ value|floatformat }}'
  91. )
  92. exclude_from_utilization = columns.BooleanColumn(
  93. verbose_name=_('Exclude from utilization'),
  94. false_mark=None
  95. )
  96. weight = columns.TemplateColumn(
  97. verbose_name=_('Weight'),
  98. template_code=WEIGHT,
  99. order_by=('_abs_weight', 'weight_unit')
  100. )
  101. instance_count = columns.LinkedCountColumn(
  102. viewname='dcim:device_list',
  103. url_params={'device_type_id': 'pk'},
  104. verbose_name=_('Instances')
  105. )
  106. console_port_template_count = tables.Column(
  107. verbose_name=_('Console Ports')
  108. )
  109. console_server_port_template_count = tables.Column(
  110. verbose_name=_('Console Server Ports')
  111. )
  112. power_port_template_count = tables.Column(
  113. verbose_name=_('Power Ports')
  114. )
  115. power_outlet_template_count = tables.Column(
  116. verbose_name=_('Power Outlets')
  117. )
  118. interface_template_count = tables.Column(
  119. verbose_name=_('Interfaces')
  120. )
  121. front_port_template_count = tables.Column(
  122. verbose_name=_('Front Ports')
  123. )
  124. rear_port_template_count = tables.Column(
  125. verbose_name=_('Rear Ports')
  126. )
  127. device_bay_template_count = tables.Column(
  128. verbose_name=_('Device Bays')
  129. )
  130. module_bay_template_count = tables.Column(
  131. verbose_name=_('Module Bays')
  132. )
  133. inventory_item_template_count = tables.Column(
  134. verbose_name=_('Inventory Items')
  135. )
  136. class Meta(NetBoxTable.Meta):
  137. model = models.DeviceType
  138. fields = (
  139. 'pk', 'id', 'model', 'manufacturer', 'default_platform', 'slug', 'part_number', 'u_height',
  140. 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight',
  141. 'description', 'comments', 'instance_count', 'tags', 'created', 'last_updated',
  142. )
  143. default_columns = (
  144. 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count',
  145. )
  146. #
  147. # Device type components
  148. #
  149. class ComponentTemplateTable(NetBoxTable):
  150. id = tables.Column(
  151. verbose_name=_('ID')
  152. )
  153. name = tables.Column(
  154. order_by=('_name',)
  155. )
  156. class Meta(NetBoxTable.Meta):
  157. exclude = ('id', )
  158. class ConsolePortTemplateTable(ComponentTemplateTable):
  159. actions = columns.ActionsColumn(
  160. actions=('edit', 'delete'),
  161. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  162. )
  163. class Meta(ComponentTemplateTable.Meta):
  164. model = models.ConsolePortTemplate
  165. fields = ('pk', 'name', 'label', 'type', 'description', 'actions')
  166. empty_text = "None"
  167. class ConsoleServerPortTemplateTable(ComponentTemplateTable):
  168. actions = columns.ActionsColumn(
  169. actions=('edit', 'delete'),
  170. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  171. )
  172. class Meta(ComponentTemplateTable.Meta):
  173. model = models.ConsoleServerPortTemplate
  174. fields = ('pk', 'name', 'label', 'type', 'description', 'actions')
  175. empty_text = "None"
  176. class PowerPortTemplateTable(ComponentTemplateTable):
  177. actions = columns.ActionsColumn(
  178. actions=('edit', 'delete'),
  179. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  180. )
  181. class Meta(ComponentTemplateTable.Meta):
  182. model = models.PowerPortTemplate
  183. fields = ('pk', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'actions')
  184. empty_text = "None"
  185. class PowerOutletTemplateTable(ComponentTemplateTable):
  186. actions = columns.ActionsColumn(
  187. actions=('edit', 'delete'),
  188. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  189. )
  190. class Meta(ComponentTemplateTable.Meta):
  191. model = models.PowerOutletTemplate
  192. fields = ('pk', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', 'actions')
  193. empty_text = "None"
  194. class InterfaceTemplateTable(ComponentTemplateTable):
  195. enabled = columns.BooleanColumn(
  196. verbose_name=_('Enabled'),
  197. )
  198. mgmt_only = columns.BooleanColumn(
  199. verbose_name=_('Management Only'),
  200. false_mark=None
  201. )
  202. actions = columns.ActionsColumn(
  203. actions=('edit', 'delete'),
  204. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  205. )
  206. class Meta(ComponentTemplateTable.Meta):
  207. model = models.InterfaceTemplate
  208. fields = (
  209. 'pk', 'name', 'label', 'enabled', 'mgmt_only', 'type', 'description', 'bridge', 'poe_mode', 'poe_type',
  210. 'rf_role', 'actions',
  211. )
  212. empty_text = "None"
  213. class FrontPortTemplateTable(ComponentTemplateTable):
  214. rear_port_position = tables.Column(
  215. verbose_name=_('Position')
  216. )
  217. color = columns.ColorColumn(
  218. verbose_name=_('Color'),
  219. )
  220. actions = columns.ActionsColumn(
  221. actions=('edit', 'delete'),
  222. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  223. )
  224. class Meta(ComponentTemplateTable.Meta):
  225. model = models.FrontPortTemplate
  226. fields = ('pk', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', 'actions')
  227. empty_text = "None"
  228. class RearPortTemplateTable(ComponentTemplateTable):
  229. color = columns.ColorColumn(
  230. verbose_name=_('Color'),
  231. )
  232. actions = columns.ActionsColumn(
  233. actions=('edit', 'delete'),
  234. extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
  235. )
  236. class Meta(ComponentTemplateTable.Meta):
  237. model = models.RearPortTemplate
  238. fields = ('pk', 'name', 'label', 'type', 'color', 'positions', 'description', 'actions')
  239. empty_text = "None"
  240. class ModuleBayTemplateTable(ComponentTemplateTable):
  241. actions = columns.ActionsColumn(
  242. actions=('edit', 'delete')
  243. )
  244. class Meta(ComponentTemplateTable.Meta):
  245. model = models.ModuleBayTemplate
  246. fields = ('pk', 'name', 'label', 'position', 'description', 'actions')
  247. empty_text = "None"
  248. class DeviceBayTemplateTable(ComponentTemplateTable):
  249. actions = columns.ActionsColumn(
  250. actions=('edit', 'delete')
  251. )
  252. class Meta(ComponentTemplateTable.Meta):
  253. model = models.DeviceBayTemplate
  254. fields = ('pk', 'name', 'label', 'description', 'actions')
  255. empty_text = "None"
  256. class InventoryItemTemplateTable(ComponentTemplateTable):
  257. actions = columns.ActionsColumn(
  258. actions=('edit', 'delete')
  259. )
  260. role = tables.Column(
  261. verbose_name=_('Role'),
  262. linkify=True
  263. )
  264. manufacturer = tables.Column(
  265. verbose_name=_('Manufacturer'),
  266. linkify=True
  267. )
  268. component = tables.Column(
  269. verbose_name=_('Component'),
  270. orderable=False
  271. )
  272. class Meta(ComponentTemplateTable.Meta):
  273. model = models.InventoryItemTemplate
  274. fields = (
  275. 'pk', 'name', 'label', 'parent', 'role', 'manufacturer', 'part_id', 'component', 'description', 'actions',
  276. )
  277. empty_text = "None"