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,24 @@
1
+ # Generated by Django 4.1.3 on 2022-12-10 16:20
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.fields.json
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("tracing", "0003_auto_20221105_0317"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddIndex(
15
+ model_name="tracingrecord",
16
+ index=models.Index(
17
+ django.db.models.fields.json.KeyTextTransform(
18
+ "carrier_account_id", "meta"
19
+ ),
20
+ condition=models.Q(("meta__carrier_account_id__isnull", False)),
21
+ name="carrier_account_idx",
22
+ ),
23
+ ),
24
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 4.2.8 on 2023-12-21 04:13
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.fields.json
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("tracing", "0004_tracingrecord_carrier_account_idx"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveIndex(
14
+ model_name="tracingrecord",
15
+ name="request_log_idx",
16
+ ),
17
+ migrations.AddIndex(
18
+ model_name="tracingrecord",
19
+ index=models.Index(
20
+ django.db.models.fields.json.KeyTransform("request_log_id", "meta"),
21
+ condition=models.Q(("meta__request_log_id__isnull", False)),
22
+ name="request_log_idx",
23
+ ),
24
+ ),
25
+ ]
@@ -0,0 +1,49 @@
1
+ # Generated by Django 4.2.8 on 2023-12-27 19:41
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.fields.json
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("tracing", "0005_optimise_tracingrecord_request_log_idx"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelOptions(
14
+ name="tracingrecord",
15
+ options={
16
+ "ordering": ["-timestamp"],
17
+ "verbose_name": "Tracing Record",
18
+ "verbose_name_plural": "Tracing Records",
19
+ },
20
+ ),
21
+ migrations.AddIndex(
22
+ model_name="tracingrecord",
23
+ index=models.Index(
24
+ django.db.models.fields.json.KeyTextTransform(
25
+ "workflow_action_id", "meta"
26
+ ),
27
+ condition=models.Q(("meta__workflow_action_id__isnull", False)),
28
+ name="workflow_action_idx",
29
+ ),
30
+ ),
31
+ migrations.AddIndex(
32
+ model_name="tracingrecord",
33
+ index=models.Index(
34
+ django.db.models.fields.json.KeyTextTransform(
35
+ "workflow_event_id", "meta"
36
+ ),
37
+ condition=models.Q(("meta__workflow_event_id__isnull", False)),
38
+ name="workflow_event_idx",
39
+ ),
40
+ ),
41
+ migrations.AddIndex(
42
+ model_name="tracingrecord",
43
+ index=models.Index(
44
+ django.db.models.fields.json.KeyTextTransform("workflow_id", "meta"),
45
+ condition=models.Q(("meta__workflow_id__isnull", False)),
46
+ name="workflow_idx",
47
+ ),
48
+ ),
49
+ ]
File without changes
@@ -0,0 +1,80 @@
1
+ from functools import partial
2
+ from django.conf import settings
3
+ from django.db import models
4
+ from django.db.models.fields import json
5
+
6
+ from karrio.core.utils import identity
7
+ from karrio.server.core.models import OwnedEntity, uuid
8
+
9
+
10
+ class TracingRecord(OwnedEntity):
11
+ HIDDEN_PROPS = (*(("org",) if settings.MULTI_ORGANIZATIONS else tuple()),)
12
+
13
+ class Meta:
14
+ db_table = "tracing-record"
15
+ verbose_name = "Tracing Record"
16
+ verbose_name_plural = "Tracing Records"
17
+ ordering = ["-timestamp"]
18
+ indexes = [
19
+ models.Index(
20
+ json.KeyTextTransform("object_id", "meta"),
21
+ condition=models.Q(meta__object_id__isnull=False),
22
+ name="trace_object_idx",
23
+ ),
24
+ models.Index(
25
+ json.KeyTransform("request_log_id", "meta"),
26
+ condition=models.Q(meta__request_log_id__isnull=False),
27
+ name="request_log_idx",
28
+ ),
29
+ models.Index(
30
+ json.KeyTextTransform("carrier_account_id", "meta"),
31
+ condition=models.Q(meta__carrier_account_id__isnull=False),
32
+ name="carrier_account_idx",
33
+ ),
34
+ models.Index(
35
+ json.KeyTextTransform("workflow_action_id", "meta"),
36
+ condition=models.Q(meta__workflow_action_id__isnull=False),
37
+ name="workflow_action_idx",
38
+ ),
39
+ models.Index(
40
+ json.KeyTextTransform("workflow_event_id", "meta"),
41
+ condition=models.Q(meta__workflow_event_id__isnull=False),
42
+ name="workflow_event_idx",
43
+ ),
44
+ models.Index(
45
+ json.KeyTextTransform("workflow_id", "meta"),
46
+ condition=models.Q(meta__workflow_id__isnull=False),
47
+ name="workflow_idx",
48
+ ),
49
+ ]
50
+
51
+ id = models.CharField(
52
+ max_length=50,
53
+ primary_key=True,
54
+ default=partial(uuid, prefix="trace_"),
55
+ editable=False,
56
+ )
57
+ created_by = models.ForeignKey(
58
+ settings.AUTH_USER_MODEL,
59
+ blank=True,
60
+ null=True,
61
+ on_delete=models.CASCADE,
62
+ editable=False,
63
+ )
64
+ key = models.CharField(max_length=50)
65
+ record = models.JSONField(
66
+ default=partial(identity, value={}),
67
+ help_text="Record data",
68
+ )
69
+ timestamp = models.FloatField()
70
+ meta = models.JSONField(
71
+ blank=True,
72
+ null=True,
73
+ default=partial(identity, value={}),
74
+ help_text="Readonly Context metadata use for filtering and premission check",
75
+ )
76
+ test_mode = models.BooleanField(null=False)
77
+
78
+ @property
79
+ def object_type(self):
80
+ return "tracking_record"
@@ -0,0 +1,3 @@
1
+ from django.test import TestCase
2
+
3
+ # Create your tests here.
@@ -0,0 +1,112 @@
1
+ import logging
2
+
3
+ import karrio.lib as lib
4
+ import karrio.server.conf as conf
5
+ import karrio.server.core.utils as utils
6
+ import karrio.server.tracing.models as models
7
+ import karrio.server.serializers as serializers
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @utils.error_wrapper
13
+ def save_tracing_records(context, tracer: lib.Tracer = None, schema: str = None):
14
+ if conf.settings.PERSIST_SDK_TRACING is False:
15
+ return
16
+
17
+ tracer = tracer or getattr(context, "tracer", lib.Tracer())
18
+
19
+ # Process Karrio SDK tracing records to persist records of interest.
20
+ @utils.async_wrapper
21
+ @utils.tenant_aware
22
+ def persist_records(**kwarg):
23
+ actor = getattr(context, "user", None)
24
+ if len(tracer.records) == 0 or getattr(actor, "id", None) is None:
25
+ return
26
+
27
+ try:
28
+ records = []
29
+ exists = lib.identity(
30
+ models.TracingRecord.access_by(context)
31
+ .filter(
32
+ meta__request_log_id__isnull=False,
33
+ meta__request_log_id=tracer.context.get("request_log_id"),
34
+ )
35
+ .exists()
36
+ )
37
+
38
+ if exists:
39
+ return
40
+
41
+ for record in tracer.records:
42
+ connection: dict = record.metadata.get("connection")
43
+
44
+ records.append(
45
+ models.TracingRecord(
46
+ key=record.key,
47
+ record=record.data,
48
+ timestamp=record.timestamp,
49
+ created_by_id=getattr(actor, "id", None),
50
+ test_mode=connection.get("test_mode", False),
51
+ meta=lib.to_dict(
52
+ {
53
+ "tracer_id": tracer.id,
54
+ "object_id": tracer.context.get("object_id"),
55
+ "carrier_account_id": connection.get("id"),
56
+ "carrier_id": connection.get("carrier_id"),
57
+ "carrier_name": connection.get("carrier_name"),
58
+ "request_log_id": tracer.context.get("request_log_id"),
59
+ }
60
+ ),
61
+ )
62
+ )
63
+
64
+ saved_records = models.TracingRecord.objects.bulk_create(records)
65
+
66
+ if getattr(context, "org", None) is not None:
67
+ serializers.bulk_link_org(saved_records, context)
68
+
69
+ logger.info("successfully saved tracing records...")
70
+ except Exception as e:
71
+ logger.error(e, exc_info=False)
72
+
73
+ persist_records(schema=schema)
74
+
75
+
76
+ @utils.error_wrapper
77
+ def bulk_save_tracing_records(tracer: lib.Tracer, context=None):
78
+ if conf.settings.PERSIST_SDK_TRACING is False:
79
+ return
80
+
81
+ if len(tracer.records) == 0 or context is None:
82
+ return
83
+
84
+ records = []
85
+
86
+ for record in tracer.records:
87
+ logger.debug([f"record: {record.key}", record.metadata])
88
+ records.append(
89
+ models.TracingRecord(
90
+ key=record.key,
91
+ record=record.data,
92
+ timestamp=record.timestamp,
93
+ test_mode=getattr(context, "test_mode", False),
94
+ created_by_id=getattr(context.user, "id", None),
95
+ meta=lib.to_dict({"tracer_id": tracer.id, **(record.metadata or {})}),
96
+ )
97
+ )
98
+
99
+ saved_records = models.TracingRecord.objects.bulk_create(records)
100
+
101
+ if getattr(context, "org", None) is not None:
102
+ serializers.bulk_link_org(saved_records, context)
103
+
104
+ logger.info("> tracing records saved...")
105
+
106
+
107
+ def set_tracing_context(**kwargs):
108
+
109
+ from karrio.server.core import middleware
110
+
111
+ request = middleware.SessionContext.get_current_request()
112
+ request.tracer.add_context(kwargs)
File without changes
@@ -0,0 +1,96 @@
1
+ from django.conf import settings
2
+ from django.contrib import auth
3
+ from django.contrib import admin
4
+ from django.contrib.auth import admin as auth_admin
5
+ from django.utils.translation import gettext_lazy as _
6
+
7
+ from karrio.server.user.models import Token, Group
8
+
9
+ User = auth.get_user_model()
10
+ admin.site.unregister(auth.models.Group)
11
+
12
+
13
+ class UserAdmin(auth_admin.UserAdmin):
14
+ add_form_template = None
15
+ fieldsets = (
16
+ (None, {"fields": ("email", "password")}),
17
+ (_("Personal info"), {"fields": ("full_name",)}),
18
+ (
19
+ _("Permissions"),
20
+ {
21
+ "fields": (
22
+ "is_active",
23
+ "is_staff",
24
+ "is_superuser",
25
+ "groups",
26
+ "user_permissions",
27
+ ),
28
+ },
29
+ ),
30
+ (_("Important dates"), {"fields": ("last_login", "date_joined")}),
31
+ )
32
+ add_fieldsets = (
33
+ (
34
+ None,
35
+ {
36
+ "classes": ("wide",),
37
+ "fields": ("email", "password1", "password2"),
38
+ },
39
+ ),
40
+ )
41
+ list_display = (
42
+ "email",
43
+ "full_name",
44
+ "is_staff",
45
+ "is_active",
46
+ "date_joined",
47
+ "last_login",
48
+ )
49
+ list_filter = (
50
+ "is_staff",
51
+ "is_superuser",
52
+ "is_active",
53
+ "groups",
54
+ "last_login",
55
+ "date_joined",
56
+ )
57
+ search_fields = ("email", "full_name")
58
+ ordering = ("email",)
59
+
60
+
61
+ class GroupAdmin(auth_admin.GroupAdmin):
62
+ pass
63
+
64
+
65
+ class TokenAdmin(admin.ModelAdmin):
66
+ list_display = (
67
+ "key",
68
+ "user",
69
+ "label",
70
+ *(["organization"] if settings.MULTI_ORGANIZATIONS else []),
71
+ "test_mode",
72
+ "created",
73
+ )
74
+ fields = ("user", "label", "test_mode")
75
+ ordering = ("-created",)
76
+
77
+ def get_queryset(self, request):
78
+ query = super().get_queryset(request)
79
+ return query.filter(user=request.user)
80
+
81
+ if settings.MULTI_ORGANIZATIONS:
82
+ from karrio.server.orgs.admin import TokenLinkInline
83
+
84
+ inlines = [TokenLinkInline]
85
+
86
+ def get_form(self, request, obj, change, **kwargs):
87
+ form = super().get_form(request, obj, change, **kwargs)
88
+ form.base_fields["user"].queryset = User.objects.filter(
89
+ orgs_organization__users__id=request.user.id
90
+ ).distinct()
91
+ return form
92
+
93
+
94
+ admin.site.register(User, UserAdmin)
95
+ admin.site.register(Group, GroupAdmin)
96
+ admin.site.register(Token, TokenAdmin)
@@ -0,0 +1,7 @@
1
+ from django.apps import AppConfig
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+
5
+ class UserConfig(AppConfig):
6
+ name = "karrio.server.user"
7
+ verbose_name = _("AUTHENTICATION AND AUTHORIZATION")
@@ -0,0 +1,35 @@
1
+ from django import forms
2
+ from django.db import transaction
3
+ from django.contrib.auth import get_user_model
4
+ from django.contrib.auth.forms import UserCreationForm
5
+ from django.utils.translation import gettext_lazy as _
6
+
7
+ from karrio.server.conf import settings
8
+ from karrio.server.user.utils import send_email
9
+
10
+
11
+ class SignUpForm(UserCreationForm):
12
+ redirect_url = forms.URLField(required=True)
13
+
14
+ class Meta:
15
+ model = get_user_model()
16
+ fields = ("email", "full_name")
17
+
18
+ @transaction.atomic
19
+ def save(self, commit=True):
20
+ if settings.ALLOW_SIGNUP == False:
21
+ raise Exception(
22
+ "Signup is not allowed. "
23
+ "Please contact your administrator to create an account."
24
+ )
25
+
26
+ user = super().save(commit=commit)
27
+
28
+ if commit and settings.EMAIL_ENABLED:
29
+ user.is_active = False
30
+ send_email(user, self.cleaned_data["redirect_url"])
31
+
32
+ if commit and settings.ALLOW_ADMIN_APPROVED_SIGNUP:
33
+ user.is_active = False
34
+
35
+ return user
@@ -0,0 +1,41 @@
1
+ # Generated by Django 3.1.2 on 2020-10-20 20:17
2
+
3
+ from django.db import migrations, models
4
+ import django.utils.timezone
5
+ import karrio.server.user.models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ('auth', '0012_alter_user_first_name_max_length'),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.CreateModel(
18
+ name='User',
19
+ fields=[
20
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21
+ ('password', models.CharField(max_length=128, verbose_name='password')),
22
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
23
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
24
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
25
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
26
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
27
+ ('full_name', models.CharField(blank=True, max_length=150, verbose_name='full name')),
28
+ ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')),
29
+ ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
30
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
31
+ ],
32
+ options={
33
+ 'verbose_name': 'user',
34
+ 'verbose_name_plural': 'users',
35
+ 'abstract': False,
36
+ },
37
+ managers=[
38
+ ('objects', karrio.server.user.models.UserManager()),
39
+ ],
40
+ ),
41
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 3.2.3 on 2021-05-20 10:27
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+ import karrio.server.core.models.base
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+
11
+ dependencies = [
12
+ ('user', '0001_initial'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='Token',
18
+ fields=[
19
+ ('key', models.CharField(max_length=40, primary_key=True, serialize=False, verbose_name='Key')),
20
+ ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
21
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tokens', to=settings.AUTH_USER_MODEL)),
22
+ ],
23
+ options={
24
+ 'verbose_name': 'Token',
25
+ 'verbose_name_plural': 'Tokens',
26
+ },
27
+ bases=(models.Model, karrio.server.core.models.base.ControlledAccessModel),
28
+ ),
29
+ ]
@@ -0,0 +1,20 @@
1
+ # Generated by Django 3.2.13 on 2022-07-06 13:50
2
+
3
+ from django.db import migrations, models
4
+ import functools
5
+ import karrio.server.core.models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('user', '0002_token'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AddField(
16
+ model_name='token',
17
+ name='test_mode',
18
+ field=models.BooleanField(default=functools.partial(karrio.server.core.models._identity, *(), **{'value': False})),
19
+ ),
20
+ ]
@@ -0,0 +1,26 @@
1
+ # Generated by Django 3.2.14 on 2022-09-01 18:44
2
+
3
+ import django.contrib.auth.models
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('auth', '0012_alter_user_first_name_max_length'),
12
+ ('user', '0003_token_test_mode'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='Group',
18
+ fields=[
19
+ ('group_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='auth.group')),
20
+ ],
21
+ bases=('auth.group',),
22
+ managers=[
23
+ ('objects', django.contrib.auth.models.GroupManager()),
24
+ ],
25
+ ),
26
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.0 on 2023-12-08 05:41
2
+
3
+ import django.utils.timezone
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ("user", "0004_group"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="token",
15
+ name="label",
16
+ field=models.CharField(
17
+ default=django.utils.timezone.now, max_length=50, verbose_name="label"
18
+ ),
19
+ preserve_default=False,
20
+ ),
21
+ ]
@@ -0,0 +1,63 @@
1
+ # Generated by Django 4.2.10 on 2024-03-12 18:03
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+ import functools
7
+ import karrio.server.core.models
8
+ import karrio.server.core.models.base
9
+
10
+
11
+ class Migration(migrations.Migration):
12
+
13
+ dependencies = [
14
+ ("user", "0005_token_label"),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name="WorkspaceConfig",
20
+ fields=[
21
+ ("created_at", models.DateTimeField(auto_now_add=True)),
22
+ ("updated_at", models.DateTimeField(auto_now=True)),
23
+ (
24
+ "id",
25
+ models.CharField(
26
+ default=functools.partial(
27
+ karrio.server.core.models.base.uuid,
28
+ *(),
29
+ **{"prefix": "wcfg_"}
30
+ ),
31
+ editable=False,
32
+ max_length=50,
33
+ primary_key=True,
34
+ serialize=False,
35
+ ),
36
+ ),
37
+ (
38
+ "config",
39
+ models.JSONField(
40
+ default=functools.partial(
41
+ karrio.server.core.models._identity, *(), **{"value": {}}
42
+ )
43
+ ),
44
+ ),
45
+ (
46
+ "created_by",
47
+ models.ForeignKey(
48
+ blank=True,
49
+ editable=False,
50
+ null=True,
51
+ on_delete=django.db.models.deletion.CASCADE,
52
+ to=settings.AUTH_USER_MODEL,
53
+ ),
54
+ ),
55
+ ],
56
+ options={
57
+ "verbose_name": "Workspace Config",
58
+ "verbose_name_plural": "Workspace Configs",
59
+ "db_table": "workspace-config",
60
+ },
61
+ bases=(karrio.server.core.models.base.ControlledAccessModel, models.Model),
62
+ ),
63
+ ]
File without changes