From c181fcd95f99271b34f2e2983e617bd202e97376 Mon Sep 17 00:00:00 2001 From: Irvin Zhan Date: Fri, 17 Jul 2015 18:50:12 -0700 Subject: [PATCH] escape semicolons when serializing aggregated activities --- .../serializers/aggregated_activity_serializer.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/stream_framework/serializers/aggregated_activity_serializer.py b/stream_framework/serializers/aggregated_activity_serializer.py index b4aa22e7..942e2acb 100644 --- a/stream_framework/serializers/aggregated_activity_serializer.py +++ b/stream_framework/serializers/aggregated_activity_serializer.py @@ -5,6 +5,7 @@ from stream_framework.utils import epoch_to_datetime, datetime_to_epoch from stream_framework.serializers.base import BaseAggregatedSerializer import six +import re class AggregatedActivitySerializer(BaseAggregatedSerializer): @@ -23,7 +24,6 @@ class AggregatedActivitySerializer(BaseAggregatedSerializer): #: indicates if dumps returns dehydrated aggregated activities dehydrate = True identifier = 'v3' - reserved_characters = [';', ',', ';;'] date_fields = ['created_at', 'updated_at', 'seen_at', 'read_at'] activity_serializer_class = ActivitySerializer @@ -55,7 +55,8 @@ def dumps(self, aggregated): else: for activity in aggregated.activities: serialized = activity_serializer.dumps(activity) - check_reserved(serialized, [';', ';;']) + # we use semicolons as delimiter, so need to escape + serialized = serialized.replace(";", "\;") serialized_activities.append(serialized) serialized_activities_part = ';'.join(serialized_activities) @@ -86,8 +87,10 @@ def loads(self, serialized_aggregated): date_value = epoch_to_datetime(float(v)) setattr(aggregated, k, date_value) + # looks for ; not \; + unescaped_semicolons_regex = re.compile("(?<=[^\\\]);") # write the activities - serializations = parts[5].split(';') + serializations = unescaped_semicolons_regex.split(parts[5]) if self.dehydrate: activity_ids = list(map(int, serializations)) aggregated._activity_ids = activity_ids