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.
@@ -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
+ ]
@@ -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
- shipping_data = manager.Shipment.objects.filter(created_at__lt=shipment_retention)
28
- tracking_Data = manager.Tracking.objects.filter(created_at__lt=tracker_retention)
29
- tracing_data = tracing.TracingRecord.objects.filter(created_at__lt=log_retention)
30
- api_log_data = core.APILog.objects.filter(requested_at__lt=log_retention)
31
- order_data = orders.Order.objects.filter(created_at__lt=order_retention)
32
- event_data = events.Event.objects.filter(created_at__lt=log_retention)
33
-
34
- if any(tracing_data):
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
- utils.failsafe(lambda: tracing_data.delete())
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 any(event_data):
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 any(api_log_data):
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 any(tracking_Data):
53
+ if tracking_exists:
47
54
  logger.info(">> archiving tracking data backlog...")
48
- utils.failsafe(lambda: tracking_Data.delete())
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 any(shipping_data):
58
+ if shipping_exists:
51
59
  logger.info(">> archiving shipping data backlog...")
52
- utils.failsafe(lambda: shipping_data.delete())
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 any(order_data):
63
+ if order_exists:
55
64
  logger.info(">> archiving order data backlog...")
56
- utils.failsafe(lambda: order_data.delete())
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
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karrio_server_events
3
- Version: 2025.5rc16
3
+ Version: 2025.5rc17
4
4
  Summary: Multi-carrier shipping API Events module
5
5
  Author-email: karrio <hello@karrio.io>
6
6
  License-Expression: Apache-2.0
@@ -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=Ze4ITStRy_eb7qtujYbq7IISxvo7V2SKcmdCQ4fQO2I,2439
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=flbcxmD1pKlzCrYvekbwJ7Dvz4TaLdudAAsWH8JAjzI,2257
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.5rc16.dist-info/METADATA,sha256=22gin3KztbVtme9fD8Z7hiHw2xJhS25zTK6md7volYc,705
42
- karrio_server_events-2025.5rc16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
- karrio_server_events-2025.5rc16.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
44
- karrio_server_events-2025.5rc16.dist-info/RECORD,,
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,,