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.
- karrio/server/data/__init__.py +0 -0
- karrio/server/data/admin.py +1 -0
- karrio/server/data/apps.py +13 -0
- karrio/server/data/filters.py +43 -0
- karrio/server/data/migrations/0001_initial.py +62 -0
- karrio/server/data/migrations/0002_alter_batchoperation_resource_type_and_more.py +28 -0
- karrio/server/data/migrations/0003_datatemplate_metadata_alter_batchoperation_resources.py +36 -0
- karrio/server/data/migrations/__init__.py +0 -0
- karrio/server/data/models.py +97 -0
- karrio/server/data/resources/__init__.py +53 -0
- karrio/server/data/resources/orders.py +523 -0
- karrio/server/data/resources/shipments.py +473 -0
- karrio/server/data/resources/trackers.py +212 -0
- karrio/server/data/serializers/__init__.py +26 -0
- karrio/server/data/serializers/base.py +107 -0
- karrio/server/data/serializers/batch.py +9 -0
- karrio/server/data/serializers/batch_orders.py +99 -0
- karrio/server/data/serializers/batch_shipments.py +102 -0
- karrio/server/data/serializers/batch_trackers.py +131 -0
- karrio/server/data/serializers/data.py +109 -0
- karrio/server/data/signals.py +52 -0
- karrio/server/data/tests.py +3 -0
- karrio/server/data/urls.py +13 -0
- karrio/server/data/views/__init__.py +0 -0
- karrio/server/data/views/batch.py +72 -0
- karrio/server/data/views/batch_order.py +40 -0
- karrio/server/data/views/batch_shipment.py +40 -0
- karrio/server/data/views/batch_tracking.py +40 -0
- karrio/server/data/views/data.py +171 -0
- karrio/server/events/task_definitions/__init__.py +1 -0
- karrio/server/events/task_definitions/data/__init__.py +136 -0
- karrio/server/events/task_definitions/data/batch.py +130 -0
- karrio/server/events/task_definitions/data/shipments.py +51 -0
- karrio/server/graph/schemas/__init__.py +1 -0
- karrio/server/graph/schemas/data/__init__.py +51 -0
- karrio/server/graph/schemas/data/inputs.py +39 -0
- karrio/server/graph/schemas/data/mutations.py +53 -0
- karrio/server/graph/schemas/data/types.py +78 -0
- karrio/server/settings/data.py +15 -0
- karrio_server_data-2025.5rc1.dist-info/METADATA +18 -0
- karrio_server_data-2025.5rc1.dist-info/RECORD +43 -0
- karrio_server_data-2025.5rc1.dist-info/WHEEL +5 -0
- 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")
|