models.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. from django import forms
  2. from django.contrib.contenttypes.models import ContentType
  3. from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup
  4. from extras.choices import *
  5. from extras.models import *
  6. from extras.utils import FeatureQuery
  7. from tenancy.models import Tenant, TenantGroup
  8. from utilities.forms import (
  9. add_blank_choice, BootstrapMixin, CommentField, ContentTypeChoiceField,
  10. ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect,
  11. )
  12. from virtualization.models import Cluster, ClusterGroup
  13. __all__ = (
  14. 'AddRemoveTagsForm',
  15. 'ConfigContextForm',
  16. 'CustomFieldForm',
  17. 'CustomLinkForm',
  18. 'ExportTemplateForm',
  19. 'ImageAttachmentForm',
  20. 'JournalEntryForm',
  21. 'TagForm',
  22. 'WebhookForm',
  23. )
  24. class CustomFieldForm(BootstrapMixin, forms.ModelForm):
  25. content_types = ContentTypeMultipleChoiceField(
  26. queryset=ContentType.objects.all(),
  27. limit_choices_to=FeatureQuery('custom_fields')
  28. )
  29. class Meta:
  30. model = CustomField
  31. fields = '__all__'
  32. fieldsets = (
  33. ('Custom Field', ('name', 'label', 'type', 'weight', 'required', 'description')),
  34. ('Assigned Models', ('content_types',)),
  35. ('Behavior', ('filter_logic',)),
  36. ('Values', ('default', 'choices')),
  37. ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')),
  38. )
  39. class CustomLinkForm(BootstrapMixin, forms.ModelForm):
  40. content_type = ContentTypeChoiceField(
  41. queryset=ContentType.objects.all(),
  42. limit_choices_to=FeatureQuery('custom_links')
  43. )
  44. class Meta:
  45. model = CustomLink
  46. fields = '__all__'
  47. fieldsets = (
  48. ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window')),
  49. ('Templates', ('link_text', 'link_url')),
  50. )
  51. widgets = {
  52. 'link_text': forms.Textarea(attrs={'class': 'font-monospace'}),
  53. 'link_url': forms.Textarea(attrs={'class': 'font-monospace'}),
  54. }
  55. help_texts = {
  56. 'link_text': 'Jinja2 template code for the link text. Reference the object as <code>{{ obj }}</code>. '
  57. 'Links which render as empty text will not be displayed.',
  58. 'link_url': 'Jinja2 template code for the link URL. Reference the object as <code>{{ obj }}</code>.',
  59. }
  60. class ExportTemplateForm(BootstrapMixin, forms.ModelForm):
  61. content_type = ContentTypeChoiceField(
  62. queryset=ContentType.objects.all(),
  63. limit_choices_to=FeatureQuery('custom_links')
  64. )
  65. class Meta:
  66. model = ExportTemplate
  67. fields = '__all__'
  68. fieldsets = (
  69. ('Custom Link', ('name', 'content_type', 'description')),
  70. ('Template', ('template_code',)),
  71. ('Rendering', ('mime_type', 'file_extension', 'as_attachment')),
  72. )
  73. widgets = {
  74. 'template_code': forms.Textarea(attrs={'class': 'font-monospace'}),
  75. }
  76. class WebhookForm(BootstrapMixin, forms.ModelForm):
  77. content_types = ContentTypeMultipleChoiceField(
  78. queryset=ContentType.objects.all(),
  79. limit_choices_to=FeatureQuery('webhooks')
  80. )
  81. class Meta:
  82. model = Webhook
  83. fields = '__all__'
  84. fieldsets = (
  85. ('Webhook', ('name', 'enabled')),
  86. ('Assigned Models', ('content_types',)),
  87. ('Events', ('type_create', 'type_update', 'type_delete')),
  88. ('HTTP Request', (
  89. 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret',
  90. )),
  91. ('SSL', ('ssl_verification', 'ca_file_path')),
  92. )
  93. widgets = {
  94. 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}),
  95. 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}),
  96. }
  97. class TagForm(BootstrapMixin, forms.ModelForm):
  98. slug = SlugField()
  99. class Meta:
  100. model = Tag
  101. fields = [
  102. 'name', 'slug', 'color', 'description'
  103. ]
  104. fieldsets = (
  105. ('Tag', ('name', 'slug', 'color', 'description')),
  106. )
  107. class AddRemoveTagsForm(forms.Form):
  108. def __init__(self, *args, **kwargs):
  109. super().__init__(*args, **kwargs)
  110. # Add add/remove tags fields
  111. self.fields['add_tags'] = DynamicModelMultipleChoiceField(
  112. queryset=Tag.objects.all(),
  113. required=False
  114. )
  115. self.fields['remove_tags'] = DynamicModelMultipleChoiceField(
  116. queryset=Tag.objects.all(),
  117. required=False
  118. )
  119. class ConfigContextForm(BootstrapMixin, forms.ModelForm):
  120. regions = DynamicModelMultipleChoiceField(
  121. queryset=Region.objects.all(),
  122. required=False
  123. )
  124. site_groups = DynamicModelMultipleChoiceField(
  125. queryset=SiteGroup.objects.all(),
  126. required=False
  127. )
  128. sites = DynamicModelMultipleChoiceField(
  129. queryset=Site.objects.all(),
  130. required=False
  131. )
  132. device_types = DynamicModelMultipleChoiceField(
  133. queryset=DeviceType.objects.all(),
  134. required=False
  135. )
  136. roles = DynamicModelMultipleChoiceField(
  137. queryset=DeviceRole.objects.all(),
  138. required=False
  139. )
  140. platforms = DynamicModelMultipleChoiceField(
  141. queryset=Platform.objects.all(),
  142. required=False
  143. )
  144. cluster_groups = DynamicModelMultipleChoiceField(
  145. queryset=ClusterGroup.objects.all(),
  146. required=False
  147. )
  148. clusters = DynamicModelMultipleChoiceField(
  149. queryset=Cluster.objects.all(),
  150. required=False
  151. )
  152. tenant_groups = DynamicModelMultipleChoiceField(
  153. queryset=TenantGroup.objects.all(),
  154. required=False
  155. )
  156. tenants = DynamicModelMultipleChoiceField(
  157. queryset=Tenant.objects.all(),
  158. required=False
  159. )
  160. tags = DynamicModelMultipleChoiceField(
  161. queryset=Tag.objects.all(),
  162. required=False
  163. )
  164. data = JSONField(
  165. label=''
  166. )
  167. class Meta:
  168. model = ConfigContext
  169. fields = (
  170. 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', 'roles', 'device_types',
  171. 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data',
  172. )
  173. class ImageAttachmentForm(BootstrapMixin, forms.ModelForm):
  174. class Meta:
  175. model = ImageAttachment
  176. fields = [
  177. 'name', 'image',
  178. ]
  179. class JournalEntryForm(BootstrapMixin, forms.ModelForm):
  180. comments = CommentField()
  181. kind = forms.ChoiceField(
  182. choices=add_blank_choice(JournalEntryKindChoices),
  183. required=False,
  184. widget=StaticSelect()
  185. )
  186. class Meta:
  187. model = JournalEntry
  188. fields = ['assigned_object_type', 'assigned_object_id', 'kind', 'comments']
  189. widgets = {
  190. 'assigned_object_type': forms.HiddenInput,
  191. 'assigned_object_id': forms.HiddenInput,
  192. }