karrio-server-manager 2025.5.5__py3-none-any.whl → 2025.5.7__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.
@@ -0,0 +1,20 @@
1
+ # Generated by Django 6.0 on 2025-12-12 20:16
2
+
3
+ import functools
4
+ import karrio.server.core.utils
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('manager', '0067_rename_customs_commodities_table'),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AddField(
16
+ model_name='shipment',
17
+ name='extra_documents',
18
+ field=models.JSONField(blank=True, default=functools.partial(karrio.server.core.utils.identity, value=[]), null=True),
19
+ ),
20
+ ]
@@ -0,0 +1,36 @@
1
+ # Generated by Django 5.2.9 on 2025-12-19 03:49
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("manager", "0068_shipment_extra_documents"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="tracking",
15
+ name="status",
16
+ field=models.CharField(
17
+ choices=[
18
+ ("pending", "pending"),
19
+ ("picked_up", "picked_up"),
20
+ ("unknown", "unknown"),
21
+ ("on_hold", "on_hold"),
22
+ ("cancelled", "cancelled"),
23
+ ("delivered", "delivered"),
24
+ ("in_transit", "in_transit"),
25
+ ("delivery_delayed", "delivery_delayed"),
26
+ ("out_for_delivery", "out_for_delivery"),
27
+ ("ready_for_pickup", "ready_for_pickup"),
28
+ ("delivery_failed", "delivery_failed"),
29
+ ("return_to_sender", "return_to_sender"),
30
+ ],
31
+ db_index=True,
32
+ default="pending",
33
+ max_length=25,
34
+ ),
35
+ ),
36
+ ]
@@ -823,6 +823,9 @@ class Shipment(core.OwnedEntity):
823
823
  metadata = models.JSONField(
824
824
  blank=True, null=True, default=functools.partial(utils.identity, value={})
825
825
  )
826
+ extra_documents = models.JSONField(
827
+ blank=True, null=True, default=functools.partial(utils.identity, value=[])
828
+ )
826
829
 
827
830
  # System Reference fields
828
831
 
@@ -285,8 +285,14 @@ class ShipmentSerializer(ShipmentData):
285
285
  if "docs" in validated_data:
286
286
  changes.append("label")
287
287
  changes.append("invoice")
288
+ changes.append("extra_documents")
288
289
  instance.label = validated_data["docs"].get("label") or instance.label
289
290
  instance.invoice = validated_data["docs"].get("invoice") or instance.invoice
291
+ instance.extra_documents = (
292
+ validated_data["docs"].get("extra_documents")
293
+ or instance.extra_documents
294
+ or []
295
+ )
290
296
 
291
297
  if "selected_rate" in validated_data:
292
298
  selected_rate = validated_data.get("selected_rate", {})
@@ -387,6 +393,7 @@ class ShipmentUpdateData(validators.OptionDefaultSerializer):
387
393
  "shipment_note": "This is a shipment note",
388
394
  "signature_confirmation": true,
389
395
  "saturday_delivery": true,
396
+ "shipping_charges": 10.00,
390
397
  "is_return": true,
