tables.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import django_tables2 as tables
  2. from django_tables2.utils import Accessor
  3. from utilities.tables import BaseTable, ToggleColumn
  4. from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VLANGroup, VRF
  5. RIR_ACTIONS = """
  6. {% if perms.ipam.change_rir %}
  7. <a href="{% url 'ipam:rir_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  8. {% endif %}
  9. """
  10. UTILIZATION_GRAPH = """
  11. {% load helpers %}
  12. {% utilization_graph record.get_utilization %}
  13. """
  14. ROLE_ACTIONS = """
  15. {% if perms.ipam.change_role %}
  16. <a href="{% url 'ipam:role_edit' slug=record.slug %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  17. {% endif %}
  18. """
  19. PREFIX_LINK = """
  20. {% if record.has_children %}
  21. <span style="padding-left: {{ record.depth }}0px "><i class="fa fa-caret-right"></i></a>
  22. {% else %}
  23. <span style="padding-left: {{ record.depth }}9px">
  24. {% endif %}
  25. <a href="{% if record.pk %}{% url 'ipam:prefix' pk=record.pk %}{% else %}{% url 'ipam:prefix_add' %}?prefix={{ record }}{% if parent.vrf %}&vrf={{ parent.vrf.pk }}{% endif %}{% if parent.site %}&site={{ parent.site.pk }}{% endif %}{% endif %}">{{ record.prefix }}</a>
  26. </span>
  27. """
  28. PREFIX_LINK_BRIEF = """
  29. <span style="padding-left: {{ record.depth }}0px">
  30. <a href="{% if record.pk %}{% url 'ipam:prefix' pk=record.pk %}{% else %}{% url 'ipam:prefix_add' %}?prefix={{ record }}{% if parent.vrf %}&vrf={{ parent.vrf.pk }}{% endif %}{% if parent.site %}&site={{ parent.site.pk }}{% endif %}{% endif %}">{{ record.prefix }}</a>
  31. </span>
  32. """
  33. IPADDRESS_LINK = """
  34. {% if record.pk %}
  35. <a href="{{ record.get_absolute_url }}">{{ record.address }}</a>
  36. {% elif perms.ipam.add_ipaddress %}
  37. <a href="{% url 'ipam:ipaddress_add' %}?address={{ record.1 }}{% if prefix.vrf %}&vrf={{ prefix.vrf.pk }}{% endif %}" class="btn btn-xs btn-success">{% if record.0 <= 65536 %}{{ record.0 }}{% else %}Lots of{% endif %} free IP{{ record.0|pluralize }}</a>
  38. {% else %}
  39. {{ record.0 }}
  40. {% endif %}
  41. """
  42. VRF_LINK = """
  43. {% if record.vrf %}
  44. <a href="{{ record.vrf.get_absolute_url }}">{{ record.vrf }}</a>
  45. {% elif prefix.vrf %}
  46. {{ prefix.vrf }}
  47. {% else %}
  48. Global
  49. {% endif %}
  50. """
  51. STATUS_LABEL = """
  52. {% if record.pk %}
  53. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  54. {% else %}
  55. <span class="label label-success">Available</span>
  56. {% endif %}
  57. """
  58. VLANGROUP_ACTIONS = """
  59. {% if perms.ipam.change_vlangroup %}
  60. <a href="{% url 'ipam:vlangroup_edit' pk=record.pk %}" class="btn btn-xs btn-warning"><i class="glyphicon glyphicon-pencil" aria-hidden="true"></i></a>
  61. {% endif %}
  62. """
  63. TENANT_LINK = """
  64. {% if record.tenant %}
  65. <a href="{% url 'tenancy:tenant' slug=record.tenant.slug %}">{{ record.tenant }}</a>
  66. {% elif record.vrf.tenant %}
  67. <a href="{% url 'tenancy:tenant' slug=record.vrf.tenant.slug %}">{{ record.vrf.tenant }}</a>*
  68. {% else %}
  69. &mdash;
  70. {% endif %}
  71. """
  72. #
  73. # VRFs
  74. #
  75. class VRFTable(BaseTable):
  76. pk = ToggleColumn()
  77. name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
  78. rd = tables.Column(verbose_name='RD')
  79. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  80. description = tables.Column(orderable=False, verbose_name='Description')
  81. class Meta(BaseTable.Meta):
  82. model = VRF
  83. fields = ('pk', 'name', 'rd', 'tenant', 'description')
  84. #
  85. # RIRs
  86. #
  87. class RIRTable(BaseTable):
  88. pk = ToggleColumn()
  89. name = tables.LinkColumn(verbose_name='Name')
  90. aggregate_count = tables.Column(verbose_name='Aggregates')
  91. slug = tables.Column(verbose_name='Slug')
  92. actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='')
  93. class Meta(BaseTable.Meta):
  94. model = RIR
  95. fields = ('pk', 'name', 'aggregate_count', 'slug', 'actions')
  96. #
  97. # Aggregates
  98. #
  99. class AggregateTable(BaseTable):
  100. pk = ToggleColumn()
  101. prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
  102. rir = tables.Column(verbose_name='RIR')
  103. child_count = tables.Column(verbose_name='Prefixes')
  104. utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
  105. date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
  106. description = tables.Column(orderable=False, verbose_name='Description')
  107. class Meta(BaseTable.Meta):
  108. model = Aggregate
  109. fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
  110. #
  111. # Roles
  112. #
  113. class RoleTable(BaseTable):
  114. pk = ToggleColumn()
  115. name = tables.Column(verbose_name='Name')
  116. prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
  117. vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
  118. slug = tables.Column(verbose_name='Slug')
  119. actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='')
  120. class Meta(BaseTable.Meta):
  121. model = Role
  122. fields = ('pk', 'name', 'prefix_count', 'vlan_count', 'slug', 'actions')
  123. #
  124. # Prefixes
  125. #
  126. class PrefixTable(BaseTable):
  127. pk = ToggleColumn()
  128. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  129. prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
  130. vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
  131. tenant = tables.TemplateColumn(TENANT_LINK, verbose_name='Tenant')
  132. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  133. role = tables.Column(verbose_name='Role')
  134. description = tables.Column(orderable=False, verbose_name='Description')
  135. class Meta(BaseTable.Meta):
  136. model = Prefix
  137. fields = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'role', 'description')
  138. row_attrs = {
  139. 'class': lambda record: 'success' if not record.pk else '',
  140. }
  141. class PrefixBriefTable(BaseTable):
  142. prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix')
  143. vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global', verbose_name='VRF')
  144. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  145. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  146. role = tables.Column(verbose_name='Role')
  147. class Meta(BaseTable.Meta):
  148. model = Prefix
  149. fields = ('prefix', 'vrf', 'status', 'site', 'role')
  150. orderable = False
  151. #
  152. # IPAddresses
  153. #
  154. class IPAddressTable(BaseTable):
  155. pk = ToggleColumn()
  156. address = tables.TemplateColumn(IPADDRESS_LINK, verbose_name='IP Address')
  157. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  158. vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
  159. tenant = tables.TemplateColumn(TENANT_LINK, verbose_name='Tenant')
  160. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  161. verbose_name='Device')
  162. interface = tables.Column(orderable=False, verbose_name='Interface')
  163. description = tables.Column(orderable=False, verbose_name='Description')
  164. class Meta(BaseTable.Meta):
  165. model = IPAddress
  166. fields = ('pk', 'address', 'status', 'vrf', 'tenant', 'device', 'interface', 'description')
  167. row_attrs = {
  168. 'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
  169. }
  170. class IPAddressBriefTable(BaseTable):
  171. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  172. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  173. verbose_name='Device')
  174. interface = tables.Column(orderable=False, verbose_name='Interface')
  175. nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False,
  176. verbose_name='NAT (Inside)')
  177. class Meta(BaseTable.Meta):
  178. model = IPAddress
  179. fields = ('address', 'device', 'interface', 'nat_inside')
  180. #
  181. # VLAN groups
  182. #
  183. class VLANGroupTable(BaseTable):
  184. pk = ToggleColumn()
  185. name = tables.LinkColumn(verbose_name='Name')
  186. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  187. vlan_count = tables.Column(verbose_name='VLANs')
  188. slug = tables.Column(verbose_name='Slug')
  189. actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}},
  190. verbose_name='')
  191. class Meta(BaseTable.Meta):
  192. model = VLANGroup
  193. fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'actions')
  194. #
  195. # VLANs
  196. #
  197. class VLANTable(BaseTable):
  198. pk = ToggleColumn()
  199. vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
  200. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  201. group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
  202. name = tables.Column(verbose_name='Name')
  203. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  204. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  205. role = tables.Column(verbose_name='Role')
  206. class Meta(BaseTable.Meta):
  207. model = VLAN
  208. fields = ('pk', 'vid', 'site', 'group', 'name', 'tenant', 'status', 'role')