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,338 @@
|
|
|
1
|
+
# Generated by Django 5.1.9 on 2025-05-09 06:49
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("providers", "0080_alter_aramexsettings_account_country_code_and_more"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
# 1. Remove all 'services' and other dependent fields first
|
|
14
|
+
migrations.RemoveField(
|
|
15
|
+
model_name="belgianpostsettings",
|
|
16
|
+
name="services",
|
|
17
|
+
),
|
|
18
|
+
migrations.RemoveField(
|
|
19
|
+
model_name="colissimosettings",
|
|
20
|
+
name="services",
|
|
21
|
+
),
|
|
22
|
+
migrations.RemoveField(
|
|
23
|
+
model_name="dhlparceldesettings",
|
|
24
|
+
name="services",
|
|
25
|
+
),
|
|
26
|
+
migrations.RemoveField(
|
|
27
|
+
model_name="dhlpolandsettings",
|
|
28
|
+
name="services",
|
|
29
|
+
),
|
|
30
|
+
migrations.RemoveField(
|
|
31
|
+
model_name="dpdhlsettings",
|
|
32
|
+
name="services",
|
|
33
|
+
),
|
|
34
|
+
migrations.RemoveField(
|
|
35
|
+
model_name="dpdsettings",
|
|
36
|
+
name="services",
|
|
37
|
+
),
|
|
38
|
+
migrations.RemoveField(
|
|
39
|
+
model_name="genericsettings",
|
|
40
|
+
name="services",
|
|
41
|
+
),
|
|
42
|
+
migrations.RemoveField(
|
|
43
|
+
model_name="genericsettings",
|
|
44
|
+
name="label_template",
|
|
45
|
+
),
|
|
46
|
+
# 2. Remove all 'carrier_ptr' fields
|
|
47
|
+
migrations.RemoveField(
|
|
48
|
+
model_name="alliedexpresssettings",
|
|
49
|
+
name="carrier_ptr",
|
|
50
|
+
),
|
|
51
|
+
migrations.RemoveField(
|
|
52
|
+
model_name="amazonshippingsettings",
|
|
53
|
+
name="carrier_ptr",
|
|
54
|
+
),
|
|
55
|
+
migrations.RemoveField(
|
|
56
|
+
model_name="aramexsettings",
|
|
57
|
+
name="carrier_ptr",
|
|
58
|
+
),
|
|
59
|
+
migrations.RemoveField(
|
|
60
|
+
model_name="asendiaussettings",
|
|
61
|
+
name="carrier_ptr",
|
|
62
|
+
),
|
|
63
|
+
migrations.RemoveField(
|
|
64
|
+
model_name="australiapostsettings",
|
|
65
|
+
name="carrier_ptr",
|
|
66
|
+
),
|
|
67
|
+
migrations.RemoveField(
|
|
68
|
+
model_name="belgianpostsettings",
|
|
69
|
+
name="carrier_ptr",
|
|
70
|
+
),
|
|
71
|
+
migrations.RemoveField(
|
|
72
|
+
model_name="boxknightsettings",
|
|
73
|
+
name="carrier_ptr",
|
|
74
|
+
),
|
|
75
|
+
migrations.RemoveField(
|
|
76
|
+
model_name="canadapostsettings",
|
|
77
|
+
name="carrier_ptr",
|
|
78
|
+
),
|
|
79
|
+
migrations.RemoveField(
|
|
80
|
+
model_name="canparsettings",
|
|
81
|
+
name="carrier_ptr",
|
|
82
|
+
),
|
|
83
|
+
migrations.RemoveField(
|
|
84
|
+
model_name="chronopostsettings",
|
|
85
|
+
name="carrier_ptr",
|
|
86
|
+
),
|
|
87
|
+
migrations.RemoveField(
|
|
88
|
+
model_name="colissimosettings",
|
|
89
|
+
name="carrier_ptr",
|
|
90
|
+
),
|
|
91
|
+
migrations.RemoveField(
|
|
92
|
+
model_name="dhlexpresssettings",
|
|
93
|
+
name="carrier_ptr",
|
|
94
|
+
),
|
|
95
|
+
migrations.RemoveField(
|
|
96
|
+
model_name="dhlparceldesettings",
|
|
97
|
+
name="carrier_ptr",
|
|
98
|
+
),
|
|
99
|
+
migrations.RemoveField(
|
|
100
|
+
model_name="dhlpolandsettings",
|
|
101
|
+
name="carrier_ptr",
|
|
102
|
+
),
|
|
103
|
+
migrations.RemoveField(
|
|
104
|
+
model_name="dhluniversalsettings",
|
|
105
|
+
name="carrier_ptr",
|
|
106
|
+
),
|
|
107
|
+
migrations.RemoveField(
|
|
108
|
+
model_name="dicomsettings",
|
|
109
|
+
name="carrier_ptr",
|
|
110
|
+
),
|
|
111
|
+
migrations.RemoveField(
|
|
112
|
+
model_name="dpdhlsettings",
|
|
113
|
+
name="carrier_ptr",
|
|
114
|
+
),
|
|
115
|
+
migrations.RemoveField(
|
|
116
|
+
model_name="dpdsettings",
|
|
117
|
+
name="carrier_ptr",
|
|
118
|
+
),
|
|
119
|
+
migrations.RemoveField(
|
|
120
|
+
model_name="easypostsettings",
|
|
121
|
+
name="carrier_ptr",
|
|
122
|
+
),
|
|
123
|
+
migrations.RemoveField(
|
|
124
|
+
model_name="eshippersettings",
|
|
125
|
+
name="carrier_ptr",
|
|
126
|
+
),
|
|
127
|
+
migrations.RemoveField(
|
|
128
|
+
model_name="fedexsettings",
|
|
129
|
+
name="carrier_ptr",
|
|
130
|
+
),
|
|
131
|
+
migrations.RemoveField(
|
|
132
|
+
model_name="fedexwssettings",
|
|
133
|
+
name="carrier_ptr",
|
|
134
|
+
),
|
|
135
|
+
migrations.RemoveField(
|
|
136
|
+
model_name="freightcomsettings",
|
|
137
|
+
name="carrier_ptr",
|
|
138
|
+
),
|
|
139
|
+
migrations.RemoveField(
|
|
140
|
+
model_name="genericsettings",
|
|
141
|
+
name="carrier_ptr",
|
|
142
|
+
),
|
|
143
|
+
migrations.RemoveField(
|
|
144
|
+
model_name="geodissettings",
|
|
145
|
+
name="carrier_ptr",
|
|
146
|
+
),
|
|
147
|
+
migrations.RemoveField(
|
|
148
|
+
model_name="haypostsettings",
|
|
149
|
+
name="carrier_ptr",
|
|
150
|
+
),
|
|
151
|
+
migrations.RemoveField(
|
|
152
|
+
model_name="lapostesettings",
|
|
153
|
+
name="carrier_ptr",
|
|
154
|
+
),
|
|
155
|
+
migrations.RemoveField(
|
|
156
|
+
model_name="locate2usettings",
|
|
157
|
+
name="carrier_ptr",
|
|
158
|
+
),
|
|
159
|
+
migrations.RemoveField(
|
|
160
|
+
model_name="nationexsettings",
|
|
161
|
+
name="carrier_ptr",
|
|
162
|
+
),
|
|
163
|
+
migrations.RemoveField(
|
|
164
|
+
model_name="purolatorsettings",
|
|
165
|
+
name="carrier_ptr",
|
|
166
|
+
),
|
|
167
|
+
migrations.RemoveField(
|
|
168
|
+
model_name="roadiesettings",
|
|
169
|
+
name="carrier_ptr",
|
|
170
|
+
),
|
|
171
|
+
migrations.RemoveField(
|
|
172
|
+
model_name="royalmailsettings",
|
|
173
|
+
name="carrier_ptr",
|
|
174
|
+
),
|
|
175
|
+
migrations.RemoveField(
|
|
176
|
+
model_name="sendlesettings",
|
|
177
|
+
name="carrier_ptr",
|
|
178
|
+
),
|
|
179
|
+
migrations.RemoveField(
|
|
180
|
+
model_name="tgesettings",
|
|
181
|
+
name="carrier_ptr",
|
|
182
|
+
),
|
|
183
|
+
migrations.RemoveField(
|
|
184
|
+
model_name="tntsettings",
|
|
185
|
+
name="carrier_ptr",
|
|
186
|
+
),
|
|
187
|
+
migrations.RemoveField(
|
|
188
|
+
model_name="upssettings",
|
|
189
|
+
name="carrier_ptr",
|
|
190
|
+
),
|
|
191
|
+
migrations.RemoveField(
|
|
192
|
+
model_name="uspsinternationalsettings",
|
|
193
|
+
name="carrier_ptr",
|
|
194
|
+
),
|
|
195
|
+
migrations.RemoveField(
|
|
196
|
+
model_name="uspssettings",
|
|
197
|
+
name="carrier_ptr",
|
|
198
|
+
),
|
|
199
|
+
migrations.RemoveField(
|
|
200
|
+
model_name="uspswtinternationalsettings",
|
|
201
|
+
name="carrier_ptr",
|
|
202
|
+
),
|
|
203
|
+
migrations.RemoveField(
|
|
204
|
+
model_name="uspswtsettings",
|
|
205
|
+
name="carrier_ptr",
|
|
206
|
+
),
|
|
207
|
+
migrations.RemoveField(
|
|
208
|
+
model_name="zoom2usettings",
|
|
209
|
+
name="carrier_ptr",
|
|
210
|
+
),
|
|
211
|
+
# 3. Delete all the models
|
|
212
|
+
migrations.DeleteModel(
|
|
213
|
+
name="AlliedExpressLocalSettings",
|
|
214
|
+
),
|
|
215
|
+
migrations.DeleteModel(
|
|
216
|
+
name="AlliedExpressSettings",
|
|
217
|
+
),
|
|
218
|
+
migrations.DeleteModel(
|
|
219
|
+
name="AmazonShippingSettings",
|
|
220
|
+
),
|
|
221
|
+
migrations.DeleteModel(
|
|
222
|
+
name="AramexSettings",
|
|
223
|
+
),
|
|
224
|
+
migrations.DeleteModel(
|
|
225
|
+
name="AsendiaUSSettings",
|
|
226
|
+
),
|
|
227
|
+
migrations.DeleteModel(
|
|
228
|
+
name="AustraliaPostSettings",
|
|
229
|
+
),
|
|
230
|
+
migrations.DeleteModel(
|
|
231
|
+
name="BelgianPostSettings",
|
|
232
|
+
),
|
|
233
|
+
migrations.DeleteModel(
|
|
234
|
+
name="BoxKnightSettings",
|
|
235
|
+
),
|
|
236
|
+
migrations.DeleteModel(
|
|
237
|
+
name="CanadaPostSettings",
|
|
238
|
+
),
|
|
239
|
+
migrations.DeleteModel(
|
|
240
|
+
name="CanparSettings",
|
|
241
|
+
),
|
|
242
|
+
migrations.DeleteModel(
|
|
243
|
+
name="ChronopostSettings",
|
|
244
|
+
),
|
|
245
|
+
migrations.DeleteModel(
|
|
246
|
+
name="ColissimoSettings",
|
|
247
|
+
),
|
|
248
|
+
migrations.DeleteModel(
|
|
249
|
+
name="DHLExpressSettings",
|
|
250
|
+
),
|
|
251
|
+
migrations.DeleteModel(
|
|
252
|
+
name="DHLParcelDESettings",
|
|
253
|
+
),
|
|
254
|
+
migrations.DeleteModel(
|
|
255
|
+
name="DHLPolandSettings",
|
|
256
|
+
),
|
|
257
|
+
migrations.DeleteModel(
|
|
258
|
+
name="DHLUniversalSettings",
|
|
259
|
+
),
|
|
260
|
+
migrations.DeleteModel(
|
|
261
|
+
name="DicomSettings",
|
|
262
|
+
),
|
|
263
|
+
migrations.DeleteModel(
|
|
264
|
+
name="DPDHLSettings",
|
|
265
|
+
),
|
|
266
|
+
migrations.DeleteModel(
|
|
267
|
+
name="DPDSettings",
|
|
268
|
+
),
|
|
269
|
+
migrations.DeleteModel(
|
|
270
|
+
name="EasyPostSettings",
|
|
271
|
+
),
|
|
272
|
+
migrations.DeleteModel(
|
|
273
|
+
name="EShipperSettings",
|
|
274
|
+
),
|
|
275
|
+
migrations.DeleteModel(
|
|
276
|
+
name="FedexSettings",
|
|
277
|
+
),
|
|
278
|
+
migrations.DeleteModel(
|
|
279
|
+
name="FedexWSSettings",
|
|
280
|
+
),
|
|
281
|
+
migrations.DeleteModel(
|
|
282
|
+
name="FreightcomSettings",
|
|
283
|
+
),
|
|
284
|
+
migrations.DeleteModel(
|
|
285
|
+
name="GenericSettings",
|
|
286
|
+
),
|
|
287
|
+
migrations.DeleteModel(
|
|
288
|
+
name="GEODISSettings",
|
|
289
|
+
),
|
|
290
|
+
migrations.DeleteModel(
|
|
291
|
+
name="HayPostSettings",
|
|
292
|
+
),
|
|
293
|
+
migrations.DeleteModel(
|
|
294
|
+
name="LaPosteSettings",
|
|
295
|
+
),
|
|
296
|
+
migrations.DeleteModel(
|
|
297
|
+
name="Locate2uSettings",
|
|
298
|
+
),
|
|
299
|
+
migrations.DeleteModel(
|
|
300
|
+
name="NationexSettings",
|
|
301
|
+
),
|
|
302
|
+
migrations.DeleteModel(
|
|
303
|
+
name="PurolatorSettings",
|
|
304
|
+
),
|
|
305
|
+
migrations.DeleteModel(
|
|
306
|
+
name="RoadieSettings",
|
|
307
|
+
),
|
|
308
|
+
migrations.DeleteModel(
|
|
309
|
+
name="RoyalMailSettings",
|
|
310
|
+
),
|
|
311
|
+
migrations.DeleteModel(
|
|
312
|
+
name="SendleSettings",
|
|
313
|
+
),
|
|
314
|
+
migrations.DeleteModel(
|
|
315
|
+
name="TGESettings",
|
|
316
|
+
),
|
|
317
|
+
migrations.DeleteModel(
|
|
318
|
+
name="TNTSettings",
|
|
319
|
+
),
|
|
320
|
+
migrations.DeleteModel(
|
|
321
|
+
name="UPSSettings",
|
|
322
|
+
),
|
|
323
|
+
migrations.DeleteModel(
|
|
324
|
+
name="USPSInternationalSettings",
|
|
325
|
+
),
|
|
326
|
+
migrations.DeleteModel(
|
|
327
|
+
name="USPSSettings",
|
|
328
|
+
),
|
|
329
|
+
migrations.DeleteModel(
|
|
330
|
+
name="USPSWTInternationalSettings",
|
|
331
|
+
),
|
|
332
|
+
migrations.DeleteModel(
|
|
333
|
+
name="USPSWTSettings",
|
|
334
|
+
),
|
|
335
|
+
migrations.DeleteModel(
|
|
336
|
+
name="Zoom2uSettings",
|
|
337
|
+
),
|
|
338
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
|
|
2
|
+
from karrio.server.providers.models.sheet import RateSheet
|
|
3
|
+
from karrio.server.providers.models.config import CarrierConfig
|
|
4
|
+
from karrio.server.providers.models.service import ServiceLevel
|
|
5
|
+
from karrio.server.providers.models.template import LabelTemplate
|
|
6
|
+
import karrio.server.providers.extension.models as extensions
|
|
7
|
+
from karrio.server.core.models.base import register_model
|
|
8
|
+
from karrio.server.providers.models.utils import has_rate_sheet
|
|
9
|
+
from karrio.server.providers.models.carrier import (
|
|
10
|
+
Carrier,
|
|
11
|
+
COUNTRIES,
|
|
12
|
+
CURRENCIES,
|
|
13
|
+
WEIGHT_UNITS,
|
|
14
|
+
DIMENSION_UNITS,
|
|
15
|
+
CAPABILITIES_CHOICES,
|
|
16
|
+
create_carrier_proxy,
|
|
17
|
+
)
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
import functools
|
|
3
|
+
import django.conf as conf
|
|
4
|
+
import django.forms as forms
|
|
5
|
+
import django.db.models as models
|
|
6
|
+
|
|
7
|
+
import karrio.sdk as karrio
|
|
8
|
+
import karrio.lib as lib
|
|
9
|
+
import karrio.core.units as units
|
|
10
|
+
import django.core.cache as caching
|
|
11
|
+
import karrio.api.gateway as gateway
|
|
12
|
+
import karrio.server.core.models as core
|
|
13
|
+
import karrio.server.core.fields as fields
|
|
14
|
+
import karrio.server.core.datatypes as datatypes
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
COUNTRIES = [(c.name, c.name) for c in units.Country]
|
|
18
|
+
CURRENCIES = [(c.name, c.name) for c in units.Currency]
|
|
19
|
+
WEIGHT_UNITS = [(c.name, c.name) for c in units.WeightUnit]
|
|
20
|
+
DIMENSION_UNITS = [(c.name, c.name) for c in units.DimensionUnit]
|
|
21
|
+
CAPABILITIES_CHOICES = [(c, c) for c in units.CarrierCapabilities.get_capabilities()]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Manager(models.Manager):
|
|
25
|
+
def get_queryset(self):
|
|
26
|
+
return (
|
|
27
|
+
super()
|
|
28
|
+
.get_queryset()
|
|
29
|
+
.select_related(
|
|
30
|
+
"created_by",
|
|
31
|
+
*(("link",) if conf.settings.MULTI_ORGANIZATIONS else tuple()),
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CarrierManager(Manager):
|
|
37
|
+
def get_queryset(self):
|
|
38
|
+
return super().get_queryset().filter(is_system=False)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SystemCarrierManager(models.Manager):
|
|
42
|
+
def get_queryset(self):
|
|
43
|
+
return (
|
|
44
|
+
super()
|
|
45
|
+
.get_queryset()
|
|
46
|
+
.prefetch_related(
|
|
47
|
+
"configs",
|
|
48
|
+
)
|
|
49
|
+
.select_related(
|
|
50
|
+
"created_by",
|
|
51
|
+
*(("link",) if conf.settings.MULTI_ORGANIZATIONS else tuple()),
|
|
52
|
+
)
|
|
53
|
+
.filter(is_system=True)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@core.register_model
|
|
58
|
+
class Carrier(core.OwnedEntity):
|
|
59
|
+
class Meta:
|
|
60
|
+
ordering = ["test_mode", "-created_at"]
|
|
61
|
+
|
|
62
|
+
objects = Manager()
|
|
63
|
+
user_carriers = CarrierManager()
|
|
64
|
+
system_carriers = SystemCarrierManager()
|
|
65
|
+
|
|
66
|
+
id = models.CharField(
|
|
67
|
+
max_length=50,
|
|
68
|
+
primary_key=True,
|
|
69
|
+
default=functools.partial(core.uuid, prefix="car_"),
|
|
70
|
+
editable=False,
|
|
71
|
+
)
|
|
72
|
+
carrier_code = models.CharField(
|
|
73
|
+
max_length=100,
|
|
74
|
+
db_index=True,
|
|
75
|
+
default="generic",
|
|
76
|
+
help_text="eg. dhl_express, fedex, ups, usps, ...",
|
|
77
|
+
)
|
|
78
|
+
carrier_id = models.CharField(
|
|
79
|
+
max_length=150,
|
|
80
|
+
db_index=True,
|
|
81
|
+
help_text="eg. canadapost, dhl_express, fedex, purolator_courrier, ups...",
|
|
82
|
+
)
|
|
83
|
+
credentials = models.JSONField(
|
|
84
|
+
default=core.field_default({}),
|
|
85
|
+
help_text="Carrier connection credentials",
|
|
86
|
+
)
|
|
87
|
+
capabilities = fields.MultiChoiceField(
|
|
88
|
+
choices=datatypes.CAPABILITIES_CHOICES,
|
|
89
|
+
default=core.field_default([]),
|
|
90
|
+
help_text="Select the capabilities of the carrier that you want to enable",
|
|
91
|
+
)
|
|
92
|
+
metadata = models.JSONField(
|
|
93
|
+
blank=True,
|
|
94
|
+
null=True,
|
|
95
|
+
default=core.field_default({}),
|
|
96
|
+
help_text="User defined metadata",
|
|
97
|
+
)
|
|
98
|
+
active = models.BooleanField(
|
|
99
|
+
default=True,
|
|
100
|
+
db_index=True,
|
|
101
|
+
help_text="Disable/Hide carrier from clients",
|
|
102
|
+
)
|
|
103
|
+
is_system = models.BooleanField(
|
|
104
|
+
default=False,
|
|
105
|
+
db_index=True,
|
|
106
|
+
help_text="Determine that the carrier connection is available system wide.",
|
|
107
|
+
)
|
|
108
|
+
test_mode = models.BooleanField(
|
|
109
|
+
default=True,
|
|
110
|
+
db_column="test_mode",
|
|
111
|
+
help_text="Toggle carrier connection mode",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
created_by = models.ForeignKey(
|
|
115
|
+
conf.settings.AUTH_USER_MODEL,
|
|
116
|
+
blank=True,
|
|
117
|
+
null=True,
|
|
118
|
+
on_delete=models.CASCADE,
|
|
119
|
+
editable=False,
|
|
120
|
+
)
|
|
121
|
+
active_users = models.ManyToManyField(
|
|
122
|
+
conf.settings.AUTH_USER_MODEL,
|
|
123
|
+
blank=True,
|
|
124
|
+
related_name="connection_users",
|
|
125
|
+
)
|
|
126
|
+
rate_sheet = models.ForeignKey(
|
|
127
|
+
"RateSheet",
|
|
128
|
+
null=True,
|
|
129
|
+
blank=True,
|
|
130
|
+
on_delete=models.SET_NULL,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def __str__(self):
|
|
134
|
+
return self.carrier_id
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def object_type(self):
|
|
138
|
+
return "carrier-connection"
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def ext(self) -> str:
|
|
142
|
+
return (
|
|
143
|
+
"generic"
|
|
144
|
+
if "custom_carrier_name" in self.credentials
|
|
145
|
+
else lib.failsafe(lambda: self.carrier_code) or "generic"
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def carrier_name(self):
|
|
150
|
+
return (
|
|
151
|
+
self.credentials.get("custom_carrier_name")
|
|
152
|
+
if "custom_carrier_name" in self.credentials
|
|
153
|
+
else lib.failsafe(lambda: self.carrier_code) or "generic"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def display_name(self):
|
|
158
|
+
import karrio.references as references
|
|
159
|
+
|
|
160
|
+
return self.credentials.get("display_name") or references.REFERENCES[
|
|
161
|
+
"carriers"
|
|
162
|
+
].get(self.ext) or "generic"
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def carrier_config(self):
|
|
166
|
+
return self.__class__.resolve_config(self)
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def config(self) -> dict:
|
|
170
|
+
return getattr(self.carrier_config, "config", {})
|
|
171
|
+
|
|
172
|
+
@property
|
|
173
|
+
def services(self) -> typing.Optional[typing.List[dict]]:
|
|
174
|
+
|
|
175
|
+
if self.rate_sheet is None:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
return self.rate_sheet.services.all()
|
|
179
|
+
|
|
180
|
+
@property
|
|
181
|
+
def data(self) -> datatypes.CarrierSettings:
|
|
182
|
+
_computed_data: typing.Dict = dict(
|
|
183
|
+
id=self.id,
|
|
184
|
+
config=self.config,
|
|
185
|
+
test_mode=self.test_mode,
|
|
186
|
+
metadata=self.metadata,
|
|
187
|
+
carrier_id=self.carrier_id,
|
|
188
|
+
carrier_name=self.ext,
|
|
189
|
+
display_name=self.display_name,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
if any(self.services or []):
|
|
193
|
+
_computed_data.update(
|
|
194
|
+
services=[forms.model_to_dict(s) for s in self.services]
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# override the config with the system config
|
|
198
|
+
if self.is_system and self.carrier_config is None:
|
|
199
|
+
_config = self.__class__.resolve_config(self, is_system_config=True)
|
|
200
|
+
_computed_data.update(config=getattr(_config, "config", None))
|
|
201
|
+
|
|
202
|
+
return datatypes.CarrierSettings.create(
|
|
203
|
+
{
|
|
204
|
+
**self.credentials,
|
|
205
|
+
**_computed_data,
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
@property
|
|
210
|
+
def gateway(self) -> gateway.Gateway:
|
|
211
|
+
import karrio.server.core.middleware as middleware
|
|
212
|
+
|
|
213
|
+
_context = middleware.SessionContext.get_current_request()
|
|
214
|
+
_tracer = getattr(_context, "tracer", lib.Tracer())
|
|
215
|
+
_cache = lib.Cache(caching.cache)
|
|
216
|
+
|
|
217
|
+
return karrio.gateway[self.ext].create(
|
|
218
|
+
self.data.to_dict(),
|
|
219
|
+
_tracer,
|
|
220
|
+
_cache,
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
@staticmethod
|
|
224
|
+
def resolve_config(
|
|
225
|
+
carrier, is_user_config: bool = False, is_system_config: bool = False
|
|
226
|
+
):
|
|
227
|
+
"""Resolve the config for a carrier.
|
|
228
|
+
Here are the rules:
|
|
229
|
+
- If the carrier is a system carrier, return the first config with no org
|
|
230
|
+
- If the carrier is an org carrier, return the first config from the org
|
|
231
|
+
- If the carrier is a user carrier, return the first config from the user
|
|
232
|
+
"""
|
|
233
|
+
import karrio.server.serializers as serializers
|
|
234
|
+
import karrio.server.core.middleware as middleware
|
|
235
|
+
from django.contrib.auth.models import AnonymousUser
|
|
236
|
+
from karrio.server.providers.models.config import CarrierConfig
|
|
237
|
+
|
|
238
|
+
if carrier.id is None:
|
|
239
|
+
return None
|
|
240
|
+
|
|
241
|
+
_ctx = serializers.get_object_context(carrier)
|
|
242
|
+
ctx = lib.identity(
|
|
243
|
+
_ctx
|
|
244
|
+
if (_ctx.user or _ctx.org)
|
|
245
|
+
else lib.failsafe(lambda: middleware.SessionContext.get_current_request())
|
|
246
|
+
)
|
|
247
|
+
has_ctx_user = lib.identity(
|
|
248
|
+
ctx and ((ctx.user and not isinstance(ctx.user, AnonymousUser)) or ctx.org)
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
queryset = lib.identity(
|
|
252
|
+
CarrierConfig.objects.filter(carrier=carrier)
|
|
253
|
+
if carrier.is_system
|
|
254
|
+
else CarrierConfig.access_by(ctx).filter(carrier=carrier)
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
if carrier.is_system:
|
|
258
|
+
_config = queryset.filter(
|
|
259
|
+
created_by__is_staff=True,
|
|
260
|
+
**({"org": None} if hasattr(carrier, "org") else {}),
|
|
261
|
+
).first()
|
|
262
|
+
|
|
263
|
+
if has_ctx_user:
|
|
264
|
+
return queryset.filter(
|
|
265
|
+
**(
|
|
266
|
+
{"org": (None if is_system_config else ctx.org)}
|
|
267
|
+
if hasattr(carrier, "org")
|
|
268
|
+
else {"created_by": ctx.user}
|
|
269
|
+
)
|
|
270
|
+
).first() or (None if is_user_config else _config)
|
|
271
|
+
|
|
272
|
+
return _config
|
|
273
|
+
|
|
274
|
+
return queryset.first()
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def create_carrier_proxy(carrier_name: str, display_name):
|
|
278
|
+
class _Manager(Manager):
|
|
279
|
+
def get_queryset(self):
|
|
280
|
+
return super().get_queryset().filter(carrier_code=carrier_name)
|
|
281
|
+
|
|
282
|
+
class _CarrierManager(CarrierManager):
|
|
283
|
+
def get_queryset(self):
|
|
284
|
+
return super().get_queryset().filter(carrier_code=carrier_name)
|
|
285
|
+
|
|
286
|
+
class _SystemCarrierManager(SystemCarrierManager):
|
|
287
|
+
def get_queryset(self):
|
|
288
|
+
return super().get_queryset().filter(carrier_code=carrier_name)
|
|
289
|
+
|
|
290
|
+
return type(
|
|
291
|
+
f"{carrier_name}Connection",
|
|
292
|
+
(Carrier,),
|
|
293
|
+
{
|
|
294
|
+
"Meta": type(
|
|
295
|
+
"Meta",
|
|
296
|
+
(),
|
|
297
|
+
{
|
|
298
|
+
"proxy": True,
|
|
299
|
+
"__module__": __name__,
|
|
300
|
+
"verbose_name": f"{display_name} Connection",
|
|
301
|
+
"verbose_name_plural": f"{display_name} Connections",
|
|
302
|
+
},
|
|
303
|
+
),
|
|
304
|
+
"__module__": __name__,
|
|
305
|
+
"objects": _Manager(),
|
|
306
|
+
"user_carriers": _CarrierManager(),
|
|
307
|
+
"system_carriers": _SystemCarrierManager(),
|
|
308
|
+
},
|
|
309
|
+
)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import django.db.models as models
|
|
3
|
+
import karrio.server.core.models as core
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@core.register_model
|
|
7
|
+
class CarrierConfig(core.OwnedEntity):
|
|
8
|
+
class Meta:
|
|
9
|
+
db_table = "carrier-config"
|
|
10
|
+
verbose_name = "Carrier Config"
|
|
11
|
+
verbose_name_plural = "Carrier Configs"
|
|
12
|
+
ordering = ["-created_at"]
|
|
13
|
+
|
|
14
|
+
id = models.CharField(
|
|
15
|
+
max_length=50,
|
|
16
|
+
editable=False,
|
|
17
|
+
primary_key=True,
|
|
18
|
+
default=functools.partial(core.uuid, prefix="cfg_"),
|
|
19
|
+
)
|
|
20
|
+
carrier = models.ForeignKey(
|
|
21
|
+
"Carrier",
|
|
22
|
+
null=False,
|
|
23
|
+
related_name="configs",
|
|
24
|
+
on_delete=models.CASCADE,
|
|
25
|
+
)
|
|
26
|
+
config = models.JSONField(
|
|
27
|
+
null=False,
|
|
28
|
+
blank=False,
|
|
29
|
+
default=core.field_default({}),
|
|
30
|
+
)
|