karrio-server-events 2025.5rc30__py3-none-any.whl → 2025.5rc32__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.
@@ -1,22 +1,20 @@
1
- import logging
2
1
  from django.db.models import signals
3
2
 
4
3
  from karrio.server.core import utils
4
+ from karrio.server.core.logging import logger
5
5
  from karrio.server.conf import settings
6
6
  from karrio.server.events.serializers import EventTypes
7
7
  import karrio.server.core.serializers as serializers
8
8
  import karrio.server.manager.models as models
9
9
  import karrio.server.events.tasks as tasks
10
10
 
11
- logger = logging.getLogger(__name__)
12
-
13
11
 
14
12
  def register_signals():
15
13
  signals.post_save.connect(shipment_updated, sender=models.Shipment)
16
14
  signals.post_delete.connect(shipment_cancelled, sender=models.Shipment)
17
15
  signals.post_save.connect(tracker_updated, sender=models.Tracking)
18
16
 
19
- logger.info("karrio.events signals registered...")
17
+ logger.info("Karrio events signals registered")
20
18
 
21
19
 
22
20
  @utils.disable_for_loaddata
@@ -1,17 +1,15 @@
1
- import logging
2
1
  import datetime
3
2
  import django.utils.timezone as timezone
4
3
 
5
4
  import karrio.server.conf as conf
6
5
  import karrio.server.core.utils as utils
6
+ from karrio.server.core.logging import logger
7
7
  import karrio.server.core.models as core
8
8
  import karrio.server.events.models as events
9
9
  import karrio.server.orders.models as orders
10
10
  import karrio.server.tracing.models as tracing
11
11
  import karrio.server.manager.models as manager
12
12
 
13
- logger = logging.getLogger(__name__)
14
-
15
13
 
16
14
  def run_data_archiving(*args, **kwargs):
17
15
  now = timezone.now()
@@ -36,36 +34,36 @@ def run_data_archiving(*args, **kwargs):
36
34
  order_exists = orders.Order.objects.filter(created_at__lt=order_retention).exists()
37
35
 
38
36
  if tracing_exists:
39
- logger.info(">> archiving SDK tracing backlog...")
37
+ logger.info("Archiving SDK tracing backlog", retention_days=conf.settings.API_LOGS_DATA_RETENTION)
40
38
  tracing_data = tracing.TracingRecord.objects.filter(created_at__lt=log_retention)
41
39
  utils.failsafe(lambda: _bulk_delete_tracing_data(tracing_data))
42
40
 
43
41
  if event_exists:
44
- logger.info(">> archiving events backlog...")
42
+ logger.info("Archiving events backlog", retention_days=conf.settings.API_LOGS_DATA_RETENTION)
45
43
  event_data = events.Event.objects.filter(created_at__lt=log_retention)
46
44
  utils.failsafe(lambda: event_data.delete())
47
45
 
48
46
  if api_log_exists:
49
- logger.info(">> archiving API request logs backlog...")
47
+ logger.info("Archiving API request logs backlog", retention_days=conf.settings.API_LOGS_DATA_RETENTION)
50
48
  api_log_data = core.APILog.objects.filter(requested_at__lt=log_retention)
51
49
  utils.failsafe(lambda: api_log_data.delete())
52
50
 
53
51
  if tracking_exists:
54
- logger.info(">> archiving tracking data backlog...")
52
+ logger.info("Archiving tracking data backlog", retention_days=conf.settings.TRACKER_DATA_RETENTION)
55
53
  tracking_data = manager.Tracking.objects.filter(created_at__lt=tracker_retention)
56
54
  utils.failsafe(lambda: _bulk_delete_tracking_data(tracking_data))
57
55
 
58
56
  if shipping_exists:
59
- logger.info(">> archiving shipping data backlog...")
57
+ logger.info("Archiving shipping data backlog", retention_days=conf.settings.SHIPMENT_DATA_RETENTION)
60
58
  shipping_data = manager.Shipment.objects.filter(created_at__lt=shipment_retention)
61
59
  utils.failsafe(lambda: _bulk_delete_shipment_data(shipping_data))
62
60
 
63
61
  if order_exists:
64
- logger.info(">> archiving order data backlog...")
62
+ logger.info("Archiving order data backlog", retention_days=conf.settings.ORDER_DATA_RETENTION)
65
63
  order_data = orders.Order.objects.filter(created_at__lt=order_retention)
66
64
  utils.failsafe(lambda: _bulk_delete_order_data(order_data))
67
65
 
