Coverage for circuits/forms/bulk_import.py: 100%

92 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django import forms 

2from django.contrib.contenttypes.models import ContentType 

3from django.utils.translation import gettext_lazy as _ 

4 

5from circuits.choices import * 

6from circuits.constants import * 

7from circuits.models import * 

8from dcim.models import Interface 

9from netbox.choices import DistanceUnitChoices 

10from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, PrimaryModelImportForm 

11from tenancy.models import Tenant 

12from utilities.forms.fields import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField 

13 

14__all__ = ( 

15 'CircuitGroupAssignmentImportForm', 

16 'CircuitGroupImportForm', 

17 'CircuitImportForm', 

18 'CircuitTerminationImportForm', 

19 'CircuitTerminationImportRelatedForm', 

20 'CircuitTypeImportForm', 

21 'ProviderAccountImportForm', 

22 'ProviderImportForm', 

23 'ProviderNetworkImportForm', 

24 'VirtualCircuitImportForm', 

25 'VirtualCircuitTerminationImportForm', 

26 'VirtualCircuitTerminationImportRelatedForm', 

27 'VirtualCircuitTypeImportForm', 

28) 

29 

30 

31class ProviderImportForm(PrimaryModelImportForm): 

32 slug = SlugField() 

33 

34 class Meta: 

35 model = Provider 

36 fields = ( 

37 'name', 'slug', 'description', 'owner', 'comments', 'tags', 

38 ) 

39 

40 

41class ProviderAccountImportForm(PrimaryModelImportForm): 

42 provider = CSVModelChoiceField( 

43 label=_('Provider'), 

44 queryset=Provider.objects.all(), 

45 to_field_name='name', 

46 help_text=_('Assigned provider') 

47 ) 

48 

49 class Meta: 

50 model = ProviderAccount 

51 fields = ( 

52 'provider', 'name', 'account', 'description', 'owner', 'comments', 'tags', 

53 ) 

54 

55 

56class ProviderNetworkImportForm(PrimaryModelImportForm): 

57 provider = CSVModelChoiceField( 

58 label=_('Provider'), 

59 queryset=Provider.objects.all(), 

60 to_field_name='name', 

61 help_text=_('Assigned provider') 

62 ) 

63 

64 class Meta: 

65 model = ProviderNetwork 

66 fields = [ 

67 'provider', 'name', 'service_id', 'description', 'owner', 'comments', 'tags' 

68 ] 

69 

70 

71class CircuitTypeImportForm(OrganizationalModelImportForm): 

72 slug = SlugField() 

73 

74 class Meta: 

75 model = CircuitType 

76 fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags') 

77 

78 

79class CircuitImportForm(PrimaryModelImportForm): 

80 provider = CSVModelChoiceField( 

81 label=_('Provider'), 

82 queryset=Provider.objects.all(), 

83 to_field_name='name', 

84 help_text=_('Assigned provider') 

85 ) 

86 provider_account = CSVModelChoiceField( 

87 label=_('Provider account'), 

88 queryset=ProviderAccount.objects.all(), 

89 to_field_name='name', 

90 help_text=_('Assigned provider account'), 

91 required=False 

92 ) 

93 type = CSVModelChoiceField( 

94 label=_('Type'), 

95 queryset=CircuitType.objects.all(), 

96 to_field_name='name', 

97 help_text=_('Type of circuit') 

98 ) 

99 status = CSVChoiceField( 

100 label=_('Status'), 

101 choices=CircuitStatusChoices, 

102 help_text=_('Operational status') 

103 ) 

104 distance_unit = CSVChoiceField( 

105 label=_('Distance unit'), 

106 choices=DistanceUnitChoices, 

107 required=False, 

108 help_text=_('Distance unit') 

109 ) 

110 tenant = CSVModelChoiceField( 

111 label=_('Tenant'), 

112 queryset=Tenant.objects.all(), 

113 required=False, 

114 to_field_name='name', 

115 help_text=_('Assigned tenant') 

116 ) 

117 

118 class Meta: 

119 model = Circuit 

120 fields = [ 

121 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 

122 'commit_rate', 'distance', 'distance_unit', 'description', 'owner', 'comments', 'tags' 

123 ] 

124 

125 

126class BaseCircuitTerminationImportForm(forms.ModelForm): 

127 circuit = CSVModelChoiceField( 

128 label=_('Circuit'), 

129 queryset=Circuit.objects.all(), 

130 to_field_name='cid', 

131 ) 

132 term_side = CSVChoiceField( 

133 label=_('Termination'), 

134 choices=CircuitTerminationSideChoices, 

135 ) 

