tables.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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. STATUS_LABEL = """
  34. {% if record.pk %}
  35. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  36. {% else %}
  37. <span class="label label-success">Available</span>
  38. {% endif %}
  39. """
  40. VLANGROUP_ACTIONS = """
  41. {% if perms.ipam.change_vlangroup %}
  42. <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>
  43. {% endif %}
  44. """
  45. TENANT_LINK = """
  46. {% if record.tenant %}
  47. <a href="{% url 'tenancy:tenant' slug=record.tenant.slug %}">{{ record.tenant }}</a>
  48. {% elif record.vrf.tenant %}
  49. <a href="{% url 'tenancy:tenant' slug=record.vrf.tenant.slug %}">{{ record.vrf.tenant }}</a>*
  50. {% else %}
  51. &mdash;
  52. {% endif %}
  53. """
  54. #
  55. # VRFs
  56. #
  57. class VRFTable(BaseTable):
  58. pk = ToggleColumn()
  59. name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
  60. rd = tables.Column(verbose_name='RD')
  61. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  62. description = tables.Column(orderable=False, verbose_name='Description')
  63. class Meta(BaseTable.Meta):
  64. model = VRF
  65. fields = ('pk', 'name', 'rd', 'tenant', 'description')
  66. #
  67. # RIRs
  68. #
  69. class RIRTable(BaseTable):
  70. pk = ToggleColumn()
  71. name = tables.LinkColumn(verbose_name='Name')
  72. aggregate_count = tables.Column(verbose_name='Aggregates')
  73. slug = tables.Column(verbose_name='Slug')
  74. actions = tables.TemplateColumn(template_code=RIR_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='')
  75. class Meta(BaseTable.Meta):
  76. model = RIR
  77. fields = ('pk', 'name', 'aggregate_count', 'slug', 'actions')
  78. #
  79. # Aggregates
  80. #
  81. class AggregateTable(BaseTable):
  82. pk = ToggleColumn()
  83. prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
  84. rir = tables.Column(verbose_name='RIR')
  85. child_count = tables.Column(verbose_name='Prefixes')
  86. utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
  87. date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
  88. description = tables.Column(orderable=False, verbose_name='Description')
  89. class Meta(BaseTable.Meta):
  90. model = Aggregate
  91. fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
  92. #
  93. # Roles
  94. #
  95. class RoleTable(BaseTable):
  96. pk = ToggleColumn()
  97. name = tables.Column(verbose_name='Name')
  98. prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
  99. vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
  100. slug = tables.Column(verbose_name='Slug')
  101. actions = tables.TemplateColumn(template_code=ROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='')
  102. class Meta(BaseTable.Meta):
  103. model = Role
  104. fields = ('pk', 'name', 'prefix_count', 'vlan_count', 'slug', 'actions')
  105. #
  106. # Prefixes
  107. #
  108. class PrefixTable(BaseTable):
  109. pk = ToggleColumn()
  110. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  111. prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
  112. vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global', verbose_name='VRF')
  113. tenant = tables.TemplateColumn(TENANT_LINK, verbose_name='Tenant')
  114. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  115. role = tables.Column(verbose_name='Role')
  116. description = tables.Column(orderable=False, verbose_name='Description')
  117. class Meta(BaseTable.Meta):
  118. model = Prefix
  119. fields = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'role', 'description')
  120. class PrefixBriefTable(BaseTable):
  121. prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix')
  122. vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global', verbose_name='VRF')
  123. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  124. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  125. role = tables.Column(verbose_name='Role')
  126. class Meta(BaseTable.Meta):
  127. model = Prefix
  128. fields = ('prefix', 'vrf', 'status', 'site', 'role')
  129. orderable = False
  130. #
  131. # IPAddresses
  132. #
  133. class IPAddressTable(BaseTable):
  134. pk = ToggleColumn()
  135. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  136. vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global', verbose_name='VRF')
  137. tenant = tables.TemplateColumn(TENANT_LINK, verbose_name='Tenant')
  138. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  139. verbose_name='Device')
  140. interface = tables.Column(orderable=False, verbose_name='Interface')
  141. description = tables.Column(orderable=False, verbose_name='Description')
  142. class Meta(BaseTable.Meta):
  143. model = IPAddress
  144. fields = ('pk', 'address', 'vrf', 'tenant', 'device', 'interface', 'description')
  145. class IPAddressBriefTable(BaseTable):
  146. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  147. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  148. verbose_name='Device')
  149. interface = tables.Column(orderable=False, verbose_name='Interface')
  150. nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False,
  151. verbose_name='NAT (Inside)')
  152. class Meta(BaseTable.Meta):
  153. model = IPAddress
  154. fields = ('address', 'device', 'interface', 'nat_inside')
  155. #
  156. # VLAN groups
  157. #
  158. class VLANGroupTable(BaseTable):
  159. pk = ToggleColumn()
  160. name = tables.LinkColumn(verbose_name='Name')
  161. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  162. vlan_count = tables.Column(verbose_name='VLANs')
  163. slug = tables.Column(verbose_name='Slug')
  164. actions = tables.TemplateColumn(template_code=VLANGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}},
  165. verbose_name='')
  166. class Meta(BaseTable.Meta):
  167. model = VLANGroup
  168. fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'actions')
  169. #
  170. # VLANs
  171. #
  172. class VLANTable(BaseTable):
  173. pk = ToggleColumn()
  174. vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
  175. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  176. group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
  177. name = tables.Column(verbose_name='Name')
  178. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  179. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  180. role = tables.Column(verbose_name='Role')
  181. class Meta(BaseTable.Meta):
  182. model = VLAN
  183. fields = ('pk', 'vid', 'site', 'group', 'name', 'tenant', 'status', 'role')