karrio-server-data 2025.5rc1__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.
Files changed (43) hide show
  1. karrio/server/data/__init__.py +0 -0
  2. karrio/server/data/admin.py +1 -0
  3. karrio/server/data/apps.py +13 -0
  4. karrio/server/data/filters.py +43 -0
  5. karrio/server/data/migrations/0001_initial.py +62 -0
  6. karrio/server/data/migrations/0002_alter_batchoperation_resource_type_and_more.py +28 -0
  7. karrio/server/data/migrations/0003_datatemplate_metadata_alter_batchoperation_resources.py +36 -0
  8. karrio/server/data/migrations/__init__.py +0 -0
  9. karrio/server/data/models.py +97 -0
  10. karrio/server/data/resources/__init__.py +53 -0
  11. karrio/server/data/resources/orders.py +523 -0
  12. karrio/server/data/resources/shipments.py +473 -0
  13. karrio/server/data/resources/trackers.py +212 -0
  14. karrio/server/data/serializers/__init__.py +26 -0
  15. karrio/server/data/serializers/base.py +107 -0
  16. karrio/server/data/serializers/batch.py +9 -0
  17. karrio/server/data/serializers/batch_orders.py +99 -0
  18. karrio/server/data/serializers/batch_shipments.py +102 -0
  19. karrio/server/data/serializers/batch_trackers.py +131 -0
  20. karrio/server/data/serializers/data.py +109 -0
  21. karrio/server/data/signals.py +52 -0
  22. karrio/server/data/tests.py +3 -0
  23. karrio/server/data/urls.py +13 -0
  24. karrio/server/data/views/__init__.py +0 -0
  25. karrio/server/data/views/batch.py +72 -0
  26. karrio/server/data/views/batch_order.py +40 -0
  27. karrio/server/data/views/batch_shipment.py +40 -0
  28. karrio/server/data/views/batch_tracking.py +40 -0
  29. karrio/server/data/views/data.py +171 -0
  30. karrio/server/events/task_definitions/__init__.py +1 -0
  31. karrio/server/events/task_definitions/data/__init__.py +136 -0
  32. karrio/server/events/task_definitions/data/batch.py +130 -0
  33. karrio/server/events/task_definitions/data/shipments.py +51 -0
  34. karrio/server/graph/schemas/__init__.py +1 -0
  35. karrio/server/graph/schemas/data/__init__.py +51 -0
  36. karrio/server/graph/schemas/data/inputs.py +39 -0
  37. karrio/server/graph/schemas/data/mutations.py +53 -0
  38. karrio/server/graph/schemas/data/types.py +78 -0
  39. karrio/server/settings/data.py +15 -0
  40. karrio_server_data-2025.5rc1.dist-info/METADATA +18 -0
  41. karrio_server_data-2025.5rc1.dist-info/RECORD +43 -0
  42. karrio_server_data-2025.5rc1.dist-info/WHEEL +5 -0
  43. karrio_server_data-2025.5rc1.dist-info/top_level.txt +2 -0