136 termination_type = CSVContentTypeField( 

137 queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), 

138 required=False, 

139 label=_('Termination type (app & model)') 

140 ) 

141 

142 

143class CircuitTerminationImportRelatedForm(BaseCircuitTerminationImportForm): 

144 class Meta: 

145 model = CircuitTermination 

146 fields = [ 

147 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id', 

148 'pp_info', 'description' 

149 ] 

150 labels = { 

151 'termination_id': _('Termination ID'), 

152 } 

153 

154 

155class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTerminationImportForm): 

156 

157 class Meta: 

158 model = CircuitTermination 

159 fields = [ 

160 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id', 

161 'pp_info', 'description', 'tags' 

162 ] 

163 labels = { 

164 'termination_id': _('Termination ID'), 

165 } 

166 

167 

168class CircuitGroupImportForm(OrganizationalModelImportForm): 

169 tenant = CSVModelChoiceField( 

170 label=_('Tenant'), 

171 queryset=Tenant.objects.all(), 

172 required=False, 

173 to_field_name='name', 

174 help_text=_('Assigned tenant') 

175 ) 

176 

177 class Meta: 

178 model = CircuitGroup 

179 fields = ('name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags') 

180 

181 

182class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): 

183 member_type = CSVContentTypeField( 

184 queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS), 

185 label=_('Circuit type (app & model)') 

186 ) 

187 priority = CSVChoiceField( 

188 label=_('Priority'), 

189 choices=CircuitPriorityChoices, 

190 required=False 

191 ) 

192 

193 class Meta: 

194 model = CircuitGroupAssignment 

195 fields = ('member_type', 'member_id', 'group', 'priority') 

196 

197 

198class VirtualCircuitTypeImportForm(OrganizationalModelImportForm): 

199 

200 class Meta: 

201 model = VirtualCircuitType 

202 fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags') 

203 

204 

205class VirtualCircuitImportForm(PrimaryModelImportForm): 

206 provider_network = CSVModelChoiceField( 

207 label=_('Provider network'), 

208 queryset=ProviderNetwork.objects.all(), 

209 to_field_name='name', 

210 help_text=_('The network to which this virtual circuit belongs') 

211 ) 

212 provider_account = CSVModelChoiceField( 

213 label=_('Provider account'), 

214 queryset=ProviderAccount.objects.all(), 

215 to_field_name='account', 

216 help_text=_('Assigned provider account (if any)'), 

217 required=False 

218 ) 

219 type = CSVModelChoiceField( 

220 label=_('Type'), 

221 queryset=VirtualCircuitType.objects.all(), 

222 to_field_name='name', 

223 help_text=_('Type of virtual circuit') 

224 ) 

225 status = CSVChoiceField( 

226 label=_('Status'), 

227 choices=CircuitStatusChoices, 

228 help_text=_('Operational status') 

229 ) 

230 tenant = CSVModelChoiceField( 

231 label=_('Tenant'), 

232 queryset=Tenant.objects.all(), 

233 required=False, 

234 to_field_name='name', 

235 help_text=_('Assigned tenant') 

236 ) 

237 

238 class Meta: 

239 model = VirtualCircuit 

240 fields = [ 

241 'cid', 'provider_network', 'provider_account', 'type', 'status', 'tenant', 'description', 'owner', 

242 'comments', 'tags', 

243 ] 

244 

245 

246class BaseVirtualCircuitTerminationImportForm(forms.ModelForm): 

247 virtual_circuit = CSVModelChoiceField( 

248 label=_('Virtual circuit'), 

249 queryset=VirtualCircuit.objects.all(), 

250 to_field_name='cid', 

251 ) 

252 role = CSVChoiceField( 

253 label=_('Role'), 

254 choices=VirtualCircuitTerminationRoleChoices, 

255 help_text=_('Operational role') 

256 ) 

257 interface = CSVModelChoiceField( 

258 label=_('Interface'), 

259 queryset=Interface.objects.all(), 

260 to_field_name='pk', 

261 ) 

262 

263 

264class VirtualCircuitTerminationImportRelatedForm(BaseVirtualCircuitTerminationImportForm): 

265 

266 class Meta: 

267 model = VirtualCircuitTermination 

268 fields = [ 

269 'virtual_circuit', 'role', 'interface', 'description', 

270 ] 

271 

272 

273class VirtualCircuitTerminationImportForm(NetBoxModelImportForm, BaseVirtualCircuitTerminationImportForm): 

274 

275 class Meta: 

276 model = VirtualCircuitTermination 

277 fields = [ 

278 'virtual_circuit', 'role', 'interface', 'description', 'tags', 

279 ]