Skip to content

Commit 234daf0

Browse files
committed
✨ [#472] support commas in values for 'data_attrs' query param
1 parent efd240d commit 234daf0

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

src/objects/api/v2/filters.py

+5
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,14 @@ class Meta:
9292
form = ObjectRecordFilterForm
9393

9494
def filter_data_attrs(self, queryset, name, value: str):
95+
# temporarily replace escaped comma
96+
comma_replace = "*COMMA*"
97+
value = value.replace("\\,", comma_replace)
9598
parts = value.split(",")
9699

97100
for value_part in parts:
101+
# replace to comma back after splitting
102+
value_part = value_part.replace(comma_replace, ",")
98103
variable, operator, str_value = value_part.rsplit("__", 2)
99104
real_value = string_to_value(str_value)
100105

src/objects/api/validators.py

+7
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,16 @@ def __call__(self, new_value, serializer_field):
7070

7171
def validate_data_attrs(value: str):
7272
code = "invalid-data-attrs-query"
73+
74+
# temporarily replace escaped comma
75+
comma_replace = "*COMMA*"
76+
value = value.replace("\\,", comma_replace)
77+
7378
parts = value.split(",")
7479

7580
for value_part in parts:
81+
# replace to comma back after splitting
82+
value_part = value_part.replace(comma_replace, ",")
7683
try:
7784
variable, operator, val = value_part.rsplit("__", 2)
7885
except ValueError as exc:

src/objects/tests/v2/test_filters.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -363,17 +363,16 @@ def test_filter_icontains_string_with_comma(self):
363363
"""
364364
regression test for https://github.com/maykinmedia/objects-api/issues/472
365365
"""
366-
record = ObjectRecordFactory.create(
366+
ObjectRecordFactory.create(
367367
data={"name": "Something important"}, object__object_type=self.object_type
368368
)
369-
ObjectRecordFactory.create(
369+
record = ObjectRecordFactory.create(
370370
data={"name": "Advies, support en kennis om te weten"},
371371
object__object_type=self.object_type,
372372
)
373-
ObjectRecordFactory.create(data={}, object__object_type=self.object_type)
374373

375374
response = self.client.get(
376-
self.url, {"data_attrs": "name__icontains__Advies, support en kennis"}
375+
self.url, {"data_attrs": "name__icontains__Advies\\, support en kennis"}
377376
)
378377

379378
self.assertEqual(response.status_code, status.HTTP_200_OK)
@@ -390,19 +389,18 @@ def test_filter_two_icontains_with_comma(self):
390389
"""
391390
regression test for https://github.com/maykinmedia/objects-api/issues/472
392391
"""
393-
record = ObjectRecordFactory.create(
392+
ObjectRecordFactory.create(
394393
data={"name": "Something important"}, object__object_type=self.object_type
395394
)
396-
ObjectRecordFactory.create(
395+
record = ObjectRecordFactory.create(
397396
data={"name": "Advies, support en kennis om te weten"},
398397
object__object_type=self.object_type,
399398
)
400-
ObjectRecordFactory.create(data={}, object__object_type=self.object_type)
401399

402400
response = self.client.get(
403401
self.url,
404402
{
405-
"data_attrs": "name__icontains__Advies, support en kennis,name__icontains__om"
403+
"data_attrs": "name__icontains__Advies\\, support en kennis,name__icontains__om"
406404
},
407405
)
408406

0 commit comments

Comments
 (0)