bulk_edit.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. from django import forms
  2. from django.utils.translation import gettext_lazy as _
  3. from extras.choices import *
  4. from extras.models import *
  5. from netbox.events import get_event_type_choices
  6. from netbox.forms import NetBoxModelBulkEditForm, PrimaryModelBulkEditForm
  7. from netbox.forms.mixins import ChangelogMessageMixin, OwnerMixin
  8. from utilities.forms import BulkEditForm, add_blank_choice
  9. from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField
  10. from utilities.forms.rendering import FieldSet
  11. from utilities.forms.widgets import BulkEditNullBooleanSelect
  12. __all__ = (
  13. 'ConfigContextBulkEditForm',
  14. 'ConfigContextProfileBulkEditForm',
  15. 'ConfigTemplateBulkEditForm',
  16. 'CustomFieldBulkEditForm',
  17. 'CustomFieldChoiceSetBulkEditForm',
  18. 'CustomLinkBulkEditForm',
  19. 'EventRuleBulkEditForm',
  20. 'ExportTemplateBulkEditForm',
  21. 'ImageAttachmentBulkEditForm',
  22. 'JournalEntryBulkEditForm',
  23. 'NotificationGroupBulkEditForm',
  24. 'SavedFilterBulkEditForm',
  25. 'TableConfigBulkEditForm',
  26. 'TagBulkEditForm',
  27. 'WebhookBulkEditForm',
  28. )
  29. class CustomFieldBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  30. pk = forms.ModelMultipleChoiceField(
  31. queryset=CustomField.objects.all(),
  32. widget=forms.MultipleHiddenInput
  33. )
  34. group_name = forms.CharField(
  35. label=_('Group name'),
  36. required=False
  37. )
  38. description = forms.CharField(
  39. label=_('Description'),
  40. required=False
  41. )
  42. required = forms.NullBooleanField(
  43. label=_('Required'),
  44. required=False,
  45. widget=BulkEditNullBooleanSelect()
  46. )
  47. unique = forms.NullBooleanField(
  48. label=_('Must be unique'),
  49. required=False,
  50. widget=BulkEditNullBooleanSelect()
  51. )
  52. weight = forms.IntegerField(
  53. label=_('Weight'),
  54. required=False
  55. )
  56. choice_set = DynamicModelChoiceField(
  57. queryset=CustomFieldChoiceSet.objects.all(),
  58. required=False
  59. )
  60. ui_visible = forms.ChoiceField(
  61. label=_("UI visible"),
  62. choices=add_blank_choice(CustomFieldUIVisibleChoices),
  63. required=False
  64. )
  65. ui_editable = forms.ChoiceField(
  66. label=_("UI editable"),
  67. choices=add_blank_choice(CustomFieldUIEditableChoices),
  68. required=False
  69. )
  70. is_cloneable = forms.NullBooleanField(
  71. label=_('Is cloneable'),
  72. required=False,
  73. widget=BulkEditNullBooleanSelect()
  74. )
  75. validation_minimum = forms.DecimalField(
  76. label=_('Minimum value'),
  77. required=False,
  78. )
  79. validation_maximum = forms.DecimalField(
  80. label=_('Maximum value'),
  81. required=False,
  82. )
  83. validation_regex = forms.CharField(
  84. label=_('Validation regex'),
  85. required=False
  86. )
  87. comments = CommentField()
  88. fieldsets = (
  89. FieldSet('group_name', 'description', 'weight', 'required', 'unique', 'choice_set', name=_('Attributes')),
  90. FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')),
  91. FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')),
  92. )
  93. nullable_fields = ('group_name', 'description', 'choice_set')
  94. class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  95. pk = forms.ModelMultipleChoiceField(
  96. queryset=CustomFieldChoiceSet.objects.all(),
  97. widget=forms.MultipleHiddenInput
  98. )
  99. base_choices = forms.ChoiceField(
  100. choices=add_blank_choice(CustomFieldChoiceSetBaseChoices),
  101. required=False
  102. )
  103. description = forms.CharField(
  104. required=False
  105. )
  106. order_alphabetically = forms.NullBooleanField(
  107. required=False,
  108. widget=BulkEditNullBooleanSelect()
  109. )
  110. nullable_fields = ('base_choices', 'description')
  111. class CustomLinkBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  112. pk = forms.ModelMultipleChoiceField(
  113. queryset=CustomLink.objects.all(),
  114. widget=forms.MultipleHiddenInput
  115. )
  116. enabled = forms.NullBooleanField(
  117. label=_('Enabled'),
  118. required=False,
  119. widget=BulkEditNullBooleanSelect()
  120. )
  121. new_window = forms.NullBooleanField(
  122. label=_('New window'),
  123. required=False,
  124. widget=BulkEditNullBooleanSelect()
  125. )
  126. weight = forms.IntegerField(
  127. label=_('Weight'),
  128. required=False
  129. )
  130. button_class = forms.ChoiceField(
  131. label=_('Button class'),
  132. choices=add_blank_choice(CustomLinkButtonClassChoices),
  133. required=False
  134. )
  135. class ExportTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  136. pk = forms.ModelMultipleChoiceField(
  137. queryset=ExportTemplate.objects.all(),
  138. widget=forms.MultipleHiddenInput
  139. )
  140. description = forms.CharField(
  141. label=_('Description'),
  142. max_length=200,
  143. required=False
  144. )
  145. mime_type = forms.CharField(
  146. label=_('MIME type'),
  147. max_length=50,
  148. required=False
  149. )
  150. file_name = forms.CharField(
  151. label=_('File name'),
  152. required=False
  153. )
  154. file_extension = forms.CharField(
  155. label=_('File extension'),
  156. max_length=15,
  157. required=False
  158. )
  159. as_attachment = forms.NullBooleanField(
  160. label=_('As attachment'),
  161. required=False,
  162. widget=BulkEditNullBooleanSelect()
  163. )
  164. nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension')
  165. class SavedFilterBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  166. pk = forms.ModelMultipleChoiceField(
  167. queryset=SavedFilter.objects.all(),
  168. widget=forms.MultipleHiddenInput
  169. )
  170. description = forms.CharField(
  171. label=_('Description'),
  172. max_length=200,
  173. required=False
  174. )
  175. weight = forms.IntegerField(
  176. label=_('Weight'),
  177. required=False
  178. )
  179. enabled = forms.NullBooleanField(
  180. label=_('Enabled'),
  181. required=False,
  182. widget=BulkEditNullBooleanSelect()
  183. )
  184. shared = forms.NullBooleanField(
  185. label=_('Shared'),
  186. required=False,
  187. widget=BulkEditNullBooleanSelect()
  188. )
  189. nullable_fields = ('description',)
  190. class TableConfigBulkEditForm(BulkEditForm):
  191. pk = forms.ModelMultipleChoiceField(
  192. queryset=TableConfig.objects.all(),
  193. widget=forms.MultipleHiddenInput
  194. )
  195. description = forms.CharField(
  196. label=_('Description'),
  197. max_length=200,
  198. required=False
  199. )
  200. weight = forms.IntegerField(
  201. label=_('Weight'),
  202. required=False
  203. )
  204. enabled = forms.NullBooleanField(
  205. label=_('Enabled'),
  206. required=False,
  207. widget=BulkEditNullBooleanSelect()
  208. )
  209. shared = forms.NullBooleanField(
  210. label=_('Shared'),
  211. required=False,
  212. widget=BulkEditNullBooleanSelect()
  213. )
  214. nullable_fields = ('description',)
  215. class WebhookBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
  216. model = Webhook
  217. pk = forms.ModelMultipleChoiceField(
  218. queryset=Webhook.objects.all(),
  219. widget=forms.MultipleHiddenInput
  220. )
  221. description = forms.CharField(
  222. label=_('Description'),
  223. max_length=200,
  224. required=False
  225. )
  226. http_method = forms.ChoiceField(
  227. choices=add_blank_choice(WebhookHttpMethodChoices),
  228. required=False,
  229. label=_('HTTP method')
  230. )
  231. payload_url = forms.CharField(
  232. required=False,
  233. label=_('Payload URL')
  234. )
  235. ssl_verification = forms.NullBooleanField(
  236. required=False,
  237. widget=BulkEditNullBooleanSelect(),
  238. label=_('SSL verification')
  239. )
  240. secret = forms.CharField(
  241. label=_('Secret'),
  242. required=False
  243. )
  244. ca_file_path = forms.CharField(
  245. required=False,
  246. label=_('CA file path')
  247. )
  248. nullable_fields = ('secret', 'ca_file_path')
  249. class EventRuleBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
  250. model = EventRule
  251. pk = forms.ModelMultipleChoiceField(
  252. queryset=EventRule.objects.all(),
  253. widget=forms.MultipleHiddenInput
  254. )
  255. enabled = forms.NullBooleanField(
  256. label=_('Enabled'),
  257. required=False,
  258. widget=BulkEditNullBooleanSelect()
  259. )
  260. event_types = forms.MultipleChoiceField(
  261. choices=get_event_type_choices(),
  262. required=False,
  263. label=_('Event types')
  264. )
  265. description = forms.CharField(
  266. label=_('Description'),
  267. max_length=200,
  268. required=False
  269. )
  270. nullable_fields = ('description', 'conditions')
  271. class TagBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  272. pk = forms.ModelMultipleChoiceField(
  273. queryset=Tag.objects.all(),
  274. widget=forms.MultipleHiddenInput
  275. )
  276. color = ColorField(
  277. label=_('Color'),
  278. required=False
  279. )
  280. description = forms.CharField(
  281. label=_('Description'),
  282. max_length=200,
  283. required=False
  284. )
  285. weight = forms.IntegerField(
  286. label=_('Weight'),
  287. required=False
  288. )
  289. nullable_fields = ('description',)
  290. class ConfigContextProfileBulkEditForm(PrimaryModelBulkEditForm):
  291. pk = forms.ModelMultipleChoiceField(
  292. queryset=ConfigContextProfile.objects.all(),
  293. widget=forms.MultipleHiddenInput
  294. )
  295. model = ConfigContextProfile
  296. fieldsets = (
  297. FieldSet('description',),
  298. )
  299. nullable_fields = ('description',)
  300. class ConfigContextBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  301. pk = forms.ModelMultipleChoiceField(
  302. queryset=ConfigContext.objects.all(),
  303. widget=forms.MultipleHiddenInput
  304. )
  305. weight = forms.IntegerField(
  306. label=_('Weight'),
  307. required=False,
  308. min_value=0
  309. )
  310. profile = DynamicModelChoiceField(
  311. queryset=ConfigContextProfile.objects.all(),
  312. required=False
  313. )
  314. is_active = forms.NullBooleanField(
  315. label=_('Is active'),
  316. required=False,
  317. widget=BulkEditNullBooleanSelect()
  318. )
  319. description = forms.CharField(
  320. label=_('Description'),
  321. required=False,
  322. max_length=100
  323. )
  324. fieldsets = (
  325. FieldSet('weight', 'profile', 'is_active', 'description'),
  326. )
  327. nullable_fields = ('profile', 'description')
  328. class ConfigTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  329. pk = forms.ModelMultipleChoiceField(
  330. queryset=ConfigTemplate.objects.all(),
  331. widget=forms.MultipleHiddenInput
  332. )
  333. description = forms.CharField(
  334. label=_('Description'),
  335. max_length=200,
  336. required=False
  337. )
  338. mime_type = forms.CharField(
  339. label=_('MIME type'),
  340. max_length=50,
  341. required=False
  342. )
  343. file_name = forms.CharField(
  344. label=_('File name'),
  345. required=False
  346. )
  347. file_extension = forms.CharField(
  348. label=_('File extension'),
  349. max_length=15,
  350. required=False
  351. )
  352. as_attachment = forms.NullBooleanField(
  353. label=_('As attachment'),
  354. required=False,
  355. widget=BulkEditNullBooleanSelect()
  356. )
  357. nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension')
  358. class ImageAttachmentBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  359. pk = forms.ModelMultipleChoiceField(
  360. queryset=ImageAttachment.objects.all(),
  361. widget=forms.MultipleHiddenInput
  362. )
  363. description = forms.CharField(
  364. label=_('Description'),
  365. max_length=200,
  366. required=False
  367. )
  368. class JournalEntryBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  369. pk = forms.ModelMultipleChoiceField(
  370. queryset=JournalEntry.objects.all(),
  371. widget=forms.MultipleHiddenInput
  372. )
  373. kind = forms.ChoiceField(
  374. label=_('Kind'),
  375. choices=add_blank_choice(JournalEntryKindChoices),
  376. required=False
  377. )
  378. comments = CommentField()
  379. class NotificationGroupBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  380. pk = forms.ModelMultipleChoiceField(
  381. queryset=NotificationGroup.objects.all(),
  382. widget=forms.MultipleHiddenInput
  383. )
  384. description = forms.CharField(
  385. label=_('Description'),
  386. max_length=200,
  387. required=False
  388. )
  389. nullable_fields = ('description',)