Skip to content

Commit 2c9d4a8

Browse files
committed
LITE-23778 Fixed serialization of DT / UUID instance_pk
* Introduced resusable func: `get_json_valid_value`
1 parent e55c8e1 commit 2c9d4a8

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

dj_cqrs/dataclasses.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from dateutil.parser import parse as dateutil_parse
44

55
from dj_cqrs.correlation import get_correlation_id
6-
from dj_cqrs.utils import get_message_expiration_dt
6+
from dj_cqrs.utils import get_json_valid_value, get_message_expiration_dt
77

88
from django.utils import timezone
99

@@ -152,8 +152,8 @@ def to_dict(self):
152152
'cqrs_id': self.__cqrs_id,
153153
'instance_data': self.__instance_data,
154154
'previous_data': self.__previous_data,
155-
'instance_pk': self.__instance_pk,
156-
'correlation_id': self.__correlation_id,
155+
'instance_pk': get_json_valid_value(self.__instance_pk),
156+
'correlation_id': get_json_valid_value(self.__correlation_id),
157157
'retries': self.__retries,
158158
'expires': expires,
159159
'meta': self.__meta,

dj_cqrs/tracker.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# Copyright © 2022 Ingram Micro Inc. All rights reserved.
22

3-
from datetime import date, datetime
4-
53
from dj_cqrs.constants import ALL_BASIC_FIELDS, FIELDS_TRACKER_FIELD_NAME
4+
from dj_cqrs.utils import get_json_valid_value
65

76
from model_utils import FieldTracker
87
from model_utils.tracker import FieldInstanceTracker
@@ -30,10 +29,7 @@ def changed_initial(self):
3029
def get_field_value(self, field):
3130
value = super().get_field_value(field)
3231

33-
if isinstance(value, (date, datetime)):
34-
value = str(value)
35-
36-
return value
32+
return get_json_valid_value(value)
3733

3834

3935
class CQRSTracker(FieldTracker):

dj_cqrs/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Copyright © 2022 Ingram Micro Inc. All rights reserved.
22

33
import logging
4-
from datetime import timedelta
4+
from datetime import date, datetime, timedelta
5+
from uuid import UUID
56

67
from django.conf import settings
78
from django.utils import timezone
@@ -49,3 +50,7 @@ def get_messages_prefetch_count_per_worker():
4950
return 0
5051

5152
return delay_queue_max_size + 1
53+
54+
55+
def get_json_valid_value(value):
56+
return str(value) if isinstance(value, (date, datetime, UUID)) else value

tests/test_utils.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
# Copyright © 2022 Ingram Micro Inc. All rights reserved.
22

3-
from datetime import datetime, timedelta, timezone
3+
from datetime import date, datetime, timedelta, timezone
4+
from uuid import UUID
5+
6+
import pytest
47

58
from dj_cqrs.utils import (
6-
get_delay_queue_max_size, get_message_expiration_dt, get_messages_prefetch_count_per_worker,
9+
get_delay_queue_max_size,
10+
get_json_valid_value,
11+
get_message_expiration_dt,
12+
get_messages_prefetch_count_per_worker,
713
)
814

915

@@ -60,3 +66,15 @@ def test_get_messaged_prefetch_count_per_worker_with_delay_queue(settings):
6066
settings.CQRS['replica']['delay_queue_max_size'] = 4
6167

6268
assert get_messages_prefetch_count_per_worker() == 5
69+
70+
71+
@pytest.mark.parametrize('value,result', (
72+
(None, None),
73+
(1, 1),
74+
(datetime(2022, 1, 1, second=0, tzinfo=timezone.utc), '2022-01-01 00:00:00+00:00'),
75+
(date(2022, 2, 1), '2022-02-01'),
76+
(UUID('0419d87b-d477-44e4-82c4-310f56faa3c7'), '0419d87b-d477-44e4-82c4-310f56faa3c7'),
77+
('abc', 'abc'),
78+
))
79+
def test_get_json_valid_value(value, result):
80+
assert get_json_valid_value(value) == result

0 commit comments

Comments
 (0)