connections.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. from circuits.models import Circuit, CircuitTermination, Provider
  2. from dcim.models import *
  3. from netbox.forms import NetBoxModelForm
  4. from tenancy.forms import TenancyForm
  5. from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect
  6. __all__ = (
  7. 'ConnectCableToCircuitTerminationForm',
  8. 'ConnectCableToConsolePortForm',
  9. 'ConnectCableToConsoleServerPortForm',
  10. 'ConnectCableToFrontPortForm',
  11. 'ConnectCableToInterfaceForm',
  12. 'ConnectCableToPowerFeedForm',
  13. 'ConnectCableToPowerPortForm',
  14. 'ConnectCableToPowerOutletForm',
  15. 'ConnectCableToRearPortForm',
  16. )
  17. class BaseCableConnectionForm(TenancyForm, NetBoxModelForm):
  18. a_terminations = DynamicModelMultipleChoiceField(
  19. queryset=Interface.objects.all(),
  20. label='Name',
  21. disabled_indicator='_occupied'
  22. )
  23. b_terminations = DynamicModelMultipleChoiceField(
  24. queryset=Interface.objects.all(),
  25. label='Name',
  26. disabled_indicator='_occupied'
  27. )
  28. def save(self, commit=True):
  29. instance = super().save(commit=commit)
  30. # Create CableTermination instances
  31. terminations = []
  32. terminations.extend([
  33. CableTermination(cable=instance, cable_end='A', termination=termination)
  34. for termination in self.cleaned_data['a_terminations']
  35. ])
  36. terminations.extend([
  37. CableTermination(cable=instance, cable_end='B', termination=termination)
  38. for termination in self.cleaned_data['b_terminations']
  39. ])
  40. if commit:
  41. for ct in terminations:
  42. ct.save()
  43. else:
  44. instance._terminations = [
  45. *self.cleaned_data['a_terminations'],
  46. *self.cleaned_data['b_terminations'],
  47. ]
  48. return instance
  49. class ConnectCableToDeviceForm(BaseCableConnectionForm):
  50. """
  51. Base form for connecting a Cable to a Device component
  52. """
  53. termination_b_region = DynamicModelChoiceField(
  54. queryset=Region.objects.all(),
  55. label='Region',
  56. required=False,
  57. initial_params={
  58. 'sites': '$termination_b_site'
  59. }
  60. )
  61. termination_b_sitegroup = DynamicModelChoiceField(
  62. queryset=SiteGroup.objects.all(),
  63. label='Site group',
  64. required=False,
  65. initial_params={
  66. 'sites': '$termination_b_site'
  67. }
  68. )
  69. termination_b_site = DynamicModelChoiceField(
  70. queryset=Site.objects.all(),
  71. label='Site',
  72. required=False,
  73. query_params={
  74. 'region_id': '$termination_b_region',
  75. 'group_id': '$termination_b_sitegroup',
  76. }
  77. )
  78. termination_b_location = DynamicModelChoiceField(
  79. queryset=Location.objects.all(),
  80. label='Location',
  81. required=False,
  82. null_option='None',
  83. query_params={
  84. 'site_id': '$termination_b_site'
  85. }
  86. )
  87. termination_b_rack = DynamicModelChoiceField(
  88. queryset=Rack.objects.all(),
  89. label='Rack',
  90. required=False,
  91. null_option='None',
  92. query_params={
  93. 'site_id': '$termination_b_site',
  94. 'location_id': '$termination_b_location',
  95. }
  96. )
  97. termination_b_device = DynamicModelChoiceField(
  98. queryset=Device.objects.all(),
  99. label='Device',
  100. required=False,
  101. query_params={
  102. 'site_id': '$termination_b_site',
  103. 'location_id': '$termination_b_location',
  104. 'rack_id': '$termination_b_rack',
  105. }
  106. )
  107. class Meta:
  108. model = Cable
  109. fields = [
  110. 'a_terminations', 'termination_b_region', 'termination_b_sitegroup', 'termination_b_site',
  111. 'termination_b_rack', 'termination_b_device', 'b_terminations', 'type', 'status', 'tenant_group',
  112. 'tenant', 'label', 'color', 'length', 'length_unit', 'tags',
  113. ]
  114. widgets = {
  115. 'status': StaticSelect,
  116. 'type': StaticSelect,
  117. 'length_unit': StaticSelect,
  118. }
  119. class ConnectCableToConsolePortForm(ConnectCableToDeviceForm):
  120. b_terminations = DynamicModelMultipleChoiceField(
  121. queryset=ConsolePort.objects.all(),
  122. label='Name',
  123. disabled_indicator='_occupied',
  124. query_params={
  125. 'device_id': '$termination_b_device'
  126. }
  127. )
  128. class ConnectCableToConsoleServerPortForm(ConnectCableToDeviceForm):
  129. b_terminations = DynamicModelMultipleChoiceField(
  130. queryset=ConsoleServerPort.objects.all(),
  131. label='Name',
  132. disabled_indicator='_occupied',
  133. query_params={
  134. 'device_id': '$termination_b_device'
  135. }
  136. )
  137. class ConnectCableToPowerPortForm(ConnectCableToDeviceForm):
  138. b_terminations = DynamicModelMultipleChoiceField(
  139. queryset=PowerPort.objects.all(),
  140. label='Name',
  141. disabled_indicator='_occupied',
  142. query_params={
  143. 'device_id': '$termination_b_device'
  144. }
  145. )
  146. class ConnectCableToPowerOutletForm(ConnectCableToDeviceForm):
  147. b_terminations = DynamicModelMultipleChoiceField(
  148. queryset=PowerOutlet.objects.all(),
  149. label='Name',
  150. disabled_indicator='_occupied',
  151. query_params={
  152. 'device_id': '$termination_b_device'
  153. }
  154. )
  155. class ConnectCableToInterfaceForm(ConnectCableToDeviceForm):
  156. b_terminations = DynamicModelMultipleChoiceField(
  157. queryset=Interface.objects.all(),
  158. label='Name',
  159. disabled_indicator='_occupied',
  160. query_params={
  161. 'device_id': '$termination_b_device',
  162. 'kind': 'physical',
  163. }
  164. )
  165. class ConnectCableToFrontPortForm(ConnectCableToDeviceForm):
  166. b_terminations = DynamicModelMultipleChoiceField(
  167. queryset=FrontPort.objects.all(),
  168. label='Name',
  169. disabled_indicator='_occupied',
  170. query_params={
  171. 'device_id': '$termination_b_device'
  172. }
  173. )
  174. class ConnectCableToRearPortForm(ConnectCableToDeviceForm):
  175. b_terminations = DynamicModelMultipleChoiceField(
  176. queryset=RearPort.objects.all(),
  177. label='Name',
  178. disabled_indicator='_occupied',
  179. query_params={
  180. 'device_id': '$termination_b_device'
  181. }
  182. )
  183. class ConnectCableToCircuitTerminationForm(BaseCableConnectionForm):
  184. termination_b_provider = DynamicModelChoiceField(
  185. queryset=Provider.objects.all(),
  186. label='Provider',
  187. required=False
  188. )
  189. termination_b_region = DynamicModelChoiceField(
  190. queryset=Region.objects.all(),
  191. label='Region',
  192. required=False,
  193. initial_params={
  194. 'sites': '$termination_b_site'
  195. }
  196. )
  197. termination_b_sitegroup = DynamicModelChoiceField(
  198. queryset=SiteGroup.objects.all(),
  199. label='Site group',
  200. required=False,
  201. initial_params={
  202. 'sites': '$termination_b_site'
  203. }
  204. )
  205. termination_b_site = DynamicModelChoiceField(
  206. queryset=Site.objects.all(),
  207. label='Site',
  208. required=False,
  209. query_params={
  210. 'region_id': '$termination_b_region',
  211. 'group_id': '$termination_b_sitegroup',
  212. }
  213. )
  214. termination_b_circuit = DynamicModelChoiceField(
  215. queryset=Circuit.objects.all(),
  216. label='Circuit',
  217. query_params={
  218. 'provider_id': '$termination_b_provider',
  219. 'site_id': '$termination_b_site',
  220. }
  221. )
  222. b_terminations = DynamicModelMultipleChoiceField(
  223. queryset=CircuitTermination.objects.all(),
  224. label='Side',
  225. disabled_indicator='_occupied',
  226. query_params={
  227. 'circuit_id': '$termination_b_circuit'
  228. }
  229. )
  230. class Meta(ConnectCableToDeviceForm.Meta):
  231. fields = [
  232. 'a_terminations', 'termination_b_provider', 'termination_b_region', 'termination_b_sitegroup',
  233. 'termination_b_site', 'termination_b_circuit', 'b_terminations', 'type', 'status', 'tenant_group',
  234. 'tenant', 'label', 'color', 'length', 'length_unit', 'tags',
  235. ]
  236. class ConnectCableToPowerFeedForm(BaseCableConnectionForm):
  237. termination_b_region = DynamicModelChoiceField(
  238. queryset=Region.objects.all(),
  239. label='Region',
  240. required=False,
  241. initial_params={
  242. 'sites': '$termination_b_site'
  243. }
  244. )
  245. termination_b_sitegroup = DynamicModelChoiceField(
  246. queryset=SiteGroup.objects.all(),
  247. label='Site group',
  248. required=False,
  249. initial_params={
  250. 'sites': '$termination_b_site'
  251. }
  252. )
  253. termination_b_site = DynamicModelChoiceField(
  254. queryset=Site.objects.all(),
  255. label='Site',
  256. required=False,
  257. query_params={
  258. 'region_id': '$termination_b_region',
  259. 'group_id': '$termination_b_sitegroup',
  260. }
  261. )
  262. termination_b_location = DynamicModelChoiceField(
  263. queryset=Location.objects.all(),
  264. label='Location',
  265. required=False,
  266. query_params={
  267. 'site_id': '$termination_b_site'
  268. }
  269. )
  270. termination_b_powerpanel = DynamicModelChoiceField(
  271. queryset=PowerPanel.objects.all(),
  272. label='Power Panel',
  273. required=False,
  274. query_params={
  275. 'site_id': '$termination_b_site',
  276. 'location_id': '$termination_b_location',
  277. }
  278. )
  279. b_terminations = DynamicModelMultipleChoiceField(
  280. queryset=PowerFeed.objects.all(),
  281. label='Name',
  282. disabled_indicator='_occupied',
  283. query_params={
  284. 'power_panel_id': '$termination_b_powerpanel'
  285. }
  286. )
  287. class Meta(ConnectCableToDeviceForm.Meta):
  288. fields = [
  289. 'a_terminations', 'termination_b_region', 'termination_b_sitegroup', 'termination_b_site',
  290. 'termination_b_location', 'termination_b_powerpanel', 'b_terminations', 'type', 'status', 'tenant_group',
  291. 'tenant', 'label', 'color', 'length', 'length_unit', 'tags',
  292. ]