karrio-server-core 2025.5rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of karrio-server-core might be problematic. Click here for more details.

Files changed (241) hide show
  1. karrio/server/conf.py +54 -0
  2. karrio/server/core/__init__.py +3 -0
  3. karrio/server/core/admin.py +1 -0
  4. karrio/server/core/apps.py +10 -0
  5. karrio/server/core/authentication.py +313 -0
  6. karrio/server/core/context_processors.py +12 -0
  7. karrio/server/core/datatypes.py +369 -0
  8. karrio/server/core/dataunits.py +156 -0
  9. karrio/server/core/exceptions.py +200 -0
  10. karrio/server/core/fields.py +12 -0
  11. karrio/server/core/filters.py +823 -0
  12. karrio/server/core/gateway.py +720 -0
  13. karrio/server/core/management/commands/cli.py +19 -0
  14. karrio/server/core/management/commands/create_oauth_client.py +41 -0
  15. karrio/server/core/middleware.py +95 -0
  16. karrio/server/core/migrations/0001_initial.py +28 -0
  17. karrio/server/core/migrations/0002_apilogindex.py +69 -0
  18. karrio/server/core/migrations/0003_apilogindex_test_mode.py +62 -0
  19. karrio/server/core/migrations/0004_metafield.py +74 -0
  20. karrio/server/core/migrations/0005_alter_metafield_type_alter_metafield_value.py +23 -0
  21. karrio/server/core/migrations/__init__.py +0 -0
  22. karrio/server/core/models/__init__.py +48 -0
  23. karrio/server/core/models/base.py +70 -0
  24. karrio/server/core/models/entity.py +22 -0
  25. karrio/server/core/models/metafield.py +144 -0
  26. karrio/server/core/models/third_party.py +21 -0
  27. karrio/server/core/oauth_validators.py +171 -0
  28. karrio/server/core/permissions.py +37 -0
  29. karrio/server/core/renderers.py +11 -0
  30. karrio/server/core/router.py +3 -0
  31. karrio/server/core/serializers.py +1898 -0
  32. karrio/server/core/signals.py +57 -0
  33. karrio/server/core/tests.py +98 -0
  34. karrio/server/core/urls.py +12 -0
  35. karrio/server/core/utils.py +479 -0
  36. karrio/server/core/validators.py +416 -0
  37. karrio/server/core/views/__init__.py +2 -0
  38. karrio/server/core/views/api.py +133 -0
  39. karrio/server/core/views/metadata.py +44 -0
  40. karrio/server/core/views/oauth.py +74 -0
  41. karrio/server/core/views/references.py +82 -0
  42. karrio/server/core/views/schema.py +310 -0
  43. karrio/server/filters/__init__.py +2 -0
  44. karrio/server/filters/abstract.py +26 -0
  45. karrio/server/iam/__init__.py +0 -0
  46. karrio/server/iam/admin.py +3 -0
  47. karrio/server/iam/apps.py +21 -0
  48. karrio/server/iam/migrations/0001_initial.py +33 -0
  49. karrio/server/iam/migrations/__init__.py +0 -0
  50. karrio/server/iam/models.py +48 -0
  51. karrio/server/iam/permissions.py +134 -0
  52. karrio/server/iam/serializers.py +39 -0
  53. karrio/server/iam/signals.py +20 -0
  54. karrio/server/iam/tests.py +3 -0
  55. karrio/server/iam/views.py +3 -0
  56. karrio/server/openapi.py +75 -0
  57. karrio/server/providers/__init__.py +1 -0
  58. karrio/server/providers/admin.py +364 -0
  59. karrio/server/providers/apps.py +10 -0
  60. karrio/server/providers/extension/__init__.py +1 -0
  61. karrio/server/providers/extension/models/__init__.py +1 -0
  62. karrio/server/providers/extension/models/allied_express.py +22 -0
  63. karrio/server/providers/extension/models/allied_express_local.py +22 -0
  64. karrio/server/providers/extension/models/amazon_shipping.py +27 -0
  65. karrio/server/providers/extension/models/aramex.py +25 -0
  66. karrio/server/providers/extension/models/asendia_us.py +21 -0
  67. karrio/server/providers/extension/models/australiapost.py +20 -0
  68. karrio/server/providers/extension/models/boxknight.py +19 -0
  69. karrio/server/providers/extension/models/bpost.py +21 -0
  70. karrio/server/providers/extension/models/canadapost.py +21 -0
  71. karrio/server/providers/extension/models/canpar.py +19 -0
  72. karrio/server/providers/extension/models/chronopost.py +22 -0
  73. karrio/server/providers/extension/models/colissimo.py +22 -0
  74. karrio/server/providers/extension/models/dhl_express.py +23 -0
  75. karrio/server/providers/extension/models/dhl_parcel_de.py +25 -0
  76. karrio/server/providers/extension/models/dhl_poland.py +22 -0
  77. karrio/server/providers/extension/models/dhl_universal.py +19 -0
  78. karrio/server/providers/extension/models/dicom.py +20 -0
  79. karrio/server/providers/extension/models/dpd.py +37 -0
  80. karrio/server/providers/extension/models/dpdhl.py +26 -0
  81. karrio/server/providers/extension/models/easypost.py +20 -0
  82. karrio/server/providers/extension/models/eshipper.py +21 -0
  83. karrio/server/providers/extension/models/fedex.py +25 -0
  84. karrio/server/providers/extension/models/fedex_ws.py +24 -0
  85. karrio/server/providers/extension/models/freightcom.py +21 -0
  86. karrio/server/providers/extension/models/generic.py +35 -0
  87. karrio/server/providers/extension/models/geodis.py +22 -0
  88. karrio/server/providers/extension/models/hay_post.py +22 -0
  89. karrio/server/providers/extension/models/laposte.py +19 -0
  90. karrio/server/providers/extension/models/locate2u.py +22 -0
  91. karrio/server/providers/extension/models/nationex.py +22 -0
  92. karrio/server/providers/extension/models/purolator.py +21 -0
  93. karrio/server/providers/extension/models/roadie.py +18 -0
  94. karrio/server/providers/extension/models/royalmail.py +19 -0
  95. karrio/server/providers/extension/models/sendle.py +22 -0
  96. karrio/server/providers/extension/models/tge.py +63 -0
  97. karrio/server/providers/extension/models/tnt.py +23 -0
  98. karrio/server/providers/extension/models/ups.py +23 -0
  99. karrio/server/providers/extension/models/usps.py +23 -0
  100. karrio/server/providers/extension/models/usps_international.py +23 -0
  101. karrio/server/providers/extension/models/usps_wt.py +24 -0
  102. karrio/server/providers/extension/models/usps_wt_international.py +24 -0
  103. karrio/server/providers/extension/models/zoom2u.py +23 -0
  104. karrio/server/providers/migrations/0001_initial.py +140 -0
  105. karrio/server/providers/migrations/0002_carrier_active.py +18 -0
  106. karrio/server/providers/migrations/0003_auto_20201230_0820.py +24 -0
  107. karrio/server/providers/migrations/0004_auto_20210212_0554.py +178 -0
  108. karrio/server/providers/migrations/0005_auto_20210212_0555.py +18 -0
  109. karrio/server/providers/migrations/0006_australiapostsettings.py +29 -0
  110. karrio/server/providers/migrations/0007_auto_20210213_0206.py +21 -0
  111. karrio/server/providers/migrations/0008_auto_20210214_0409.py +30 -0
  112. karrio/server/providers/migrations/0009_auto_20210308_0302.py +18 -0
  113. karrio/server/providers/migrations/0010_auto_20210409_0852.py +32 -0
  114. karrio/server/providers/migrations/0011_auto_20210409_0853.py +21 -0
  115. karrio/server/providers/migrations/0012_alter_carrier_options.py +17 -0
  116. karrio/server/providers/migrations/0013_tntsettings.py +30 -0
  117. karrio/server/providers/migrations/0014_auto_20210612_1608.py +46 -0
  118. karrio/server/providers/migrations/0015_auto_20210615_1601.py +28 -0
  119. karrio/server/providers/migrations/0016_alter_purolatorsettings_user_token.py +18 -0
  120. karrio/server/providers/migrations/0017_auto_20210805_0359.py +1293 -0
  121. karrio/server/providers/migrations/0018_alter_fedexsettings_user_key.py +18 -0
  122. karrio/server/providers/migrations/0019_dhlpolandsettings_servicelevel.py +65 -0
  123. karrio/server/providers/migrations/0020_genericsettings_labeltemplate.py +52 -0
  124. karrio/server/providers/migrations/0021_auto_20211231_2353.py +40 -0
  125. karrio/server/providers/migrations/0022_carrier_metadata.py +18 -0
  126. karrio/server/providers/migrations/0023_auto_20220124_1916.py +27 -0
  127. karrio/server/providers/migrations/0024_alter_genericsettings_custom_carrier_name.py +19 -0
  128. karrio/server/providers/migrations/0025_alter_servicelevel_service_code.py +19 -0
  129. karrio/server/providers/migrations/0026_auto_20220208_0132.py +59 -0
  130. karrio/server/providers/migrations/0027_auto_20220304_1340.py +29 -0
  131. karrio/server/providers/migrations/0028_auto_20220323_1500.py +33 -0
  132. karrio/server/providers/migrations/0029_easypostsettings.py +27 -0
  133. karrio/server/providers/migrations/0030_amazonmwssettings.py +29 -0
  134. karrio/server/providers/migrations/0031_delete_amazonmwssettings.py +18 -0
  135. karrio/server/providers/migrations/0032_alter_carrier_test.py +18 -0
  136. karrio/server/providers/migrations/0033_auto_20220708_1350.py +22 -0
  137. karrio/server/providers/migrations/0034_amazonmwssettings_dpdhlsettings.py +47 -0
  138. karrio/server/providers/migrations/0035_alter_carrier_capabilities.py +43 -0
  139. karrio/server/providers/migrations/0036_upsfreightsettings.py +31 -0
  140. karrio/server/providers/migrations/0037_chronopostsettings.py +29 -0
  141. karrio/server/providers/migrations/0038_alter_genericsettings_label_template.py +19 -0
  142. karrio/server/providers/migrations/0039_auto_20220906_0612.py +23 -0
  143. karrio/server/providers/migrations/0040_dpdhlsettings_services.py +18 -0
  144. karrio/server/providers/migrations/0041_auto_20221105_0705.py +38 -0
  145. karrio/server/providers/migrations/0042_auto_20221215_1642.py +23 -0
  146. karrio/server/providers/migrations/0043_alter_genericsettings_account_number_and_more.py +39 -0
  147. karrio/server/providers/migrations/0044_carrier_carrier_capabilities.py +64 -0
  148. karrio/server/providers/migrations/0045_alter_carrier_active_alter_carrier_carrier_id.py +31 -0
  149. karrio/server/providers/migrations/0046_remove_dpdhlsettings_signature_and_more.py +41 -0
  150. karrio/server/providers/migrations/0047_dpdsettings.py +286 -0
  151. karrio/server/providers/migrations/0048_servicelevel_min_weight_servicelevel_transit_days_and_more.py +64 -0
  152. karrio/server/providers/migrations/0049_boxknightsettings_geodissettings_lapostesettings_and_more.py +156 -0
  153. karrio/server/providers/migrations/0050_carrier_is_system_alter_carrier_metadata_and_more.py +106 -0
  154. karrio/server/providers/migrations/0051_rename_username_upssettings_client_id_and_more.py +31 -0
  155. karrio/server/providers/migrations/0052_alter_upssettings_account_number_and_more.py +20 -0
  156. karrio/server/providers/migrations/0053_locate2usettings.py +281 -0
  157. karrio/server/providers/migrations/0054_zoom2usettings.py +280 -0
  158. karrio/server/providers/migrations/0055_rename_amazonmwssettings_amazonshippingsettings_and_more.py +44 -0
  159. karrio/server/providers/migrations/0056_asendiaussettings_geodissettings_code_client_and_more.py +75 -0
  160. karrio/server/providers/migrations/0057_alter_servicelevel_weight_unit_belgianpostsettings.py +51 -0
  161. karrio/server/providers/migrations/0058_alliedexpresssettings.py +38 -0
  162. karrio/server/providers/migrations/0059_ratesheet.py +81 -0
  163. karrio/server/providers/migrations/0060_belgianpostsettings_rate_sheet_and_more.py +73 -0
  164. karrio/server/providers/migrations/0061_alliedexpresssettings_service_type.py +17 -0
  165. karrio/server/providers/migrations/0062_sendlesettings_account_country_code.py +257 -0
  166. karrio/server/providers/migrations/0063_servicelevel_metadata.py +25 -0
  167. karrio/server/providers/migrations/0064_alliedexpresslocalsettings.py +43 -0
  168. karrio/server/providers/migrations/0065_servicelevel_carrier_service_code_and_more.py +66 -0
  169. karrio/server/providers/migrations/0066_rename_fedexsettings_fedexwssettings_and_more.py +28 -0
  170. karrio/server/providers/migrations/0067_fedexsettings.py +283 -0
  171. karrio/server/providers/migrations/0068_fedexsettings_track_api_key_and_more.py +38 -0
  172. karrio/server/providers/migrations/0069_alter_canadapostsettings_contract_id_and_more.py +23 -0
  173. karrio/server/providers/migrations/0070_tgesettings_alter_carrier_capabilities.py +65 -0
  174. karrio/server/providers/migrations/0071_alter_tgesettings_my_toll_token.py +18 -0
  175. karrio/server/providers/migrations/0072_rename_eshippersettings_eshipperxmlsettings_and_more.py +28 -0
  176. karrio/server/providers/migrations/0073_delete_eshipperxmlsettings.py +41 -0
  177. karrio/server/providers/migrations/0074_eshippersettings.py +38 -0
  178. karrio/server/providers/migrations/0075_haypostsettings.py +40 -0
  179. karrio/server/providers/migrations/0076_rename_customer_registration_id_uspsinternationalsettings_account_number_and_more.py +125 -0
  180. karrio/server/providers/migrations/0077_uspswtinternationalsettings_uspswtsettings_and_more.py +165 -0
  181. karrio/server/providers/migrations/0078_auto_20240813_1552.py +120 -0
  182. karrio/server/providers/migrations/0079_alter_carrier_options_alter_ratesheet_created_by.py +31 -0
  183. karrio/server/providers/migrations/0080_alter_aramexsettings_account_country_code_and_more.py +3025 -0
  184. karrio/server/providers/migrations/0081_remove_alliedexpresssettings_carrier_ptr_and_more.py +338 -0
  185. karrio/server/providers/migrations/__init__.py +0 -0
  186. karrio/server/providers/models/__init__.py +17 -0
  187. karrio/server/providers/models/carrier.py +309 -0
  188. karrio/server/providers/models/config.py +30 -0
  189. karrio/server/providers/models/service.py +62 -0
  190. karrio/server/providers/models/sheet.py +60 -0
  191. karrio/server/providers/models/template.py +39 -0
  192. karrio/server/providers/models/utils.py +58 -0
  193. karrio/server/providers/router.py +3 -0
  194. karrio/server/providers/serializers/__init__.py +3 -0
  195. karrio/server/providers/serializers/base.py +277 -0
  196. karrio/server/providers/signals.py +27 -0
  197. karrio/server/providers/tests.py +3 -0
  198. karrio/server/providers/urls.py +11 -0
  199. karrio/server/providers/views/__init__.py +0 -0
  200. karrio/server/providers/views/carriers.py +269 -0
  201. karrio/server/providers/views/connections.py +176 -0
  202. karrio/server/samples.py +352 -0
  203. karrio/server/serializers/__init__.py +2 -0
  204. karrio/server/serializers/abstract.py +506 -0
  205. karrio/server/tracing/__init__.py +0 -0
  206. karrio/server/tracing/admin.py +63 -0
  207. karrio/server/tracing/apps.py +8 -0
  208. karrio/server/tracing/migrations/0001_initial.py +41 -0
  209. karrio/server/tracing/migrations/0002_auto_20220710_1307.py +22 -0
  210. karrio/server/tracing/migrations/0003_auto_20221105_0317.py +43 -0
  211. karrio/server/tracing/migrations/0004_tracingrecord_carrier_account_idx.py +24 -0
  212. karrio/server/tracing/migrations/0005_optimise_tracingrecord_request_log_idx.py +25 -0
  213. karrio/server/tracing/migrations/0006_alter_tracingrecord_options_and_more.py +49 -0
  214. karrio/server/tracing/migrations/__init__.py +0 -0
  215. karrio/server/tracing/models.py +80 -0
  216. karrio/server/tracing/tests.py +3 -0
  217. karrio/server/tracing/utils.py +112 -0
  218. karrio/server/user/__init__.py +0 -0
  219. karrio/server/user/admin.py +96 -0
  220. karrio/server/user/apps.py +7 -0
  221. karrio/server/user/forms.py +35 -0
  222. karrio/server/user/migrations/0001_initial.py +41 -0
  223. karrio/server/user/migrations/0002_token.py +29 -0
  224. karrio/server/user/migrations/0003_token_test_mode.py +20 -0
  225. karrio/server/user/migrations/0004_group.py +26 -0
  226. karrio/server/user/migrations/0005_token_label.py +21 -0
  227. karrio/server/user/migrations/0006_workspaceconfig.py +63 -0
  228. karrio/server/user/migrations/__init__.py +0 -0
  229. karrio/server/user/models.py +203 -0
  230. karrio/server/user/serializers.py +46 -0
  231. karrio/server/user/templates/registration/login.html +108 -0
  232. karrio/server/user/templates/registration/registration_confirm_email.html +10 -0
  233. karrio/server/user/templates/registration/registration_confirm_email.txt +3 -0
  234. karrio/server/user/tests.py +3 -0
  235. karrio/server/user/urls.py +10 -0
  236. karrio/server/user/utils.py +60 -0
  237. karrio/server/user/views.py +9 -0
  238. karrio_server_core-2025.5rc1.dist-info/METADATA +32 -0
  239. karrio_server_core-2025.5rc1.dist-info/RECORD +241 -0
  240. karrio_server_core-2025.5rc1.dist-info/WHEEL +5 -0
  241. karrio_server_core-2025.5rc1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,338 @@
