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,369 @@
1
+ import attr
2
+ import typing
3
+ import jstruct
4
+ import karrio.core.units as units
5
+ from karrio.core.models import (
6
+ DocumentDetails,
7
+ Documents,
8
+ Images,
9
+ Parcel,
10
+ Message,
11
+ Address as BaseAddress,
12
+ TrackingRequest as BaseTrackingRequest,
13
+ ShipmentDetails,
14
+ Payment,
15
+ Customs,
16
+ RateRequest as BaseRateRequest,
17
+ ShipmentRequest as BaseShipmentRequest,
18
+ ShipmentCancelRequest,
19
+ ChargeDetails,
20
+ PickupRequest as BasePickupRequest,
21
+ PickupDetails,
22
+ PickupUpdateRequest as BasePickupUpdateRequest,
23
+ PickupCancelRequest as BasePickupCancelRequest,
24
+ ConfirmationDetails as Confirmation,
25
+ TrackingEvent,
26
+ TrackingDetails,
27
+ TrackingInfo,
28
+ DocumentFile,
29
+ DocumentUploadRequest,
30
+ ManifestRequest,
31
+ ManifestDetails,
32
+ ManifestDocument,
33
+ )
34
+
35
+
36
+ COUNTRIES = [(c.name, c.name) for c in units.Country]
37
+ CURRENCIES = [(c.name, c.name) for c in units.Currency]
38
+ WEIGHT_UNITS = [(c.name, c.name) for c in units.WeightUnit]
39
+ DIMENSION_UNITS = [(c.name, c.name) for c in units.DimensionUnit]
40
+ CAPABILITIES_CHOICES = [(c, c) for c in units.CarrierCapabilities.get_capabilities()]
41
+ LABEL_TYPES = [(c.name, c.name) for c in list(units.LabelType)]
42
+
43
+
44
+ class CarrierSettings:
45
+ def __init__(
46
+ self,
47
+ carrier_name: str,
48
+ carrier_id: str,
49
+ test_mode: bool = None,
50
+ active: bool = None,
51
+ id: str = None,
52
+ display_name: str = None,
53
+ **kwargs
54
+ ):
55
+ self.carrier_name = carrier_name
56
+ self.display_name = display_name
57
+ self.carrier_id = carrier_id
58
+ self.active = active
59
+ self.test_mode = test_mode
60
+ self.id = id
61
+
62
+ for name, value in kwargs.items():
63
+ if name not in ["carrier_ptr", "created_by", "active_users", "active_orgs"]:
64
+ self.__setattr__(name, value)
65
+
66
+ # TODO: rename this to avoid confusion
67
+ def to_dict(self):
68
+ return {
69
+ name: value
70
+ for name, value in self.__dict__.items()
71
+ if name
72
+ not in [
73
+ "carrier_name",
74
+ "created_by",
75
+ "active",
76
+ "capabilities",
77
+ "active_users",
78
+ "active_orgs",
79
+ *([] if self.carrier_name == "generic" else ["display_name"]),
80
+ ]
81
+ }
82
+
83
+ @classmethod
84
+ def create(cls, data: dict):
85
+ return cls(**data)
86
+
87
+
88
+ @attr.s(auto_attribs=True)
89
+ class AddressValidation:
90
+ success: bool
91
+ meta: dict = {}
92
+
93
+
94
+ @attr.s(auto_attribs=True)
95
+ class Address(BaseAddress):
96
+ id: str = None
97
+ postal_code: str = None
98
+ city: str = None
99
+ person_name: str = None
100
+ company_name: str = None
101
+ country_code: str = None
102
+ email: str = None
103
+ phone_number: str = None
104
+
105
+ state_code: str = None
106
+ residential: bool = False
107
+
108
+ address_line1: str = ""
109
+ address_line2: str = ""
110
+
111
+ federal_tax_id: str = None
112
+ state_tax_id: str = None
113
+
114
+ validate_location: bool = None
115
+ validation: jstruct.JStruct[AddressValidation] = None
116
+
117
+
118
+ @attr.s(auto_attribs=True)
119
+ class PickupRequest(BasePickupRequest):
120
+ pickup_date: str
121
+ ready_time: str
122
+ closing_time: str
123
+ address: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
124
+
125
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel]
126
+ shipment_identifiers: typing.List[str] = []
127
+ package_location: str = None
128
+ metadata: typing.Dict = {}
129
+ options: typing.Dict = {}
130
+ instruction: str = None
131
+
132
+
133
+ @attr.s(auto_attribs=True)
134
+ class PickupUpdateRequest(BasePickupUpdateRequest):
135
+ confirmation_number: str
136
+ pickup_date: str
137
+ ready_time: str
138
+ closing_time: str
139
+ address: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
140
+
141
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel]
142
+ shipment_identifiers: typing.List[str] = []
143
+ package_location: str = None
144
+ options: typing.Dict = {}
145
+ instruction: str = None
146
+
147
+
148
+ @attr.s(auto_attribs=True)
149
+ class PickupCancelRequest(BasePickupCancelRequest):
150
+ confirmation_number: str
151
+
152
+ address: Address = jstruct.JStruct[Address]
153
+ pickup_date: str = None
154
+ reason: str = None
155
+ options: typing.Dict = {}
156
+
157
+
158
+ @attr.s(auto_attribs=True)
159
+ class Rate:
160
+ carrier_name: str
161
+ carrier_id: str
162
+
163
+ currency: str = None
164
+ transit_days: int = None
165
+ service: str = None
166
+ total_charge: float = 0.0
167
+ extra_charges: typing.List[ChargeDetails] = []
168
+ estimated_delivery: str = None
169
+ id: str = None
170
+ meta: dict = None
171
+ test_mode: bool = None
172
+ object_type: str = "rate"
173
+
174
+
175
+ @attr.s(auto_attribs=True)
176
+ class RateRequest(BaseRateRequest):
177
+ shipper: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
178
+ recipient: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
179
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel, jstruct.REQUIRED]
180
+
181
+ payment: Payment = jstruct.JStruct[Payment]
182
+ customs: Customs = jstruct.JStruct[Customs]
183
+ return_address: Address = jstruct.JStruct[Address]
184
+ billing_address: Address = jstruct.JStruct[Address]
185
+
186
+ services: typing.List[str] = []
187
+ options: typing.Dict = {}
188
+ reference: str = ""
189
+
190
+ carrier_ids: typing.List[str] = []
191
+
192
+
193
+ @attr.s(auto_attribs=True)
194
+ class ShipmentRequest(BaseShipmentRequest):
195
+ service: str
196
+ selected_rate_id: str # type: ignore
197
+
198
+ shipper: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
199
+ recipient: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
200
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel, jstruct.REQUIRED]
201
+ rates: typing.List[Rate] = jstruct.JList[Rate, jstruct.REQUIRED]
202
+
203
+ payment: Payment = jstruct.JStruct[Payment]
204
+ customs: Customs = jstruct.JStruct[Customs]
205
+ return_address: Address = jstruct.JStruct[Address]
206
+ billing_address: Address = jstruct.JStruct[Address]
207
+
208
+ options: typing.Dict = {}
209
+ reference: str = ""
210
+ label_type: str = None
211
+ id: str = None
212
+
213
+ metadata: typing.Dict = {}
214
+
215
+
216
+ @attr.s(auto_attribs=True)
217
+ class Shipment:
218
+ carrier_id: str
219
+ carrier_name: str
220
+ tracking_number: str
221
+ shipment_identifier: str
222
+ service: str
223
+ selected_rate_id: str
224
+
225
+ shipper: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
226
+ recipient: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
227
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel, jstruct.REQUIRED]
228
+ rates: typing.List[Rate] = jstruct.JList[Rate, jstruct.REQUIRED]
229
+ selected_rate: Rate = jstruct.JStruct[Rate, jstruct.REQUIRED]
230
+ docs: Documents = jstruct.JStruct[Documents, jstruct.REQUIRED]
231
+
232
+ payment: Payment = jstruct.JStruct[Payment]
233
+ customs: Customs = jstruct.JStruct[Customs]
234
+ billing_address: Address = jstruct.JStruct[Address]
235
+
236
+ options: typing.Dict = {}
237
+ reference: str = ""
238
+ label_type: str = None
239
+ tracking_url: str = None
240
+ tracker_id: str = None
241
+ status: str = ""
242
+ metadata: typing.Dict = {}
243
+ meta: dict = {}
244
+ id: str = None
245
+
246
+ messages: typing.List[Message] = jstruct.JList[Message]
247
+ created_at: str = None
248
+ test_mode: bool = None
249
+
250
+
251
+ @attr.s(auto_attribs=True)
252
+ class Pickup:
253
+ carrier_id: str
254
+ carrier_name: str
255
+
256
+ pickup_date: str
257
+ ready_time: str
258
+ closing_time: str
259
+ confirmation_number: str
260
+ address: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
261
+ parcels: typing.List[Parcel] = jstruct.JList[Parcel, jstruct.REQUIRED]
262
+
263
+ pickup_charge: ChargeDetails = jstruct.JStruct[ChargeDetails]
264
+ instruction: str = None
265
+ package_location: str = None
266
+ metadata: typing.Dict = {}
267
+ options: typing.Dict = {}
268
+ meta: dict = {}
269
+ id: str = None
270
+
271
+ messages: typing.List[Message] = jstruct.JList[Message]
272
+ test_mode: bool = None
273
+
274
+
275
+ @attr.s(auto_attribs=True)
276
+ class TrackingRequest(BaseTrackingRequest):
277
+ tracking_numbers: typing.List[str]
278
+ account_numer: str = None
279
+ reference: str = None
280
+ options: typing.Dict = {}
281
+ info: TrackingInfo = jstruct.JStruct[TrackingInfo]
282
+
283
+
284
+ @attr.s(auto_attribs=True)
285
+ class Tracking:
286
+ carrier_name: str
287
+ carrier_id: str
288
+ tracking_number: str
289
+ events: typing.List[TrackingEvent] = jstruct.JList[TrackingEvent]
290
+
291
+ status: str = "unknown"
292
+ info: TrackingInfo = jstruct.JStruct[TrackingInfo]
293
+ images: Images = jstruct.JStruct[Images]
294
+ estimated_delivery: str = None
295
+ delivered: bool = None
296
+ test_mode: bool = None
297
+ options: typing.Dict = {}
298
+ meta: dict = None
299
+ id: str = None
300
+
301
+
302
+ @attr.s(auto_attribs=True)
303
+ class DocumentUploadResponse:
304
+ carrier_name: str
305
+ carrier_id: str
306
+ documents: typing.List[DocumentDetails] = jstruct.JList[DocumentDetails]
307
+ reference: str = ""
308
+
309
+ test_mode: bool = None
310
+ options: typing.Dict = {}
311
+ meta: dict = None
312
+ id: str = None
313
+ messages: typing.List[Message] = jstruct.JList[Message]
314
+
315
+
316
+ @attr.s(auto_attribs=True)
317
+ class Manifest:
318
+ carrier_id: str
319
+ carrier_name: str
320
+
321
+ shipment_identifiers: typing.List[str]
322
+ address: Address = jstruct.JStruct[Address, jstruct.REQUIRED]
323
+ doc: ManifestDocument = jstruct.JStruct[ManifestDocument]
324
+
325
+ reference: str = None
326
+ metadata: typing.Dict = {}
327
+ options: typing.Dict = {}
328
+ meta: dict = {}
329
+ id: str = None
330
+
331
+ messages: typing.List[Message] = jstruct.JList[Message]
332
+ test_mode: bool = None
333
+
334
+
335
+ @attr.s(auto_attribs=True)
336
+ class ConfirmationResponse:
337
+ messages: typing.List[Message] = jstruct.JList[Message]
338
+ confirmation: Confirmation = jstruct.JStruct[Confirmation]
339
+
340
+
341
+ @attr.s(auto_attribs=True)
342
+ class PickupResponse:
343
+ messages: typing.List[Message] = jstruct.JList[Message]
344
+ pickup: Pickup = jstruct.JStruct[Pickup]
345
+
346
+
347
+ @attr.s(auto_attribs=True)
348
+ class RateResponse:
349
+ messages: typing.List[Message] = jstruct.JList[Message]
350
+ rates: typing.List[Rate] = jstruct.JList[Rate]
351
+
352
+
353
+ @attr.s(auto_attribs=True)
354
+ class TrackingResponse:
355
+ messages: typing.List[Message] = jstruct.JList[Message]
356
+ tracking: Tracking = jstruct.JStruct[Tracking]
357
+
358
+
359
+ @attr.s(auto_attribs=True)
360
+ class ManifestResponse:
361
+ messages: typing.List[Message] = jstruct.JList[Message]
362
+ manifest: Manifest = jstruct.JStruct[Manifest]
363
+
364
+
365
+ @attr.s(auto_attribs=True)
366
+ class Error:
367
+ message: str = None
368
+ code: str = None
369
+ details: typing.Dict = None
@@ -0,0 +1,156 @@
1
+ import typing
2
+ from constance import config
3
+ from django.urls import reverse
4
+ from rest_framework.request import Request
5
+
6
+ import karrio.lib as lib
7
+ import karrio.references as ref
8
+ import karrio.core.units as units
9
+ import karrio.server.conf as conf
10
+
11
+
12
+ PACKAGE_MAPPERS = ref.collect_providers_data()
13
+ REFERENCE_MODELS = {
14
+ **ref.collect_references(),
15
+ "customs_content_type": {c.name: c.value for c in list(units.CustomsContentType)},
16
+ "incoterms": {c.name: c.value for c in list(units.Incoterm)},
17
+ }
18
+ REFERENCE_EXCLUSIONS = [
19
+ "currencies",
20
+ "incoterms",
21
+ "weight_units",
22
+ "dimension_units",
23
+ "payment_types",
24
+ "option_names",
25
+ "customs_content_type",
26
+ "options",
27
+ ]
28
+ CARRIER_NAMES = list(sorted(set([*REFERENCE_MODELS["carriers"].keys(), "generic"])))
29
+ CARRIER_HUBS = list(sorted(REFERENCE_MODELS["carrier_hubs"].keys()))
30
+ NON_HUBS_CARRIERS = [
31
+ carrier_name for carrier_name in CARRIER_NAMES if carrier_name not in CARRIER_HUBS
32
+ ]
33
+
34
+
35
+ def contextual_metadata(request: Request):
36
+ _host: str = typing.cast(
37
+ str,
38
+ (
39
+ request.build_absolute_uri(
40
+ reverse("karrio.server.core:metadata", kwargs={})
41
+ )
42
+ if hasattr(request, "build_absolute_uri")
43
+ else "/"
44
+ ),
45
+ )
46
+ host = _host[:-1] if _host[-1] == "/" else _host
47
+ name = lib.identity(
48
+ getattr(conf.settings.tenant, "name", conf.settings.APP_NAME)
49
+ if conf.settings.MULTI_TENANTS
50
+ else getattr(config, "APP_NAME", None) or conf.settings.APP_NAME
51
+ )
52
+ website = lib.identity(
53
+ getattr(conf.settings.tenant, "website", conf.settings.APP_WEBSITE)
54
+ if conf.settings.MULTI_TENANTS
55
+ else getattr(config, "APP_WEBSITE", None) or conf.settings.APP_WEBSITE
56
+ )
57
+
58
+ return {
59
+ "VERSION": conf.settings.VERSION,
60
+ "APP_NAME": name,
61
+ "APP_WEBSITE": website,
62
+ "HOST": f"{host}/",
63
+ "ADMIN": f"{host}/admin",
64
+ "GRAPHQL": f"{host}/graphql",
65
+ "OPENAPI": f"{host}/openapi",
66
+ **{
67
+ flag: getattr(conf.settings, flag, None)
68
+ for flag, _ in conf.settings.FEATURE_FLAGS
69
+ },
70
+ }
71
+
72
+
73
+ def contextual_reference(request: Request = None, reduced: bool = True):
74
+ import karrio.server.core.gateway as gateway
75
+ import karrio.server.core.validators as validators
76
+ import karrio.server.core.middleware as middleware
77
+
78
+ request = request or middleware.SessionContext.get_current_request()
79
+ is_authenticated = lib.identity(
80
+ request.user.is_authenticated if hasattr(request, "user") else False
81
+ )
82
+ references = {
83
+ **contextual_metadata(request),
84
+ "ADDRESS_AUTO_COMPLETE": lib.failsafe(
85
+ lambda: validators.Address.get_info(is_authenticated),
86
+ None,
87
+ ),
88
+ **{
89
+ k: v
90
+ for k, v in REFERENCE_MODELS.items()
91
+ if k not in (REFERENCE_EXCLUSIONS if reduced else [])
92
+ },
93
+ }
94
+
95
+ def _get_generic_carriers():
96
+ system_custom_carriers = [
97
+ c for c in gateway.Carriers.list(system_only=True, carrier_name="generic")
98
+ ]
99
+ custom_carriers = [
100
+ c
101
+ for c in (
102
+ gateway.Carriers.list(context=request, carrier_name="generic").exclude(
103
+ is_system=True
104
+ )
105
+ if is_authenticated
106
+ else []
107
+ )
108
+ ]
109
+
110
+ extra_carriers = {
111
+ f"{c.credentials.get('custom_carrier_name') or 'generic'}": c.display_name
112
+ for c in custom_carriers
113
+ }
114
+ system_carriers = {
115
+ f"{c.credentials.get('custom_carrier_name') or 'generic'}": c.display_name
116
+ for c in system_custom_carriers
117
+ }
118
+ extra_services = {
119
+ f"{c.credentials.get('custom_carrier_name') or 'generic'}": {
120
+ s.service_code: s.service_code
121
+ for s in c.services
122
+ or [
123
+ lib.to_object(lib.models.ServiceLevel, _)
124
+ for _ in references["service_levels"][c.ext]
125
+ ]
126
+ }
127
+ for c in custom_carriers
128
+ }
129
+ extra_service_names = {
130
+ name: {key: key.upper().replace("_", " ") for key, _ in value.items()}
131
+ for name, value in extra_services.items()
132
+ }
133
+
134
+ references.update(
135
+ dict(
136
+ custom_carriers=extra_carriers,
137
+ services={**references["services"], **extra_services},
138
+ carriers={**references["carriers"], **system_carriers},
139
+ service_names={**references["service_names"], **extra_service_names},
140
+ )
141
+ )
142
+
143
+ if request is not None and "generic" in CARRIER_NAMES:
144
+ _get_generic_carriers()
145
+
146
+ return references
147
+
148
+
149
+ def get_carrier_details(
150
+ carrier_name: str,
151
+ contextual_reference: dict = None,
152
+ ) -> dict:
153
+ return ref.get_carrier_details(
154
+ carrier_name,
155
+ contextual_reference=contextual_reference or contextual_reference(),
156
+ )