karrio-server-events 2025.5rc33__py3-none-any.whl → 2025.5rc35__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.
- karrio/server/events/signals.py +1 -1
- karrio/server/events/task_definitions/base/archiving.py +107 -75
- karrio/server/events/task_definitions/base/tracking.py +1 -0
- {karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/METADATA +1 -1
- {karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/RECORD +7 -7
- {karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/WHEEL +0 -0
- {karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/top_level.txt +0 -0
karrio/server/events/signals.py
CHANGED
|
@@ -86,7 +86,7 @@ def shipment_cancelled(sender, instance, *args, **kwargs):
|
|
|
86
86
|
- shipment cancelled/deleted (label voided)
|
|
87
87
|
"""
|
|
88
88
|
event = EventTypes.shipment_cancelled.value
|
|
89
|
-
data = serializers.Shipment(instance)
|
|
89
|
+
data = serializers.Shipment(instance).data
|
|
90
90
|
event_at = instance.updated_at
|
|
91
91
|
context = dict(
|
|
92
92
|
user_id=utils.failsafe(lambda: instance.created_by.id),
|
|
@@ -22,46 +22,61 @@ def run_data_archiving(*args, **kwargs):
|
|
|
22
22
|
days=conf.settings.TRACKER_DATA_RETENTION
|
|
23
23
|
)
|
|
24
24
|
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
25
|
+
# Prepare querysets once and rely on delete helpers to determine if work was done.
|
|
26
|
+
tracing_data = tracing.TracingRecord.objects.filter(created_at__lt=log_retention)
|
|
27
|
+
event_data = events.Event.objects.filter(created_at__lt=log_retention)
|
|
28
|
+
api_log_data = core.APILog.objects.filter(requested_at__lt=log_retention)
|
|
29
|
+
tracking_data = manager.Tracking.objects.filter(created_at__lt=tracker_retention)
|
|
30
|
+
shipping_data = manager.Shipment.objects.filter(created_at__lt=shipment_retention)
|
|
31
|
+
order_data = orders.Order.objects.filter(created_at__lt=order_retention)
|
|
32
|
+
|
|
33
|
+
tracing_deleted = utils.failsafe(lambda: _bulk_delete_tracing_data(tracing_data)) or 0
|
|
34
|
+
if tracing_deleted:
|
|
35
|
+
logger.info(
|
|
36
|
+
"Archiving SDK tracing backlog",
|
|
37
|
+
retention_days=conf.settings.API_LOGS_DATA_RETENTION,
|
|
38
|
+
deleted_records=tracing_deleted,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
events_deleted = utils.failsafe(lambda: event_data.delete()[0]) or 0
|
|
42
|
+
if events_deleted:
|
|
43
|
+
logger.info(
|
|
44
|
+
"Archiving events backlog",
|
|
45
|
+
retention_days=conf.settings.API_LOGS_DATA_RETENTION,
|
|
46
|
+
deleted_records=events_deleted,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
api_logs_deleted = utils.failsafe(lambda: api_log_data.delete()[0]) or 0
|
|
50
|
+
if api_logs_deleted:
|
|
51
|
+
logger.info(
|
|
52
|
+
"Archiving API request logs backlog",
|
|
53
|
+
retention_days=conf.settings.API_LOGS_DATA_RETENTION,
|
|
54
|
+
deleted_records=api_logs_deleted,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
tracking_deleted = utils.failsafe(lambda: _bulk_delete_tracking_data(tracking_data)) or 0
|
|
58
|
+
if tracking_deleted:
|
|
59
|
+
logger.info(
|
|
60
|
+
"Archiving tracking data backlog",
|
|
61
|
+
retention_days=conf.settings.TRACKER_DATA_RETENTION,
|
|
62
|
+
deleted_records=tracking_deleted,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
shipping_deleted = utils.failsafe(lambda: _bulk_delete_shipment_data(shipping_data)) or 0
|
|
66
|
+
if shipping_deleted:
|
|
67
|
+
logger.info(
|
|
68
|
+
"Archiving shipping data backlog",
|
|
69
|
+
retention_days=conf.settings.SHIPMENT_DATA_RETENTION,
|
|
70
|
+
deleted_records=shipping_deleted,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
order_deleted = utils.failsafe(lambda: _bulk_delete_order_data(order_data)) or 0
|
|
74
|
+
if order_deleted:
|
|
75
|
+
logger.info(
|
|
76
|
+
"Archiving order data backlog",
|
|
77
|
+
retention_days=conf.settings.ORDER_DATA_RETENTION,
|
|
78
|
+
deleted_records=order_deleted,
|
|
79
|
+
)
|
|
65
80
|
|
|
66
81
|
logger.info("Finished scheduled backlog archiving")
|
|
67
82
|
|
|
@@ -69,100 +84,117 @@ def run_data_archiving(*args, **kwargs):
|
|
|
69
84
|
def _bulk_delete_tracing_data(tracing_queryset):
|
|
70
85
|
"""Bulk delete tracing data to avoid N+1 queries with organization links."""
|
|
71
86
|
BATCH_SIZE = 1000
|
|
72
|
-
|
|
87
|
+
queryset = tracing_queryset.order_by("pk")
|
|
88
|
+
|
|
73
89
|
try:
|
|
74
90
|
from karrio.server.orgs.models import TracingRecordLink
|
|
75
|
-
|
|
91
|
+
|
|
76
92
|
# Process in batches to avoid memory issues
|
|
77
93
|
total_deleted = 0
|
|
78
94
|
while True:
|
|
79
95
|
# Get a batch of IDs to delete
|
|
80
|
-
batch_ids = list(
|
|
81
|
-
|
|
96
|
+
batch_ids = list(queryset.values_list("id", flat=True)[:BATCH_SIZE])
|
|
97
|
+
|
|
82
98
|
if not batch_ids:
|
|
83
99
|
break
|
|
84
|
-
|
|
100
|
+
|
|
85
101
|
# Bulk delete TracingRecordLink entries first to avoid CASCADE N+1 queries
|
|
86
102
|
TracingRecordLink.objects.filter(item_id__in=batch_ids).delete()
|
|
87
|
-
|
|
103
|
+
|
|
88
104
|
# Delete the tracing records in this batch
|
|
89
|
-
deleted_count =
|
|
105
|
+
deleted_count = queryset.filter(id__in=batch_ids).delete()[0]
|
|
90
106
|
total_deleted += deleted_count
|
|
91
|
-
|
|
107
|
+
|
|
92
108
|
logger.info("Deleted tracing records batch", batch_count=deleted_count, total_deleted=total_deleted)
|
|
93
|
-
|
|
109
|
+
|
|
110
|
+
return total_deleted
|
|
111
|
+
|
|
94
112
|
except ImportError:
|
|
95
113
|
# Organizations module not installed, just delete in batches
|
|
96
114
|
total_deleted = 0
|
|
97
115
|
while True:
|
|
98
116
|
# Get a batch to delete
|
|
99
|
-
batch_ids = list(
|
|
100
|
-
|
|
117
|
+
batch_ids = list(queryset.values_list("id", flat=True)[:BATCH_SIZE])
|
|
118
|
+
|
|
101
119
|
if not batch_ids:
|
|
102
120
|
break
|
|
103
|
-
|
|
104
|
-
deleted_count =
|
|
121
|
+
|
|
122
|
+
deleted_count = queryset.filter(id__in=batch_ids).delete()[0]
|
|
105
123
|
total_deleted += deleted_count
|
|
106
|
-
|
|
124
|
+
|
|
107
125
|
logger.info("Deleted tracing records batch", batch_count=deleted_count, total_deleted=total_deleted)
|
|
108
126
|
|
|
127
|
+
return total_deleted
|
|
128
|
+
|
|
109
129
|
|
|
110
130
|
def _bulk_delete_tracking_data(tracking_queryset):
|
|
111
131
|
"""Bulk delete tracking data to avoid N+1 queries with organization links."""
|
|
132
|
+
queryset = tracking_queryset.order_by("pk")
|
|
133
|
+
|
|
112
134
|
try:
|
|
113
135
|
from karrio.server.orgs.models import TrackingLink
|
|
114
|
-
|
|
136
|
+
|
|
115
137
|
# Get the tracking record IDs that will be deleted
|
|
116
|
-
tracking_ids = list(
|
|
117
|
-
|
|
138
|
+
tracking_ids = list(queryset.values_list("id", flat=True))
|
|
139
|
+
|
|
118
140
|
if tracking_ids:
|
|
119
141
|
# Bulk delete TrackingLink entries first to avoid CASCADE N+1 queries
|
|
120
142
|
TrackingLink.objects.filter(item_id__in=tracking_ids).delete()
|
|
121
|
-
|
|
143
|
+
|
|
122
144
|
# Now delete the tracking records themselves
|
|
123
|
-
|
|
124
|
-
|
|
145
|
+
deleted = queryset.delete()[0]
|
|
146
|
+
|
|
125
147
|
except ImportError:
|
|
126
148
|
# Organizations module not installed, just delete normally
|
|
127
|
-
|
|
149
|
+
deleted = queryset.delete()[0]
|
|
150
|
+
|
|
151
|
+
return deleted
|
|
128
152
|
|
|
129
153
|
|
|
130
154
|
def _bulk_delete_shipment_data(shipment_queryset):
|
|
131
155
|
"""Bulk delete shipment data to avoid N+1 queries with organization links."""
|
|
156
|
+
queryset = shipment_queryset.order_by("pk")
|
|
157
|
+
|
|
132
158
|
try:
|
|
133
159
|
from karrio.server.orgs.models import ShipmentLink
|
|
134
|
-
|
|
160
|
+
|
|
135
161
|
# Get the shipment record IDs that will be deleted
|
|
136
|
-
shipment_ids = list(
|
|
137
|
-
|
|
162
|
+
shipment_ids = list(queryset.values_list("id", flat=True))
|
|
163
|
+
|
|
138
164
|
if shipment_ids:
|
|
139
165
|
# Bulk delete ShipmentLink entries first to avoid CASCADE N+1 queries
|
|
140
166
|
ShipmentLink.objects.filter(item_id__in=shipment_ids).delete()
|
|
141
|
-
|
|
167
|
+
|
|
142
168
|
# Now delete the shipment records themselves
|
|
143
|
-
|
|
144
|
-
|
|
169
|
+
deleted = queryset.delete()[0]
|
|
170
|
+
|
|
145
171
|
except ImportError:
|
|
146
172
|
# Organizations module not installed, just delete normally
|
|
147
|
-
|
|
173
|
+
deleted = queryset.delete()[0]
|
|
174
|
+
|
|
175
|
+
return deleted
|
|
148
176
|
|
|
149
177
|
|
|
150
178
|
def _bulk_delete_order_data(order_queryset):
|
|
151
179
|
"""Bulk delete order data to avoid N+1 queries with organization links."""
|
|
180
|
+
queryset = order_queryset.order_by("pk")
|
|
181
|
+
|
|
152
182
|
try:
|
|
153
183
|
from karrio.server.orgs.models import OrderLink
|
|
154
|
-
|
|
184
|
+
|
|
155
185
|
# Get the order record IDs that will be deleted
|
|
156
|
-
order_ids = list(
|
|
157
|
-
|
|
186
|
+
order_ids = list(queryset.values_list("id", flat=True))
|
|
187
|
+
|
|
158
188
|
if order_ids:
|
|
159
189
|
# Bulk delete OrderLink entries first to avoid CASCADE N+1 queries
|
|
160
190
|
OrderLink.objects.filter(item_id__in=order_ids).delete()
|
|
161
|
-
|
|
191
|
+
|
|
162
192
|
# Now delete the order records themselves
|
|
163
|
-
|
|
164
|
-
|
|
193
|
+
deleted = queryset.delete()[0]
|
|
194
|
+
|
|
165
195
|
except ImportError:
|
|
166
196
|
# Organizations module not installed, just delete normally
|
|
167
|
-
|
|
197
|
+
deleted = queryset.delete()[0]
|
|
198
|
+
|
|
199
|
+
return deleted
|
|
168
200
|
|
|
@@ -38,6 +38,7 @@ def update_trackers(
|
|
|
38
38
|
):
|
|
39
39
|
logger.info("Starting scheduled trackers update", delta_seconds=delta.seconds, tracker_count=len(tracker_ids) if tracker_ids else 0)
|
|
40
40
|
|
|
41
|
+
# TrackingManager now handles all necessary prefetching including carrier config
|
|
41
42
|
active_trackers = lib.identity(
|
|
42
43
|
models.Tracking.objects.filter(id__in=tracker_ids)
|
|
43
44
|
if any(tracker_ids)
|
{karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/RECORD
RENAMED
|
@@ -4,7 +4,7 @@ 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=
|
|
7
|
+
karrio/server/events/signals.py,sha256=3VlwVPWEyALcjn1MEbuh3u9Xojq8hSgmwYFz7lulW3M,4544
|
|
8
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
|
|
@@ -25,8 +25,8 @@ 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=
|
|
29
|
-
karrio/server/events/task_definitions/base/tracking.py,sha256=
|
|
28
|
+
karrio/server/events/task_definitions/base/archiving.py,sha256=HVUfgzTSsfa-o2u6N1VuyPopnVLdFRwvv-3ix5LjKHc,7270
|
|
29
|
+
karrio/server/events/task_definitions/base/tracking.py,sha256=rSzNZiRGmchgJj81iSl9X6QXExsTfxegqTyfRkjOvPE,9111
|
|
30
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
|
|
@@ -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.
|
|
43
|
-
karrio_server_events-2025.
|
|
44
|
-
karrio_server_events-2025.
|
|
45
|
-
karrio_server_events-2025.
|
|
42
|
+
karrio_server_events-2025.5rc35.dist-info/METADATA,sha256=udp3Y8My2q74CuIdnd9qte8hrZ-rux6l_o3gjCQaREA,705
|
|
43
|
+
karrio_server_events-2025.5rc35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
44
|
+
karrio_server_events-2025.5rc35.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
|
|
45
|
+
karrio_server_events-2025.5rc35.dist-info/RECORD,,
|
{karrio_server_events-2025.5rc33.dist-info → karrio_server_events-2025.5rc35.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|