bulk_edit.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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, JSONField
  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. validation_schema = JSONField(
  88. label=_('Validation schema'),
  89. required=False
  90. )
  91. comments = CommentField()
  92. fieldsets = (
  93. FieldSet('group_name', 'description', 'weight', 'required', 'unique', 'choice_set', name=_('Attributes')),
  94. FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')),
  95. FieldSet(
  96. 'validation_minimum', 'validation_maximum', 'validation_regex', 'validation_schema',
  97. name=_('Validation')
  98. ),
  99. )
  100. nullable_fields = ('group_name', 'description', 'choice_set', 'validation_schema', 'owner', 'comments')
  101. class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  102. pk = forms.ModelMultipleChoiceField(
  103. queryset=CustomFieldChoiceSet.objects.all(),
  104. widget=forms.MultipleHiddenInput
  105. )
  106. base_choices = forms.ChoiceField(
  107. choices=add_blank_choice(CustomFieldChoiceSetBaseChoices),
  108. required=False
  109. )
  110. description = forms.CharField(
  111. required=False
  112. )
  113. order_alphabetically = forms.NullBooleanField(
  114. required=False,
  115. widget=BulkEditNullBooleanSelect()
  116. )
  117. nullable_fields = ('base_choices', 'description')
  118. class CustomLinkBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  119. pk = forms.ModelMultipleChoiceField(
  120. queryset=CustomLink.objects.all(),
  121. widget=forms.MultipleHiddenInput
  122. )
  123. enabled = forms.NullBooleanField(
  124. label=_('Enabled'),
  125. required=False,
  126. widget=BulkEditNullBooleanSelect()
  127. )
  128. new_window = forms.NullBooleanField(
  129. label=_('New window'),
  130. required=False,
  131. widget=BulkEditNullBooleanSelect()
  132. )
  133. weight = forms.IntegerField(
  134. label=_('Weight'),
  135. required=False
  136. )
  137. button_class = forms.ChoiceField(
  138. label=_('Button class'),
  139. choices=add_blank_choice(CustomLinkButtonClassChoices),
  140. required=False
  141. )
  142. class ExportTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  143. pk = forms.ModelMultipleChoiceField(
  144. queryset=ExportTemplate.objects.all(),
  145. widget=forms.MultipleHiddenInput
  146. )
  147. description = forms.CharField(
  148. label=_('Description'),
  149. max_length=200,
  150. required=False
  151. )
  152. mime_type = forms.CharField(
  153. label=_('MIME type'),
  154. max_length=50,
  155. required=False
  156. )
  157. file_name = forms.CharField(
  158. label=_('File name'),
  159. required=False
  160. )
  161. file_extension = forms.CharField(
  162. label=_('File extension'),
  163. max_length=15,
  164. required=False
  165. )
  166. as_attachment = forms.NullBooleanField(
  167. label=_('As attachment'),
  168. required=False,
  169. widget=BulkEditNullBooleanSelect()
  170. )
  171. nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension')
  172. class SavedFilterBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  173. pk = forms.ModelMultipleChoiceField(
  174. queryset=SavedFilter.objects.all(),
  175. widget=forms.MultipleHiddenInput
  176. )
  177. description = forms.CharField(
  178. label=_('Description'),
  179. max_length=200,
  180. required=False
  181. )
  182. weight = forms.IntegerField(
  183. label=_('Weight'),
  184. required=False
  185. )
  186. enabled = forms.NullBooleanField(
  187. label=_('Enabled'),
  188. required=False,
  189. widget=BulkEditNullBooleanSelect()
  190. )
  191. shared = forms.NullBooleanField(
  192. label=_('Shared'),
  193. required=False,
  194. widget=BulkEditNullBooleanSelect()
  195. )
  196. nullable_fields = ('description',)
  197. class TableConfigBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  198. pk = forms.ModelMultipleChoiceField(
  199. queryset=TableConfig.objects.all(),
  200. widget=forms.MultipleHiddenInput
  201. )
  202. description = forms.CharField(
  203. label=_('Description'),
  204. max_length=200,
  205. required=False
  206. )
  207. weight = forms.IntegerField(
  208. label=_('Weight'),
  209. required=False
  210. )
  211. enabled = forms.NullBooleanField(
  212. label=_('Enabled'),
  213. required=False,
  214. widget=BulkEditNullBooleanSelect()
  215. )
  216. shared = forms.NullBooleanField(
  217. label=_('Shared'),
  218. required=False,
  219. widget=BulkEditNullBooleanSelect()
  220. )
  221. nullable_fields = ('description',)
  222. class WebhookBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
  223. model = Webhook
  224. pk = forms.ModelMultipleChoiceField(
  225. queryset=Webhook.objects.all(),
  226. widget=forms.MultipleHiddenInput
  227. )
  228. description = forms.CharField(
  229. label=_('Description'),
  230. max_length=200,
  231. required=False
  232. )
  233. http_method = forms.ChoiceField(
  234. choices=add_blank_choice(WebhookHttpMethodChoices),
  235. required=False,
  236. label=_('HTTP method')
  237. )
  238. payload_url = forms.CharField(
  239. required=False,
  240. label=_('Payload URL')
  241. )
  242. ssl_verification = forms.NullBooleanField(
  243. required=False,
  244. widget=BulkEditNullBooleanSelect(),
  245. label=_('SSL verification')
  246. )
  247. secret = forms.CharField(
  248. label=_('Secret'),
  249. required=False
  250. )
  251. ca_file_path = forms.CharField(
  252. required=False,
  253. label=_('CA file path')
  254. )
  255. nullable_fields = ('secret', 'ca_file_path')
  256. class EventRuleBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
  257. model = EventRule
  258. pk = forms.ModelMultipleChoiceField(
  259. queryset=EventRule.objects.all(),
  260. widget=forms.MultipleHiddenInput
  261. )
  262. enabled = forms.NullBooleanField(
  263. label=_('Enabled'),
  264. required=False,
  265. widget=BulkEditNullBooleanSelect()
  266. )
  267. event_types = forms.MultipleChoiceField(
  268. choices=get_event_type_choices(),
  269. required=False,
  270. label=_('Event types')
  271. )
  272. description = forms.CharField(
  273. label=_('Description'),
  274. max_length=200,
  275. required=False
  276. )
  277. conditions = JSONField(
  278. label=_('Conditions'),
  279. required=False,
  280. help_text=_('Enter conditions in <a href="https://json.org/">JSON</a> format.')
  281. )
  282. nullable_fields = ('description', 'conditions')
  283. class TagBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  284. pk = forms.ModelMultipleChoiceField(
  285. queryset=Tag.objects.all(),
  286. widget=forms.MultipleHiddenInput
  287. )
  288. color = ColorField(
  289. label=_('Color'),
  290. required=False
  291. )
  292. description = forms.CharField(
  293. label=_('Description'),
  294. max_length=200,
  295. required=False
  296. )
  297. weight = forms.IntegerField(
  298. label=_('Weight'),
  299. required=False
  300. )
  301. nullable_fields = ('description',)
  302. class ConfigContextProfileBulkEditForm(PrimaryModelBulkEditForm):
  303. pk = forms.ModelMultipleChoiceField(
  304. queryset=ConfigContextProfile.objects.all(),
  305. widget=forms.MultipleHiddenInput
  306. )
  307. model = ConfigContextProfile
  308. fieldsets = (
  309. FieldSet('description',),
  310. )
  311. nullable_fields = ('description',)
  312. class ConfigContextBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  313. pk = forms.ModelMultipleChoiceField(
  314. queryset=ConfigContext.objects.all(),
  315. widget=forms.MultipleHiddenInput
  316. )
  317. weight = forms.IntegerField(
  318. label=_('Weight'),
  319. required=False,
  320. min_value=0
  321. )
  322. profile = DynamicModelChoiceField(
  323. queryset=ConfigContextProfile.objects.all(),
  324. required=False
  325. )
  326. is_active = forms.NullBooleanField(
  327. label=_('Is active'),
  328. required=False,
  329. widget=BulkEditNullBooleanSelect()
  330. )
  331. description = forms.CharField(
  332. label=_('Description'),
  333. required=False,
  334. max_length=100
  335. )
  336. fieldsets = (
  337. FieldSet('weight', 'profile', 'is_active', 'description'),
  338. )
  339. nullable_fields = ('profile', 'description', 'owner')
  340. class ConfigTemplateBulkEditForm(ChangelogMessageMixin, OwnerMixin, BulkEditForm):
  341. pk = forms.ModelMultipleChoiceField(
  342. queryset=ConfigTemplate.objects.all(),
  343. widget=forms.MultipleHiddenInput
  344. )
  345. description = forms.CharField(
  346. label=_('Description'),
  347. max_length=200,
  348. required=False
  349. )
  350. mime_type = forms.CharField(
  351. label=_('MIME type'),
  352. max_length=50,
  353. required=False
  354. )
  355. file_name = forms.CharField(
  356. label=_('File name'),
  357. required=False
  358. )
  359. file_extension = forms.CharField(
  360. label=_('File extension'),
  361. max_length=15,
  362. required=False
  363. )
  364. as_attachment = forms.NullBooleanField(
  365. label=_('As attachment'),
  366. required=False,
  367. widget=BulkEditNullBooleanSelect()
  368. )
  369. debug = forms.NullBooleanField(
  370. label=_('Debug'),
  371. required=False,
  372. widget=BulkEditNullBooleanSelect()
  373. )
  374. auto_sync_enabled = forms.NullBooleanField(
  375. label=_('Auto sync enabled'),
  376. required=False,
  377. widget=BulkEditNullBooleanSelect()
  378. )
  379. nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension', 'auto_sync_enabled',)
  380. class ImageAttachmentBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  381. pk = forms.ModelMultipleChoiceField(
  382. queryset=ImageAttachment.objects.all(),
  383. widget=forms.MultipleHiddenInput
  384. )
  385. description = forms.CharField(
  386. label=_('Description'),
  387. max_length=200,
  388. required=False
  389. )
  390. class JournalEntryBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  391. pk = forms.ModelMultipleChoiceField(
  392. queryset=JournalEntry.objects.all(),
  393. widget=forms.MultipleHiddenInput
  394. )
  395. kind = forms.ChoiceField(
  396. label=_('Kind'),
  397. choices=add_blank_choice(JournalEntryKindChoices),
  398. required=False
  399. )
  400. comments = CommentField()
  401. class NotificationGroupBulkEditForm(ChangelogMessageMixin, BulkEditForm):
  402. pk = forms.ModelMultipleChoiceField(
  403. queryset=NotificationGroup.objects.all(),
  404. widget=forms.MultipleHiddenInput
  405. )
  406. description = forms.CharField(
  407. label=_('Description'),
  408. max_length=200,
  409. required=False
  410. )
  411. nullable_fields = ('description',)