Skip to content

Commit 32fc04f

Browse files
committed
add possibility to specify queryset by filters
1 parent 2d34bb7 commit 32fc04f

3 files changed

Lines changed: 34 additions & 13 deletions

File tree

import_export_celery/admin_actions.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from django.utils import timezone
2-
import json
32
from uuid import UUID
43

54
from django.utils.translation import gettext_lazy as _
@@ -45,12 +44,10 @@ def create_export_job_action(modeladmin, request, queryset):
4544
ej = ExportJob.objects.create(
4645
app_label=arbitrary_obj._meta.app_label,
4746
model=arbitrary_obj._meta.model_name,
48-
queryset=json.dumps(
49-
[
50-
str(obj.pk) if isinstance(obj.pk, UUID) else obj.pk
51-
for obj in queryset
52-
]
53-
),
47+
queryset=[
48+
str(obj.pk) if isinstance(obj.pk, UUID) else obj.pk
49+
for obj in queryset
50+
],
5451
site_of_origin=request.scheme + "://" + request.get_host(),
5552
)
5653
rurl = reverse(
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 5.0.7 on 2024-07-29 12:21
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("import_export_celery", "0010_auto_20231013_0904"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="exportjob",
15+
name="queryset",
16+
field=models.JSONField(
17+
verbose_name="JSON list of pks to export or dict of queryset filters"
18+
),
19+
),
20+
]

import_export_celery/models/exportjob.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright (C) 2019 o.s. Auto*Mat
22
from django.utils import timezone
3-
import json
43

54
from author.decorators import with_author
65

@@ -67,8 +66,8 @@ def __init__(self, *args, **kwargs):
6766
default="",
6867
)
6968

70-
queryset = models.TextField(
71-
verbose_name=_("JSON list of pks to export"),
69+
queryset = models.JSONField(
70+
verbose_name=_("JSON list of pks to export or dict of queryset filters"),
7271
null=False,
7372
)
7473

@@ -104,14 +103,19 @@ def get_content_type(self):
104103
return self._content_type
105104

106105
def get_queryset(self):
107-
pks = json.loads(self.queryset)
106+
queryset_spec = self.queryset
107+
if isinstance(queryset_spec, list):
108+
filters = {"pk__in": queryset_spec}
109+
elif isinstance(queryset_spec, dict):
110+
filters = queryset_spec
111+
108112
# If customised queryset for the model exists
109113
# then it'll apply filter on that otherwise it'll
110114
# apply filter directly on the model.
111115
resource_class = self.get_resource_class()
112116
if hasattr(resource_class, "get_export_queryset"):
113-
return resource_class().get_export_queryset().filter(pk__in=pks)
114-
return self.get_content_type().model_class().objects.filter(pk__in=pks)
117+
return resource_class().get_export_queryset().filter(**filters)
118+
return self.get_content_type().model_class().objects.filter(**filters)
115119

116120
def get_resource_choices(self):
117121
return [

0 commit comments

Comments
 (0)