tables.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import django_tables2 as tables
  2. from django_tables2.utils import Accessor
  3. from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VRF
  4. RIR_EDIT_LINK = """
  5. {% if perms.ipam.change_rir %}<a href="{% url 'ipam:rir_edit' slug=record.slug %}">Edit</a>{% endif %}
  6. """
  7. UTILIZATION_GRAPH = """
  8. {% with record.get_utilization as percentage %}
  9. <div class="progress text-center">
  10. {% if percentage < 15 %}<span style="font-size: 12px;">{{ percentage }}%</span>{% endif %}
  11. <div class="progress-bar progress-bar-{% if percentage >= 90 %}danger{% elif percentage >= 75 %}warning{% else %}success{% endif %}"
  12. role="progressbar" aria-valuenow="{{ percentage }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage }}%">
  13. {% if percentage >= 15 %}{{ percentage }}%{% endif %}
  14. </div>
  15. </div>
  16. {% endwith %}
  17. """
  18. ROLE_EDIT_LINK = """
  19. {% if perms.ipam.change_role %}<a href="{% url 'ipam:role_edit' slug=record.slug %}">Edit</a>{% endif %}
  20. """
  21. PREFIX_LINK = """
  22. {% if record.has_children %}
  23. <span style="padding-left: {{ record.depth }}0px "><i class="fa fa-caret-right"></i></a>
  24. {% else %}
  25. <span style="padding-left: {{ record.depth }}9px">
  26. {% endif %}
  27. <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>
  28. </span>
  29. """
  30. PREFIX_LINK_BRIEF = """
  31. <span style="padding-left: {{ record.depth }}0px">
  32. <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>
  33. </span>
  34. """
  35. STATUS_LABEL = """
  36. {% if record.pk %}
  37. <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
  38. {% else %}
  39. <span class="label label-success">Available</span>
  40. {% endif %}
  41. """
  42. #
  43. # VRFs
  44. #
  45. class VRFTable(tables.Table):
  46. pk = tables.CheckBoxColumn(visible=False, default='')
  47. name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
  48. rd = tables.Column(verbose_name='RD')
  49. description = tables.Column(sortable=False, verbose_name='Description')
  50. class Meta:
  51. model = VRF
  52. fields = ('pk', 'name', 'rd', 'description')
  53. empty_text = "No VRFs found."
  54. attrs = {
  55. 'class': 'table table-hover',
  56. }
  57. #
  58. # RIRs
  59. #
  60. class RIRTable(tables.Table):
  61. pk = tables.CheckBoxColumn(visible=False, default='')
  62. name = tables.LinkColumn(verbose_name='Name')
  63. aggregate_count = tables.Column(verbose_name='Aggregates')
  64. slug = tables.Column(verbose_name='Slug')
  65. edit = tables.TemplateColumn(template_code=RIR_EDIT_LINK, verbose_name='')
  66. class Meta:
  67. model = RIR
  68. fields = ('pk', 'name', 'aggregate_count', 'slug', 'edit')
  69. empty_text = "No aggregates were found."
  70. attrs = {
  71. 'class': 'table table-hover',
  72. }
  73. #
  74. # Aggregates
  75. #
  76. class AggregateTable(tables.Table):
  77. pk = tables.CheckBoxColumn(visible=False, default='')
  78. prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
  79. rir = tables.Column(verbose_name='RIR')
  80. child_count = tables.Column(verbose_name='Prefixes')
  81. utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
  82. date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
  83. description = tables.Column(sortable=False, verbose_name='Description')
  84. class Meta:
  85. model = Aggregate
  86. fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
  87. empty_text = "No aggregates found."
  88. attrs = {
  89. 'class': 'table table-hover',
  90. }
  91. #
  92. # Roles
  93. #
  94. class RoleTable(tables.Table):
  95. pk = tables.CheckBoxColumn(visible=False, default='')
  96. name = tables.Column(verbose_name='Name')
  97. prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
  98. vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
  99. slug = tables.Column(verbose_name='Slug')
  100. edit = tables.TemplateColumn(template_code=ROLE_EDIT_LINK, verbose_name='')
  101. class Meta:
  102. model = Role
  103. fields = ('pk', 'name', 'prefix_count', 'vlan_count', 'slug', 'edit')
  104. empty_text = "No roles were found."
  105. attrs = {
  106. 'class': 'table table-hover',
  107. }
  108. #
  109. # Prefixes
  110. #
  111. class PrefixTable(tables.Table):
  112. pk = tables.CheckBoxColumn(visible=False, default='')
  113. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  114. prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
  115. vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
  116. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  117. role = tables.Column(verbose_name='Role')
  118. description = tables.Column(sortable=False, verbose_name='Description')
  119. class Meta:
  120. model = Prefix
  121. fields = ('pk', 'prefix', 'status', 'vrf', 'site', 'role', 'description')
  122. empty_text = "No prefixes found."
  123. attrs = {
  124. 'class': 'table table-hover',
  125. }
  126. class PrefixBriefTable(tables.Table):
  127. prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix')
  128. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  129. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  130. role = tables.Column(verbose_name='Role')
  131. class Meta:
  132. model = Prefix
  133. fields = ('prefix', 'status', 'site', 'role')
  134. empty_text = "No prefixes found."
  135. attrs = {
  136. 'class': 'table table-hover',
  137. }
  138. #
  139. # IPAddresses
  140. #
  141. class IPAddressTable(tables.Table):
  142. pk = tables.CheckBoxColumn(visible=False, default='')
  143. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  144. vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
  145. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  146. verbose_name='Device')
  147. interface = tables.Column(orderable=False, verbose_name='Interface')
  148. description = tables.Column(sortable=False, verbose_name='Description')
  149. class Meta:
  150. model = IPAddress
  151. fields = ('pk', 'address', 'vrf', 'device', 'interface', 'description')
  152. empty_text = "No IP addresses found."
  153. attrs = {
  154. 'class': 'table table-hover',
  155. }
  156. class IPAddressBriefTable(tables.Table):
  157. address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
  158. device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
  159. verbose_name='Device')
  160. interface = tables.Column(orderable=False, verbose_name='Interface')
  161. nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False,
  162. verbose_name='NAT (Inside)')
  163. class Meta:
  164. model = IPAddress
  165. fields = ('address', 'device', 'interface', 'nat_inside')
  166. empty_text = "No IP addresses found."
  167. attrs = {
  168. 'class': 'table table-hover',
  169. }
  170. #
  171. # VLANs
  172. #
  173. class VLANTable(tables.Table):
  174. pk = tables.CheckBoxColumn(visible=False, default='')
  175. vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
  176. site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
  177. name = tables.Column(verbose_name='Name')
  178. status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
  179. role = tables.Column(verbose_name='Role')
  180. class Meta:
  181. model = VLAN
  182. fields = ('pk', 'vid', 'site', 'name', 'status', 'role')
  183. empty_text = "No VLANs found."
  184. attrs = {
  185. 'class': 'table table-hover',
  186. }