bulk_edit.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. from django import forms
  2. from dcim.models import Region, Site, SiteGroup
  3. from ipam.choices import *
  4. from ipam.constants import *
  5. from ipam.models import *
  6. from ipam.models import ASN
  7. from netbox.forms import NetBoxModelBulkEditForm
  8. from tenancy.models import Tenant
  9. from utilities.forms import (
  10. add_blank_choice, BulkEditNullBooleanSelect, DatePicker, DynamicModelChoiceField, NumericArrayField, StaticSelect,
  11. DynamicModelMultipleChoiceField,
  12. )
  13. __all__ = (
  14. 'AggregateBulkEditForm',
  15. 'ASNBulkEditForm',
  16. 'FHRPGroupBulkEditForm',
  17. 'IPAddressBulkEditForm',
  18. 'IPRangeBulkEditForm',
  19. 'L2VPNBulkEditForm',
  20. 'L2VPNTerminationBulkEditForm',
  21. 'PrefixBulkEditForm',
  22. 'RIRBulkEditForm',
  23. 'RoleBulkEditForm',
  24. 'RouteTargetBulkEditForm',
  25. 'ServiceBulkEditForm',
  26. 'ServiceTemplateBulkEditForm',
  27. 'VLANBulkEditForm',
  28. 'VLANGroupBulkEditForm',
  29. 'VRFBulkEditForm',
  30. )
  31. class VRFBulkEditForm(NetBoxModelBulkEditForm):
  32. tenant = DynamicModelChoiceField(
  33. queryset=Tenant.objects.all(),
  34. required=False
  35. )
  36. enforce_unique = forms.NullBooleanField(
  37. required=False,
  38. widget=BulkEditNullBooleanSelect(),
  39. label='Enforce unique space'
  40. )
  41. description = forms.CharField(
  42. max_length=100,
  43. required=False
  44. )
  45. model = VRF
  46. fieldsets = (
  47. (None, ('tenant', 'enforce_unique', 'description')),
  48. )
  49. nullable_fields = ('tenant', 'description')
  50. class RouteTargetBulkEditForm(NetBoxModelBulkEditForm):
  51. tenant = DynamicModelChoiceField(
  52. queryset=Tenant.objects.all(),
  53. required=False
  54. )
  55. description = forms.CharField(
  56. max_length=200,
  57. required=False
  58. )
  59. model = RouteTarget
  60. fieldsets = (
  61. (None, ('tenant', 'description')),
  62. )
  63. nullable_fields = ('tenant', 'description')
  64. class RIRBulkEditForm(NetBoxModelBulkEditForm):
  65. is_private = forms.NullBooleanField(
  66. required=False,
  67. widget=BulkEditNullBooleanSelect
  68. )
  69. description = forms.CharField(
  70. max_length=200,
  71. required=False
  72. )
  73. model = RIR
  74. fieldsets = (
  75. (None, ('is_private', 'description')),
  76. )
  77. nullable_fields = ('is_private', 'description')
  78. class ASNBulkEditForm(NetBoxModelBulkEditForm):
  79. sites = DynamicModelMultipleChoiceField(
  80. queryset=Site.objects.all(),
  81. required=False
  82. )
  83. rir = DynamicModelChoiceField(
  84. queryset=RIR.objects.all(),
  85. required=False,
  86. label='RIR'
  87. )
  88. tenant = DynamicModelChoiceField(
  89. queryset=Tenant.objects.all(),
  90. required=False
  91. )
  92. description = forms.CharField(
  93. max_length=100,
  94. required=False
  95. )
  96. model = ASN
  97. fieldsets = (
  98. (None, ('sites', 'rir', 'tenant', 'description')),
  99. )
  100. nullable_fields = ('date_added', 'description')
  101. class AggregateBulkEditForm(NetBoxModelBulkEditForm):
  102. rir = DynamicModelChoiceField(
  103. queryset=RIR.objects.all(),
  104. required=False,
  105. label='RIR'
  106. )
  107. tenant = DynamicModelChoiceField(
  108. queryset=Tenant.objects.all(),
  109. required=False
  110. )
  111. date_added = forms.DateField(
  112. required=False
  113. )
  114. description = forms.CharField(
  115. max_length=100,
  116. required=False
  117. )
  118. model = Aggregate
  119. fieldsets = (
  120. (None, ('rir', 'tenant', 'date_added', 'description')),
  121. )
  122. nullable_fields = ('date_added', 'description')
  123. class RoleBulkEditForm(NetBoxModelBulkEditForm):
  124. weight = forms.IntegerField(
  125. required=False
  126. )
  127. description = forms.CharField(
  128. max_length=200,
  129. required=False
  130. )
  131. model = Role
  132. fieldsets = (
  133. (None, ('weight', 'description')),
  134. )
  135. nullable_fields = ('description',)
  136. class PrefixBulkEditForm(NetBoxModelBulkEditForm):
  137. region = DynamicModelChoiceField(
  138. queryset=Region.objects.all(),
  139. required=False
  140. )
  141. site_group = DynamicModelChoiceField(
  142. queryset=SiteGroup.objects.all(),
  143. required=False
  144. )
  145. site = DynamicModelChoiceField(
  146. queryset=Site.objects.all(),
  147. required=False,
  148. query_params={
  149. 'region_id': '$region',
  150. 'group_id': '$site_group',
  151. }
  152. )
  153. vrf = DynamicModelChoiceField(
  154. queryset=VRF.objects.all(),
  155. required=False,
  156. label='VRF'
  157. )
  158. prefix_length = forms.IntegerField(
  159. min_value=PREFIX_LENGTH_MIN,
  160. max_value=PREFIX_LENGTH_MAX,
  161. required=False
  162. )
  163. tenant = DynamicModelChoiceField(
  164. queryset=Tenant.objects.all(),
  165. required=False
  166. )
  167. status = forms.ChoiceField(
  168. choices=add_blank_choice(PrefixStatusChoices),
  169. required=False,
  170. widget=StaticSelect()
  171. )
  172. role = DynamicModelChoiceField(
  173. queryset=Role.objects.all(),
  174. required=False
  175. )
  176. is_pool = forms.NullBooleanField(
  177. required=False,
  178. widget=BulkEditNullBooleanSelect(),
  179. label='Is a pool'
  180. )
  181. mark_utilized = forms.NullBooleanField(
  182. required=False,
  183. widget=BulkEditNullBooleanSelect(),
  184. label='Treat as 100% utilized'
  185. )
  186. description = forms.CharField(
  187. max_length=100,
  188. required=False
  189. )
  190. model = Prefix
  191. fieldsets = (
  192. (None, ('tenant', 'status', 'role', 'description')),
  193. ('Site', ('region', 'site_group', 'site')),
  194. ('Addressing', ('vrf', 'prefix_length', 'is_pool', 'mark_utilized')),
  195. )
  196. nullable_fields = (
  197. 'site', 'vrf', 'tenant', 'role', 'description',
  198. )
  199. class IPRangeBulkEditForm(NetBoxModelBulkEditForm):
  200. vrf = DynamicModelChoiceField(
  201. queryset=VRF.objects.all(),
  202. required=False,
  203. label='VRF'
  204. )
  205. tenant = DynamicModelChoiceField(
  206. queryset=Tenant.objects.all(),
  207. required=False
  208. )
  209. status = forms.ChoiceField(
  210. choices=add_blank_choice(IPRangeStatusChoices),
  211. required=False,
  212. widget=StaticSelect()
  213. )
  214. role = DynamicModelChoiceField(
  215. queryset=Role.objects.all(),
  216. required=False
  217. )
  218. description = forms.CharField(
  219. max_length=100,
  220. required=False
  221. )
  222. model = IPRange
  223. fieldsets = (
  224. (None, ('status', 'role', 'vrf', 'tenant', 'description')),
  225. )
  226. nullable_fields = (
  227. 'vrf', 'tenant', 'role', 'description',
  228. )
  229. class IPAddressBulkEditForm(NetBoxModelBulkEditForm):
  230. vrf = DynamicModelChoiceField(
  231. queryset=VRF.objects.all(),
  232. required=False,
  233. label='VRF'
  234. )
  235. mask_length = forms.IntegerField(
  236. min_value=IPADDRESS_MASK_LENGTH_MIN,
  237. max_value=IPADDRESS_MASK_LENGTH_MAX,
  238. required=False
  239. )
  240. tenant = DynamicModelChoiceField(
  241. queryset=Tenant.objects.all(),
  242. required=False
  243. )
  244. status = forms.ChoiceField(
  245. choices=add_blank_choice(IPAddressStatusChoices),
  246. required=False,
  247. widget=StaticSelect()
  248. )
  249. role = forms.ChoiceField(
  250. choices=add_blank_choice(IPAddressRoleChoices),
  251. required=False,
  252. widget=StaticSelect()
  253. )
  254. dns_name = forms.CharField(
  255. max_length=255,
  256. required=False,
  257. label='DNS name'
  258. )
  259. description = forms.CharField(
  260. max_length=100,
  261. required=False
  262. )
  263. model = IPAddress
  264. fieldsets = (
  265. (None, ('status', 'role', 'tenant', 'description')),
  266. ('Addressing', ('vrf', 'mask_length', 'dns_name')),
  267. )
  268. nullable_fields = (
  269. 'vrf', 'role', 'tenant', 'dns_name', 'description',
  270. )
  271. class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm):
  272. protocol = forms.ChoiceField(
  273. choices=add_blank_choice(FHRPGroupProtocolChoices),
  274. required=False,
  275. widget=StaticSelect()
  276. )
  277. group_id = forms.IntegerField(
  278. min_value=0,
  279. required=False,
  280. label='Group ID'
  281. )
  282. auth_type = forms.ChoiceField(
  283. choices=add_blank_choice(FHRPGroupAuthTypeChoices),
  284. required=False,
  285. widget=StaticSelect(),
  286. label='Authentication type'
  287. )
  288. auth_key = forms.CharField(
  289. max_length=255,
  290. required=False,
  291. label='Authentication key'
  292. )
  293. description = forms.CharField(
  294. max_length=200,
  295. required=False
  296. )
  297. model = FHRPGroup
  298. fieldsets = (
  299. (None, ('protocol', 'group_id', 'description')),
  300. ('Authentication', ('auth_type', 'auth_key')),
  301. )
  302. nullable_fields = ('auth_type', 'auth_key', 'description')
  303. class VLANGroupBulkEditForm(NetBoxModelBulkEditForm):
  304. site = DynamicModelChoiceField(
  305. queryset=Site.objects.all(),
  306. required=False
  307. )
  308. min_vid = forms.IntegerField(
  309. min_value=VLAN_VID_MIN,
  310. max_value=VLAN_VID_MAX,
  311. required=False,
  312. label='Minimum child VLAN VID'
  313. )
  314. max_vid = forms.IntegerField(
  315. min_value=VLAN_VID_MIN,
  316. max_value=VLAN_VID_MAX,
  317. required=False,
  318. label='Maximum child VLAN VID'
  319. )
  320. description = forms.CharField(
  321. max_length=200,
  322. required=False
  323. )
  324. model = VLANGroup
  325. fieldsets = (
  326. (None, ('site', 'min_vid', 'max_vid', 'description')),
  327. )
  328. nullable_fields = ('site', 'description')
  329. class VLANBulkEditForm(NetBoxModelBulkEditForm):
  330. region = DynamicModelChoiceField(
  331. queryset=Region.objects.all(),
  332. required=False
  333. )
  334. site_group = DynamicModelChoiceField(
  335. queryset=SiteGroup.objects.all(),
  336. required=False
  337. )
  338. site = DynamicModelChoiceField(
  339. queryset=Site.objects.all(),
  340. required=False,
  341. query_params={
  342. 'region_id': '$region',
  343. 'group_id': '$site_group',
  344. }
  345. )
  346. group = DynamicModelChoiceField(
  347. queryset=VLANGroup.objects.all(),
  348. required=False,
  349. query_params={
  350. 'site_id': '$site'
  351. }
  352. )
  353. tenant = DynamicModelChoiceField(
  354. queryset=Tenant.objects.all(),
  355. required=False
  356. )
  357. status = forms.ChoiceField(
  358. choices=add_blank_choice(VLANStatusChoices),
  359. required=False,
  360. widget=StaticSelect()
  361. )
  362. role = DynamicModelChoiceField(
  363. queryset=Role.objects.all(),
  364. required=False
  365. )
  366. description = forms.CharField(
  367. max_length=100,
  368. required=False
  369. )
  370. model = VLAN
  371. fieldsets = (
  372. (None, ('status', 'role', 'tenant', 'description')),
  373. ('Site & Group', ('region', 'site_group', 'site', 'group')),
  374. )
  375. nullable_fields = (
  376. 'site', 'group', 'tenant', 'role', 'description',
  377. )
  378. class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm):
  379. protocol = forms.ChoiceField(
  380. choices=add_blank_choice(ServiceProtocolChoices),
  381. required=False,
  382. widget=StaticSelect()
  383. )
  384. ports = NumericArrayField(
  385. base_field=forms.IntegerField(
  386. min_value=SERVICE_PORT_MIN,
  387. max_value=SERVICE_PORT_MAX
  388. ),
  389. required=False
  390. )
  391. description = forms.CharField(
  392. max_length=100,
  393. required=False
  394. )
  395. model = ServiceTemplate
  396. fieldsets = (
  397. (None, ('protocol', 'ports', 'description')),
  398. )
  399. nullable_fields = ('description',)
  400. class ServiceBulkEditForm(ServiceTemplateBulkEditForm):
  401. model = Service
  402. class L2VPNBulkEditForm(NetBoxModelBulkEditForm):
  403. tenant = DynamicModelChoiceField(
  404. queryset=Tenant.objects.all(),
  405. required=False
  406. )
  407. description = forms.CharField(
  408. max_length=100,
  409. required=False
  410. )
  411. model = L2VPN
  412. fieldsets = (
  413. (None, ('tenant', 'description')),
  414. )
  415. nullable_fields = ('tenant', 'description',)
  416. class L2VPNTerminationBulkEditForm(NetBoxModelBulkEditForm):
  417. model = L2VPN