File without changes
@@ -0,0 +1 @@
1
+ from django.contrib import admin
@@ -0,0 +1,13 @@
1
+ from django.apps import AppConfig
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+
5
+ class DataConfig(AppConfig):
6
+ name = "karrio.server.data"
7
+ verbose_name = _("Import/Export")
8
+ default_auto_field = "django.db.models.BigAutoField"
9
+
10
+ def ready(self):
11
+ from karrio.server.data import signals
12
+
13
+ signals.register_all()
@@ -0,0 +1,43 @@
1
+ import karrio.server.filters as filters
2
+ import karrio.server.data.models as models
3
+ import karrio.server.data.serializers as serializers
4
+
5
+
6
+ class DataTemplateFilter(filters.FilterSet):
7
+ name = filters.CharFilter(field_name="name", lookup_expr="icontains")
8
+ slug = filters.CharFilter(field_name="slug", lookup_expr="icontains")
9
+ resource_type = filters.MultipleChoiceFilter(
10
+ field_name="resource_type",
11
+ choices=[(c.value, c.value) for c in list(serializers.ResourceType)],
12
+ help_text=f"""
13
+ the data template resource type
14
+ Values: {', '.join([f"`{s.name}`" for s in list(serializers.ResourceType)])}
15
+ """,
16
+ )
17
+
18
+ class Meta:
19
+ model = models.DataTemplate
20
+ fields: list = []
21
+
22
+
23
+ class BatchOperationFilter(filters.FilterSet):
24
+ resource_type = filters.MultipleChoiceFilter(
25
+ field_name="resource_type",
26
+ choices=[(c.value, c.value) for c in list(serializers.ResourceType)],
27
+ help_text=f"""
28
+ the batch resource type
29
+ Values: {', '.join([f"`{s.name}`" for s in list(serializers.ResourceType)])}
30
+ """,
31
+ )
32
+ status = filters.MultipleChoiceFilter(
33
+ field_name="status",
34
+ choices=[(c.value, c.value) for c in list(serializers.BatchOperationStatus)],
35
+ help_text=f"""
36
+ the batch operation status
37
+ Values: {', '.join([f"`{s.name}`" for s in list(serializers.BatchOperationStatus)])}
38
+ """,
39
+ )
40
+
41
+ class Meta:
42
+ model = models.BatchOperation
43
+ fields: list = []
@@ -0,0 +1,62 @@
1
+ # Generated by Django 3.2.13 on 2022-07-05 20:23
2
+
3
+ from django.conf import settings
4
+ import django.core.validators
5
+ from django.db import migrations, models
6
+ import django.db.models.deletion
7
+ import functools
8
+ import karrio.server.core.models.base
9
+ import karrio.server.core.utils
10
+
11
+
12
+ class Migration(migrations.Migration):
13
+
14
+ initial = True
15
+
16
+ dependencies = [
17
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
18
+ ]
19
+
20
+ operations = [
21
+ migrations.CreateModel(
22
+ name='BatchOperation',
23
+ fields=[
24
+ ('created_at', models.DateTimeField(auto_now_add=True)),
25
+ ('updated_at', models.DateTimeField(auto_now=True)),
26
+ ('id', models.CharField(default=functools.partial(karrio.server.core.models.base.uuid, *(), **{'prefix': 'batch_'}), editable=False, max_length=50, primary_key=True, serialize=False)),
27
+ ('status', models.CharField(choices=[('queued', 'queued'), ('running', 'running'), ('completed', 'completed'), ('failed', 'failed')], default='queued', max_length=25)),
28
+ ('resource_type', models.CharField(choices=[('order', 'order'), ('shipment', 'shipment'), ('tracking', 'tracking'), ('billing', 'billing')], default='order', max_length=25)),
29
+ ('resources', models.JSONField(blank=True, default=functools.partial(karrio.server.core.utils.identity, *(), **{'value': []}), null=True)),
30
+ ('test_mode', models.BooleanField()),
31
+ ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
32
+ ],
33
+ options={
34
+ 'verbose_name': 'Batch Operation',
35
+ 'verbose_name_plural': 'Batch Operations',
36
+ 'db_table': 'batch-operation',
37
+ 'ordering': ['-created_at'],
38
+ },
39
+ bases=(karrio.server.core.models.base.ControlledAccessModel, models.Model),
40
+ ),
41
+ migrations.CreateModel(
42
+ name='DataTemplate',
43
+ fields=[
44
+ ('created_at', models.DateTimeField(auto_now_add=True)),
45
+ ('updated_at', models.DateTimeField(auto_now=True)),
46
+ ('id', models.CharField(default=functools.partial(karrio.server.core.models.base.uuid, *(), **{'prefix': 'data_'}), editable=False, max_length=50, primary_key=True, serialize=False)),
47
+ ('name', models.CharField(max_length=50)),
48
+ ('slug', models.SlugField(max_length=25, validators=[django.core.validators.RegexValidator('^[a-z0-9_]+$')])),
49
+ ('description', models.CharField(blank=True, max_length=50, null=True)),
50
+ ('resource_type', models.CharField(choices=[('order', 'order'), ('shipment', 'shipment'), ('tracking', 'tracking'), ('billing', 'billing')], max_length=25)),
51
+ ('fields_mapping', models.JSONField(default=functools.partial(karrio.server.core.utils.identity, *(), **{'value': {}}), help_text="\n The fields is a mapping of key value pairs linking the resource type's\n data field (key) to header used for import/export.\n\n e.g: resource: tracking | fields [{'id': 'ID', 'tracking_number': 'Tracking Number'}]\n ")),
52
+ ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
53
+ ],
54
+ options={
55
+ 'verbose_name': 'Data Template',
56
+ 'verbose_name_plural': 'Data Templates',
57
+ 'db_table': 'data-template',
58
+ 'ordering': ['-created_at'],
59
+ },
60
+ bases=(karrio.server.core.models.base.ControlledAccessModel, models.Model),
61
+ ),
62
+ ]
@@ -0,0 +1,28 @@
1
+ # Generated by Django 4.1.3 on 2022-11-25 17:09
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('data', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='batchoperation',
15
+ name='resource_type',
16
+ field=models.CharField(choices=[('orders', 'orders'), ('shipments', 'shipments'), ('trackers', 'trackers'), ('billing', 'billing')], default='orders', max_length=25),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='batchoperation',
20
+ name='status',
21
+ field=models.CharField(choices=[('queued', 'queued'), ('running', 'running'), ('failed', 'failed'), ('completed', 'completed'), ('completed_with_errors', 'completed_with_errors')], default='queued', max_length=25),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='datatemplate',
25
+ name='resource_type',
26
+ field=models.CharField(choices=[('orders', 'orders'), ('shipments', 'shipments'), ('trackers', 'trackers'), ('billing', 'billing')], max_length=25),
27
+ ),
28
+ ]
@@ -0,0 +1,36 @@
1
+ # Generated by Django 4.1.7 on 2023-02-22 15:35
2
+
3
+ from django.db import migrations, models
4
+ import functools
5
+ import karrio.server.core.models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+ dependencies = [
10
+ ("data", "0002_alter_batchoperation_resource_type_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="datatemplate",
16
+ name="metadata",
17
+ field=models.JSONField(
18
+ blank=True,
19
+ default=functools.partial(
20
+ karrio.server.core.models._identity, *(), **{"value": {}}
21
+ ),
22
+ null=True,
23
+ ),
24
+ ),
25
+ migrations.AlterField(
26
+ model_name="batchoperation",
27
+ name="resources",
28
+ field=models.JSONField(
29
+ blank=True,
30
+ default=functools.partial(
31
+ karrio.server.core.models._identity, *(), **{"value": []}
32
+ ),
33
+ null=True,
34
+ ),
35
+ ),
36
+ ]
File without changes
@@ -0,0 +1,97 @@
1
+ from functools import partial
2
+ from django.db import models
3
+ from django.core.validators import RegexValidator
4
+
5
+ import karrio.server.core.utils as utils
6
+ import karrio.server.core.models as core
7
+ import karrio.server.data.serializers as serializers
8
+
9
+
10
+ @core.register_model
11
+ class BatchOperation(core.OwnedEntity):
12
+ class Meta:
13
+ db_table = "batch-operation"
14
+ verbose_name = "Batch Operation"
15
+ verbose_name_plural = "Batch Operations"
16
+ ordering = ["-created_at"]
17
+
18
+ id = models.CharField(
19
+ max_length=50,
20
+ primary_key=True,
21
+ default=partial(core.uuid, prefix="batch_"),
22
+ editable=False,
23
+ )
24
+
25
+ status = models.CharField(
26
+ max_length=25,
27
+ choices=serializers.OPERATION_STATUS,
28
+ default=serializers.OPERATION_STATUS[0][0],
29
+ )
30
+ resource_type = models.CharField(
31
+ max_length=25,
32
+ choices=serializers.RESOURCE_TYPE,
33
+ default=serializers.RESOURCE_TYPE[0][0],
34
+ )
35
+ resources = models.JSONField(
36
+ blank=True,
37
+ null=True,
38
+ default=core.field_default([]),
39
+ )
40
+ test_mode = models.BooleanField(null=False)
41
+
42
+ @property
43
+ def object_type(self):
44
+ return "batch"
45
+
46
+
47
+ @core.register_model
48
+ class DataTemplate(core.OwnedEntity):
49
+ class Meta:
50
+ db_table = "data-template"
51
+ verbose_name = "Data Template"
52
+ verbose_name_plural = "Data Templates"
53
+ ordering = ["-created_at"]
54
+
55
+ id = models.CharField(
56
+ max_length=50,
57
+ primary_key=True,
58
+ default=partial(core.uuid, prefix="data_"),
59
+ editable=False,
60
+ )
61
+ name = models.CharField(max_length=50)
62
+ slug = models.SlugField(max_length=25, validators=[RegexValidator(r"^[a-z0-9_]+$")])
63
+ description = models.CharField(max_length=50, null=True, blank=True)
64
+ resource_type = models.CharField(
65
+ max_length=25, blank=False, null=False, choices=serializers.RESOURCE_TYPE
66
+ )
67
+ fields_mapping = models.JSONField(
68
+ blank=False,
69
+ null=False,
70
+ default=partial(utils.identity, value={}),
71
+ help_text="""
72
+ The fields is a mapping of key value pairs linking the resource type's
73
+ data field (key) to header used for import/export.
74
+
75
+ e.g: resource: tracking | fields [{'id': 'ID', 'tracking_number': 'Tracking Number'}]
76
+ """,
77
+ )
78
+ metadata = models.JSONField(
79
+ blank=True,
80
+ null=True,
81
+ default=core.field_default({}),
82
+ )
83
+
84
+ @property
85
+ def object_type(self):
86
+ return "data_template"
87
+
88
+ @property
89
+ def data_fields(self):
90
+ default_fields_mapping = serializers.ResourceType.get_default_mapping(
91
+ self.resource_type
92
+ )
93
+
94
+ return {
95
+ **default_fields_mapping,
96
+ **self.fields_mapping,
97
+ }
@@ -0,0 +1,53 @@
1
+ from django.contrib.auth import get_user_model
2
+ from import_export import resources
3
+
4
+ import karrio.server.data.resources.shipments as shipments
5
+ import karrio.server.data.resources.orders as orders
6
+ import karrio.server.data.resources.trackers as trackers
7
+ import karrio.server.data.models as models
8
+
9
+ User = get_user_model()
10
+
11
+
12
+ def export(
13
+ resource_type: str, query_params: dict, context, data_fields: dict = None
14
+ ) -> dict:
15
+ """Generate a file to export."""
16
+
17
+ resource = get_export_resource(
18
+ resource_type, query_params, context, data_fields=data_fields
19
+ )
20
+
21
+ return resource.export()
22
+
23
+
24
+ def get_export_resource(
25
+ resource_type: str, params: dict, context, data_fields: dict = None
26
+ ) -> resources.ModelResource:
27
+
28
+ if resource_type == "orders":
29
+ return orders.order_export_resource(params, context, data_fields=data_fields)
30
+
31
+ if resource_type == "trackers":
32
+ return trackers.tracker_export_resource(params, context, data_fields=data_fields)
33
+
34
+ if resource_type == "shipments":
35
+ return shipments.shipment_export_resource(params, context, data_fields=data_fields)
36
+
37
+ raise Exception("Unsupported resource")
38
+
39
+
40
+ def get_import_resource(
41
+ resource_type: str, params: dict, context, data_fields: dict = None, **kwargs
42
+ ) -> resources.ModelResource:
43
+
44
+ if resource_type == "orders":
45
+ return orders.order_import_resource(params, context, data_fields=data_fields, **kwargs)
46
+
47
+ if resource_type == "trackers":
48
+ return trackers.tracker_import_resource(params, context, data_fields=data_fields, **kwargs)
49
+
50
+ if resource_type == "shipments":
51
+ return shipments.shipment_import_resource(params, context, data_fields=data_fields, **kwargs)
52
+
53
+ raise Exception("Unsupported resource")