tables.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. import django_tables2 as tables
  2. from django_tables2.utils import Accessor
  3. from utilities.tables import ToggleColumn
  4. from .models import (
  5. ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, InterfaceTemplate,
  6. Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
  7. )
  8. DEVICE_LINK = """
  9. <a href="{% url 'dcim:device' pk=record.pk %}">
  10. {{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}
  11. </a>
  12. """
  13. RACKGROUP_EDIT_LINK = """
  14. {% if perms.dcim.change_rackgroup %}
  15. <a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}">Edit</a>
  16. {% endif %}
  17. """
  18. DEVICEROLE_EDIT_LINK = """
  19. {% if perms.dcim.change_devicerole %}
  20. <a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>
  21. {% endif %}
  22. """
  23. MANUFACTURER_EDIT_LINK = """
  24. {% if perms.dcim.change_manufacturer %}
  25. <a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>
  26. {% endif %}
  27. """
  28. PLATFORM_EDIT_LINK = """
  29. {% if perms.dcim.change_platform %}
  30. <a href="{% url 'dcim:platform_edit' slug=record.slug %}">Edit</a>
  31. {% endif %}
  32. """
  33. STATUS_ICON = """
  34. {% if record.status %}
  35. <span class="glyphicon glyphicon-ok-sign text-success" title="Active" aria-hidden="true"></span>
  36. {% else %}
  37. <span class="glyphicon glyphicon-minus-sign text-danger" title="Offline" aria-hidden="true"></span>
  38. {% endif %}
  39. """
  40. #
  41. # Sites
  42. #
  43. class SiteTable(tables.Table):
  44. name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name')
  45. facility = tables.Column(verbose_name='Facility')
  46. asn = tables.Column(verbose_name='ASN')
  47. rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks')
  48. device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices')
  49. prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
  50. vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
  51. circuit_count = tables.Column(accessor=Accessor('count_circuits'), orderable=False, verbose_name='Circuits')
  52. class Meta:
  53. model = Site
  54. fields = ('name', 'facility', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count',
  55. 'circuit_count')
  56. empty_text = "No sites have been defined."
  57. attrs = {
  58. 'class': 'table table-hover',
  59. }
  60. #
  61. # Rack groups
  62. #
  63. class RackGroupTable(tables.Table):
  64. pk = ToggleColumn()
  65. name = tables.LinkColumn(verbose_name='Name')
  66. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  67. rack_count = tables.Column(verbose_name='Racks')
  68. slug = tables.Column(verbose_name='Slug')
  69. edit = tables.TemplateColumn(template_code=RACKGROUP_EDIT_LINK, verbose_name='')
  70. class Meta:
  71. model = RackGroup
  72. fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'edit')
  73. empty_text = "No rack groups were found."
  74. attrs = {
  75. 'class': 'table table-hover',
  76. }
  77. #
  78. # Racks
  79. #
  80. class RackTable(tables.Table):
  81. pk = ToggleColumn()
  82. name = tables.LinkColumn('dcim:rack', args=[Accessor('pk')], verbose_name='Name')
  83. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  84. group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
  85. facility_id = tables.Column(verbose_name='Facility ID')
  86. u_height = tables.Column(verbose_name='Height (U)')
  87. devices = tables.Column(accessor=Accessor('device_count'), verbose_name='Devices')
  88. class Meta:
  89. model = Rack
  90. fields = ('pk', 'name', 'site', 'group', 'facility_id', 'u_height', 'devices')
  91. empty_text = "No racks were found."
  92. attrs = {
  93. 'class': 'table table-hover',
  94. }
  95. #
  96. # Manufacturers
  97. #
  98. class ManufacturerTable(tables.Table):
  99. pk = ToggleColumn()
  100. name = tables.LinkColumn(verbose_name='Name')
  101. devicetype_count = tables.Column(verbose_name='Device Types')
  102. slug = tables.Column(verbose_name='Slug')
  103. edit = tables.TemplateColumn(template_code=MANUFACTURER_EDIT_LINK, verbose_name='')
  104. class Meta:
  105. model = Manufacturer
  106. fields = ('pk', 'name', 'devicetype_count', 'slug', 'edit')
  107. empty_text = "No device types were found."
  108. attrs = {
  109. 'class': 'table table-hover',
  110. }
  111. #
  112. # Device types
  113. #
  114. class DeviceTypeTable(tables.Table):
  115. pk = ToggleColumn()
  116. model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type')
  117. class Meta:
  118. model = DeviceType
  119. fields = ('pk', 'model', 'manufacturer', 'u_height')
  120. empty_text = "No device types were found."
  121. attrs = {
  122. 'class': 'table table-hover',
  123. }
  124. #
  125. # Device type components
  126. #
  127. class ConsolePortTemplateTable(tables.Table):
  128. pk = ToggleColumn()
  129. class Meta:
  130. model = ConsolePortTemplate
  131. fields = ('pk', 'name')
  132. empty_text = "None"
  133. show_header = False
  134. attrs = {
  135. 'class': 'table table-hover panel-body',
  136. }
  137. class ConsoleServerPortTemplateTable(tables.Table):
  138. pk = ToggleColumn()
  139. class Meta:
  140. model = ConsoleServerPortTemplate
  141. fields = ('pk', 'name')
  142. empty_text = "None"
  143. show_header = False
  144. attrs = {
  145. 'class': 'table table-hover panel-body',
  146. }
  147. class PowerPortTemplateTable(tables.Table):
  148. pk = ToggleColumn()
  149. class Meta:
  150. model = PowerPortTemplate
  151. fields = ('pk', 'name')
  152. empty_text = "None"
  153. show_header = False
  154. attrs = {
  155. 'class': 'table table-hover panel-body',
  156. }
  157. class PowerOutletTemplateTable(tables.Table):
  158. pk = ToggleColumn()
  159. class Meta:
  160. model = PowerOutletTemplate
  161. fields = ('pk', 'name')
  162. empty_text = "None"
  163. show_header = False
  164. attrs = {
  165. 'class': 'table table-hover panel-body',
  166. }
  167. class InterfaceTemplateTable(tables.Table):
  168. pk = ToggleColumn()
  169. class Meta:
  170. model = InterfaceTemplate
  171. fields = ('pk', 'name')
  172. empty_text = "None"
  173. show_header = False
  174. attrs = {
  175. 'class': 'table table-hover panel-body',
  176. }
  177. #
  178. # Device roles
  179. #
  180. class DeviceRoleTable(tables.Table):
  181. pk = ToggleColumn()
  182. name = tables.LinkColumn(verbose_name='Name')
  183. device_count = tables.Column(verbose_name='Devices')
  184. slug = tables.Column(verbose_name='Slug')
  185. color = tables.Column(verbose_name='Color')
  186. edit = tables.TemplateColumn(template_code=DEVICEROLE_EDIT_LINK, verbose_name='')
  187. class Meta:
  188. model = DeviceRole
  189. fields = ('pk', 'name', 'device_count', 'slug', 'color')
  190. empty_text = "No device roles were found."
  191. attrs = {
  192. 'class': 'table table-hover',
  193. }
  194. #
  195. # Platforms
  196. #
  197. class PlatformTable(tables.Table):
  198. pk = ToggleColumn()
  199. name = tables.LinkColumn(verbose_name='Name')
  200. device_count = tables.Column(verbose_name='Devices')
  201. slug = tables.Column(verbose_name='Slug')
  202. edit = tables.TemplateColumn(template_code=PLATFORM_EDIT_LINK, verbose_name='')
  203. class Meta:
  204. model = Platform
  205. fields = ('pk', 'name', 'device_count', 'slug', 'edit')
  206. empty_text = "No platforms were found."
  207. attrs = {
  208. 'class': 'table table-hover',
  209. }
  210. #
  211. # Devices
  212. #
  213. class DeviceTable(tables.Table):
  214. pk = ToggleColumn()
  215. status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='')
  216. name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
  217. site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')
  218. rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
  219. device_role = tables.Column(verbose_name='Role')
  220. device_type = tables.Column(verbose_name='Type')
  221. primary_ip = tables.TemplateColumn(orderable=False, verbose_name='IP Address',
  222. template_code="{{ record.primary_ip.address.ip }}")
  223. class Meta:
  224. model = Device
  225. fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
  226. empty_text = "No devices were found."
  227. attrs = {
  228. 'class': 'table table-hover',
  229. }
  230. class DeviceImportTable(tables.Table):
  231. name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
  232. site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')
  233. rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
  234. position = tables.Column(verbose_name='Position')
  235. device_role = tables.Column(verbose_name='Role')
  236. device_type = tables.Column(verbose_name='Type')
  237. class Meta:
  238. model = Device
  239. fields = ('name', 'site', 'rack', 'position', 'device_role', 'device_type')
  240. attrs = {
  241. 'class': 'table table-hover',
  242. }
  243. #
  244. # Device connections
  245. #
  246. class ConsoleConnectionTable(tables.Table):
  247. console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'),
  248. args=[Accessor('cs_port.device.pk')], verbose_name='Console server')
  249. cs_port = tables.Column(verbose_name='Port')
  250. device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
  251. name = tables.Column(verbose_name='Console port')
  252. class Meta:
  253. model = ConsolePort
  254. fields = ('console_server', 'cs_port', 'device', 'name')
  255. attrs = {
  256. 'class': 'table table-hover',
  257. }
  258. class PowerConnectionTable(tables.Table):
  259. pdu = tables.LinkColumn('dcim:device', accessor=Accessor('power_outlet.device'),
  260. args=[Accessor('power_outlet.device.pk')], verbose_name='PDU')
  261. power_outlet = tables.Column(verbose_name='Outlet')
  262. device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
  263. name = tables.Column(verbose_name='Console port')
  264. class Meta:
  265. model = PowerPort
  266. fields = ('pdu', 'power_outlet', 'device', 'name')
  267. attrs = {
  268. 'class': 'table table-hover',
  269. }
  270. class InterfaceConnectionTable(tables.Table):
  271. device_a = tables.LinkColumn('dcim:device', accessor=Accessor('interface_a.device'),
  272. args=[Accessor('interface_a.device.pk')], verbose_name='Device A')
  273. interface_a = tables.Column(verbose_name='Interface A')
  274. device_b = tables.LinkColumn('dcim:device', accessor=Accessor('interface_b.device'),
  275. args=[Accessor('interface_b.device.pk')], verbose_name='Device B')
  276. interface_b = tables.Column(verbose_name='Interface B')
  277. class Meta:
  278. model = PowerPort
  279. fields = ('device_a', 'interface_a', 'device_b', 'interface_b')
  280. attrs = {
  281. 'class': 'table table-hover',
  282. }