karrio-server-manager 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.
Files changed (102) hide show
  1. karrio/server/manager/__init__.py +1 -0
  2. karrio/server/manager/admin.py +1 -0
  3. karrio/server/manager/apps.py +13 -0
  4. karrio/server/manager/migrations/0001_initial.py +1358 -0
  5. karrio/server/manager/migrations/0002_auto_20201127_0721.py +61 -0
  6. karrio/server/manager/migrations/0003_auto_20201230_0820.py +34 -0
  7. karrio/server/manager/migrations/0004_auto_20210125_2125.py +18 -0
  8. karrio/server/manager/migrations/0005_auto_20210216_0758.py +27 -0
  9. karrio/server/manager/migrations/0006_auto_20210307_0438.py +24 -0
  10. karrio/server/manager/migrations/0006_auto_20210308_0302.py +53 -0
  11. karrio/server/manager/migrations/0007_merge_20210311_1428.py +14 -0
  12. karrio/server/manager/migrations/0008_remove_shipment_doc_images.py +17 -0
  13. karrio/server/manager/migrations/0009_auto_20210326_1425.py +28 -0
  14. karrio/server/manager/migrations/0010_auto_20210403_1404.py +28 -0
  15. karrio/server/manager/migrations/0011_auto_20210426_1924.py +48 -0
  16. karrio/server/manager/migrations/0012_auto_20210427_1319.py +24 -0
  17. karrio/server/manager/migrations/0013_customs_invoice_date.py +18 -0
  18. karrio/server/manager/migrations/0014_auto_20210515_0928.py +24 -0
  19. karrio/server/manager/migrations/0015_auto_20210601_0340.py +182 -0
  20. karrio/server/manager/migrations/0016_shipment_archived.py +18 -0
  21. karrio/server/manager/migrations/0017_auto_20210629_1650.py +22 -0
  22. karrio/server/manager/migrations/0018_auto_20210705_1049.py +23 -0
  23. karrio/server/manager/migrations/0019_auto_20210722_1131.py +43 -0
  24. karrio/server/manager/migrations/0020_tracking_messages.py +20 -0
  25. karrio/server/manager/migrations/0021_tracking_estimated_delivery.py +18 -0
  26. karrio/server/manager/migrations/0022_auto_20211122_2100.py +53 -0
  27. karrio/server/manager/migrations/0023_auto_20211227_2141.py +118 -0
  28. karrio/server/manager/migrations/0024_alter_parcel_items.py +18 -0
  29. karrio/server/manager/migrations/0025_auto_20220113_1158.py +25 -0
  30. karrio/server/manager/migrations/0026_parcel_reference_number.py +18 -0
  31. karrio/server/manager/migrations/0027_custom_migration_2021_1.py +47 -0
  32. karrio/server/manager/migrations/0028_auto_20220303_1153.py +39 -0
  33. karrio/server/manager/migrations/0029_auto_20220303_1249.py +55 -0
  34. karrio/server/manager/migrations/0030_alter_shipment_status.py +44 -0
  35. karrio/server/manager/migrations/0031_shipment_invoice.py +34 -0
  36. karrio/server/manager/migrations/0032_custom_migration_2022_3.py +26 -0
  37. karrio/server/manager/migrations/0033_auto_20220504_1335.py +57 -0
  38. karrio/server/manager/migrations/0034_commodity_hs_code.py +18 -0
  39. karrio/server/manager/migrations/0035_parcel_options.py +26 -0
  40. karrio/server/manager/migrations/0036_alter_tracking_shipment.py +24 -0
  41. karrio/server/manager/migrations/0037_auto_20220710_1350.py +28 -0
  42. karrio/server/manager/migrations/0038_alter_tracking_status.py +18 -0
  43. karrio/server/manager/migrations/0039_documentuploadrecord.py +43 -0
  44. karrio/server/manager/migrations/0040_parcel_freight_class.py +18 -0
  45. karrio/server/manager/migrations/0041_alter_commodity_options_alter_parcel_options.py +29 -0
  46. karrio/server/manager/migrations/0042_remove_shipment_shipment_tracking_number_idx_and_more.py +658 -0
  47. karrio/server/manager/migrations/0043_customs_duty_billing_address_and_more.py +62 -0
  48. karrio/server/manager/migrations/0044_address_address_line1_temp_and_more.py +326 -0
  49. karrio/server/manager/migrations/0045_alter_customs_duty_billing_address_and_more.py +45 -0
  50. karrio/server/manager/migrations/0046_auto_20230114_0930.py +78 -0
  51. karrio/server/manager/migrations/0047_remove_shipment_shipment_tracking_number_idx_and_more.py +595 -0
  52. karrio/server/manager/migrations/0048_commodity_title_alter_commodity_description_and_more.py +53 -0
  53. karrio/server/manager/migrations/0049_auto_20230318_0708.py +39 -0
  54. karrio/server/manager/migrations/0050_address_street_number_tracking_account_number_and_more.py +60 -0
  55. karrio/server/manager/migrations/0051_auto_20230330_0556.py +56 -0
  56. karrio/server/manager/migrations/0052_auto_20230520_0811.py +35 -0
  57. karrio/server/manager/migrations/0053_alter_commodity_weight_unit_alter_parcel_weight_unit.py +32 -0
  58. karrio/server/manager/migrations/0054_alter_address_company_name_alter_address_person_name.py +22 -0
  59. karrio/server/manager/migrations/0055_alter_tracking_status.py +32 -0
  60. karrio/server/manager/migrations/0056_tracking_delivery_image_tracking_signature_image.py +22 -0
  61. karrio/server/manager/migrations/0057_alter_customs_invoice_date.py +18 -0
  62. karrio/server/manager/migrations/0058_manifest_shipment_manifest.py +124 -0
  63. karrio/server/manager/migrations/0059_shipment_return_address.py +24 -0
  64. karrio/server/manager/migrations/0060_pickup_meta_alter_address_country_code_and_more.py +527 -0
  65. karrio/server/manager/migrations/0061_alter_customs_incoterm.py +37 -0
  66. karrio/server/manager/migrations/0062_alter_tracking_status.py +35 -0
  67. karrio/server/manager/migrations/__init__.py +0 -0
  68. karrio/server/manager/models.py +984 -0
  69. karrio/server/manager/router.py +3 -0
  70. karrio/server/manager/serializers/__init__.py +50 -0
  71. karrio/server/manager/serializers/address.py +82 -0
  72. karrio/server/manager/serializers/commodity.py +51 -0
  73. karrio/server/manager/serializers/customs.py +84 -0
  74. karrio/server/manager/serializers/document.py +113 -0
  75. karrio/server/manager/serializers/manifest.py +85 -0
  76. karrio/server/manager/serializers/parcel.py +84 -0
  77. karrio/server/manager/serializers/pickup.py +285 -0
  78. karrio/server/manager/serializers/rate.py +19 -0
  79. karrio/server/manager/serializers/shipment.py +869 -0
  80. karrio/server/manager/serializers/tracking.py +250 -0
  81. karrio/server/manager/signals.py +70 -0
  82. karrio/server/manager/tests/__init__.py +10 -0
  83. karrio/server/manager/tests/test_addresses.py +110 -0
  84. karrio/server/manager/tests/test_custom_infos.py +97 -0
  85. karrio/server/manager/tests/test_parcels.py +104 -0
  86. karrio/server/manager/tests/test_pickups.py +345 -0
  87. karrio/server/manager/tests/test_shipments.py +833 -0
  88. karrio/server/manager/tests/test_trackers.py +215 -0
  89. karrio/server/manager/urls.py +10 -0
  90. karrio/server/manager/views/__init__.py +9 -0
  91. karrio/server/manager/views/addresses.py +154 -0
  92. karrio/server/manager/views/customs.py +159 -0
  93. karrio/server/manager/views/documents.py +131 -0
  94. karrio/server/manager/views/manifests.py +160 -0
  95. karrio/server/manager/views/parcels.py +155 -0
  96. karrio/server/manager/views/pickups.py +182 -0
  97. karrio/server/manager/views/shipments.py +335 -0
  98. karrio/server/manager/views/trackers.py +364 -0
  99. karrio_server_manager-2025.5rc1.dist-info/METADATA +28 -0
  100. karrio_server_manager-2025.5rc1.dist-info/RECORD +102 -0
  101. karrio_server_manager-2025.5rc1.dist-info/WHEEL +5 -0
  102. karrio_server_manager-2025.5rc1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,62 @@
