5
5
from stream_framework .utils import epoch_to_datetime , datetime_to_epoch
6
6
from stream_framework .serializers .base import BaseAggregatedSerializer
7
7
import six
8
+ import re
8
9
9
10
10
11
class AggregatedActivitySerializer (BaseAggregatedSerializer ):
@@ -23,7 +24,6 @@ class AggregatedActivitySerializer(BaseAggregatedSerializer):
23
24
#: indicates if dumps returns dehydrated aggregated activities
24
25
dehydrate = True
25
26
identifier = 'v3'
26
- reserved_characters = [';' , ',' , ';;' ]
27
27
date_fields = ['created_at' , 'updated_at' , 'seen_at' , 'read_at' ]
28
28
29
29
activity_serializer_class = ActivitySerializer
@@ -55,7 +55,8 @@ def dumps(self, aggregated):
55
55
else :
56
56
for activity in aggregated .activities :
57
57
serialized = activity_serializer .dumps (activity )
58
- check_reserved (serialized , [';' , ';;' ])
58
+ # we use semicolons as delimiter, so need to escape
59
+ serialized = serialized .replace (";" , "\;" )
59
60
serialized_activities .append (serialized )
60
61
61
62
serialized_activities_part = ';' .join (serialized_activities )
@@ -86,8 +87,10 @@ def loads(self, serialized_aggregated):
86
87
date_value = epoch_to_datetime (float (v ))
87
88
setattr (aggregated , k , date_value )
88
89
90
+ # looks for ; not \;
91
+ unescaped_semicolons_regex = re .compile ("(?<=[^\\ \]);" )
89
92
# write the activities
90
- serializations = parts [5 ]. split ( ';' )
93
+ serializations = unescaped_semicolons_regex . split ( parts [5 ])
91
94
if self .dehydrate :
92
95
activity_ids = list (map (int , serializations ))
93
96
aggregated ._activity_ids = activity_ids
0 commit comments