forms.py 8.5 KB

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