1
+ # Generated by Django 4.1.3 on 2022-12-10 20:13
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ def forwards_func(apps, schema_editor):
8
+ db_alias = schema_editor.connection.alias
9
+ Address = apps.get_model("manager", "Address")
10
+ Customs = apps.get_model("manager", "Customs")
11
+ _customs_infos = []
12
+
13
+ for customs in (
14
+ Customs.objects.using(db_alias).filter(duty__bill_to__isnull=False).iterator()
15
+ ):
16
+ try:
17
+ customs.duty_billing_address = Address.objects.create(
18
+ **customs.duty["bill_to"]
19
+ )
20
+ customs.duty = {k: v for k, v in customs.duty.items() if k != "duty"}
21
+ _customs_infos.append(customs)
22
+ except:
23
+ pass
24
+
25
+ if any(_customs_infos):
26
+ Customs.objects.using(db_alias).bulk_update(
27
+ _customs_infos, ["duty", "duty_billing_address"]
28
+ )
29
+
30
+
31
+ def reverse_func(apps, schema_editor):
32
+ pass
33
+
34
+
35
+ class Migration(migrations.Migration):
36
+ dependencies = [
37
+ ("manager", "0042_remove_shipment_shipment_tracking_number_idx_and_more"),
38
+ ]
39
+
40
+ operations = [
41
+ migrations.AddField(
42
+ model_name="customs",
43
+ name="duty_billing_address",
44
+ field=models.OneToOneField(
45
+ null=True,
46
+ on_delete=django.db.models.deletion.CASCADE,
47
+ related_name="duty_billing_address_customs",
48
+ to="manager.address",
49
+ ),
50
+ ),
51
+ migrations.AddField(
52
+ model_name="shipment",
53
+ name="billing_address",
54
+ field=models.OneToOneField(
55
+ null=True,
56
+ on_delete=django.db.models.deletion.CASCADE,
57
+ related_name="billing_address_shipment",
58
+ to="manager.address",
59
+ ),
60
+ ),
61
+ migrations.RunPython(forwards_func, reverse_func),
62
+ ]
@@ -0,0 +1,326 @@
1
+ # Generated by Django 4.1.3 on 2022-12-11 05:10
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ def forwards_func(apps, schema_editor):
7
+ db_alias = schema_editor.connection.alias
8
+ Parcel = apps.get_model("manager", "Parcel")
9
+ Address = apps.get_model("manager", "Address")
10
+ Shipment = apps.get_model("manager", "Shipment")
11
+ Commodity = apps.get_model("manager", "Commodity")
12
+
13
+ shipments = (
14
+ Shipment.objects.using(db_alias).filter(models.Q(reference__gt=25)).iterator()
15
+ )
16
+ commodities = (
17
+ Commodity.objects.using(db_alias)
18
+ .filter(
19
+ models.Q(description__gt=25)
20
+ | models.Q(sku__gt=25)
21
+ | models.Q(hs_code__gt=25)
22
+ )
23
+ .iterator()
24
+ )
25
+ parcels = (
26
+ Parcel.objects.using(db_alias)
27
+ .filter(
28
+ models.Q(description__gt=35)
29
+ | models.Q(content__gt=35)
30
+ | models.Q(reference_number__gt=50)
31
+ )
32
+ .iterator()
33
+ )
34
+ addresses = (
35
+ Address.objects.using(db_alias)
36
+ .filter(
37
+ models.Q(city__gt=30)
38
+ | models.Q(person_name__gt=30)
39
+ | models.Q(company_name__gt=30)
40
+ | models.Q(phone_number__gt=20)
41
+ | models.Q(federal_tax_id__gt=20)
42
+ | models.Q(state_tax_id__gt=20)
43
+ | models.Q(address_line1__gt=35)
44
+ | models.Q(address_line2__gt=35)
45
+ )
46
+ .iterator()
47
+ )
48
+
49
+ for shipment in shipments:
50
+ if shipment.reference:
51
+ shipment.reference_temp = shipment.reference[:35]
52
+
53
+ shipment.save()
54
+
55
+ for parcel in parcels:
56
+ if parcel.content:
57
+ parcel.content_temp = parcel.content[:35]
58
+
59
+ if parcel.description:
60
+ parcel.description_temp = parcel.description[:35]
61
+
62
+ if parcel.reference_number:
63
+ parcel.reference_number_temp = parcel.reference_number[:50]
64
+
65
+ parcel.save()
66
+
67
+ for commodity in commodities:
68
+ if commodity.description:
69
+ commodity.description_temp = commodity.description[:25]
70
+
71
+ if commodity.sku:
72
+ commodity.sku_temp = commodity.sku[:25]
73
+
74
+ if commodity.hs_code:
75
+ commodity.hs_code_temp = commodity.hs_code[:25]
76
+
77
+ commodity.save()
78
+
79
+ for address in addresses:
80
+ if address.city:
81
+ address.city_temp = address.city[:30]
82
+ if address.federal_tax_id:
83
+ address.federal_tax_id_temp = address.federal_tax_id[:20]
84
+ if address.state_tax_id:
85
+ address.state_tax_id_temp = address.state_tax_id[:20]
86
+ if address.person_name:
87
+ address.person_name_temp = address.person_name[:30]
88
+ if address.company_name:
89
+ address.company_name_temp = address.company_name[:30]
90
+ if address.address_line1:
91
+ address.address_line1_temp = address.address_line1[:35]
92
+ if address.address_line2:
93
+ address.address_line2_temp = address.address_line2[:35]
94
+
95
+ address.save()
96
+
97
+
98
+ def reverse_func(apps, schema_editor):
99
+ pass
100
+
101
+
102
+ class Migration(migrations.Migration):
103
+ dependencies = [
104
+ ("manager", "0043_customs_duty_billing_address_and_more"),
105
+ ]
106
+
107
+ operations = [
108
+ migrations.AddField(
109
+ model_name="address",
110
+ name="address_line1_temp",
111
+ field=models.CharField(
112
+ blank=True, db_index=True, max_length=100, null=True
113
+ ),
114
+ ),
115
+ migrations.AddField(
116
+ model_name="address",
117
+ name="address_line2_temp",
118
+ field=models.CharField(
119
+ blank=True, db_index=True, max_length=100, null=True
120
+ ),
121
+ ),
122
+ migrations.AddField(
123
+ model_name="address",
124
+ name="city_temp",
125
+ field=models.CharField(blank=True, db_index=True, max_length=30, null=True),
126
+ ),
127
+ migrations.AddField(
128
+ model_name="address",
129
+ name="company_name_temp",
130
+ field=models.CharField(blank=True, db_index=True, max_length=30, null=True),
131
+ ),
132
+ migrations.AddField(
133
+ model_name="address",
134
+ name="federal_tax_id_temp",
135
+ field=models.CharField(blank=True, max_length=20, null=True),
136
+ ),
137
+ migrations.AddField(
138
+ model_name="address",
139
+ name="person_name_temp",
140
+ field=models.CharField(blank=True, db_index=True, max_length=30, null=True),
141
+ ),
142
+ migrations.AddField(
143
+ model_name="address",
144
+ name="phone_number_temp",
145
+ field=models.CharField(blank=True, max_length=50, null=True),
146
+ ),
147
+ migrations.AddField(
148
+ model_name="address",
149
+ name="state_tax_id_temp",
150
+ field=models.CharField(blank=True, max_length=20, null=True),
151
+ ),
152
+ migrations.AddField(
153
+ model_name="commodity",
154
+ name="description_temp",
155
+ field=models.CharField(blank=True, max_length=25, null=True),
156
+ ),
157
+ migrations.AddField(
158
+ model_name="commodity",
159
+ name="hs_code_temp",
160
+ field=models.CharField(blank=True, db_index=True, max_length=25, null=True),
161
+ ),
162
+ migrations.AddField(
163
+ model_name="commodity",
164
+ name="sku_temp",
165
+ field=models.CharField(blank=True, db_index=True, max_length=25, null=True),
166
+ ),
167
+ migrations.AddField(
168
+ model_name="parcel",
169
+ name="content_temp",
170
+ field=models.CharField(blank=True, max_length=35, null=True),
171
+ ),
172
+ migrations.AddField(
173
+ model_name="parcel",
174
+ name="description_temp",
175
+ field=models.CharField(blank=True, max_length=35, null=True),
176
+ ),
177
+ migrations.AddField(
178
+ model_name="parcel",
179
+ name="reference_number_temp",
180
+ field=models.CharField(blank=True, db_index=True, max_length=50, null=True),
181
+ ),
182
+ migrations.AddField(
183
+ model_name="shipment",
184
+ name="reference_temp",
185
+ field=models.CharField(blank=True, max_length=35, null=True),
186
+ ),
187
+ # Copy fields
188
+ migrations.RunPython(forwards_func, reverse_func),
189
+ # Remove fields
190
+ migrations.RemoveField(
191
+ model_name="address",
192
+ name="address_line1",
193
+ ),
194
+ migrations.RemoveField(
195
+ model_name="address",
196
+ name="address_line2",
197
+ ),
198
+ migrations.RemoveField(
199
+ model_name="address",
200
+ name="city",
201
+ ),
202
+ migrations.RemoveField(
203
+ model_name="address",
204
+ name="company_name",
205
+ ),
206
+ migrations.RemoveField(
207
+ model_name="address",
208
+ name="federal_tax_id",
209
+ ),
210
+ migrations.RemoveField(
211
+ model_name="address",
212
+ name="person_name",
213
+ ),
214
+ migrations.RemoveField(
215
+ model_name="address",
216
+ name="phone_number",
217
+ ),
218
+ migrations.RemoveField(
219
+ model_name="address",
220
+ name="state_tax_id",
221
+ ),
222
+ migrations.RemoveField(
223
+ model_name="commodity",
224
+ name="description",
225
+ ),
226
+ migrations.RemoveField(
227
+ model_name="commodity",
228
+ name="hs_code",
229
+ ),
230
+ migrations.RemoveField(
231
+ model_name="commodity",
232
+ name="sku",
233
+ ),
234
+ migrations.RemoveField(
235
+ model_name="parcel",
236
+ name="content",
237
+ ),
238
+ migrations.RemoveField(
239
+ model_name="parcel",
240
+ name="description",
241
+ ),
242
+ migrations.RemoveField(
243
+ model_name="parcel",
244
+ name="reference_number",
245
+ ),
246
+ migrations.RemoveField(
247
+ model_name="shipment",
248
+ name="reference",
249
+ ),
250
+ # Rename fields
251
+ migrations.RenameField(
252
+ model_name="address",
253
+ old_name="address_line1_temp",
254
+ new_name="address_line1",
255
+ ),
256
+ migrations.RenameField(
257
+ model_name="address",
258
+ old_name="address_line2_temp",
259
+ new_name="address_line2",
260
+ ),
261
+ migrations.RenameField(
262
+ model_name="address",
263
+ old_name="city_temp",
264
+ new_name="city",
265
+ ),
266
+ migrations.RenameField(
267
+ model_name="address",
268
+ old_name="company_name_temp",
269
+ new_name="company_name",
270
+ ),
271
+ migrations.RenameField(
272
+ model_name="address",
273
+ old_name="federal_tax_id_temp",
274
+ new_name="federal_tax_id",
275
+ ),
276
+ migrations.RenameField(
277
+ model_name="address",
278
+ old_name="person_name_temp",
279
+ new_name="person_name",
280
+ ),
281
+ migrations.RenameField(
282
+ model_name="address",
283
+ old_name="phone_number_temp",
284
+ new_name="phone_number",
285
+ ),
286
+ migrations.RenameField(
287
+ model_name="address",
288
+ old_name="state_tax_id_temp",
289
+ new_name="state_tax_id",
290
+ ),
291
+ migrations.RenameField(
292
+ model_name="commodity",
293
+ old_name="description_temp",
294
+ new_name="description",
295
+ ),
296
+ migrations.RenameField(
297
+ model_name="commodity",
298
+ old_name="hs_code_temp",
299
+ new_name="hs_code",
300
+ ),
301
+ migrations.RenameField(
302
+ model_name="commodity",
303
+ old_name="sku_temp",
304
+ new_name="sku",
305
+ ),
306
+ migrations.RenameField(
307
+ model_name="parcel",
308
+ old_name="content_temp",
309
+ new_name="content",
310
+ ),
311
+ migrations.RenameField(
312
+ model_name="parcel",
313
+ old_name="description_temp",
314
+ new_name="description",
315
+ ),
316
+ migrations.RenameField(
317
+ model_name="parcel",
318
+ old_name="reference_number_temp",
319
+ new_name="reference_number",
320
+ ),
321
+ migrations.RenameField(
322
+ model_name="shipment",
323
+ old_name="reference_temp",
324
+ new_name="reference",
325
+ ),
326
+ ]
@@ -0,0 +1,45 @@
1
+ # Generated by Django 4.1.4 on 2023-01-01 14:10
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("manager", "0044_address_address_line1_temp_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="customs",
16
+ name="duty_billing_address",
17
+ field=models.OneToOneField(
18
+ null=True,
19
+ on_delete=django.db.models.deletion.SET_NULL,
20
+ related_name="duty_billing_address_customs",
21
+ to="manager.address",
22
+ ),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name="shipment",
26
+ name="billing_address",
27
+ field=models.OneToOneField(
28
+ null=True,
29
+ on_delete=django.db.models.deletion.SET_NULL,
30
+ related_name="billing_address_shipment",
31
+ to="manager.address",
32
+ ),
33
+ ),
34
+ migrations.AlterField(
35
+ model_name="shipment",
36
+ name="customs",
37
+ field=models.OneToOneField(
38
+ blank=True,
39
+ null=True,
40
+ on_delete=django.db.models.deletion.SET_NULL,
41
+ related_name="customs_shipment",
42
+ to="manager.customs",
43
+ ),
44
+ ),
45
+ ]
@@ -0,0 +1,78 @@
1
+ # Generated by Django 4.1.5 on 2023-01-14 09:30
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ def forwards_func(apps, schema_editor):
7
+ import karrio.server.providers.models as providers
8
+
9
+ db_alias = schema_editor.connection.alias
10
+ Shipment = apps.get_model("manager", "Shipment")
11
+ shipments = (
12
+ Shipment.objects.using(db_alias)
13
+ .filter(selected_rate_carrier__isnull=False)
14
+ .iterator()
15
+ )
16
+ Tracker = apps.get_model("manager", "Tracking")
17
+ trackers = (
18
+ Tracker.objects.using(db_alias)
19
+ .filter(tracking_carrier__isnull=False)
20
+ .iterator()
21
+ )
22
+
23
+ _shipments = []
24
+ _trackers = []
25
+
26
+ for shipment in shipments:
27
+ carrier = providers.Carrier.objects.get(pk=shipment.selected_rate_carrier.pk)
28
+ meta = shipment.meta or {}
29
+ rate_provider = (
30
+ getattr(carrier.settings, "custom_carrier_name", None)
31
+ or meta.get("rate_provider")
32
+ or carrier.carrier_name
33
+ )
34
+ shipment.meta = {
35
+ **meta,
36
+ "ext": carrier.ext,
37
+ "carrier": rate_provider,
38
+ }
39
+ _shipments.append(shipment)
40
+
41
+ for tracker in trackers:
42
+ tracking_carrier = providers.Carrier.objects.get(pk=tracker.tracking_carrier.pk)
43
+ meta = tracker.meta or {}
44
+ carrier = (
45
+ (
46
+ (list(tracker.options.values())[0] or {}).get("carrier")
47
+ or tracking_carrier.carrier_name
48
+ )
49
+ if len(tracker.options.values()) > 0
50
+ else tracking_carrier.carrier_name
51
+ )
52
+ tracker.meta = {
53
+ **meta,
54
+ "carrier": carrier,
55
+ "ext": tracking_carrier.carrier_name,
56
+ }
57
+ _trackers.append(tracker)
58
+
59
+ if any(_shipments):
60
+ Shipment.objects.using(db_alias).bulk_update(_shipments, ["meta"])
61
+
62
+ if any(_trackers):
63
+ Tracker.objects.using(db_alias).bulk_update(_trackers, ["meta"])
64
+
65
+
66
+ def reverse_func(apps, schema_editor):
67
+ pass
68
+
69
+
70
+ class Migration(migrations.Migration):
71
+ dependencies = [
72
+ ("providers", "0044_carrier_carrier_capabilities"),
73
+ ("manager", "0045_alter_customs_duty_billing_address_and_more"),
74
+ ]
75
+
76
+ operations = [
77
+ migrations.RunPython(forwards_func, reverse_func),
78
+ ]