tables.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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_EDIT_LINK = """
  6. {% if perms.ipam.change_rir %}<a href="{% url 'ipam:rir_edit' slug=record.slug %}">Edit</a>{% endif %}
  7. """
  8. UTILIZATION_GRAPH = """
  9. {% load helpers %}
  10. {% utilization_graph record.get_utilization %}
  11. """
  12. ROLE_EDIT_LINK = """
  13. {% if perms.ipam.change_role %}<a href="{% url 'ipam:role_edit' slug=record.slug %}">Edit</a>{% endif %}
  14. """
  15. PREFIX_LINK = """
  16. {% if record.has_children %}
  17. <span style="padding-left: {{ record.depth }}0px "><i class="fa fa-caret-right"></i></a>
  18. {% else %}
  19. <span style="padding-left: {{ record.depth }}9px">
  20. {% endif %}
  21. <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>
  22. </span>
  23. """
  24. PREFIX_LINK_BRIEF = """
  25. <span style="padding-left: {{ record.depth }}0px">
  26. <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>
  27. </span>
  28. """
  29. STATUS_LABEL = """
  30. {% if record.pk %}
  31. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  32. {% else %}
  33. <span class="label label-success">Available</span>
  34. {% endif %}
  35. """
  36. VLANGROUP_EDIT_LINK = """
  37. {% if perms.ipam.change_vlangroup %}
  38. <a href="{% url 'ipam:vlangroup_edit' pk=record.pk %}">Edit</a>
  39. {% endif %}
  40. """
  41. #
  42. # VRFs
  43. #
  44. class VRFTable(BaseTable):
  45. pk = ToggleColumn()
  46. name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
  47. rd = tables.Column(verbose_name='RD')
  48. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  49. description = tables.Column(orderable=False, verbose_name='Description')
  50. class Meta(BaseTable.Meta):
  51. model = VRF
  52. fields = ('pk', 'name', 'rd', 'tenant', 'description')
  53. #
  54. # RIRs
  55. #
  56. class RIRTable(BaseTable):
  57. pk = ToggleColumn()
  58. name = tables.LinkColumn(verbose_name='Name')
  59. aggregate_count = tables.Column(verbose_name='Aggregates')
  60. slug = tables.Column(verbose_name='Slug')
  61. edit = tables.TemplateColumn(template_code=RIR_EDIT_LINK, verbose_name='')
  62. class Meta(BaseTable.Meta):
  63. model = RIR
  64. fields = ('pk', 'name', 'aggregate_count', 'slug', 'edit')
  65. #
  66. # Aggregates
  67. #
  68. class AggregateTable(BaseTable):
  69. pk = ToggleColumn()
  70. prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
  71. rir = tables.Column(verbose_name='RIR')
  72. child_count = tables.Column(verbose_name='Prefixes')
  73. utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
  74. date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
  75. description = tables.Column(orderable=False, verbose_name='Description')
  76. class Meta(BaseTable.Meta):
  77. model = Aggregate
  78. fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
  79. #
  80. # Roles
  81. #
  82. class RoleTable(BaseTable):
  83. pk = ToggleColumn()
  84. name = tables.Column(verbose_name='Name')
  85. prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
  86. vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
  87. slug = tables.Column(verbose_name='Slug')
  88. edit = tables.TemplateColumn(template_code=ROLE_EDIT_LINK, verbose_name='')
  89. class Meta(BaseTable.Meta):
  90. model = Role
  91. fields = ('pk', 'name', 'prefix_count', 'vlan_count', 'slug', 'edit')
  92. #
  93. # Prefixes
  94. #
  95. class PrefixTable(BaseTable):
  96. pk = ToggleColumn()
  97. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  98. prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
  99. vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
  100. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  101. role = tables.Column(verbose_name='Role')
  102. description = tables.Column(orderable=False, verbose_name='Description')
  103. class Meta(BaseTable.Meta):
  104. model = Prefix
  105. fields = ('pk', 'prefix', 'status', 'vrf', 'site', 'role', 'description')
  106. class PrefixBriefTable(BaseTable):
  107. prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix')
  108. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  109. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  110. role = tables.Column(verbose_name='Role')
  111. class Meta(BaseTable.Meta):
  112. model = Prefix
  113. fields = ('prefix', 'status', 'site', 'role')
  114. #
  115. # IPAddresses
  116. #
  117. class IPAddressTable(BaseTable):
  118. pk = ToggleColumn()
  119. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  120. vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
  121. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  122. verbose_name='Device')
  123. interface = tables.Column(orderable=False, verbose_name='Interface')
  124. description = tables.Column(orderable=False, verbose_name='Description')
  125. class Meta(BaseTable.Meta):
  126. model = IPAddress
  127. fields = ('pk', 'address', 'vrf', 'device', 'interface', 'description')
  128. class IPAddressBriefTable(BaseTable):
  129. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  130. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  131. verbose_name='Device')
  132. interface = tables.Column(orderable=False, verbose_name='Interface')
  133. nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False,
  134. verbose_name='NAT (Inside)')
  135. class Meta(BaseTable.Meta):
  136. model = IPAddress
  137. fields = ('address', 'device', 'interface', 'nat_inside')
  138. #
  139. # VLAN groups
  140. #
  141. class VLANGroupTable(BaseTable):
  142. pk = ToggleColumn()
  143. name = tables.LinkColumn(verbose_name='Name')
  144. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  145. vlan_count = tables.Column(verbose_name='VLANs')
  146. slug = tables.Column(verbose_name='Slug')
  147. edit = tables.TemplateColumn(template_code=VLANGROUP_EDIT_LINK, verbose_name='')
  148. class Meta(BaseTable.Meta):
  149. model = VLANGroup
  150. fields = ('pk', 'name', 'site', 'vlan_count', 'slug', 'edit')
  151. #
  152. # VLANs
  153. #
  154. class VLANTable(BaseTable):
  155. pk = ToggleColumn()
  156. vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
  157. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  158. group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
  159. name = tables.Column(verbose_name='Name')
  160. tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
  161. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  162. role = tables.Column(verbose_name='Role')
  163. class Meta(BaseTable.Meta):
  164. model = VLAN
  165. fields = ('pk', 'vid', 'site', 'group', 'name', 'tenant', 'status', 'role')