1
+ # Generated by Django 5.1.9 on 2025-05-09 06:49
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("providers", "0080_alter_aramexsettings_account_country_code_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ # 1. Remove all 'services' and other dependent fields first
14
+ migrations.RemoveField(
15
+ model_name="belgianpostsettings",
16
+ name="services",
17
+ ),
18
+ migrations.RemoveField(
19
+ model_name="colissimosettings",
20
+ name="services",
21
+ ),
22
+ migrations.RemoveField(
23
+ model_name="dhlparceldesettings",
24
+ name="services",
25
+ ),
26
+ migrations.RemoveField(
27
+ model_name="dhlpolandsettings",
28
+ name="services",
29
+ ),
30
+ migrations.RemoveField(
31
+ model_name="dpdhlsettings",
32
+ name="services",
33
+ ),
34
+ migrations.RemoveField(
35
+ model_name="dpdsettings",
36
+ name="services",
37
+ ),
38
+ migrations.RemoveField(
39
+ model_name="genericsettings",
40
+ name="services",
41
+ ),
42
+ migrations.RemoveField(
43
+ model_name="genericsettings",
44
+ name="label_template",
45
+ ),
46
+ # 2. Remove all 'carrier_ptr' fields
47
+ migrations.RemoveField(
48
+ model_name="alliedexpresssettings",
49
+ name="carrier_ptr",
50
+ ),
51
+ migrations.RemoveField(
52
+ model_name="amazonshippingsettings",
53
+ name="carrier_ptr",
54
+ ),
55
+ migrations.RemoveField(
56
+ model_name="aramexsettings",
57
+ name="carrier_ptr",
58
+ ),
59
+ migrations.RemoveField(
60
+ model_name="asendiaussettings",
61
+ name="carrier_ptr",
62
+ ),
63
+ migrations.RemoveField(
64
+ model_name="australiapostsettings",
65
+ name="carrier_ptr",
66
+ ),
67
+ migrations.RemoveField(
68
+ model_name="belgianpostsettings",
69
+ name="carrier_ptr",
70
+ ),
71
+ migrations.RemoveField(
72
+ model_name="boxknightsettings",
73
+ name="carrier_ptr",
74
+ ),
75
+ migrations.RemoveField(
76
+ model_name="canadapostsettings",
77
+ name="carrier_ptr",
78
+ ),
79
+ migrations.RemoveField(
80
+ model_name="canparsettings",
81
+ name="carrier_ptr",
82
+ ),
83
+ migrations.RemoveField(
84
+ model_name="chronopostsettings",
85
+ name="carrier_ptr",
86
+ ),
87
+ migrations.RemoveField(
88
+ model_name="colissimosettings",
89
+ name="carrier_ptr",
90
+ ),
91
+ migrations.RemoveField(
92
+ model_name="dhlexpresssettings",
93
+ name="carrier_ptr",
94
+ ),
95
+ migrations.RemoveField(
96
+ model_name="dhlparceldesettings",
97
+ name="carrier_ptr",
98
+ ),
99
+ migrations.RemoveField(
100
+ model_name="dhlpolandsettings",
101
+ name="carrier_ptr",
102
+ ),
103
+ migrations.RemoveField(
104
+ model_name="dhluniversalsettings",
105
+ name="carrier_ptr",
106
+ ),
107
+ migrations.RemoveField(
108
+ model_name="dicomsettings",
109
+ name="carrier_ptr",
110
+ ),
111
+ migrations.RemoveField(
112
+ model_name="dpdhlsettings",
113
+ name="carrier_ptr",
114
+ ),
115
+ migrations.RemoveField(
116
+ model_name="dpdsettings",
117
+ name="carrier_ptr",
118
+ ),
119
+ migrations.RemoveField(
120
+ model_name="easypostsettings",
121
+ name="carrier_ptr",
122
+ ),
123
+ migrations.RemoveField(
124
+ model_name="eshippersettings",
125
+ name="carrier_ptr",
126
+ ),
127
+ migrations.RemoveField(
128
+ model_name="fedexsettings",
129
+ name="carrier_ptr",
130
+ ),
131
+ migrations.RemoveField(
132
+ model_name="fedexwssettings",
133
+ name="carrier_ptr",
134
+ ),
135
+ migrations.RemoveField(
136
+ model_name="freightcomsettings",
137
+ name="carrier_ptr",
138
+ ),
139
+ migrations.RemoveField(
140
+ model_name="genericsettings",
141
+ name="carrier_ptr",
142
+ ),
143
+ migrations.RemoveField(
144
+ model_name="geodissettings",
145
+ name="carrier_ptr",
146
+ ),
147
+ migrations.RemoveField(
148
+ model_name="haypostsettings",
149
+ name="carrier_ptr",
150
+ ),
151
+ migrations.RemoveField(
152
+ model_name="lapostesettings",
153
+ name="carrier_ptr",
154
+ ),
155
+ migrations.RemoveField(
156
+ model_name="locate2usettings",
157
+ name="carrier_ptr",
158
+ ),
159
+ migrations.RemoveField(
160
+ model_name="nationexsettings",
161
+ name="carrier_ptr",
162
+ ),
163
+ migrations.RemoveField(
164
+ model_name="purolatorsettings",
165
+ name="carrier_ptr",
166
+ ),
167
+ migrations.RemoveField(
168
+ model_name="roadiesettings",
169
+ name="carrier_ptr",
170
+ ),
171
+ migrations.RemoveField(
172
+ model_name="royalmailsettings",
173
+ name="carrier_ptr",
174
+ ),
175
+ migrations.RemoveField(
176
+ model_name="sendlesettings",
177
+ name="carrier_ptr",
178
+ ),
179
+ migrations.RemoveField(
180
+ model_name="tgesettings",
181
+ name="carrier_ptr",
182
+ ),
183
+ migrations.RemoveField(
184
+ model_name="tntsettings",
185
+ name="carrier_ptr",
186
+ ),
187
+ migrations.RemoveField(
188
+ model_name="upssettings",
189
+ name="carrier_ptr",
190
+ ),
191
+ migrations.RemoveField(
192
+ model_name="uspsinternationalsettings",
193
+ name="carrier_ptr",
194
+ ),
195
+ migrations.RemoveField(
196
+ model_name="uspssettings",
197
+ name="carrier_ptr",
198
+ ),
199
+ migrations.RemoveField(
200
+ model_name="uspswtinternationalsettings",
201
+ name="carrier_ptr",
202
+ ),
203
+ migrations.RemoveField(
204
+ model_name="uspswtsettings",
205
+ name="carrier_ptr",
206
+ ),
207
+ migrations.RemoveField(
208
+ model_name="zoom2usettings",
209
+ name="carrier_ptr",
210
+ ),
211
+ # 3. Delete all the models
212
+ migrations.DeleteModel(
213
+ name="AlliedExpressLocalSettings",
214
+ ),
215
+ migrations.DeleteModel(
216
+ name="AlliedExpressSettings",
217
+ ),
218
+ migrations.DeleteModel(
219
+ name="AmazonShippingSettings",
220
+ ),
221
+ migrations.DeleteModel(
222
+ name="AramexSettings",
223
+ ),
224
+ migrations.DeleteModel(
225
+ name="AsendiaUSSettings",
226
+ ),
227
+ migrations.DeleteModel(
228
+ name="AustraliaPostSettings",
229
+ ),
230
+ migrations.DeleteModel(
231
+ name="BelgianPostSettings",
232
+ ),
233
+ migrations.DeleteModel(
234
+ name="BoxKnightSettings",
235
+ ),
236
+ migrations.DeleteModel(
237
+ name="CanadaPostSettings",
238
+ ),
239
+ migrations.DeleteModel(
240
+ name="CanparSettings",
241
+ ),
242
+ migrations.DeleteModel(
243
+ name="ChronopostSettings",
244
+ ),
245
+ migrations.DeleteModel(
246
+ name="ColissimoSettings",
247
+ ),
248
+ migrations.DeleteModel(
249
+ name="DHLExpressSettings",
250
+ ),
251
+ migrations.DeleteModel(
252
+ name="DHLParcelDESettings",
253
+ ),
254
+ migrations.DeleteModel(
255
+ name="DHLPolandSettings",
256
+ ),
257
+ migrations.DeleteModel(
258
+ name="DHLUniversalSettings",
259
+ ),
260
+ migrations.DeleteModel(
261
+ name="DicomSettings",
262
+ ),
263
+ migrations.DeleteModel(
264
+ name="DPDHLSettings",
265
+ ),
266
+ migrations.DeleteModel(
267
+ name="DPDSettings",
268
+ ),
269
+ migrations.DeleteModel(
270
+ name="EasyPostSettings",
271
+ ),
272
+ migrations.DeleteModel(
273
+ name="EShipperSettings",
274
+ ),
275
+ migrations.DeleteModel(
276
+ name="FedexSettings",
277
+ ),
278
+ migrations.DeleteModel(
279
+ name="FedexWSSettings",
280
+ ),
281
+ migrations.DeleteModel(
282
+ name="FreightcomSettings",
283
+ ),
284
+ migrations.DeleteModel(
285
+ name="GenericSettings",
286
+ ),
287
+ migrations.DeleteModel(
288
+ name="GEODISSettings",
289
+ ),
290
+ migrations.DeleteModel(
291
+ name="HayPostSettings",
292
+ ),
293
+ migrations.DeleteModel(
294
+ name="LaPosteSettings",
295
+ ),
296
+ migrations.DeleteModel(
297
+ name="Locate2uSettings",
298
+ ),
299
+ migrations.DeleteModel(
300
+ name="NationexSettings",
301
+ ),
302
+ migrations.DeleteModel(
303
+ name="PurolatorSettings",
304
+ ),
305
+ migrations.DeleteModel(
306
+ name="RoadieSettings",
307
+ ),
308
+ migrations.DeleteModel(
309
+ name="RoyalMailSettings",
310
+ ),
311
+ migrations.DeleteModel(
312
+ name="SendleSettings",
313
+ ),
314
+ migrations.DeleteModel(
315
+ name="TGESettings",
316
+ ),
317
+ migrations.DeleteModel(
318
+ name="TNTSettings",
319
+ ),
320
+ migrations.DeleteModel(
321
+ name="UPSSettings",
322
+ ),
323
+ migrations.DeleteModel(
324
+ name="USPSInternationalSettings",
325
+ ),
326
+ migrations.DeleteModel(
327
+ name="USPSSettings",
328
+ ),
329
+ migrations.DeleteModel(
330
+ name="USPSWTInternationalSettings",
331
+ ),
332
+ migrations.DeleteModel(
333
+ name="USPSWTSettings",
334
+ ),
335
+ migrations.DeleteModel(
336
+ name="Zoom2uSettings",
337
+ ),
338
+ ]
File without changes
@@ -0,0 +1,17 @@
1
+
2
+ from karrio.server.providers.models.sheet import RateSheet
3
+ from karrio.server.providers.models.config import CarrierConfig
4
+ from karrio.server.providers.models.service import ServiceLevel
5
+ from karrio.server.providers.models.template import LabelTemplate
6
+ import karrio.server.providers.extension.models as extensions
7
+ from karrio.server.core.models.base import register_model
8
+ from karrio.server.providers.models.utils import has_rate_sheet
9
+ from karrio.server.providers.models.carrier import (
10
+ Carrier,
11
+ COUNTRIES,
12
+ CURRENCIES,
13
+ WEIGHT_UNITS,
14
+ DIMENSION_UNITS,
15
+ CAPABILITIES_CHOICES,
16
+ create_carrier_proxy,
17
+ )
@@ -0,0 +1,309 @@
1
+ import typing
2
+ import functools
3
+ import django.conf as conf
4
+ import django.forms as forms
5
+ import django.db.models as models
6
+
7
+ import karrio.sdk as karrio
8
+ import karrio.lib as lib
9
+ import karrio.core.units as units
10
+ import django.core.cache as caching
11
+ import karrio.api.gateway as gateway
12
+ import karrio.server.core.models as core
13
+ import karrio.server.core.fields as fields
14
+ import karrio.server.core.datatypes as datatypes
15
+
16
+
17
+ COUNTRIES = [(c.name, c.name) for c in units.Country]
18
+ CURRENCIES = [(c.name, c.name) for c in units.Currency]
19
+ WEIGHT_UNITS = [(c.name, c.name) for c in units.WeightUnit]
20
+ DIMENSION_UNITS = [(c.name, c.name) for c in units.DimensionUnit]
21
+ CAPABILITIES_CHOICES = [(c, c) for c in units.CarrierCapabilities.get_capabilities()]
22
+
23
+
24
+ class Manager(models.Manager):
25
+ def get_queryset(self):
26
+ return (
27
+ super()
28
+ .get_queryset()
29
+ .select_related(
30
+ "created_by",
31
+ *(("link",) if conf.settings.MULTI_ORGANIZATIONS else tuple()),
32
+ )
33
+ )
34
+
35
+
36
+ class CarrierManager(Manager):
37
+ def get_queryset(self):
38
+ return super().get_queryset().filter(is_system=False)
39
+
40
+
41
+ class SystemCarrierManager(models.Manager):
42
+ def get_queryset(self):
43
+ return (
44
+ super()
45
+ .get_queryset()
46
+ .prefetch_related(
47
+ "configs",
48
+ )
49
+ .select_related(
50
+ "created_by",
51
+ *(("link",) if conf.settings.MULTI_ORGANIZATIONS else tuple()),
52
+ )
53
+ .filter(is_system=True)
54
+ )
55
+
56
+
57
+ @core.register_model
58
+ class Carrier(core.OwnedEntity):
59
+ class Meta:
60
+ ordering = ["test_mode", "-created_at"]
61
+
62
+ objects = Manager()
63
+ user_carriers = CarrierManager()
64
+ system_carriers = SystemCarrierManager()
65
+
66
+ id = models.CharField(
67
+ max_length=50,
68
+ primary_key=True,
69
+ default=functools.partial(core.uuid, prefix="car_"),
70
+ editable=False,
71
+ )
72
+ carrier_code = models.CharField(
73
+ max_length=100,
74
+ db_index=True,
75
+ default="generic",
76
+ help_text="eg. dhl_express, fedex, ups, usps, ...",
77
+ )
78
+ carrier_id = models.CharField(
79
+ max_length=150,
80
+ db_index=True,
81
+ help_text="eg. canadapost, dhl_express, fedex, purolator_courrier, ups...",
82
+ )
83
+ credentials = models.JSONField(
84
+ default=core.field_default({}),
85
+ help_text="Carrier connection credentials",
86
+ )
87
+ capabilities = fields.MultiChoiceField(
88
+ choices=datatypes.CAPABILITIES_CHOICES,
89
+ default=core.field_default([]),
90
+ help_text="Select the capabilities of the carrier that you want to enable",
91
+ )
92
+ metadata = models.JSONField(
93
+ blank=True,
94
+ null=True,
95
+ default=core.field_default({}),
96
+ help_text="User defined metadata",
97
+ )
98
+ active = models.BooleanField(
99
+ default=True,
100
+ db_index=True,
101
+ help_text="Disable/Hide carrier from clients",
102
+ )
103
+ is_system = models.BooleanField(
104
+ default=False,
105
+ db_index=True,
106
+ help_text="Determine that the carrier connection is available system wide.",
107
+ )
108
+ test_mode = models.BooleanField(
109
+ default=True,
110
+ db_column="test_mode",
111
+ help_text="Toggle carrier connection mode",
112
+ )
113
+
114
+ created_by = models.ForeignKey(
115
+ conf.settings.AUTH_USER_MODEL,
116
+ blank=True,
117
+ null=True,
118
+ on_delete=models.CASCADE,
119
+ editable=False,
120
+ )
121
+ active_users = models.ManyToManyField(
122
+ conf.settings.AUTH_USER_MODEL,
123
+ blank=True,
124
+ related_name="connection_users",
125
+ )
126
+ rate_sheet = models.ForeignKey(
127
+ "RateSheet",
128
+ null=True,
129
+ blank=True,
130
+ on_delete=models.SET_NULL,
131
+ )
132
+
133
+ def __str__(self):
134
+ return self.carrier_id
135
+
136
+ @property
137
+ def object_type(self):
138
+ return "carrier-connection"
139
+
140
+ @property
141
+ def ext(self) -> str:
142
+ return (
143
+ "generic"
144
+ if "custom_carrier_name" in self.credentials
145
+ else lib.failsafe(lambda: self.carrier_code) or "generic"
146
+ )
147
+
148
+ @property
149
+ def carrier_name(self):
150
+ return (
151
+ self.credentials.get("custom_carrier_name")
152
+ if "custom_carrier_name" in self.credentials
153
+ else lib.failsafe(lambda: self.carrier_code) or "generic"
154
+ )
155
+
156
+ @property
157
+ def display_name(self):
158
+ import karrio.references as references
159
+
160
+ return self.credentials.get("display_name") or references.REFERENCES[
161
+ "carriers"
162
+ ].get(self.ext) or "generic"
163
+
164
+ @property
165
+ def carrier_config(self):
166
+ return self.__class__.resolve_config(self)
167
+
168
+ @property
169
+ def config(self) -> dict:
170
+ return getattr(self.carrier_config, "config", {})
171
+
172
+ @property
173
+ def services(self) -> typing.Optional[typing.List[dict]]:
174
+
175
+ if self.rate_sheet is None:
176
+ return None
177
+
178
+ return self.rate_sheet.services.all()
179
+
180
+ @property
181
+ def data(self) -> datatypes.CarrierSettings:
182
+ _computed_data: typing.Dict = dict(
183
+ id=self.id,
184
+ config=self.config,
185
+ test_mode=self.test_mode,
186
+ metadata=self.metadata,
187
+ carrier_id=self.carrier_id,
188
+ carrier_name=self.ext,
189
+ display_name=self.display_name,
190
+ )
191
+
192
+ if any(self.services or []):
193
+ _computed_data.update(
194
+ services=[forms.model_to_dict(s) for s in self.services]
195
+ )
196
+
197
+ # override the config with the system config
198
+ if self.is_system and self.carrier_config is None:
199
+ _config = self.__class__.resolve_config(self, is_system_config=True)
200
+ _computed_data.update(config=getattr(_config, "config", None))
201
+
202
+ return datatypes.CarrierSettings.create(
203
+ {
204
+ **self.credentials,
205
+ **_computed_data,
206
+ }
207
+ )
208
+
209
+ @property
210
+ def gateway(self) -> gateway.Gateway:
211
+ import karrio.server.core.middleware as middleware
212
+
213
+ _context = middleware.SessionContext.get_current_request()
214
+ _tracer = getattr(_context, "tracer", lib.Tracer())
215
+ _cache = lib.Cache(caching.cache)
216
+
217
+ return karrio.gateway[self.ext].create(
218
+ self.data.to_dict(),
219
+ _tracer,
220
+ _cache,
221
+ )
222
+
223
+ @staticmethod
224
+ def resolve_config(
225
+ carrier, is_user_config: bool = False, is_system_config: bool = False
226
+ ):
227
+ """Resolve the config for a carrier.
228
+ Here are the rules:
229
+ - If the carrier is a system carrier, return the first config with no org
230
+ - If the carrier is an org carrier, return the first config from the org
231
+ - If the carrier is a user carrier, return the first config from the user
232
+ """
233
+ import karrio.server.serializers as serializers
234
+ import karrio.server.core.middleware as middleware
235
+ from django.contrib.auth.models import AnonymousUser
236
+ from karrio.server.providers.models.config import CarrierConfig
237
+
238
+ if carrier.id is None:
239
+ return None
240
+
241
+ _ctx = serializers.get_object_context(carrier)
242
+ ctx = lib.identity(
243
+ _ctx
244
+ if (_ctx.user or _ctx.org)
245
+ else lib.failsafe(lambda: middleware.SessionContext.get_current_request())
246
+ )
247
+ has_ctx_user = lib.identity(
248
+ ctx and ((ctx.user and not isinstance(ctx.user, AnonymousUser)) or ctx.org)
249
+ )
250
+
251
+ queryset = lib.identity(
252
+ CarrierConfig.objects.filter(carrier=carrier)
253
+ if carrier.is_system
254
+ else CarrierConfig.access_by(ctx).filter(carrier=carrier)
255
+ )
256
+
257
+ if carrier.is_system:
258
+ _config = queryset.filter(
259
+ created_by__is_staff=True,
260
+ **({"org": None} if hasattr(carrier, "org") else {}),
261
+ ).first()
262
+
263
+ if has_ctx_user:
264
+ return queryset.filter(
265
+ **(
266
+ {"org": (None if is_system_config else ctx.org)}
267
+ if hasattr(carrier, "org")
268
+ else {"created_by": ctx.user}
269
+ )
270
+ ).first() or (None if is_user_config else _config)
271
+
272
+ return _config
273
+
274
+ return queryset.first()
275
+
276
+
277
+ def create_carrier_proxy(carrier_name: str, display_name):
278
+ class _Manager(Manager):
279
+ def get_queryset(self):
280
+ return super().get_queryset().filter(carrier_code=carrier_name)
281
+
282
+ class _CarrierManager(CarrierManager):
283
+ def get_queryset(self):
284
+ return super().get_queryset().filter(carrier_code=carrier_name)
285
+
286
+ class _SystemCarrierManager(SystemCarrierManager):
287
+ def get_queryset(self):
288
+ return super().get_queryset().filter(carrier_code=carrier_name)
289
+
290
+ return type(
291
+ f"{carrier_name}Connection",
292
+ (Carrier,),
293
+ {
294
+ "Meta": type(
295
+ "Meta",
296
+ (),
297
+ {
298
+ "proxy": True,
299
+ "__module__": __name__,
300
+ "verbose_name": f"{display_name} Connection",
301
+ "verbose_name_plural": f"{display_name} Connections",
302
+ },
303
+ ),
304
+ "__module__": __name__,
305
+ "objects": _Manager(),
306
+ "user_carriers": _CarrierManager(),
307
+ "system_carriers": _SystemCarrierManager(),
308
+ },
309
+ )
@@ -0,0 +1,30 @@
1
+ import functools
2
+ import django.db.models as models
3
+ import karrio.server.core.models as core
4
+
5
+
6
+ @core.register_model
7
+ class CarrierConfig(core.OwnedEntity):
8
+ class Meta:
9
+ db_table = "carrier-config"
10
+ verbose_name = "Carrier Config"
11
+ verbose_name_plural = "Carrier Configs"
12
+ ordering = ["-created_at"]
13
+
14
+ id = models.CharField(
15
+ max_length=50,
16
+ editable=False,
17
+ primary_key=True,
18
+ default=functools.partial(core.uuid, prefix="cfg_"),
19
+ )
20
+ carrier = models.ForeignKey(
21
+ "Carrier",
22
+ null=False,
23
+ related_name="configs",
24
+ on_delete=models.CASCADE,
25
+ )
26
+ config = models.JSONField(
27
+ null=False,
28
+ blank=False,
29
+ default=core.field_default({}),
30
+ )