68
- logger.info("> ending scheduled backlog archiving!")
66
+ logger.info("Finished scheduled backlog archiving")
69
67
 
70
68
 
71
69
  def _bulk_delete_tracing_data(tracing_queryset):
@@ -91,7 +89,7 @@ def _bulk_delete_tracing_data(tracing_queryset):
91
89
  deleted_count = tracing_queryset.filter(id__in=batch_ids).delete()[0]
92
90
  total_deleted += deleted_count
93
91
 
94
- logger.info(f"Deleted {deleted_count} tracing records (total: {total_deleted})")
92
+ logger.info("Deleted tracing records batch", batch_count=deleted_count, total_deleted=total_deleted)
95
93
 
96
94
  except ImportError:
97
95
  # Organizations module not installed, just delete in batches
@@ -106,7 +104,7 @@ def _bulk_delete_tracing_data(tracing_queryset):
106
104
  deleted_count = tracing_queryset.filter(id__in=batch_ids).delete()[0]
107
105
  total_deleted += deleted_count
108
106
 
109
- logger.info(f"Deleted {deleted_count} tracing records (total: {total_deleted})")
107
+ logger.info("Deleted tracing records batch", batch_count=deleted_count, total_deleted=total_deleted)
110
108
 
111
109
 
112
110
  def _bulk_delete_tracking_data(tracking_queryset):
@@ -1,6 +1,5 @@
1
1
  import time
2
2
  import typing
3
- import logging
4
3
  import datetime
5
4
  import functools
6
5
  from itertools import groupby
@@ -15,12 +14,11 @@ from karrio.api.interface import IRequestFrom
15
14
  from karrio.core.models import TrackingDetails, Message, TrackingEvent
16
15
 
17
16
  import karrio.server.core.utils as utils
17
+ from karrio.server.core.logging import logger
18
18
  import karrio.server.manager.models as models
19
19
  import karrio.server.tracing.utils as tracing
20
20
  import karrio.server.core.datatypes as datatypes
21
21
  import karrio.server.manager.serializers as serializers
22
-
23
- logger = logging.getLogger(__name__)
24
22
  Delay = int
25
23
  RequestBatches = typing.Tuple[
26
24
  Gateway, IRequestFrom, Delay, typing.List[models.Tracking]
@@ -38,7 +36,7 @@ def update_trackers(
38
36
  ),
39
37
  tracker_ids: typing.List[str] = [],
40
38
  ):
41
- logger.info("> starting scheduled trackers update")
39
+ logger.info("Starting scheduled trackers update", delta_seconds=delta.seconds, tracker_count=len(tracker_ids) if tracker_ids else 0)
42
40
 
