admin.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. from django import forms
  2. from django.contrib import admin
  3. from netbox.admin import admin_site
  4. from utilities.forms import LaxURLField
  5. from .models import (
  6. CustomField, CustomFieldChoice, CustomLink, Graph, ExportTemplate, ReportResult, TopologyMap, Webhook,
  7. )
  8. from .reports import get_report
  9. def order_content_types(field):
  10. """
  11. Order the list of available ContentTypes by application
  12. """
  13. queryset = field.queryset.order_by('app_label', 'model')
  14. field.choices = [(ct.pk, '{} > {}'.format(ct.app_label, ct.name)) for ct in queryset]
  15. #
  16. # Webhooks
  17. #
  18. class WebhookForm(forms.ModelForm):
  19. payload_url = LaxURLField(
  20. label='URL'
  21. )
  22. class Meta:
  23. model = Webhook
  24. exclude = []
  25. def __init__(self, *args, **kwargs):
  26. super().__init__(*args, **kwargs)
  27. if 'obj_type' in self.fields:
  28. order_content_types(self.fields['obj_type'])
  29. @admin.register(Webhook, site=admin_site)
  30. class WebhookAdmin(admin.ModelAdmin):
  31. list_display = [
  32. 'name', 'models', 'payload_url', 'http_content_type', 'enabled', 'type_create', 'type_update',
  33. 'type_delete', 'ssl_verification',
  34. ]
  35. list_filter = [
  36. 'enabled', 'type_create', 'type_update', 'type_delete', 'obj_type',
  37. ]
  38. form = WebhookForm
  39. def models(self, obj):
  40. return ', '.join([ct.name for ct in obj.obj_type.all()])
  41. #
  42. # Custom fields
  43. #
  44. class CustomFieldForm(forms.ModelForm):
  45. class Meta:
  46. model = CustomField
  47. exclude = []
  48. def __init__(self, *args, **kwargs):
  49. super().__init__(*args, **kwargs)
  50. order_content_types(self.fields['obj_type'])
  51. class CustomFieldChoiceAdmin(admin.TabularInline):
  52. model = CustomFieldChoice
  53. extra = 5
  54. @admin.register(CustomField, site=admin_site)
  55. class CustomFieldAdmin(admin.ModelAdmin):
  56. inlines = [CustomFieldChoiceAdmin]
  57. list_display = [
  58. 'name', 'models', 'type', 'required', 'filter_logic', 'default', 'weight', 'description',
  59. ]
  60. list_filter = [
  61. 'type', 'required', 'obj_type',
  62. ]
  63. form = CustomFieldForm
  64. def models(self, obj):
  65. return ', '.join([ct.name for ct in obj.obj_type.all()])
  66. #
  67. # Custom links
  68. #
  69. class CustomLinkForm(forms.ModelForm):
  70. class Meta:
  71. model = CustomLink
  72. exclude = []
  73. widgets = {
  74. 'text': forms.Textarea,
  75. 'url': forms.Textarea,
  76. }
  77. help_texts = {
  78. 'text': 'Jinja2 template code for the link text. Reference the object as <code>{{ obj }}</code>. Links '
  79. 'which render as empty text will not be displayed.',
  80. 'url': 'Jinja2 template code for the link URL. Reference the object as <code>{{ obj }}</code>.',
  81. }
  82. def __init__(self, *args, **kwargs):
  83. super().__init__(*args, **kwargs)
  84. # Format ContentType choices
  85. order_content_types(self.fields['content_type'])
  86. self.fields['content_type'].choices.insert(0, ('', '---------'))
  87. @admin.register(CustomLink, site=admin_site)
  88. class CustomLinkAdmin(admin.ModelAdmin):
  89. list_display = [
  90. 'name', 'content_type', 'group_name', 'weight',
  91. ]
  92. list_filter = [
  93. 'content_type',
  94. ]
  95. form = CustomLinkForm
  96. #
  97. # Graphs
  98. #
  99. @admin.register(Graph, site=admin_site)
  100. class GraphAdmin(admin.ModelAdmin):
  101. list_display = [
  102. 'name', 'type', 'weight', 'source',
  103. ]
  104. list_filter = [
  105. 'type',
  106. ]
  107. #
  108. # Export templates
  109. #
  110. class ExportTemplateForm(forms.ModelForm):
  111. class Meta:
  112. model = ExportTemplate
  113. exclude = []
  114. def __init__(self, *args, **kwargs):
  115. super().__init__(*args, **kwargs)
  116. # Format ContentType choices
  117. order_content_types(self.fields['content_type'])
  118. self.fields['content_type'].choices.insert(0, ('', '---------'))
  119. @admin.register(ExportTemplate, site=admin_site)
  120. class ExportTemplateAdmin(admin.ModelAdmin):
  121. list_display = [
  122. 'name', 'content_type', 'description', 'mime_type', 'file_extension',
  123. ]
  124. list_filter = [
  125. 'content_type',
  126. ]
  127. form = ExportTemplateForm
  128. #
  129. # Reports
  130. #
  131. @admin.register(ReportResult, site=admin_site)
  132. class ReportResultAdmin(admin.ModelAdmin):
  133. list_display = [
  134. 'report', 'active', 'created', 'user', 'passing',
  135. ]
  136. fields = [
  137. 'report', 'user', 'passing', 'data',
  138. ]
  139. list_filter = [
  140. 'failed',
  141. ]
  142. readonly_fields = fields
  143. def has_add_permission(self, request):
  144. return False
  145. def active(self, obj):
  146. module, report_name = obj.report.split('.')
  147. return True if get_report(module, report_name) else False
  148. active.boolean = True
  149. def passing(self, obj):
  150. return not obj.failed
  151. passing.boolean = True
  152. #
  153. # Topology maps
  154. #
  155. @admin.register(TopologyMap, site=admin_site)
  156. class TopologyMapAdmin(admin.ModelAdmin):
  157. list_display = ['name', 'slug', 'site']
  158. prepopulated_fields = {
  159. 'slug': ['name'],
  160. }