tables.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. import django_tables2 as tables
  2. from django_tables2.utils import Accessor
  3. from tenancy.tables import COL_TENANT
  4. from utilities.tables import BaseTable, BooleanColumn, ColorColumn, ToggleColumn
  5. from .models import (
  6. Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
  7. DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
  8. InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
  9. RackGroup, RackReservation, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
  10. )
  11. REGION_LINK = """
  12. {% if record.get_children %}
  13. <span style="padding-left: {{ record.get_ancestors|length }}0px "><i class="fa fa-caret-right"></i>
  14. {% else %}
  15. <span style="padding-left: {{ record.get_ancestors|length }}9px">
  16. {% endif %}
  17. <a href="{% url 'dcim:site_list' %}?region={{ record.slug }}">{{ record.name }}</a>
  18. </span>
  19. """
  20. SITE_REGION_LINK = """
  21. {% if record.region %}
  22. <a href="{% url 'dcim:site_list' %}?region={{ record.region.slug }}">{{ record.region }}</a>
  23. {% else %}
  24. &mdash;
  25. {% endif %}
  26. """
  27. COLOR_LABEL = """
  28. <label class="label" style="background-color: #{{ record.color }}">{{ record }}</label>
  29. """
  30. DEVICE_LINK = """
  31. <a href="{% url 'dcim:device' pk=record.pk %}">
  32. {{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}
  33. </a>
  34. """
  35. REGION_ACTIONS = """
  36. <a href="{% url 'dcim:region_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Changelog">
  37. <i class="fa fa-history"></i>
  38. </a>
  39. {% if perms.dcim.change_region %}
  40. <a href="{% url 'dcim:region_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  41. {% endif %}
  42. """
  43. RACKGROUP_ACTIONS = """
  44. <a href="{% url 'dcim:rackgroup_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Changelog">
  45. <i class="fa fa-history"></i>
  46. </a>
  47. <a href="{% url 'dcim:rack_elevation_list' %}?site={{ record.site.slug }}&group_id={{ record.pk }}" class="btn btn-xs btn-primary" title="View elevations">
  48. <i class="fa fa-eye"></i>
  49. </a>
  50. {% if perms.dcim.change_rackgroup %}
  51. <a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}" class="btn btn-xs btn-warning" title="Edit">
  52. <i class="glyphicon glyphicon-pencil"></i>
  53. </a>
  54. {% endif %}
  55. """
  56. RACKROLE_ACTIONS = """
  57. <a href="{% url 'dcim:rackrole_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Changelog">
  58. <i class="fa fa-history"></i>
  59. </a>
  60. {% if perms.dcim.change_rackrole %}
  61. <a href="{% url 'dcim:rackrole_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  62. {% endif %}
  63. """
  64. RACK_ROLE = """
  65. {% if record.role %}
  66. <label class="label" style="background-color: #{{ record.role.color }}">{{ value }}</label>
  67. {% else %}
  68. &mdash;
  69. {% endif %}
  70. """
  71. RACK_DEVICE_COUNT = """
  72. <a href="{% url 'dcim:device_list' %}?rack_id={{ record.pk }}">{{ value }}</a>
  73. """
  74. RACKRESERVATION_ACTIONS = """
  75. <a href="{% url 'dcim:rackreservation_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Changelog">
  76. <i class="fa fa-history"></i>
  77. </a>
  78. {% if perms.dcim.change_rackreservation %}
  79. <a href="{% url 'dcim:rackreservation_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  80. {% endif %}
  81. """
  82. MANUFACTURER_ACTIONS = """
  83. <a href="{% url 'dcim:manufacturer_changelog' slug=record.slug %}" class="btn btn-default btn-xs" title="Changelog">
  84. <i class="fa fa-history"></i>
  85. </a>
  86. {% if perms.dcim.change_manufacturer %}
  87. <a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  88. {% endif %}
  89. """
  90. DEVICEROLE_ACTIONS = """
  91. <a href="{% url 'dcim:devicerole_changelog' slug=record.slug %}" class="btn btn-default btn-xs" title="Changelog">
  92. <i class="fa fa-history"></i>
  93. </a>
  94. {% if perms.dcim.change_devicerole %}
  95. <a href="{% url 'dcim:devicerole_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  96. {% endif %}
  97. """
  98. DEVICEROLE_DEVICE_COUNT = """
  99. <a href="{% url 'dcim:device_list' %}?role={{ record.slug }}">{{ value }}</a>
  100. """
  101. DEVICEROLE_VM_COUNT = """
  102. <a href="{% url 'virtualization:virtualmachine_list' %}?role={{ record.slug }}">{{ value }}</a>
  103. """
  104. PLATFORM_DEVICE_COUNT = """
  105. <a href="{% url 'dcim:device_list' %}?platform={{ record.slug }}">{{ value }}</a>
  106. """
  107. PLATFORM_VM_COUNT = """
  108. <a href="{% url 'virtualization:virtualmachine_list' %}?platform={{ record.slug }}">{{ value }}</a>
  109. """
  110. PLATFORM_ACTIONS = """
  111. <a href="{% url 'dcim:platform_changelog' slug=record.slug %}" class="btn btn-default btn-xs" title="Changelog">
  112. <i class="fa fa-history"></i>
  113. </a>
  114. {% if perms.dcim.change_platform %}
  115. <a href="{% url 'dcim:platform_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  116. {% endif %}
  117. """
  118. DEVICE_ROLE = """
  119. <label class="label" style="background-color: #{{ record.device_role.color }}">{{ value }}</label>
  120. """
  121. STATUS_LABEL = """
  122. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  123. """
  124. DEVICE_PRIMARY_IP = """
  125. {{ record.primary_ip6.address.ip|default:"" }}
  126. {% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %}
  127. {{ record.primary_ip4.address.ip|default:"" }}
  128. """
  129. SUBDEVICE_ROLE_TEMPLATE = """
  130. {% if record.subdevice_role == True %}Parent{% elif record.subdevice_role == False %}Child{% else %}&mdash;{% endif %}
  131. """
  132. DEVICETYPE_INSTANCES_TEMPLATE = """
  133. <a href="{% url 'dcim:device_list' %}?manufacturer_id={{ record.manufacturer_id }}&device_type_id={{ record.pk }}">{{ record.instance_count }}</a>
  134. """
  135. UTILIZATION_GRAPH = """
  136. {% load helpers %}
  137. {% utilization_graph value %}
  138. """
  139. VIRTUALCHASSIS_ACTIONS = """
  140. <a href="{% url 'dcim:virtualchassis_changelog' pk=record.pk %}" class="btn btn-default btn-xs" title="Changelog">
  141. <i class="fa fa-history"></i>
  142. </a>
  143. {% if perms.dcim.change_virtualchassis %}
  144. <a href="{% url 'dcim:virtualchassis_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  145. {% endif %}
  146. """
  147. CABLE_TERMINATION_PARENT = """
  148. {% if value.device %}
  149. <a href="{{ value.device.get_absolute_url }}">{{ value.device }}</a>
  150. {% else %}
  151. <a href="{{ value.circuit.get_absolute_url }}">{{ value.circuit }}</a>
  152. {% endif %}
  153. """
  154. CABLE_LENGTH = """
  155. {% if record.length %}{{ record.length }}{{ record.length_unit }}{% else %}&mdash;{% endif %}
  156. """
  157. #
  158. # Regions
  159. #
  160. class RegionTable(BaseTable):
  161. pk = ToggleColumn()
  162. name = tables.TemplateColumn(template_code=REGION_LINK, orderable=False)
  163. site_count = tables.Column(verbose_name='Sites')
  164. slug = tables.Column(verbose_name='Slug')
  165. actions = tables.TemplateColumn(
  166. template_code=REGION_ACTIONS,
  167. attrs={'td': {'class': 'text-right'}},
  168. verbose_name=''
  169. )
  170. class Meta(BaseTable.Meta):
  171. model = Region
  172. fields = ('pk', 'name', 'site_count', 'slug', 'actions')
  173. #
  174. # Sites
  175. #
  176. class SiteTable(BaseTable):
  177. pk = ToggleColumn()
  178. name = tables.LinkColumn(order_by=('_nat1', '_nat2', '_nat3'))
  179. status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status')
  180. region = tables.TemplateColumn(template_code=SITE_REGION_LINK)
  181. tenant = tables.TemplateColumn(template_code=COL_TENANT)
  182. class Meta(BaseTable.Meta):
  183. model = Site
  184. fields = ('pk', 'name', 'status', 'facility', 'region', 'tenant', 'asn', 'description')
  185. #
  186. # Rack groups
  187. #
  188. class RackGroupTable(BaseTable):
  189. pk = ToggleColumn()
  190. name = tables.LinkColumn()
  191. site = tables.LinkColumn(
  192. viewname='dcim:site',
  193. args=[Accessor('site.slug')],
  194. verbose_name='Site'
  195. )
  196. rack_count = tables.Column(
  197. verbose_name='Racks'
  198. )
  199. slug = tables.Column()
  200. actions = tables.TemplateColumn(
  201. template_code=RACKGROUP_ACTIONS,
  202. attrs={'td': {'class': 'text-right'}},
  203. verbose_name=''
  204. )
  205. class Meta(BaseTable.Meta):
  206. model = RackGroup
  207. fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'actions')
  208. #
  209. # Rack roles
  210. #
  211. class RackRoleTable(BaseTable):
  212. pk = ToggleColumn()
  213. name = tables.LinkColumn(verbose_name='Name')
  214. rack_count = tables.Column(verbose_name='Racks')
  215. color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Color')
  216. slug = tables.Column(verbose_name='Slug')
  217. actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right'}},
  218. verbose_name='')
  219. class Meta(BaseTable.Meta):
  220. model = RackGroup
  221. fields = ('pk', 'name', 'rack_count', 'color', 'slug', 'actions')
  222. #
  223. # Racks
  224. #
  225. class RackTable(BaseTable):
  226. pk = ToggleColumn()
  227. name = tables.LinkColumn(order_by=('_nat1', '_nat2', '_nat3'))
  228. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
  229. group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
  230. tenant = tables.TemplateColumn(template_code=COL_TENANT)
  231. status = tables.TemplateColumn(STATUS_LABEL)
  232. role = tables.TemplateColumn(RACK_ROLE)
  233. u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height')
  234. class Meta(BaseTable.Meta):
  235. model = Rack
  236. fields = ('pk', 'name', 'site', 'group', 'status', 'facility_id', 'tenant', 'role', 'u_height')
  237. class RackDetailTable(RackTable):
  238. device_count = tables.TemplateColumn(
  239. template_code=RACK_DEVICE_COUNT,
  240. verbose_name='Devices'
  241. )
  242. get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
  243. class Meta(RackTable.Meta):
  244. fields = (
  245. 'pk', 'name', 'site', 'group', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count',
  246. 'get_utilization',
  247. )
  248. #
  249. # Rack reservations
  250. #
  251. class RackReservationTable(BaseTable):
  252. pk = ToggleColumn()
  253. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
  254. rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')])
  255. unit_list = tables.Column(orderable=False, verbose_name='Units')
  256. actions = tables.TemplateColumn(
  257. template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name=''
  258. )
  259. class Meta(BaseTable.Meta):
  260. model = RackReservation
  261. fields = ('pk', 'rack', 'unit_list', 'user', 'created', 'tenant', 'description', 'actions')
  262. #
  263. # Manufacturers
  264. #
  265. class ManufacturerTable(BaseTable):
  266. pk = ToggleColumn()
  267. name = tables.LinkColumn(verbose_name='Name')
  268. devicetype_count = tables.Column(verbose_name='Device Types')
  269. platform_count = tables.Column(verbose_name='Platforms')
  270. slug = tables.Column(verbose_name='Slug')
  271. actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right'}},
  272. verbose_name='')
  273. class Meta(BaseTable.Meta):
  274. model = Manufacturer
  275. fields = ('pk', 'name', 'devicetype_count', 'platform_count', 'slug', 'actions')
  276. #
  277. # Device types
  278. #
  279. class DeviceTypeTable(BaseTable):
  280. pk = ToggleColumn()
  281. model = tables.LinkColumn(
  282. viewname='dcim:devicetype',
  283. args=[Accessor('pk')],
  284. verbose_name='Device Type'
  285. )
  286. is_full_depth = BooleanColumn(verbose_name='Full Depth')
  287. subdevice_role = tables.TemplateColumn(
  288. template_code=SUBDEVICE_ROLE_TEMPLATE,
  289. verbose_name='Subdevice Role'
  290. )
  291. instance_count = tables.TemplateColumn(
  292. template_code=DEVICETYPE_INSTANCES_TEMPLATE,
  293. verbose_name='Instances'
  294. )
  295. class Meta(BaseTable.Meta):
  296. model = DeviceType
  297. fields = (
  298. 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role',
  299. 'instance_count',
  300. )
  301. #
  302. # Device type components
  303. #
  304. class ConsolePortTemplateTable(BaseTable):
  305. pk = ToggleColumn()
  306. class Meta(BaseTable.Meta):
  307. model = ConsolePortTemplate
  308. fields = ('pk', 'name')
  309. empty_text = "None"
  310. class ConsoleServerPortTemplateTable(BaseTable):
  311. pk = ToggleColumn()
  312. class Meta(BaseTable.Meta):
  313. model = ConsoleServerPortTemplate
  314. fields = ('pk', 'name')
  315. empty_text = "None"
  316. class PowerPortTemplateTable(BaseTable):
  317. pk = ToggleColumn()
  318. class Meta(BaseTable.Meta):
  319. model = PowerPortTemplate
  320. fields = ('pk', 'name')
  321. empty_text = "None"
  322. class PowerOutletTemplateTable(BaseTable):
  323. pk = ToggleColumn()
  324. class Meta(BaseTable.Meta):
  325. model = PowerOutletTemplate
  326. fields = ('pk', 'name')
  327. empty_text = "None"
  328. class InterfaceTemplateTable(BaseTable):
  329. pk = ToggleColumn()
  330. mgmt_only = tables.TemplateColumn("{% if value %}OOB Management{% endif %}")
  331. class Meta(BaseTable.Meta):
  332. model = InterfaceTemplate
  333. fields = ('pk', 'name', 'mgmt_only', 'form_factor')
  334. empty_text = "None"
  335. class FrontPortTemplateTable(BaseTable):
  336. pk = ToggleColumn()
  337. class Meta(BaseTable.Meta):
  338. model = FrontPortTemplate
  339. fields = ('pk', 'name', 'type', 'rear_port', 'rear_port_position')
  340. empty_text = "None"
  341. class RearPortTemplateTable(BaseTable):
  342. pk = ToggleColumn()
  343. class Meta(BaseTable.Meta):
  344. model = RearPortTemplate
  345. fields = ('pk', 'name', 'type', 'positions')
  346. empty_text = "None"
  347. class DeviceBayTemplateTable(BaseTable):
  348. pk = ToggleColumn()
  349. class Meta(BaseTable.Meta):
  350. model = DeviceBayTemplate
  351. fields = ('pk', 'name')
  352. empty_text = "None"
  353. #
  354. # Device roles
  355. #
  356. class DeviceRoleTable(BaseTable):
  357. pk = ToggleColumn()
  358. device_count = tables.TemplateColumn(
  359. template_code=DEVICEROLE_DEVICE_COUNT,
  360. accessor=Accessor('devices.count'),
  361. orderable=False,
  362. verbose_name='Devices'
  363. )
  364. vm_count = tables.TemplateColumn(
  365. template_code=DEVICEROLE_VM_COUNT,
  366. accessor=Accessor('virtual_machines.count'),
  367. orderable=False,
  368. verbose_name='VMs'
  369. )
  370. color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Label')
  371. slug = tables.Column(verbose_name='Slug')
  372. actions = tables.TemplateColumn(
  373. template_code=DEVICEROLE_ACTIONS,
  374. attrs={'td': {'class': 'text-right'}},
  375. verbose_name=''
  376. )
  377. class Meta(BaseTable.Meta):
  378. model = DeviceRole
  379. fields = ('pk', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'slug', 'actions')
  380. #
  381. # Platforms
  382. #
  383. class PlatformTable(BaseTable):
  384. pk = ToggleColumn()
  385. device_count = tables.TemplateColumn(
  386. template_code=PLATFORM_DEVICE_COUNT,
  387. accessor=Accessor('devices.count'),
  388. orderable=False,
  389. verbose_name='Devices'
  390. )
  391. vm_count = tables.TemplateColumn(
  392. template_code=PLATFORM_VM_COUNT,
  393. accessor=Accessor('virtual_machines.count'),
  394. orderable=False,
  395. verbose_name='VMs'
  396. )
  397. actions = tables.TemplateColumn(
  398. template_code=PLATFORM_ACTIONS,
  399. attrs={'td': {'class': 'text-right'}},
  400. verbose_name=''
  401. )
  402. class Meta(BaseTable.Meta):
  403. model = Platform
  404. fields = ('pk', 'name', 'manufacturer', 'device_count', 'vm_count', 'slug', 'napalm_driver', 'actions')
  405. #
  406. # Devices
  407. #
  408. class DeviceTable(BaseTable):
  409. pk = ToggleColumn()
  410. name = tables.TemplateColumn(
  411. order_by=('_nat1', '_nat2', '_nat3'),
  412. template_code=DEVICE_LINK
  413. )
  414. status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status')
  415. tenant = tables.TemplateColumn(template_code=COL_TENANT)
  416. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
  417. rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')])
  418. device_role = tables.TemplateColumn(DEVICE_ROLE, verbose_name='Role')
  419. device_type = tables.LinkColumn(
  420. 'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type',
  421. text=lambda record: record.device_type.full_name
  422. )
  423. class Meta(BaseTable.Meta):
  424. model = Device
  425. fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type')
  426. class DeviceDetailTable(DeviceTable):
  427. primary_ip = tables.TemplateColumn(
  428. orderable=False, verbose_name='IP Address', template_code=DEVICE_PRIMARY_IP
  429. )
  430. class Meta(DeviceTable.Meta):
  431. model = Device
  432. fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
  433. class DeviceImportTable(BaseTable):
  434. name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
  435. status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status')
  436. tenant = tables.TemplateColumn(template_code=COL_TENANT)
  437. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  438. rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
  439. position = tables.Column(verbose_name='Position')
  440. device_role = tables.Column(verbose_name='Role')
  441. device_type = tables.Column(verbose_name='Type')
  442. class Meta(BaseTable.Meta):
  443. model = Device
  444. fields = ('name', 'status', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type')
  445. empty_text = False
  446. #
  447. # Device components
  448. #
  449. class ConsolePortTable(BaseTable):
  450. class Meta(BaseTable.Meta):
  451. model = ConsolePort
  452. fields = ('name',)
  453. class ConsoleServerPortTable(BaseTable):
  454. class Meta(BaseTable.Meta):
  455. model = ConsoleServerPort
  456. fields = ('name',)
  457. class PowerPortTable(BaseTable):
  458. class Meta(BaseTable.Meta):
  459. model = PowerPort
  460. fields = ('name',)
  461. class PowerOutletTable(BaseTable):
  462. class Meta(BaseTable.Meta):
  463. model = PowerOutlet
  464. fields = ('name',)
  465. class InterfaceTable(BaseTable):
  466. class Meta(BaseTable.Meta):
  467. model = Interface
  468. fields = ('name', 'form_factor', 'lag', 'enabled', 'mgmt_only', 'description')
  469. class FrontPortTable(BaseTable):
  470. class Meta(BaseTable.Meta):
  471. model = FrontPort
  472. fields = ('name', 'type', 'rear_port', 'rear_port_position')
  473. empty_text = "None"
  474. class RearPortTable(BaseTable):
  475. class Meta(BaseTable.Meta):
  476. model = RearPort
  477. fields = ('name', 'type', 'positions')
  478. empty_text = "None"
  479. class DeviceBayTable(BaseTable):
  480. class Meta(BaseTable.Meta):
  481. model = DeviceBay
  482. fields = ('name',)
  483. #
  484. # Cables
  485. #
  486. class CableTable(BaseTable):
  487. pk = ToggleColumn()
  488. id = tables.LinkColumn(
  489. viewname='dcim:cable',
  490. args=[Accessor('pk')],
  491. verbose_name='ID'
  492. )
  493. termination_a_parent = tables.TemplateColumn(
  494. template_code=CABLE_TERMINATION_PARENT,
  495. accessor=Accessor('termination_a'),
  496. orderable=False,
  497. verbose_name='Termination A'
  498. )
  499. termination_a = tables.Column(
  500. accessor=Accessor('termination_a'),
  501. orderable=False,
  502. verbose_name=''
  503. )
  504. termination_b_parent = tables.TemplateColumn(
  505. template_code=CABLE_TERMINATION_PARENT,
  506. accessor=Accessor('termination_b'),
  507. orderable=False,
  508. verbose_name='Termination B'
  509. )
  510. termination_b = tables.Column(
  511. accessor=Accessor('termination_b'),
  512. orderable=False,
  513. verbose_name=''
  514. )
  515. length = tables.TemplateColumn(
  516. template_code=CABLE_LENGTH,
  517. order_by='_abs_length'
  518. )
  519. color = ColorColumn()
  520. class Meta(BaseTable.Meta):
  521. model = Cable
  522. fields = (
  523. 'pk', 'id', 'label', 'termination_a_parent', 'termination_a', 'termination_b_parent', 'termination_b',
  524. 'status', 'type', 'color', 'length',
  525. )
  526. #
  527. # Device connections
  528. #
  529. class ConsoleConnectionTable(BaseTable):
  530. console_server = tables.LinkColumn(
  531. viewname='dcim:device',
  532. accessor=Accessor('connected_endpoint.device'),
  533. args=[Accessor('connected_endpoint.device.pk')],
  534. verbose_name='Console server'
  535. )
  536. connected_endpoint = tables.Column(verbose_name='Port')
  537. device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
  538. name = tables.Column(verbose_name='Console port')
  539. cable = tables.LinkColumn(
  540. viewname='dcim:cable',
  541. args=[Accessor('cable.pk')]
  542. )
  543. class Meta(BaseTable.Meta):
  544. model = ConsolePort
  545. fields = ('console_server', 'connected_endpoint', 'device', 'name', 'cable')
  546. class PowerConnectionTable(BaseTable):
  547. pdu = tables.LinkColumn(
  548. viewname='dcim:device',
  549. accessor=Accessor('connected_endpoint.device'),
  550. args=[Accessor('connected_endpoint.device.pk')],
  551. verbose_name='PDU'
  552. )
  553. connected_endpoint = tables.Column(verbose_name='Outlet')
  554. device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
  555. name = tables.Column(verbose_name='Power Port')
  556. cable = tables.LinkColumn(
  557. viewname='dcim:cable',
  558. args=[Accessor('cable.pk')]
  559. )
  560. class Meta(BaseTable.Meta):
  561. model = PowerPort
  562. fields = ('pdu', 'connected_endpoint', 'device', 'name', 'cable')
  563. class InterfaceConnectionTable(BaseTable):
  564. device_a = tables.LinkColumn(
  565. viewname='dcim:device',
  566. accessor=Accessor('device'),
  567. args=[Accessor('device.pk')],
  568. verbose_name='Device A'
  569. )
  570. interface_a = tables.LinkColumn(
  571. viewname='dcim:interface',
  572. accessor=Accessor('name'),
  573. args=[Accessor('pk')],
  574. verbose_name='Interface A'
  575. )
  576. device_b = tables.LinkColumn(
  577. viewname='dcim:device',
  578. accessor=Accessor('connected_endpoint.device'),
  579. args=[Accessor('connected_endpoint.device.pk')],
  580. verbose_name='Device B'
  581. )
  582. interface_b = tables.LinkColumn(
  583. viewname='dcim:interface',
  584. accessor=Accessor('connected_endpoint.name'),
  585. args=[Accessor('connected_endpoint.pk')],
  586. verbose_name='Interface B'
  587. )
  588. cable = tables.LinkColumn(
  589. viewname='dcim:cable',
  590. args=[Accessor('cable.pk')]
  591. )
  592. class Meta(BaseTable.Meta):
  593. model = Interface
  594. fields = ('device_a', 'interface_a', 'device_b', 'interface_b', 'cable')
  595. #
  596. # InventoryItems
  597. #
  598. class InventoryItemTable(BaseTable):
  599. pk = ToggleColumn()
  600. device = tables.LinkColumn('dcim:device_inventory', args=[Accessor('device.pk')])
  601. manufacturer = tables.Column(accessor=Accessor('manufacturer.name'), verbose_name='Manufacturer')
  602. class Meta(BaseTable.Meta):
  603. model = InventoryItem
  604. fields = ('pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description')
  605. #
  606. # Virtual chassis
  607. #
  608. class VirtualChassisTable(BaseTable):
  609. pk = ToggleColumn()
  610. master = tables.LinkColumn()
  611. member_count = tables.Column(verbose_name='Members')
  612. actions = tables.TemplateColumn(
  613. template_code=VIRTUALCHASSIS_ACTIONS,
  614. attrs={'td': {'class': 'text-right'}},
  615. verbose_name=''
  616. )
  617. class Meta(BaseTable.Meta):
  618. model = VirtualChassis
  619. fields = ('pk', 'master', 'domain', 'member_count', 'actions')