1
1
"""Diode plugin helpers."""
2
2
3
3
# Generated code. DO NOT EDIT.
4
- # Timestamp: 2025-04-12 15:25:46Z
4
+ # Timestamp: 2025-04-13 13:20:10Z
5
5
6
6
from dataclasses import dataclass
7
+ import datetime
8
+ import decimal
7
9
from functools import lru_cache
10
+ import logging
8
11
from typing import Type
9
12
10
13
from core .models import ObjectType as NetBoxType
11
14
from django .contrib .contenttypes .models import ContentType
12
15
from django .db import models
13
16
17
+ logger = logging .getLogger (__name__ )
14
18
15
19
@lru_cache (maxsize = 256 )
16
20
def get_object_type_model (object_type : str ) -> Type [models .Model ]:
@@ -995,4 +999,197 @@ def legal_fields(object_type: str|Type[models.Model]) -> frozenset[str]:
995
999
996
1000
def get_primary_value (data : dict , object_type : str ) -> str | None :
997
1001
field = _OBJECT_TYPE_PRIMARY_VALUE_FIELD_MAP .get (object_type , 'name' )
998
- return data .get (field )
1002
+ return data .get (field )
1003
+
1004
+
1005
+ def transform_timestamp_to_date_only (value : str ) -> str :
1006
+ return datetime .datetime .fromisoformat (value ).strftime ('%Y-%m-%d' )
1007
+
1008
+ def transform_float_to_decimal (value : float ) -> decimal .Decimal :
1009
+ try :
1010
+ return decimal .Decimal (str (value ))
1011
+ except decimal .InvalidOperation :
1012
+ raise ValueError (f'Invalid decimal value: { value } ' )
1013
+
1014
+ def int_from_int64string (value : str ) -> int :
1015
+ return int (value )
1016
+
1017
+ def collect_integer_pairs (value : list [int ]) -> list [tuple [int , int ]]:
1018
+ if len (value ) % 2 != 0 :
1019
+ raise ValueError ('Array must have an even number of elements' )
1020
+ return [(value [i ], value [i + 1 ]) for i in range (0 , len (value ), 2 )]
1021
+
1022
+ def for_all (transform ):
1023
+ def wrapper (value ):
1024
+ if isinstance (value , list ):
1025
+ return [transform (v ) for v in value ]
1026
+ return transform (value )
1027
+ return wrapper
1028
+
1029
+ _FORMAT_TRANSFORMATIONS = {
1030
+ 'circuits.circuit' : {
1031
+ 'commit_rate' : int_from_int64string ,
1032
+ 'distance' : transform_float_to_decimal ,
1033
+ 'install_date' : transform_timestamp_to_date_only ,
1034
+ 'termination_date' : transform_timestamp_to_date_only ,
1035
+ },
1036
+ 'circuits.circuittermination' : {
1037
+ 'port_speed' : int_from_int64string ,
1038
+ 'upstream_speed' : int_from_int64string ,
1039
+ },
1040
+ 'dcim.cable' : {
1041
+ 'length' : transform_float_to_decimal ,
1042
+ },
1043
+ 'dcim.consoleport' : {
1044
+ 'speed' : int_from_int64string ,
1045
+ },
1046
+ 'dcim.consoleserverport' : {
1047
+ 'speed' : int_from_int64string ,
1048
+ },
1049
+ 'dcim.device' : {
1050
+ 'latitude' : transform_float_to_decimal ,
1051
+ 'longitude' : transform_float_to_decimal ,
1052
+ 'position' : transform_float_to_decimal ,
1053
+ 'vc_position' : int_from_int64string ,
1054
+ 'vc_priority' : int_from_int64string ,
1055
+ },
1056
+ 'dcim.devicetype' : {
1057
+ 'u_height' : transform_float_to_decimal ,
1058
+ 'weight' : transform_float_to_decimal ,
1059
+ },
1060
+ 'dcim.frontport' : {
1061
+ 'rear_port_position' : int_from_int64string ,
1062
+ },
1063
+ 'dcim.interface' : {
1064
+ 'mtu' : int_from_int64string ,
1065
+ 'rf_channel_frequency' : transform_float_to_decimal ,
1066
+ 'rf_channel_width' : transform_float_to_decimal ,
1067
+ 'speed' : int_from_int64string ,
1068
+ 'tx_power' : int_from_int64string ,
1069
+ },
1070
+ 'dcim.moduletype' : {
1071
+ 'weight' : transform_float_to_decimal ,
1072
+ },
1073
+ 'dcim.powerfeed' : {
1074
+ 'amperage' : int_from_int64string ,
1075
+ 'max_utilization' : int_from_int64string ,
1076
+ 'voltage' : int_from_int64string ,
1077
+ },
1078
+ 'dcim.powerport' : {
1079
+ 'allocated_draw' : int_from_int64string ,
1080
+ 'maximum_draw' : int_from_int64string ,
1081
+ },
1082
+ 'dcim.rack' : {
1083
+ 'max_weight' : int_from_int64string ,
1084
+ 'mounting_depth' : int_from_int64string ,
1085
+ 'outer_depth' : int_from_int64string ,
1086
+ 'outer_width' : int_from_int64string ,
1087
+ 'starting_unit' : int_from_int64string ,
1088
+ 'u_height' : int_from_int64string ,
1089
+ 'weight' : transform_float_to_decimal ,
1090
+ 'width' : int_from_int64string ,
1091
+ },
1092
+ 'dcim.rackreservation' : {
1093
+ 'units' : for_all (int_from_int64string ),
1094
+ },
1095
+ 'dcim.racktype' : {
1096
+ 'max_weight' : int_from_int64string ,
1097
+ 'mounting_depth' : int_from_int64string ,
1098
+ 'outer_depth' : int_from_int64string ,
1099
+ 'outer_width' : int_from_int64string ,
1100
+ 'starting_unit' : int_from_int64string ,
1101
+ 'u_height' : int_from_int64string ,
1102
+ 'weight' : transform_float_to_decimal ,
1103
+ 'width' : int_from_int64string ,
1104
+ },
1105
+ 'dcim.rearport' : {
1106
+ 'positions' : int_from_int64string ,
1107
+ },
1108
+ 'dcim.site' : {
1109
+ 'latitude' : transform_float_to_decimal ,
1110
+ 'longitude' : transform_float_to_decimal ,
1111
+ },
1112
+ 'dcim.virtualdevicecontext' : {
1113
+ 'identifier' : int_from_int64string ,
1114
+ },
1115
+ 'ipam.aggregate' : {
1116
+ 'date_added' : transform_timestamp_to_date_only ,
1117
+ },
1118
+ 'ipam.asn' : {
1119
+ 'asn' : int_from_int64string ,
1120
+ },
1121
+ 'ipam.asnrange' : {
1122
+ 'end' : int_from_int64string ,
1123
+ 'start' : int_from_int64string ,
1124
+ },
1125
+ 'ipam.fhrpgroup' : {
1126
+ 'group_id' : int_from_int64string ,
1127
+ },
1128
+ 'ipam.fhrpgroupassignment' : {
1129
+ 'priority' : int_from_int64string ,
1130
+ },
1131
+ 'ipam.role' : {
1132
+ 'weight' : int_from_int64string ,
1133
+ },
1134
+ 'ipam.service' : {
1135
+ 'ports' : for_all (int_from_int64string ),
1136
+ },
1137
+ 'ipam.vlan' : {
1138
+ 'vid' : int_from_int64string ,
1139
+ },
1140
+ 'ipam.vlangroup' : {
1141
+ 'vid_ranges' : collect_integer_pairs ,
1142
+ },
1143
+ 'ipam.vlantranslationrule' : {
1144
+ 'local_vid' : int_from_int64string ,
1145
+ 'remote_vid' : int_from_int64string ,
1146
+ },
1147
+ 'virtualization.virtualdisk' : {
1148
+ 'size' : int_from_int64string ,
1149
+ },
1150
+ 'virtualization.virtualmachine' : {
1151
+ 'disk' : int_from_int64string ,
1152
+ 'memory' : int_from_int64string ,
1153
+ 'vcpus' : transform_float_to_decimal ,
1154
+ },
1155
+ 'virtualization.vminterface' : {
1156
+ 'mtu' : int_from_int64string ,
1157
+ },
1158
+ 'vpn.ikepolicy' : {
1159
+ 'version' : int_from_int64string ,
1160
+ },
1161
+ 'vpn.ikeproposal' : {
1162
+ 'group' : int_from_int64string ,
1163
+ 'sa_lifetime' : int_from_int64string ,
1164
+ },
1165
+ 'vpn.ipsecpolicy' : {
1166
+ 'pfs_group' : int_from_int64string ,
1167
+ },
1168
+ 'vpn.ipsecproposal' : {
1169
+ 'sa_lifetime_data' : int_from_int64string ,
1170
+ 'sa_lifetime_seconds' : int_from_int64string ,
1171
+ },
1172
+ 'vpn.l2vpn' : {
1173
+ 'identifier' : int_from_int64string ,
1174
+ },
1175
+ 'vpn.tunnel' : {
1176
+ 'tunnel_id' : int_from_int64string ,
1177
+ },
1178
+ 'wireless.wirelesslink' : {
1179
+ 'distance' : transform_float_to_decimal ,
1180
+ },
1181
+ }
1182
+
1183
+ def apply_format_transformations (data : dict , object_type : str ):
1184
+ for key , transform in _FORMAT_TRANSFORMATIONS .get (object_type , {}).items ():
1185
+ val = data .get (key , None )
1186
+ if val is None :
1187
+ continue
1188
+ try :
1189
+ data [key ] = transform (val )
1190
+ except ValidationError :
1191
+ raise
1192
+ except ValueError as e :
1193
+ raise ValidationError (f'Invalid value { val } for field { key } in { object_type } : { e } ' )
1194
+ except Exception as e :
1195
+ raise ValidationError (f'Invalid value { val } for field { key } in { object_type } ' )
0 commit comments