391
398
  "doc_files": [
392
399
  {
@@ -443,6 +450,7 @@ class ShipmentRateData(validators.OptionDefaultSerializer):
443
450
  {
444
451
  "currency": "USD",
445
452
  "insurance": 100.00,
453
+ "insured_by": "carrier",
446
454
  "cash_on_delivery": 30.00,
447
455
  "dangerous_good": true,
448
456
  "declared_value": 150.00,
@@ -450,6 +458,7 @@ class ShipmentRateData(validators.OptionDefaultSerializer):
450
458
  "email_notification": true,
451
459
  "email_notification_to": "shipper@mail.com",
452
460
  "hold_at_location": true,
461
+ "locker_id": "123456789",
453
462
  "paperless_trade": true,
454
463
  "preferred_service": "fedex_express_saver",
455
464
  "shipment_date": "2020-01-01", # TODO: deprecate
@@ -457,6 +466,7 @@ class ShipmentRateData(validators.OptionDefaultSerializer):
457
466
  "shipment_note": "This is a shipment note",
458
467
  "signature_confirmation": true,
459
468
  "saturday_delivery": true,
469
+ "shipping_charges": 10.00,
460
470
  "is_return": true,
461
471
  "doc_files": [
462
472
  {
@@ -500,6 +510,7 @@ class ShipmentPurchaseSerializer(Shipment):
500
510
  {
501
511
  "currency": "USD",
502
512
  "insurance": 100.00,
513
+ "insured_by": "carrier",
503
514
  "cash_on_delivery": 30.00,
504
515
  "dangerous_good": true,
505
516
  "declared_value": 150.00,
@@ -507,6 +518,7 @@ class ShipmentPurchaseSerializer(Shipment):
507
518
  "email_notification": true,
508
519
  "email_notification_to": "shipper@mail.com",
509
520
  "hold_at_location": true,
521
+ "locker_id": "123456789",
510
522
  "paperless_trade": true,
511
523
  "preferred_service": "fedex_express_saver",
512
524
  "shipment_date": "2020-01-01", # TODO: deprecate
@@ -514,6 +526,7 @@ class ShipmentPurchaseSerializer(Shipment):
514
526
  "shipment_note": "This is a shipment note",
515
527
  "signature_confirmation": true,
516
528
  "saturday_delivery": true,
529
+ "shipping_charges": 10.00,
517
530
  "is_return": true,
518
531
  "doc_files": [
519
532
  {
@@ -67,11 +67,14 @@ class TrackingSerializer(TrackingDetails):
67
67
  raise_on_error=(pending_pickup is not True),
68
68
  )
69
69
 
70
+ # Apply picked_up transformation for initial events
71
+ events = utils._ensure_picked_up_status(lib.to_dict(response.tracking.events))
72
+
70
73
  return models.Tracking.objects.create(
71
74
  created_by=context.user,
72
75
  tracking_number=tracking_number,
73
76
  account_number=account_number,
74
- events=lib.to_dict(response.tracking.events),
77
+ events=events,
75
78
  test_mode=response.tracking.test_mode,
76
79
  delivered=response.tracking.delivered,
77
80
  status=response.tracking.status,
@@ -191,6 +194,8 @@ def update_shipment_tracker(tracker: models.Tracking):
191
194
  status = ShipmentStatus.delivered.value
192
195
  elif tracker.status == TrackerStatus.pending.value:
193
196
  status = tracker.shipment.status
197
+ elif tracker.status == TrackerStatus.picked_up.value:
198
+ status = ShipmentStatus.shipped.value
194
199
  elif tracker.status == TrackerStatus.out_for_delivery.value:
195
200
  status = ShipmentStatus.out_for_delivery.value
196
201
  elif tracker.status == TrackerStatus.delivery_failed.value:
@@ -1205,6 +1205,7 @@ class TestShipmentCancelIdempotent(APITestCase):
1205
1205
  LABEL_DOCUMENT_RESPONSE = {
1206
1206
  "category": "label",
1207
1207
  "format": "PDF",
1208
+ "print_format": None,
1208
1209
  "base64": "==apodifjoefr",
1209
1210
  "url": ANY,
1210
1211
  }
@@ -130,6 +130,8 @@ TRACKING_RESPONSE = {
130
130
  "latitude": None,
131
131
  "longitude": None,
132
132
  "reason": None,
133
+ "status": None,
134
+ "timestamp": None,
133
135
  }
134
136
  ],
135
137
  "messages": [],
@@ -182,6 +184,8 @@ UPDATE_TRACKING_RESPONSE = {
182
184
  "longitude": None,
183
185
  "time": "20:34",
184
186
  "reason": None,
187
+ "status": None,
188
+ "timestamp": None,
185
189
  }
186
190
  ],
187
191
  "delivered": False,
@@ -11,6 +11,7 @@ import rest_framework.throttling as throttling
11
11
  import django_filters.rest_framework as django_filters
12
12
 
13
13
  from karrio.server.core.utils import validate_resource_token
14
+ from karrio.server.core.authentication import AccessMixin
14
15
  import karrio.server.openapi as openapi
15
16
  import karrio.server.core.views.api as api
16
17
  import karrio.server.core.filters as filters
@@ -106,7 +107,7 @@ class ManifestDetails(api.APIView):
106
107
  return response.Response(serializers.Manifest(manifest).data)
107
108
 
108
109
 
109
- class ManifestDoc(django_downloadview.VirtualDownloadView):
110
+ class ManifestDoc(AccessMixin, django_downloadview.VirtualDownloadView):
110
111
  @openapi.extend_schema(exclude=True)
111
112
  def get(self, req: request.Request, pk: str, doc: str = "manifest", format: str = "pdf", **kwargs):
112
113
  """Retrieve a manifest file."""
@@ -15,6 +15,7 @@ import karrio.server.openapi as openapi
15
15
  import karrio.server.core.filters as filters
16
16
  import karrio.server.manager.models as models
17
17
  from karrio.server.core.views.api import GenericAPIView, APIView
18
+ from karrio.server.core.authentication import AccessMixin
18
19
  from karrio.server.core.filters import ShipmentFilters
19
20
  from karrio.server.manager.router import router
20
21
  from karrio.server.manager.serializers import (
@@ -267,7 +268,7 @@ class ShipmentPurchase(APIView):
267
268
  return Response(PurchasedShipment(update).data)
268
269
 
269
270
 
270
- class ShipmentDocs(VirtualDownloadView):
271
+ class ShipmentDocs(AccessMixin, VirtualDownloadView):
271
272
  @openapi.extend_schema(exclude=True)
272
273
  def get(
273
274
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karrio_server_manager
3
- Version: 2025.5.5
3
+ Version: 2025.5.7
4
4
  Summary: Multi-carrier shipping API Shipments manager module
5
5
  Author-email: karrio <hello@karrio.io>
6
6
  License-Expression: LGPL-3.0
@@ -1,7 +1,7 @@
1
1
  karrio/server/manager/__init__.py,sha256=lDTMs_O6mQl0DEI2_TniT24TDJbjnkla-5QpnwfYlxs,64
2
2
  karrio/server/manager/admin.py,sha256=QOl5e2m3ekU5aj0yj9Uq4nRQrNMB_FfqNae6RyIxkC0,35
3
3
  karrio/server/manager/apps.py,sha256=WHTQ1t79uDZTbinRzvNg1NjtFwnwEvg0tP_ChrtTRwI,364
4
- karrio/server/manager/models.py,sha256=WruyZDTfqKlqu81fwAyxVCwxDu1lvl9l4bo9FbnFbos,34329
4
+ karrio/server/manager/models.py,sha256=eMBARl00oZVE_L1YMXV79bNBp5n36mVQO-MlSexBA3M,34458
5
5
  karrio/server/manager/router.py,sha256=IBUR7rfBkdEHQzWxYOPcVSM8NBp3fte9G6Q5BVTUNNw,95
6
6
  karrio/server/manager/signals.py,sha256=3ZApZY4Ne8Gb0AT5rjC3Xneb7dnbSQyXp1OiBXt7eIA,1908
7
7
  karrio/server/manager/urls.py,sha256=oXJlvhHNKxFkc_CmpFoyTSAMJcLp4Wt9dHbViQDkqw4,220
@@ -73,6 +73,8 @@ karrio/server/manager/migrations/0064_shipment_shipment_created_at_idx_and_more.
73
73
  karrio/server/manager/migrations/0065_alter_address_city_alter_address_company_name_and_more.py,sha256=m0KQSz8cnJzaXUlaAKdqU0duZ8wSQeTYQCIeam3Wivw,6279
74
74
  karrio/server/manager/migrations/0066_commodity_image_url_commodity_product_id_and_more.py,sha256=Jw7bEBmqzDSp6zw0xcAiKc9aDCsa3Wrw-oTM8r9Pqfc,997
75
75
  karrio/server/manager/migrations/0067_rename_customs_commodities_table.py,sha256=WPACK9Ab5QUdcX9yxBkV6_MXTAkB9F8vETDOlVqOrT4,1933
76
+ karrio/server/manager/migrations/0068_shipment_extra_documents.py,sha256=DL4FqB5bf5Rq3YuWVJsBMStkwMDmHIp_WN1BA6hKSTI,536
77
+ karrio/server/manager/migrations/0069_alter_tracking_status.py,sha256=p7rra3Iva_FT6eBmfKcpvC-E5Zll4bH69kMX9Us3Q-w,1170
76
78
  karrio/server/manager/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
79
  karrio/server/manager/serializers/__init__.py,sha256=FyL9pqzoV7umSJut5P2KzqPFxn1ZWu07Qx7I58H2AQc,1454
78
80
  karrio/server/manager/serializers/address.py,sha256=yGKvZiNukeI15LEDdbo1ycqqK8QW77ak_vyLMIKyglI,2779
@@ -83,8 +85,8 @@ karrio/server/manager/serializers/manifest.py,sha256=mSneCk_7HMXpi64_7hggWvkR7Ma
83
85
  karrio/server/manager/serializers/parcel.py,sha256=733Bg26lVbEkoWtAVM5Qt2IRBS2QDuVxhG40Hiqh3bw,2621
84
86
  karrio/server/manager/serializers/pickup.py,sha256=sX0VmcQxGkXn3IEosMuFwdXh4HhdkPcuBOp79O8PoDQ,9233
85
87
  karrio/server/manager/serializers/rate.py,sha256=7vYK_v8iWEDnswqYHG2Lir16_UhHTOxW5rdC6lw3lzA,652
86
- karrio/server/manager/serializers/shipment.py,sha256=ByVrnexMI_fgSGBWO95qOPQn65Xzcfb8Vna9nF3k7Bk,37004
87
- karrio/server/manager/serializers/tracking.py,sha256=ixrAjIiZQsvSt4y0qtisGkt6TFOJ3ORNkJAQVt6YQrA,12483
88
+ karrio/server/manager/serializers/shipment.py,sha256=XuqCsB8TBYtn270JNKyvmYglDZttEfLED69NYN-uVyA,37500
89
+ karrio/server/manager/serializers/tracking.py,sha256=BViFnLlojwbRuy3U1rP2Vp_UqWRjwTd_4OVrhNAfkEA,12712
88
90
  karrio/server/manager/tests/__init__.py,sha256=Y1UNteEE60vWdUAkjbldu_r_-h4u0He8-UoiBgTjKcU,391
89
91
  karrio/server/manager/tests/test_addresses.py,sha256=pNkZC_yJyb29ZlEOtOAs4blcEYiOarw0zhZIZC5uj1w,3111
90
92
  karrio/server/manager/tests/test_custom_infos.py,sha256=iv2cLdZVoVWFZK_mDUEnrZssncAnQcn87Rn2sAk8UQI,2731
@@ -92,18 +94,18 @@ karrio/server/manager/tests/test_errors.py,sha256=x2-mSsXknHkE4V7TajEu8d3rpqV38T
92
94
  karrio/server/manager/tests/test_manifests.py,sha256=X35ZTXTFEM4Gxdjz598yiNNkOOKZGpILjHWRC0oM5U4,2764
93
95
  karrio/server/manager/tests/test_parcels.py,sha256=lVLBOsHzXgXQvYjHIUy5oiPvrMfxYpueVvvhtuhstWk,2559
94
96
  karrio/server/manager/tests/test_pickups.py,sha256=8jxddwTnBvBM9FOyWxW9TtZ-GOVYUje7HQ2EZjsbtD8,10681
95
- karrio/server/manager/tests/test_shipments.py,sha256=I9DIx4l7zrHZ_vEvAKgdrnIx_euZtreSj9W40fouqSU,39725
96
- karrio/server/manager/tests/test_trackers.py,sha256=VIGT8OVH51mf_6F2HEr5C-kYvsMnhUods_rpq543RbI,7207
97
+ karrio/server/manager/tests/test_shipments.py,sha256=S_mDZtCFd1R5S40AA83LfmQsGJGrJ52gwDzh2SY4YIM,39751
98
+ karrio/server/manager/tests/test_trackers.py,sha256=DNeGR-MQ6E_HIARuDUod7bIfhRgem3by-_rMLJR5JfM,7325
97
99
  karrio/server/manager/views/__init__.py,sha256=kDFUaORRQ3Xh0ZPm-Jk88Ss8dgGYM57iUFXb9TPMzh0,401
98
100
  karrio/server/manager/views/addresses.py,sha256=7YCAs2ZYgd1icYwMcGGWfX7A7vZEL4BEAbU4eIxhiMY,4620
99
101
  karrio/server/manager/views/customs.py,sha256=-ZreiKyJ1xeLeNVG53nMfRQFeURduWr1QkDItdLPnE8,4875
100
102
  karrio/server/manager/views/documents.py,sha256=znW54qJ_k7WInIut5FBZFDT93CioozXTOYFKRSUTBhA,4005
101
- karrio/server/manager/views/manifests.py,sha256=bk-8XoGLVqgjDfpTZbTKjXW7r8DYNDp2ce2xGG73sbI,7012
103
+ karrio/server/manager/views/manifests.py,sha256=KwDoV7GSdRv7YDAzl0SLaNoAx4R-gBguO_WiW_qwfBM,7083
102
104
  karrio/server/manager/views/parcels.py,sha256=hZY45rg6SrTWfQqyJ38MGKSor1yqgPUEVHtu16aG37g,4594
103
105
  karrio/server/manager/views/pickups.py,sha256=gmpxz9ot1OR-BP1qh-0MXU3kUJi1ht_74hfaLJzJ42w,5503
104
- karrio/server/manager/views/shipments.py,sha256=YOFcZy-ymn3YfIKtcfNjFO4R_tPocrmEqMkQUXSSDCM,13083
106
+ karrio/server/manager/views/shipments.py,sha256=vdJFgIKnSHEb2FVGtqJbiMoHuMqzWtDpINMH4UaEtQQ,13154
105
107
  karrio/server/manager/views/trackers.py,sha256=3oGn2qDpHgk8GZvuz-Cb93Fc0j_h_HbXQR692Zhfiok,12363
106
- karrio_server_manager-2025.5.5.dist-info/METADATA,sha256=fj_XMA52xNVPSCUZYh2CywQdx6mZSiqtMP0DJ51gtrQ,730
107
- karrio_server_manager-2025.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
108
- karrio_server_manager-2025.5.5.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
109
- karrio_server_manager-2025.5.5.dist-info/RECORD,,
108
+ karrio_server_manager-2025.5.7.dist-info/METADATA,sha256=XazOdL7uDHjIEM2eIv1ZOJcLQjqXo92DMzGTsivtK2k,730
109
+ karrio_server_manager-2025.5.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
+ karrio_server_manager-2025.5.7.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
111
+ karrio_server_manager-2025.5.7.dist-info/RECORD,,