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.
- karrio/server/conf.py +54 -0
- karrio/server/core/__init__.py +3 -0
- karrio/server/core/admin.py +1 -0
- karrio/server/core/apps.py +10 -0
- karrio/server/core/authentication.py +313 -0
- karrio/server/core/context_processors.py +12 -0
- karrio/server/core/datatypes.py +369 -0
- karrio/server/core/dataunits.py +156 -0
- karrio/server/core/exceptions.py +200 -0
- karrio/server/core/fields.py +12 -0
- karrio/server/core/filters.py +823 -0
- karrio/server/core/gateway.py +720 -0
- karrio/server/core/management/commands/cli.py +19 -0
- karrio/server/core/management/commands/create_oauth_client.py +41 -0
- karrio/server/core/middleware.py +95 -0
- karrio/server/core/migrations/0001_initial.py +28 -0
- karrio/server/core/migrations/0002_apilogindex.py +69 -0
- karrio/server/core/migrations/0003_apilogindex_test_mode.py +62 -0
- karrio/server/core/migrations/0004_metafield.py +74 -0
- karrio/server/core/migrations/0005_alter_metafield_type_alter_metafield_value.py +23 -0
- karrio/server/core/migrations/__init__.py +0 -0
- karrio/server/core/models/__init__.py +48 -0
- karrio/server/core/models/base.py +70 -0
- karrio/server/core/models/entity.py +22 -0
- karrio/server/core/models/metafield.py +144 -0
- karrio/server/core/models/third_party.py +21 -0
- karrio/server/core/oauth_validators.py +171 -0
- karrio/server/core/permissions.py +37 -0
- karrio/server/core/renderers.py +11 -0
- karrio/server/core/router.py +3 -0
- karrio/server/core/serializers.py +1898 -0
- karrio/server/core/signals.py +57 -0
- karrio/server/core/tests.py +98 -0
- karrio/server/core/urls.py +12 -0
- karrio/server/core/utils.py +479 -0
- karrio/server/core/validators.py +416 -0
- karrio/server/core/views/__init__.py +2 -0
- karrio/server/core/views/api.py +133 -0
- karrio/server/core/views/metadata.py +44 -0
- karrio/server/core/views/oauth.py +74 -0
- karrio/server/core/views/references.py +82 -0
- karrio/server/core/views/schema.py +310 -0
- karrio/server/filters/__init__.py +2 -0
- karrio/server/filters/abstract.py +26 -0
- karrio/server/iam/__init__.py +0 -0
- karrio/server/iam/admin.py +3 -0
- karrio/server/iam/apps.py +21 -0
- karrio/server/iam/migrations/0001_initial.py +33 -0
- karrio/server/iam/migrations/__init__.py +0 -0
- karrio/server/iam/models.py +48 -0
- karrio/server/iam/permissions.py +134 -0
- karrio/server/iam/serializers.py +39 -0
- karrio/server/iam/signals.py +20 -0
- karrio/server/iam/tests.py +3 -0
- karrio/server/iam/views.py +3 -0
- karrio/server/openapi.py +75 -0
- karrio/server/providers/__init__.py +1 -0
- karrio/server/providers/admin.py +364 -0
- karrio/server/providers/apps.py +10 -0
- karrio/server/providers/extension/__init__.py +1 -0
- karrio/server/providers/extension/models/__init__.py +1 -0
- karrio/server/providers/extension/models/allied_express.py +22 -0
- karrio/server/providers/extension/models/allied_express_local.py +22 -0
- karrio/server/providers/extension/models/amazon_shipping.py +27 -0
- karrio/server/providers/extension/models/aramex.py +25 -0
- karrio/server/providers/extension/models/asendia_us.py +21 -0
- karrio/server/providers/extension/models/australiapost.py +20 -0
- karrio/server/providers/extension/models/boxknight.py +19 -0
- karrio/server/providers/extension/models/bpost.py +21 -0
- karrio/server/providers/extension/models/canadapost.py +21 -0
- karrio/server/providers/extension/models/canpar.py +19 -0
- karrio/server/providers/extension/models/chronopost.py +22 -0
- karrio/server/providers/extension/models/colissimo.py +22 -0
- karrio/server/providers/extension/models/dhl_express.py +23 -0
- karrio/server/providers/extension/models/dhl_parcel_de.py +25 -0
- karrio/server/providers/extension/models/dhl_poland.py +22 -0
- karrio/server/providers/extension/models/dhl_universal.py +19 -0
- karrio/server/providers/extension/models/dicom.py +20 -0
- karrio/server/providers/extension/models/dpd.py +37 -0
- karrio/server/providers/extension/models/dpdhl.py +26 -0
- karrio/server/providers/extension/models/easypost.py +20 -0
- karrio/server/providers/extension/models/eshipper.py +21 -0
- karrio/server/providers/extension/models/fedex.py +25 -0
- karrio/server/providers/extension/models/fedex_ws.py +24 -0
- karrio/server/providers/extension/models/freightcom.py +21 -0
- karrio/server/providers/extension/models/generic.py +35 -0
- karrio/server/providers/extension/models/geodis.py +22 -0
- karrio/server/providers/extension/models/hay_post.py +22 -0
- karrio/server/providers/extension/models/laposte.py +19 -0
- karrio/server/providers/extension/models/locate2u.py +22 -0
- karrio/server/providers/extension/models/nationex.py +22 -0
- karrio/server/providers/extension/models/purolator.py +21 -0
- karrio/server/providers/extension/models/roadie.py +18 -0
- karrio/server/providers/extension/models/royalmail.py +19 -0
- karrio/server/providers/extension/models/sendle.py +22 -0
- karrio/server/providers/extension/models/tge.py +63 -0
- karrio/server/providers/extension/models/tnt.py +23 -0
- karrio/server/providers/extension/models/ups.py +23 -0
- karrio/server/providers/extension/models/usps.py +23 -0
- karrio/server/providers/extension/models/usps_international.py +23 -0
- karrio/server/providers/extension/models/usps_wt.py +24 -0
- karrio/server/providers/extension/models/usps_wt_international.py +24 -0
- karrio/server/providers/extension/models/zoom2u.py +23 -0
- karrio/server/providers/migrations/0001_initial.py +140 -0
- karrio/server/providers/migrations/0002_carrier_active.py +18 -0
- karrio/server/providers/migrations/0003_auto_20201230_0820.py +24 -0
- karrio/server/providers/migrations/0004_auto_20210212_0554.py +178 -0
- karrio/server/providers/migrations/0005_auto_20210212_0555.py +18 -0
- karrio/server/providers/migrations/0006_australiapostsettings.py +29 -0
- karrio/server/providers/migrations/0007_auto_20210213_0206.py +21 -0
- karrio/server/providers/migrations/0008_auto_20210214_0409.py +30 -0
- karrio/server/providers/migrations/0009_auto_20210308_0302.py +18 -0
- karrio/server/providers/migrations/0010_auto_20210409_0852.py +32 -0
- karrio/server/providers/migrations/0011_auto_20210409_0853.py +21 -0
- karrio/server/providers/migrations/0012_alter_carrier_options.py +17 -0
- karrio/server/providers/migrations/0013_tntsettings.py +30 -0
- karrio/server/providers/migrations/0014_auto_20210612_1608.py +46 -0
- karrio/server/providers/migrations/0015_auto_20210615_1601.py +28 -0
- karrio/server/providers/migrations/0016_alter_purolatorsettings_user_token.py +18 -0
- karrio/server/providers/migrations/0017_auto_20210805_0359.py +1293 -0
- karrio/server/providers/migrations/0018_alter_fedexsettings_user_key.py +18 -0
- karrio/server/providers/migrations/0019_dhlpolandsettings_servicelevel.py +65 -0
- karrio/server/providers/migrations/0020_genericsettings_labeltemplate.py +52 -0
- karrio/server/providers/migrations/0021_auto_20211231_2353.py +40 -0
- karrio/server/providers/migrations/0022_carrier_metadata.py +18 -0
- karrio/server/providers/migrations/0023_auto_20220124_1916.py +27 -0
- karrio/server/providers/migrations/0024_alter_genericsettings_custom_carrier_name.py +19 -0
- karrio/server/providers/migrations/0025_alter_servicelevel_service_code.py +19 -0
- karrio/server/providers/migrations/0026_auto_20220208_0132.py +59 -0
- karrio/server/providers/migrations/0027_auto_20220304_1340.py +29 -0
- karrio/server/providers/migrations/0028_auto_20220323_1500.py +33 -0
- karrio/server/providers/migrations/0029_easypostsettings.py +27 -0
- karrio/server/providers/migrations/0030_amazonmwssettings.py +29 -0
- karrio/server/providers/migrations/0031_delete_amazonmwssettings.py +18 -0
- karrio/server/providers/migrations/0032_alter_carrier_test.py +18 -0
- karrio/server/providers/migrations/0033_auto_20220708_1350.py +22 -0
- karrio/server/providers/migrations/0034_amazonmwssettings_dpdhlsettings.py +47 -0
- karrio/server/providers/migrations/0035_alter_carrier_capabilities.py +43 -0
- karrio/server/providers/migrations/0036_upsfreightsettings.py +31 -0
- karrio/server/providers/migrations/0037_chronopostsettings.py +29 -0
- karrio/server/providers/migrations/0038_alter_genericsettings_label_template.py +19 -0
- karrio/server/providers/migrations/0039_auto_20220906_0612.py +23 -0
- karrio/server/providers/migrations/0040_dpdhlsettings_services.py +18 -0
- karrio/server/providers/migrations/0041_auto_20221105_0705.py +38 -0
- karrio/server/providers/migrations/0042_auto_20221215_1642.py +23 -0
- karrio/server/providers/migrations/0043_alter_genericsettings_account_number_and_more.py +39 -0
- karrio/server/providers/migrations/0044_carrier_carrier_capabilities.py +64 -0
- karrio/server/providers/migrations/0045_alter_carrier_active_alter_carrier_carrier_id.py +31 -0
- karrio/server/providers/migrations/0046_remove_dpdhlsettings_signature_and_more.py +41 -0
- karrio/server/providers/migrations/0047_dpdsettings.py +286 -0
- karrio/server/providers/migrations/0048_servicelevel_min_weight_servicelevel_transit_days_and_more.py +64 -0
- karrio/server/providers/migrations/0049_boxknightsettings_geodissettings_lapostesettings_and_more.py +156 -0
- karrio/server/providers/migrations/0050_carrier_is_system_alter_carrier_metadata_and_more.py +106 -0
- karrio/server/providers/migrations/0051_rename_username_upssettings_client_id_and_more.py +31 -0
- karrio/server/providers/migrations/0052_alter_upssettings_account_number_and_more.py +20 -0
- karrio/server/providers/migrations/0053_locate2usettings.py +281 -0
- karrio/server/providers/migrations/0054_zoom2usettings.py +280 -0
- karrio/server/providers/migrations/0055_rename_amazonmwssettings_amazonshippingsettings_and_more.py +44 -0
- karrio/server/providers/migrations/0056_asendiaussettings_geodissettings_code_client_and_more.py +75 -0
- karrio/server/providers/migrations/0057_alter_servicelevel_weight_unit_belgianpostsettings.py +51 -0
- karrio/server/providers/migrations/0058_alliedexpresssettings.py +38 -0
- karrio/server/providers/migrations/0059_ratesheet.py +81 -0
- karrio/server/providers/migrations/0060_belgianpostsettings_rate_sheet_and_more.py +73 -0
- karrio/server/providers/migrations/0061_alliedexpresssettings_service_type.py +17 -0
- karrio/server/providers/migrations/0062_sendlesettings_account_country_code.py +257 -0
- karrio/server/providers/migrations/0063_servicelevel_metadata.py +25 -0
- karrio/server/providers/migrations/0064_alliedexpresslocalsettings.py +43 -0
- karrio/server/providers/migrations/0065_servicelevel_carrier_service_code_and_more.py +66 -0
- karrio/server/providers/migrations/0066_rename_fedexsettings_fedexwssettings_and_more.py +28 -0
- karrio/server/providers/migrations/0067_fedexsettings.py +283 -0
- karrio/server/providers/migrations/0068_fedexsettings_track_api_key_and_more.py +38 -0
- karrio/server/providers/migrations/0069_alter_canadapostsettings_contract_id_and_more.py +23 -0
- karrio/server/providers/migrations/0070_tgesettings_alter_carrier_capabilities.py +65 -0
- karrio/server/providers/migrations/0071_alter_tgesettings_my_toll_token.py +18 -0
- karrio/server/providers/migrations/0072_rename_eshippersettings_eshipperxmlsettings_and_more.py +28 -0
- karrio/server/providers/migrations/0073_delete_eshipperxmlsettings.py +41 -0
- karrio/server/providers/migrations/0074_eshippersettings.py +38 -0
- karrio/server/providers/migrations/0075_haypostsettings.py +40 -0
- karrio/server/providers/migrations/0076_rename_customer_registration_id_uspsinternationalsettings_account_number_and_more.py +125 -0
- karrio/server/providers/migrations/0077_uspswtinternationalsettings_uspswtsettings_and_more.py +165 -0
- karrio/server/providers/migrations/0078_auto_20240813_1552.py +120 -0
- karrio/server/providers/migrations/0079_alter_carrier_options_alter_ratesheet_created_by.py +31 -0
- karrio/server/providers/migrations/0080_alter_aramexsettings_account_country_code_and_more.py +3025 -0
- karrio/server/providers/migrations/0081_remove_alliedexpresssettings_carrier_ptr_and_more.py +338 -0
- karrio/server/providers/migrations/__init__.py +0 -0
- karrio/server/providers/models/__init__.py +17 -0
- karrio/server/providers/models/carrier.py +309 -0
- karrio/server/providers/models/config.py +30 -0
- karrio/server/providers/models/service.py +62 -0
- karrio/server/providers/models/sheet.py +60 -0
- karrio/server/providers/models/template.py +39 -0
- karrio/server/providers/models/utils.py +58 -0
- karrio/server/providers/router.py +3 -0
- karrio/server/providers/serializers/__init__.py +3 -0
- karrio/server/providers/serializers/base.py +277 -0
- karrio/server/providers/signals.py +27 -0
- karrio/server/providers/tests.py +3 -0
- karrio/server/providers/urls.py +11 -0
- karrio/server/providers/views/__init__.py +0 -0
- karrio/server/providers/views/carriers.py +269 -0
- karrio/server/providers/views/connections.py +176 -0
- karrio/server/samples.py +352 -0
- karrio/server/serializers/__init__.py +2 -0
- karrio/server/serializers/abstract.py +506 -0
- karrio/server/tracing/__init__.py +0 -0
- karrio/server/tracing/admin.py +63 -0
- karrio/server/tracing/apps.py +8 -0
- karrio/server/tracing/migrations/0001_initial.py +41 -0
- karrio/server/tracing/migrations/0002_auto_20220710_1307.py +22 -0
- karrio/server/tracing/migrations/0003_auto_20221105_0317.py +43 -0
- karrio/server/tracing/migrations/0004_tracingrecord_carrier_account_idx.py +24 -0
- karrio/server/tracing/migrations/0005_optimise_tracingrecord_request_log_idx.py +25 -0
- karrio/server/tracing/migrations/0006_alter_tracingrecord_options_and_more.py +49 -0
- karrio/server/tracing/migrations/__init__.py +0 -0
- karrio/server/tracing/models.py +80 -0
- karrio/server/tracing/tests.py +3 -0
- karrio/server/tracing/utils.py +112 -0
- karrio/server/user/__init__.py +0 -0
- karrio/server/user/admin.py +96 -0
- karrio/server/user/apps.py +7 -0
- karrio/server/user/forms.py +35 -0
- karrio/server/user/migrations/0001_initial.py +41 -0
- karrio/server/user/migrations/0002_token.py +29 -0
- karrio/server/user/migrations/0003_token_test_mode.py +20 -0
- karrio/server/user/migrations/0004_group.py +26 -0
- karrio/server/user/migrations/0005_token_label.py +21 -0
- karrio/server/user/migrations/0006_workspaceconfig.py +63 -0
- karrio/server/user/migrations/__init__.py +0 -0
- karrio/server/user/models.py +203 -0
- karrio/server/user/serializers.py +46 -0
- karrio/server/user/templates/registration/login.html +108 -0
- karrio/server/user/templates/registration/registration_confirm_email.html +10 -0
- karrio/server/user/templates/registration/registration_confirm_email.txt +3 -0
- karrio/server/user/tests.py +3 -0
- karrio/server/user/urls.py +10 -0
- karrio/server/user/utils.py +60 -0
- karrio/server/user/views.py +9 -0
- karrio_server_core-2025.5rc1.dist-info/METADATA +32 -0
- karrio_server_core-2025.5rc1.dist-info/RECORD +241 -0
- karrio_server_core-2025.5rc1.dist-info/WHEEL +5 -0
- 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,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,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
|