karrio-server-events 2025.5rc16__py3-none-any.whl → 2025.5rc17__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/migrations/0010_event_event_created_at_idx.py +19 -0
- karrio/server/events/models.py +2 -0
- karrio/server/events/task_definitions/base/archiving.py +129 -17
- {karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/METADATA +1 -1
- {karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/RECORD +7 -6
- {karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/WHEEL +0 -0
- {karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Generated by Django 5.2.5 on 2025-08-23 00:22
|
|
2
|
+
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
("events", "0009_alter_webhook_enabled_events"),
|
|
11
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
operations = [
|
|
15
|
+
migrations.AddIndex(
|
|
16
|
+
model_name="event",
|
|
17
|
+
index=models.Index(fields=["created_at"], name="event_created_at_idx"),
|
|
18
|
+
),
|
|
19
|
+
]
|
karrio/server/events/models.py
CHANGED
|
@@ -64,6 +64,8 @@ class Event(core.OwnedEntity):
|
|
|
64
64
|
condition=models.Q(data__id__isnull=False),
|
|
65
65
|
name="event_object_idx",
|
|
66
66
|
),
|
|
67
|
+
# Index for archiving queries based on creation date
|
|
68
|
+
models.Index(fields=["created_at"], name="event_created_at_idx"),
|
|
67
69
|
]
|
|
68
70
|
|
|
69
71
|
id = models.CharField(
|
|
@@ -24,35 +24,147 @@ def run_data_archiving(*args, **kwargs):
|
|
|
24
24
|
days=conf.settings.TRACKER_DATA_RETENTION
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
# Use efficient existence checks and batch processing
|
|
28
|
+
BATCH_SIZE = 1000 # Process in batches to avoid memory issues
|
|
29
|
+
|
|
30
|
+
# Optimize querysets by only selecting required fields for existence checks
|
|
31
|
+
tracing_exists = tracing.TracingRecord.objects.filter(created_at__lt=log_retention).exists()
|
|
32
|
+
event_exists = events.Event.objects.filter(created_at__lt=log_retention).exists()
|
|
33
|
+
api_log_exists = core.APILog.objects.filter(requested_at__lt=log_retention).exists()
|
|
34
|
+
tracking_exists = manager.Tracking.objects.filter(created_at__lt=tracker_retention).exists()
|
|
35
|
+
shipping_exists = manager.Shipment.objects.filter(created_at__lt=shipment_retention).exists()
|
|
36
|
+
order_exists = orders.Order.objects.filter(created_at__lt=order_retention).exists()
|
|
37
|
+
|
|
38
|
+
if tracing_exists:
|
|
35
39
|
logger.info(">> archiving SDK tracing backlog...")
|
|
36
|
-
|
|
40
|
+
tracing_data = tracing.TracingRecord.objects.filter(created_at__lt=log_retention)
|
|
41
|
+
utils.failsafe(lambda: _bulk_delete_tracing_data(tracing_data))
|
|
37
42
|
|
|
38
|
-
if
|
|
43
|
+
if event_exists:
|
|
39
44
|
logger.info(">> archiving events backlog...")
|
|
45
|
+
event_data = events.Event.objects.filter(created_at__lt=log_retention)
|
|
40
46
|
utils.failsafe(lambda: event_data.delete())
|
|
41
47
|
|
|
42
|
-
if
|
|
48
|
+
if api_log_exists:
|
|
43
49
|
logger.info(">> archiving API request logs backlog...")
|
|
50
|
+
api_log_data = core.APILog.objects.filter(requested_at__lt=log_retention)
|
|
44
51
|
utils.failsafe(lambda: api_log_data.delete())
|
|
45
52
|
|
|
46
|
-
if
|
|
53
|
+
if tracking_exists:
|
|
47
54
|
logger.info(">> archiving tracking data backlog...")
|
|
48
|
-
|
|
55
|
+
tracking_data = manager.Tracking.objects.filter(created_at__lt=tracker_retention)
|
|
56
|
+
utils.failsafe(lambda: _bulk_delete_tracking_data(tracking_data))
|
|
49
57
|
|
|
50
|
-
if
|
|
58
|
+
if shipping_exists:
|
|
51
59
|
logger.info(">> archiving shipping data backlog...")
|
|
52
|
-
|
|
60
|
+
shipping_data = manager.Shipment.objects.filter(created_at__lt=shipment_retention)
|
|
61
|
+
utils.failsafe(lambda: _bulk_delete_shipment_data(shipping_data))
|
|
53
62
|
|
|
54
|
-
if
|
|
63
|
+
if order_exists:
|
|
55
64
|
logger.info(">> archiving order data backlog...")
|
|
56
|
-
|
|
65
|
+
order_data = orders.Order.objects.filter(created_at__lt=order_retention)
|
|
66
|
+
utils.failsafe(lambda: _bulk_delete_order_data(order_data))
|
|
57
67
|
|
|
58
68
|
logger.info("> ending scheduled backlog archiving!")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _bulk_delete_tracing_data(tracing_queryset):
|
|
72
|
+
"""Bulk delete tracing data to avoid N+1 queries with organization links."""
|
|
73
|
+
BATCH_SIZE = 1000
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
from karrio.server.orgs.models import TracingRecordLink
|
|
77
|
+
|
|
78
|
+
# Process in batches to avoid memory issues
|
|
79
|
+
total_deleted = 0
|
|
80
|
+
while True:
|
|
81
|
+
# Get a batch of IDs to delete
|
|
82
|
+
batch_ids = list(tracing_queryset.values_list('id', flat=True)[:BATCH_SIZE])
|
|
83
|
+
|
|
84
|
+
if not batch_ids:
|
|
85
|
+
break
|
|
86
|
+
|
|
87
|
+
# Bulk delete TracingRecordLink entries first to avoid CASCADE N+1 queries
|
|
88
|
+
TracingRecordLink.objects.filter(item_id__in=batch_ids).delete()
|
|
89
|
+
|
|
90
|
+
# Delete the tracing records in this batch
|
|
91
|
+
deleted_count = tracing_queryset.filter(id__in=batch_ids).delete()[0]
|
|
92
|
+
total_deleted += deleted_count
|
|
93
|
+
|
|
94
|
+
logger.info(f"Deleted {deleted_count} tracing records (total: {total_deleted})")
|
|
95
|
+
|
|
96
|
+
except ImportError:
|
|
97
|
+
# Organizations module not installed, just delete in batches
|
|
98
|
+
total_deleted = 0
|
|
99
|
+
while True:
|
|
100
|
+
# Get a batch to delete
|
|
101
|
+
batch_ids = list(tracing_queryset.values_list('id', flat=True)[:BATCH_SIZE])
|
|
102
|
+
|
|
103
|
+
if not batch_ids:
|
|
104
|
+
break
|
|
105
|
+
|
|
106
|
+
deleted_count = tracing_queryset.filter(id__in=batch_ids).delete()[0]
|
|
107
|
+
total_deleted += deleted_count
|
|
108
|
+
|
|
109
|
+
logger.info(f"Deleted {deleted_count} tracing records (total: {total_deleted})")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _bulk_delete_tracking_data(tracking_queryset):
|
|
113
|
+
"""Bulk delete tracking data to avoid N+1 queries with organization links."""
|
|
114
|
+
try:
|
|
115
|
+
from karrio.server.orgs.models import TrackingLink
|
|
116
|
+
|
|
117
|
+
# Get the tracking record IDs that will be deleted
|
|
118
|
+
tracking_ids = list(tracking_queryset.values_list('id', flat=True))
|
|
119
|
+
|
|
120
|
+
if tracking_ids:
|
|
121
|
+
# Bulk delete TrackingLink entries first to avoid CASCADE N+1 queries
|
|
122
|
+
TrackingLink.objects.filter(item_id__in=tracking_ids).delete()
|
|
123
|
+
|
|
124
|
+
# Now delete the tracking records themselves
|
|
125
|
+
tracking_queryset.delete()
|
|
126
|
+
|
|
127
|
+
except ImportError:
|
|
128
|
+
# Organizations module not installed, just delete normally
|
|
129
|
+
tracking_queryset.delete()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _bulk_delete_shipment_data(shipment_queryset):
|
|
133
|
+
"""Bulk delete shipment data to avoid N+1 queries with organization links."""
|
|
134
|
+
try:
|
|
135
|
+
from karrio.server.orgs.models import ShipmentLink
|
|
136
|
+
|
|
137
|
+
# Get the shipment record IDs that will be deleted
|
|
138
|
+
shipment_ids = list(shipment_queryset.values_list('id', flat=True))
|
|
139
|
+
|
|
140
|
+
if shipment_ids:
|
|
141
|
+
# Bulk delete ShipmentLink entries first to avoid CASCADE N+1 queries
|
|
142
|
+
ShipmentLink.objects.filter(item_id__in=shipment_ids).delete()
|
|
143
|
+
|
|
144
|
+
# Now delete the shipment records themselves
|
|
145
|
+
shipment_queryset.delete()
|
|
146
|
+
|
|
147
|
+
except ImportError:
|
|
148
|
+
# Organizations module not installed, just delete normally
|
|
149
|
+
shipment_queryset.delete()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _bulk_delete_order_data(order_queryset):
|
|
153
|
+
"""Bulk delete order data to avoid N+1 queries with organization links."""
|
|
154
|
+
try:
|
|
155
|
+
from karrio.server.orgs.models import OrderLink
|
|
156
|
+
|
|
157
|
+
# Get the order record IDs that will be deleted
|
|
158
|
+
order_ids = list(order_queryset.values_list('id', flat=True))
|
|
159
|
+
|
|
160
|
+
if order_ids:
|
|
161
|
+
# Bulk delete OrderLink entries first to avoid CASCADE N+1 queries
|
|
162
|
+
OrderLink.objects.filter(item_id__in=order_ids).delete()
|
|
163
|
+
|
|
164
|
+
# Now delete the order records themselves
|
|
165
|
+
order_queryset.delete()
|
|
166
|
+
|
|
167
|
+
except ImportError:
|
|
168
|
+
# Organizations module not installed, just delete normally
|
|
169
|
+
order_queryset.delete()
|
|
170
|
+
|
{karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/RECORD
RENAMED
|
@@ -2,7 +2,7 @@ karrio/server/events/__init__.py,sha256=tvia3JfJUbr8axL76i0ic308Q0623SVKOyg0FXP3
|
|
|
2
2
|
karrio/server/events/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
|
|
3
3
|
karrio/server/events/apps.py,sha256=DIV8JdPB_3hD4DwhcQTevhph3PaceMkFSEGM1lOcdVY,301
|
|
4
4
|
karrio/server/events/filters.py,sha256=vMeY42IsoFl482-yX1BI17sw-9x9euOnzTl-860W3sg,2230
|
|
5
|
-
karrio/server/events/models.py,sha256=
|
|
5
|
+
karrio/server/events/models.py,sha256=WQQKpDnbUW97beFmCBJDTckSoE-h-HtxeRfjoNWepQY,2582
|
|
6
6
|
karrio/server/events/router.py,sha256=IBUR7rfBkdEHQzWxYOPcVSM8NBp3fte9G6Q5BVTUNNw,95
|
|
7
7
|
karrio/server/events/signals.py,sha256=gQ1FHwd-LXpg9OcV0inaqNBxSkqQVaztOgCOFNbo7I8,4549
|
|
8
8
|
karrio/server/events/tasks.py,sha256=RVLJ2cNEQnT-3bUoitw9C_ST6g7tlLyzuJvu8omLOHc,712
|
|
@@ -17,6 +17,7 @@ karrio/server/events/migrations/0006_webhook_events_alter_event_data.py,sha256=N
|
|
|
17
17
|
karrio/server/events/migrations/0007_auto_20221130_0255.py,sha256=o5tkTj6vzrqpOyX6mXAYS3GOYlDRMkMY4tcPxzOzvOc,780
|
|
18
18
|
karrio/server/events/migrations/0008_alter_event_type.py,sha256=DhUAI-yG_ugEv4f9oigdhn1lH_6A2nV8GyS-N63cmdQ,397
|
|
19
19
|
karrio/server/events/migrations/0009_alter_webhook_enabled_events.py,sha256=0bhn3Ab_4cW2Zjptw7yfKJT1iTnsrBl_7goCCquNzcQ,1825
|
|
20
|
+
karrio/server/events/migrations/0010_event_event_created_at_idx.py,sha256=9vLPYVIId5Ni4W_EnmaCfL-F29YzoQ070963D3q6KgA,498
|
|
20
21
|
karrio/server/events/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
22
|
karrio/server/events/serializers/__init__.py,sha256=S5KJONM1VFbB_Wyl__F2YbdSV7R_5RPNFos0ERkfDko,52
|
|
22
23
|
karrio/server/events/serializers/base.py,sha256=Civqqod7X2u8wUfQpx7NejFpQfqQD8UWjztSOX4iWzg,2158
|
|
@@ -24,7 +25,7 @@ karrio/server/events/serializers/event.py,sha256=dKYqldfSEjKMY7uB1rBFfEfSZ_dfEp8
|
|
|
24
25
|
karrio/server/events/serializers/webhook.py,sha256=Ri5JS1SXpSsPUvQH989T_7Amu1p46y5TP54MEEhK8j8,889
|
|
25
26
|
karrio/server/events/task_definitions/__init__.py,sha256=bpT73UG7mZL_JjEqMwbYx6q69jA8J5Jcoul1LcDokhA,81
|
|
26
27
|
karrio/server/events/task_definitions/base/__init__.py,sha256=3vP52gFdCo9hctLRKnYvEi9iz1UK8GL_a47Nw44h3Nc,1834
|
|
27
|
-
karrio/server/events/task_definitions/base/archiving.py,sha256=
|
|
28
|
+
karrio/server/events/task_definitions/base/archiving.py,sha256=MtQoW5y4TwoFphg96hXrz_3wBoKxrmI5yQRiHm98pL4,6987
|
|
28
29
|
karrio/server/events/task_definitions/base/tracking.py,sha256=UL7-z1nVp3Scz-Nm6xuJB8S6obfaiHd-IyBXXIcrwOo,8533
|
|
29
30
|
karrio/server/events/task_definitions/base/webhook.py,sha256=NgXMJw_55pwZ5z4bu49VUekFNkUJ_cwvs01PNnLxhI4,3506
|
|
30
31
|
karrio/server/events/tests/__init__.py,sha256=5szv9hDvu0R0jtm3XWktY19rCaE8bZ2LdjRm4oJ0pYA,220
|
|
@@ -38,7 +39,7 @@ karrio/server/graph/schemas/events/__init__.py,sha256=Yg1rWew5DgSb_OnLy8n7qqwPLf
|
|
|
38
39
|
karrio/server/graph/schemas/events/inputs.py,sha256=Mgy9qCUrbL-sMI5dNXsnbW8K5_PnGKM13brzZrc5OWk,1526
|
|
39
40
|
karrio/server/graph/schemas/events/mutations.py,sha256=930g2D5TnAEgEjfEfLml1Q9OGCyxe2D592BhzSGDQAQ,1862
|
|
40
41
|
karrio/server/graph/schemas/events/types.py,sha256=TPlrDwQV4LZXu-1t4gFl_eYayU39THmgYT3uv7VXnnw,2759
|
|
41
|
-
karrio_server_events-2025.
|
|
42
|
-
karrio_server_events-2025.
|
|
43
|
-
karrio_server_events-2025.
|
|
44
|
-
karrio_server_events-2025.
|
|
42
|
+
karrio_server_events-2025.5rc17.dist-info/METADATA,sha256=aOk6AOFvrGnJ0XbpjSTtZblpifv0cZchGzb-cr6nl60,705
|
|
43
|
+
karrio_server_events-2025.5rc17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
44
|
+
karrio_server_events-2025.5rc17.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
|
|
45
|
+
karrio_server_events-2025.5rc17.dist-info/RECORD,,
|
{karrio_server_events-2025.5rc16.dist-info → karrio_server_events-2025.5rc17.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|