43
41
  active_trackers = lib.identity(
44
42
  models.Tracking.objects.filter(id__in=tracker_ids)
@@ -61,9 +59,9 @@ def update_trackers(
61
59
  save_tracing_records(request_batches)
62
60
  save_updated_trackers(responses, active_trackers)
63
61
  else:
64
- logger.info("no active trackers found needing update")
62
+ logger.info("No active trackers found needing update")
65
63
 
66
- logger.info("> ending scheduled trackers update")
64
+ logger.info("Finished scheduled trackers update")
67
65
 
68
66
 
69
67
  def create_request_batches(
@@ -86,7 +84,7 @@ def create_request_batches(
86
84
  lambda acc, t: {**acc, **(t.options or {})}, batch_trackers, {}
87
85
  )
88
86
 
89
- logger.debug(f"prepare tracking request for {tracking_numbers}")
87
+ logger.debug("Preparing tracking request", tracking_numbers=tracking_numbers, batch_range=(start, end))
90
88
 
91
89
  # Prepare and send tracking request(s) using the karrio interface.
92
90
  request: IRequestFrom = karrio.Tracking.fetch(
@@ -99,8 +97,8 @@ def create_request_batches(
99
97
  batches.append((gateway, request, delay, batch_trackers))
100
98
 
101
99
  except Exception as request_error:
102
- logger.warning(f"failed to prepare tracking batch ({start}, {end}) request")
103
- logger.error(request_error, exc_info=True)
100
+ logger.warning("Failed to prepare tracking batch request", batch_range=(start, end), error=str(request_error))
101
+ logger.exception("Tracking batch request preparation error", batch_range=(start, end))
104
102
 
105
103
  end += 10
106
104
  start += 10
@@ -110,21 +108,22 @@ def create_request_batches(
110
108
 
111
109
  def fetch_tracking_info(request_batch: RequestBatches) -> BatchResponse:
112
110
  gateway, request, delay, trackers = request_batch
113
- logger.debug(f"fetching batch {[t.tracking_number for t in trackers]}")
111
+ tracking_numbers = [t.tracking_number for t in trackers]
112
+ logger.debug("Fetching tracking batch", tracking_numbers=tracking_numbers, delay_seconds=delay)
114
113
  time.sleep(delay) # apply delay before request
115
114
 
116
115
  try:
117
116
  return utils.identity(lambda: request.from_(gateway).parse())
118
117
  except Exception as request_error:
119
- logger.warning("batch request failed")
120
- logger.error(request_error, exc_info=True)
118
+ logger.warning("Tracking batch request failed", tracking_numbers=tracking_numbers, error=str(request_error))
119
+ logger.exception("Tracking batch request error", tracking_numbers=tracking_numbers)
121
120
 
122
121
  return []
123
122
 
124
123
 
125
124
  @utils.error_wrapper
126
125
  def save_tracing_records(request_batches: typing.List[RequestBatches]):
127
- logger.info("> saving tracing records...")
126
+ logger.info("Saving tracing records", batch_count=len(request_batches))
128
127
 
129
128
  try:
130
129
  for request_batch in request_batches:
@@ -136,20 +135,19 @@ def save_tracing_records(request_batches: typing.List[RequestBatches]):
136
135
  context = serializers.get_object_context(trackers[0])
137
136
  tracing.bulk_save_tracing_records(gateway.tracer, context=context)
138
137
  except Exception as error:
139
- print(error)
140
- logger.warning("Failed failed saving tracing record...")
141
- logger.error(error, exc_info=True)
138
+ logger.warning("Failed to save tracing records", error=str(error))
139
+ logger.exception("Tracing record save error")
142
140
 
143
141
 
144
142
  def save_updated_trackers(
145
143
  responses: typing.List[BatchResponse], trackers: typing.List[models.Tracking]
146
144
  ):
147
- logger.info("> saving updated trackers")
145
+ logger.info("Saving updated trackers", tracker_count=len(trackers))
148
146
 
149
147
  for tracking_details, _ in responses:
150
148
  for details in tracking_details or []:
151
149
  try:
152
- logger.debug(f"update tracking info for {details.tracking_number}")
150
+ logger.debug("Updating tracking info", tracking_number=details.tracking_number)
153
151
  related_trackers = [
154
152
  t for t in trackers if t.tracking_number == details.tracking_number
155
153
  ]
@@ -214,14 +212,10 @@ def save_updated_trackers(
214
212
  if any(changes):
215
213
  tracker.save(update_fields=changes)
216
214
  serializers.update_shipment_tracker(tracker)
217
- logger.debug(
218
- f"tracking info {details.tracking_number} updated successfully"
219
- )
215
+ logger.debug("Tracking info updated successfully", tracking_number=details.tracking_number, changes=changes)
220
216
  else:
221
- logger.debug(f"no changes detect")
217
+ logger.debug("No changes detected", tracking_number=details.tracking_number)
222
218
 
223
219
  except Exception as update_error:
224
- logger.warning(
225
- f"failed to update tracker with tracking number: {details.tracking_number}"
226
- )
227
- logger.error(update_error, exc_info=True)
220
+ logger.warning("Failed to update tracker", tracking_number=details.tracking_number, error=str(update_error))
221
+ logger.exception("Tracker update error", tracking_number=details.tracking_number)
@@ -1,6 +1,5 @@
1
1
  import typing
2
2
  import requests
3
- import logging
4
3
  from datetime import datetime
5
4
  from django.conf import settings
6
5
  from django.db.models import Q
@@ -8,11 +7,10 @@ from django.contrib.auth import get_user_model
8
7
 
9
8
  from karrio.core import utils
10
9
  from karrio.server.core.utils import identity
10
+ from karrio.server.core.logging import logger
11
11
  from karrio.server.serializers import Context
12
12
  from karrio.server.events import models
13
13
  import karrio.server.events.serializers.event as serializers
14
-
15
- logger = logging.getLogger(__name__)
16
14
  NotificationResponse = typing.Tuple[str, requests.Response]
17
15
  User = get_user_model()
18
16
 
@@ -24,7 +22,7 @@ def notify_webhook_subscribers(
24
22
  ctx: dict,
25
23
  **kwargs,
26
24
  ):
27
- logger.info(f"> starting {event} subscribers notification")
25
+ logger.info("Starting webhook subscribers notification", event=event)
28
26
  context = retrieve_context(ctx)
29
27
  query = (
30
28
  (Q(enabled_events__icontains=event) | Q(enabled_events__icontains="all")),
@@ -49,9 +47,9 @@ def notify_webhook_subscribers(
49
47
  )
50
48
  update_notified_webhooks(webhooks, responses, event_at)
51
49
  else:
52
- logger.info("no subscribers found")
50
+ logger.info("No webhook subscribers found", event=event)
53
51
 
54
- logger.info(f"> ending {event} subscribers notification")
52
+ logger.info("Finished webhook subscribers notification", event=event)
55
53
 
56
54
 
57
55
  def notify_subscribers(webhooks: typing.List[models.Webhook], payload: dict):
@@ -77,11 +75,11 @@ def update_notified_webhooks(
77
75
  responses: typing.List[NotificationResponse],
78
76
  event_at: datetime,
79
77
  ):
80
- logger.info("> saving updated webhooks")
78
+ logger.info("Saving updated webhooks")
81
79
 
82
80
  for webhook_id, response in responses:
83
81
  try:
84
- logger.debug(f"update webhook {webhook_id}")
82
+ logger.debug("Updating webhook", webhook_id=webhook_id)
85
83
 
86
84
  webhook = next((w for w in webhooks if w.id == webhook_id))
87
85
  if response.ok:
@@ -94,11 +92,11 @@ def update_notified_webhooks(
94
92
 
95
93
  webhook.save()
96
94
 
97
- logger.debug(f"webhook {webhook_id} updated successfully")
95
+ logger.debug("Webhook updated successfully", webhook_id=webhook_id)
98
96
 
99
97
  except Exception as update_error:
100
- logger.warning(f"failed to update webhook {webhook_id}")
101
- logger.error(update_error, exc_info=True)
98
+ logger.warning("Failed to update webhook", webhook_id=webhook_id, error=str(update_error))
99
+ logger.exception("Webhook update error", webhook_id=webhook_id)
102
100
 
103
101
 
104
102
  def retrieve_context(info: dict) -> Context:
@@ -1,9 +1,7 @@
1
1
  import typing
2
- import logging
3
2
  import pkgutil
3
+ from karrio.server.core.logging import logger
4
4
  import karrio.server.events.task_definitions as definitions
5
-
6
- logger = logging.getLogger(__name__)
7
5
  DEFINITIONS: typing.List[typing.Any] = []
8
6
 
9
7
  # Register karrio background tasks
@@ -13,8 +11,8 @@ for _, name, _ in pkgutil.iter_modules(definitions.__path__): # type: ignore
13
11
  if hasattr(definition, "TASK_DEFINITIONS"):
14
12
  DEFINITIONS += definition.TASK_DEFINITIONS
15
13
  except Exception as e:
16
- logger.warning(f'Failed to register "{name}" schema')
17
- logger.exception(e)
14
+ logger.warning(f"Failed to register task definition", task_name=name, error=str(e))
15
+ logger.exception(f"Task definition registration error", task_name=name)
18
16
 
19
17
  for wrapper in DEFINITIONS:
20
18
  globals()[wrapper.task_class.__name__] = wrapper
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karrio_server_events
3
- Version: 2025.5rc30
3
+ Version: 2025.5rc32
4
4
  Summary: Multi-carrier shipping API Events module
5
5
  Author-email: karrio <hello@karrio.io>
6
6
  License-Expression: Apache-2.0
@@ -4,8 +4,8 @@ karrio/server/events/apps.py,sha256=DIV8JdPB_3hD4DwhcQTevhph3PaceMkFSEGM1lOcdVY,
4
4
  karrio/server/events/filters.py,sha256=vMeY42IsoFl482-yX1BI17sw-9x9euOnzTl-860W3sg,2230
5
5
  karrio/server/events/models.py,sha256=WQQKpDnbUW97beFmCBJDTckSoE-h-HtxeRfjoNWepQY,2582
6
6
  karrio/server/events/router.py,sha256=IBUR7rfBkdEHQzWxYOPcVSM8NBp3fte9G6Q5BVTUNNw,95
7
- karrio/server/events/signals.py,sha256=gQ1FHwd-LXpg9OcV0inaqNBxSkqQVaztOgCOFNbo7I8,4549
8
- karrio/server/events/tasks.py,sha256=RVLJ2cNEQnT-3bUoitw9C_ST6g7tlLyzuJvu8omLOHc,712
7
+ karrio/server/events/signals.py,sha256=lIqouHZ_RGSzZXQgBeTT5Y0YoQL_TpzoifqxQKYJTSo,4539
8
+ karrio/server/events/tasks.py,sha256=kqs-W2VnDHOQNvieN8Ltehk578W5FTXTobj7t_mi9Xk,787
9
9
  karrio/server/events/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
10
10
  karrio/server/events/urls.py,sha256=oLTTzDWPhEFfK93EvzHTDRxqkw8Fr3iXneDXwFUkvcU,217
11
11
  karrio/server/events/migrations/0001_initial.py,sha256=c_HS1Pt89fnDgc839eh2VGBN4mvICBGWH5OUC5Xsz8k,2212
@@ -25,9 +25,9 @@ karrio/server/events/serializers/event.py,sha256=dKYqldfSEjKMY7uB1rBFfEfSZ_dfEp8
25
25
  karrio/server/events/serializers/webhook.py,sha256=Ri5JS1SXpSsPUvQH989T_7Amu1p46y5TP54MEEhK8j8,889
26
26
  karrio/server/events/task_definitions/__init__.py,sha256=bpT73UG7mZL_JjEqMwbYx6q69jA8J5Jcoul1LcDokhA,81
27
27
  karrio/server/events/task_definitions/base/__init__.py,sha256=3vP52gFdCo9hctLRKnYvEi9iz1UK8GL_a47Nw44h3Nc,1834
28
- karrio/server/events/task_definitions/base/archiving.py,sha256=MtQoW5y4TwoFphg96hXrz_3wBoKxrmI5yQRiHm98pL4,6987
29
- karrio/server/events/task_definitions/base/tracking.py,sha256=UL7-z1nVp3Scz-Nm6xuJB8S6obfaiHd-IyBXXIcrwOo,8533
30
- karrio/server/events/task_definitions/base/webhook.py,sha256=NgXMJw_55pwZ5z4bu49VUekFNkUJ_cwvs01PNnLxhI4,3506
28
+ karrio/server/events/task_definitions/base/archiving.py,sha256=n2Jxn6Jj-3fMtNCBnCUXrq4_iePmvU31j4ntCilIXJk,7303
29
+ karrio/server/events/task_definitions/base/tracking.py,sha256=av_uiT_0zNuZEC9X31EUXnuIF6gavtM8_1g300QUtzk,9026
30
+ karrio/server/events/task_definitions/base/webhook.py,sha256=QNRq3xhLWQEbrs3zSy6Sa0AXUPhWE7YenKpPzZoFwL0,3616
31
31
  karrio/server/events/tests/__init__.py,sha256=5szv9hDvu0R0jtm3XWktY19rCaE8bZ2LdjRm4oJ0pYA,220
32
32
  karrio/server/events/tests/test_events.py,sha256=Fxi1hv_lyuRJw5Y_ydywhq5P3akpxet4mFMFSiHU96c,4066
33
33
  karrio/server/events/tests/test_tracking_tasks.py,sha256=oOPdjhVax4SzTgBwKxySosgWOX6ZJ2Y-cYvXp3kj0lw,12114
@@ -39,7 +39,7 @@ karrio/server/graph/schemas/events/__init__.py,sha256=Yg1rWew5DgSb_OnLy8n7qqwPLf
39
39
  karrio/server/graph/schemas/events/inputs.py,sha256=Mgy9qCUrbL-sMI5dNXsnbW8K5_PnGKM13brzZrc5OWk,1526
40
40
  karrio/server/graph/schemas/events/mutations.py,sha256=930g2D5TnAEgEjfEfLml1Q9OGCyxe2D592BhzSGDQAQ,1862
41
41
  karrio/server/graph/schemas/events/types.py,sha256=TPlrDwQV4LZXu-1t4gFl_eYayU39THmgYT3uv7VXnnw,2759
42
- karrio_server_events-2025.5rc30.dist-info/METADATA,sha256=NnYeZbHvx4wo_uhsNk14pUptfRSZxeLjF-Oc4q-yT8A,705
43
- karrio_server_events-2025.5rc30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
44
- karrio_server_events-2025.5rc30.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
45
- karrio_server_events-2025.5rc30.dist-info/RECORD,,
42
+ karrio_server_events-2025.5rc32.dist-info/METADATA,sha256=QQ8nCIksva7rWXw-ygn4COHUMOrwrgRVAxPc0EZMFQQ,705
43
+ karrio_server_events-2025.5rc32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
44
+ karrio_server_events-2025.5rc32.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
45
+ karrio_server_events-2025.5rc32.dist-info/RECORD,,