@ -425,6 +425,33 @@ class EventClientSerializer:
return serialized_event
def _apply_edit (
self , orig_event : EventBase , serialized_event : JsonDict , edit : EventBase
) - > None :
""" Replace the content, preserving existing relations of the serialized event.
Args :
orig_event : The original event .
serialized_event : The original event , serialized . This is modified .
edit : The event which edits the above .
"""
# Ensure we take copies of the edit content, otherwise we risk modifying
# the original event.
edit_content = edit . content . copy ( )
# Unfreeze the event content if necessary, so that we may modify it below
edit_content = unfreeze ( edit_content )
serialized_event [ " content " ] = edit_content . get ( " m.new_content " , { } )
# Check for existing relations
relates_to = orig_event . content . get ( " m.relates_to " )
if relates_to :
# Keep the relations, ensuring we use a dict copy of the original
serialized_event [ " content " ] [ " m.relates_to " ] = relates_to . copy ( )
else :
serialized_event [ " content " ] . pop ( " m.relates_to " , None )
def _inject_bundled_aggregations (
self ,
event : EventBase ,
@ -450,26 +477,11 @@ class EventClientSerializer:
serialized_aggregations [ RelationTypes . REFERENCE ] = aggregations . references
if aggregations . replace :
# If there is an edit replace the content, preserving existing
# relations.
# If there is an edit, apply it to the event.
edit = aggregations . replace
self . _apply_edit ( event , serialized_event , edit )
# Ensure we take copies of the edit content, otherwise we risk modifying
# the original event.
edit_content = edit . content . copy ( )
# Unfreeze the event content if necessary, so that we may modify it below
edit_content = unfreeze ( edit_content )
serialized_event [ " content " ] = edit_content . get ( " m.new_content " , { } )
# Check for existing relations
relates_to = event . content . get ( " m.relates_to " )
if relates_to :
# Keep the relations, ensuring we use a dict copy of the original
serialized_event [ " content " ] [ " m.relates_to " ] = relates_to . copy ( )
else :
serialized_event [ " content " ] . pop ( " m.relates_to " , None )
# Include information about it in the relations dict.
serialized_aggregations [ RelationTypes . REPLACE ] = {
" event_id " : edit . event_id ,
" origin_server_ts " : edit . origin_server_ts ,
@ -478,13 +490,22 @@ class EventClientSerializer:
# If this event is the start of a thread, include a summary of the replies.
if aggregations . thread :
thread = aggregations . thread
# Don't bundle aggregations as this could recurse forever.
serialized_latest_event = self . serialize_event (
thread . latest_event , time_now , bundle_aggregations = None
)
# Manually apply an edit, if one exists.
if thread . latest_edit :
self . _apply_edit (
thread . latest_event , serialized_latest_event , thread . latest_edit
)
serialized_aggregations [ RelationTypes . THREAD ] = {
# Don't bundle aggregations as this could recurse forever.
" latest_event " : self . serialize_event (
aggregations . thread . latest_event , time_now , bundle_aggregations = None
) ,
" count " : aggregations . thread . count ,
" current_user_participated " : aggregations . thread . current_user_participated ,
" latest_event " : serialized_latest_event ,
" count " : thread . count ,
" current_user_participated " : thread . current_user_participated ,
}
# Include the bundled aggregations in the event.