forms.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. from django import forms
  2. from dcim.models import Region, Site
  3. from extras.forms import (
  4. AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm,
  5. TagField,
  6. )
  7. from tenancy.forms import TenancyFilterForm, TenancyForm
  8. from tenancy.models import Tenant
  9. from utilities.forms import (
  10. APISelectMultiple, add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField,
  11. CSVModelForm, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SmallTextarea, SlugField,
  12. StaticSelect2, StaticSelect2Multiple, TagFilterField,
  13. )
  14. from .choices import CircuitStatusChoices
  15. from .models import Circuit, CircuitTermination, CircuitType, Provider
  16. #
  17. # Providers
  18. #
  19. class ProviderForm(BootstrapMixin, CustomFieldModelForm):
  20. slug = SlugField()
  21. comments = CommentField()
  22. tags = TagField(
  23. required=False
  24. )
  25. class Meta:
  26. model = Provider
  27. fields = [
  28. 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'tags',
  29. ]
  30. widgets = {
  31. 'noc_contact': SmallTextarea(
  32. attrs={'rows': 5}
  33. ),
  34. 'admin_contact': SmallTextarea(
  35. attrs={'rows': 5}
  36. ),
  37. }
  38. help_texts = {
  39. 'name': "Full name of the provider",
  40. 'asn': "BGP autonomous system number (if applicable)",
  41. 'portal_url': "URL of the provider's customer support portal",
  42. 'noc_contact': "NOC email address and phone number",
  43. 'admin_contact': "Administrative contact email address and phone number",
  44. }
  45. class ProviderCSVForm(CustomFieldModelCSVForm):
  46. slug = SlugField()
  47. class Meta:
  48. model = Provider
  49. fields = Provider.csv_headers
  50. class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
  51. pk = forms.ModelMultipleChoiceField(
  52. queryset=Provider.objects.all(),
  53. widget=forms.MultipleHiddenInput
  54. )
  55. asn = forms.IntegerField(
  56. required=False,
  57. label='ASN'
  58. )
  59. account = forms.CharField(
  60. max_length=30,
  61. required=False,
  62. label='Account number'
  63. )
  64. portal_url = forms.URLField(
  65. required=False,
  66. label='Portal'
  67. )
  68. noc_contact = forms.CharField(
  69. required=False,
  70. widget=SmallTextarea,
  71. label='NOC contact'
  72. )
  73. admin_contact = forms.CharField(
  74. required=False,
  75. widget=SmallTextarea,
  76. label='Admin contact'
  77. )
  78. comments = CommentField(
  79. widget=SmallTextarea,
  80. label='Comments'
  81. )
  82. class Meta:
  83. nullable_fields = [
  84. 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments',
  85. ]
  86. class ProviderFilterForm(BootstrapMixin, CustomFieldFilterForm):
  87. model = Provider
  88. q = forms.CharField(
  89. required=False,
  90. label='Search'
  91. )
  92. region = DynamicModelMultipleChoiceField(
  93. queryset=Region.objects.all(),
  94. to_field_name='slug',
  95. required=False,
  96. widget=APISelectMultiple(
  97. value_field="slug",
  98. filter_for={
  99. 'site': 'region'
  100. }
  101. )
  102. )
  103. site = DynamicModelMultipleChoiceField(
  104. queryset=Site.objects.all(),
  105. to_field_name='slug',
  106. required=False,
  107. widget=APISelectMultiple(
  108. value_field="slug",
  109. )
  110. )
  111. asn = forms.IntegerField(
  112. required=False,
  113. label='ASN'
  114. )
  115. tag = TagFilterField(model)
  116. #
  117. # Circuit types
  118. #
  119. class CircuitTypeForm(BootstrapMixin, forms.ModelForm):
  120. slug = SlugField()
  121. class Meta:
  122. model = CircuitType
  123. fields = [
  124. 'name', 'slug', 'description',
  125. ]
  126. class CircuitTypeCSVForm(CSVModelForm):
  127. slug = SlugField()
  128. class Meta:
  129. model = CircuitType
  130. fields = CircuitType.csv_headers
  131. help_texts = {
  132. 'name': 'Name of circuit type',
  133. }
  134. #
  135. # Circuits
  136. #
  137. class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm):
  138. provider = DynamicModelChoiceField(
  139. queryset=Provider.objects.all()
  140. )
  141. type = DynamicModelChoiceField(
  142. queryset=CircuitType.objects.all()
  143. )
  144. comments = CommentField()
  145. tags = TagField(
  146. required=False
  147. )
  148. class Meta:
  149. model = Circuit
  150. fields = [
  151. 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant',
  152. 'comments', 'tags',
  153. ]
  154. help_texts = {
  155. 'cid': "Unique circuit ID",
  156. 'commit_rate': "Committed rate",
  157. }
  158. widgets = {
  159. 'status': StaticSelect2(),
  160. 'install_date': DatePicker(),
  161. }
  162. class CircuitCSVForm(CustomFieldModelCSVForm):
  163. provider = CSVModelChoiceField(
  164. queryset=Provider.objects.all(),
  165. to_field_name='name',
  166. help_text='Assigned provider'
  167. )
  168. type = CSVModelChoiceField(
  169. queryset=CircuitType.objects.all(),
  170. to_field_name='name',
  171. help_text='Type of circuit'
  172. )
  173. status = CSVChoiceField(
  174. choices=CircuitStatusChoices,
  175. required=False,
  176. help_text='Operational status'
  177. )
  178. tenant = CSVModelChoiceField(
  179. queryset=Tenant.objects.all(),
  180. required=False,
  181. to_field_name='name',
  182. help_text='Assigned tenant'
  183. )
  184. class Meta:
  185. model = Circuit
  186. fields = [
  187. 'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'commit_rate', 'description', 'comments',
  188. ]
  189. class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm):
  190. pk = forms.ModelMultipleChoiceField(
  191. queryset=Circuit.objects.all(),
  192. widget=forms.MultipleHiddenInput
  193. )
  194. type = DynamicModelChoiceField(
  195. queryset=CircuitType.objects.all(),
  196. required=False
  197. )
  198. provider = DynamicModelChoiceField(
  199. queryset=Provider.objects.all(),
  200. required=False
  201. )
  202. status = forms.ChoiceField(
  203. choices=add_blank_choice(CircuitStatusChoices),
  204. required=False,
  205. initial='',
  206. widget=StaticSelect2()
  207. )
  208. tenant = DynamicModelChoiceField(
  209. queryset=Tenant.objects.all(),
  210. required=False
  211. )
  212. commit_rate = forms.IntegerField(
  213. required=False,
  214. label='Commit rate (Kbps)'
  215. )
  216. description = forms.CharField(
  217. max_length=100,
  218. required=False
  219. )
  220. comments = CommentField(
  221. widget=SmallTextarea,
  222. label='Comments'
  223. )
  224. class Meta:
  225. nullable_fields = [
  226. 'tenant', 'commit_rate', 'description', 'comments',
  227. ]
  228. class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
  229. model = Circuit
  230. field_order = [
  231. 'q', 'type', 'provider', 'status', 'region', 'site', 'tenant_group', 'tenant', 'commit_rate',
  232. ]
  233. q = forms.CharField(
  234. required=False,
  235. label='Search'
  236. )
  237. type = DynamicModelMultipleChoiceField(
  238. queryset=CircuitType.objects.all(),
  239. to_field_name='slug',
  240. required=False,
  241. widget=APISelectMultiple(
  242. value_field="slug",
  243. )
  244. )
  245. provider = DynamicModelMultipleChoiceField(
  246. queryset=Provider.objects.all(),
  247. to_field_name='slug',
  248. required=False,
  249. widget=APISelectMultiple(
  250. value_field="slug",
  251. )
  252. )
  253. status = forms.MultipleChoiceField(
  254. choices=CircuitStatusChoices,
  255. required=False,
  256. widget=StaticSelect2Multiple()
  257. )
  258. region = DynamicModelMultipleChoiceField(
  259. queryset=Region.objects.all(),
  260. to_field_name='slug',
  261. required=False,
  262. widget=APISelectMultiple(
  263. value_field="slug",
  264. filter_for={
  265. 'site': 'region'
  266. }
  267. )
  268. )
  269. site = DynamicModelMultipleChoiceField(
  270. queryset=Site.objects.all(),
  271. to_field_name='slug',
  272. required=False,
  273. widget=APISelectMultiple(
  274. value_field="slug",
  275. )
  276. )
  277. commit_rate = forms.IntegerField(
  278. required=False,
  279. min_value=0,
  280. label='Commit rate (Kbps)'
  281. )
  282. tag = TagFilterField(model)
  283. #
  284. # Circuit terminations
  285. #
  286. class CircuitTerminationForm(BootstrapMixin, forms.ModelForm):
  287. site = DynamicModelChoiceField(
  288. queryset=Site.objects.all()
  289. )
  290. class Meta:
  291. model = CircuitTermination
  292. fields = [
  293. 'term_side', 'site', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description',
  294. ]
  295. help_texts = {
  296. 'port_speed': "Physical circuit speed",
  297. 'xconnect_id': "ID of the local cross-connect",
  298. 'pp_info': "Patch panel ID and port number(s)"
  299. }
  300. widgets = {
  301. 'term_side': forms.HiddenInput(),
  302. }