def to_dict_uncached_helper(message, apply_markdown): # type: (Message, bool) -> Dict[str, Any] return MessageDict.build_message_dict( apply_markdown=apply_markdown, message=message, message_id=message.id, last_edit_time=message.last_edit_time, edit_history=message.edit_history, content=message.content, subject=message.subject, pub_date=message.pub_date, rendered_content=message.rendered_content, rendered_content_version=message.rendered_content_version, sender_id=message.sender.id, sender_email=message.sender.email, sender_realm_id=message.sender.realm_id, sender_realm_str=message.sender.realm.string_id, sender_full_name=message.sender.full_name, sender_short_name=message.sender.short_name, sender_avatar_source=message.sender.avatar_source, sender_avatar_version=message.sender.avatar_version, sender_is_mirror_dummy=message.sender.is_mirror_dummy, sending_client_name=message.sending_client.name, recipient_id=message.recipient.id, recipient_type=message.recipient.type, recipient_type_id=message.recipient.type_id, reactions=Reaction.get_raw_db_rows([message.id]))
def get_raw_db_rows(needed_ids: List[int]) -> List[Dict[str, Any]]: # This is a special purpose function optimized for # callers like get_messages_backend(). fields = [ 'id', DB_TOPIC_NAME, 'date_sent', 'last_edit_time', 'edit_history', 'content', 'rendered_content', 'rendered_content_version', 'recipient_id', 'recipient__type', 'recipient__type_id', 'sender_id', 'sending_client__name', 'sender__realm_id', ] messages = Message.objects.filter(id__in=needed_ids).values(*fields) submessages = SubMessage.get_raw_db_rows(needed_ids) sew_messages_and_submessages(messages, submessages) reactions = Reaction.get_raw_db_rows(needed_ids) return sew_messages_and_reactions(messages, reactions)
def to_dict_uncached_helper(message, apply_markdown): # type: (Message, bool) -> Dict[str, Any] return MessageDict.build_message_dict( apply_markdown = apply_markdown, message = message, message_id = message.id, last_edit_time = message.last_edit_time, edit_history = message.edit_history, content = message.content, subject = message.subject, pub_date = message.pub_date, rendered_content = message.rendered_content, rendered_content_version = message.rendered_content_version, sender_id = message.sender.id, sender_email = message.sender.email, sender_realm_id = message.sender.realm_id, sender_realm_domain = message.sender.realm.domain, sender_full_name = message.sender.full_name, sender_short_name = message.sender.short_name, sender_avatar_source = message.sender.avatar_source, sender_is_mirror_dummy = message.sender.is_mirror_dummy, sending_client_name = message.sending_client.name, recipient_id = message.recipient.id, recipient_type = message.recipient.type, recipient_type_id = message.recipient.type_id, reactions = Reaction.get_raw_db_rows([message.id]) )
def sew_submessages_and_reactions_to_msgs(messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]: msg_ids = [msg['id'] for msg in messages] submessages = SubMessage.get_raw_db_rows(msg_ids) sew_messages_and_submessages(messages, submessages) reactions = Reaction.get_raw_db_rows(msg_ids) return sew_messages_and_reactions(messages, reactions)
def get_raw_db_rows(needed_ids): # type: (List[int]) -> List[Dict[str, Any]] # This is a special purpose function optimized for # callers like get_messages_backend(). fields = [ 'id', 'subject', 'pub_date', 'last_edit_time', 'edit_history', 'content', 'rendered_content', 'rendered_content_version', 'recipient_id', 'recipient__type', 'recipient__type_id', 'sender_id', 'sending_client__name', 'sender__realm_id', ] messages = Message.objects.filter(id__in=needed_ids).values(*fields) """Adding one-many or Many-Many relationship in values results in N X results. Link: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#values """ reactions = Reaction.get_raw_db_rows(needed_ids) return sew_messages_and_reactions(messages, reactions)
def get_raw_db_rows(needed_ids: List[int]) -> List[Dict[str, Any]]: # This is a special purpose function optimized for # callers like get_messages_backend(). fields = [ 'id', DB_TOPIC_NAME, 'pub_date', 'last_edit_time', 'edit_history', 'content', 'rendered_content', 'rendered_content_version', 'recipient_id', 'recipient__type', 'recipient__type_id', 'sender_id', 'sending_client__name', 'sender__realm_id', ] messages = Message.objects.filter(id__in=needed_ids).values(*fields) submessages = SubMessage.get_raw_db_rows(needed_ids) sew_messages_and_submessages(messages, submessages) reactions = Reaction.get_raw_db_rows(needed_ids) return sew_messages_and_reactions(messages, reactions)
def test_sew_messages_and_reaction(self) -> None: sender = self.example_user("othello") receiver = self.example_user("hamlet") pm_recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) stream_name = "Çiğdem" stream = self.make_stream(stream_name) stream_recipient = Recipient.objects.get(type_id=stream.id, type=Recipient.STREAM) sending_client = make_client(name="test suite") needed_ids = [] for i in range(5): for recipient in [pm_recipient, stream_recipient]: message = Message( sender=sender, recipient=recipient, content=f"whatever {i}", date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history="[]", ) message.set_topic_name("whatever") message.save() needed_ids.append(message.id) reaction = Reaction(user_profile=sender, message=message, emoji_name="simple_smile") reaction.save() messages = Message.objects.filter(id__in=needed_ids).values(*["id", "content"]) reactions = Reaction.get_raw_db_rows(needed_ids) tied_data = sew_messages_and_reactions(messages, reactions) for data in tied_data: self.assertEqual(len(data["reactions"]), 1) self.assertEqual(data["reactions"][0]["emoji_name"], "simple_smile") self.assertTrue(data["id"]) self.assertTrue(data["content"])
def to_dict_uncached_helper(message: Message) -> Dict[str, Any]: return MessageDict.build_message_dict( message=message, message_id=message.id, last_edit_time=message.last_edit_time, edit_history=message.edit_history, content=message.content, subject=message.subject, pub_date=message.pub_date, rendered_content=message.rendered_content, rendered_content_version=message.rendered_content_version, sender_id=message.sender.id, sender_realm_id=message.sender.realm_id, sending_client_name=message.sending_client.name, recipient_id=message.recipient.id, recipient_type=message.recipient.type, recipient_type_id=message.recipient.type_id, reactions=Reaction.get_raw_db_rows([message.id]))
def to_dict_uncached_helper(message: Message) -> Dict[str, Any]: return MessageDict.build_message_dict( message = message, message_id = message.id, last_edit_time = message.last_edit_time, edit_history = message.edit_history, content = message.content, subject = message.subject, pub_date = message.pub_date, rendered_content = message.rendered_content, rendered_content_version = message.rendered_content_version, sender_id = message.sender.id, sender_realm_id = message.sender.realm_id, sending_client_name = message.sending_client.name, recipient_id = message.recipient.id, recipient_type = message.recipient.type, recipient_type_id = message.recipient.type_id, reactions = Reaction.get_raw_db_rows([message.id]) )
def test_sew_messages_and_reaction(self) -> None: sender = self.example_user('othello') receiver = self.example_user('hamlet') pm_recipient = Recipient.objects.get(type_id=receiver.id, type=Recipient.PERSONAL) stream_name = 'Çiğdem' stream = self.make_stream(stream_name) stream_recipient = Recipient.objects.get(type_id=stream.id, type=Recipient.STREAM) sending_client = make_client(name="test suite") needed_ids = [] for i in range(5): for recipient in [pm_recipient, stream_recipient]: message = Message( sender=sender, recipient=recipient, content=f'whatever {i}', date_sent=timezone_now(), sending_client=sending_client, last_edit_time=timezone_now(), edit_history='[]', ) message.set_topic_name('whatever') message.save() needed_ids.append(message.id) reaction = Reaction(user_profile=sender, message=message, emoji_name='simple_smile') reaction.save() messages = Message.objects.filter(id__in=needed_ids).values( *['id', 'content']) reactions = Reaction.get_raw_db_rows(needed_ids) tied_data = sew_messages_and_reactions(messages, reactions) for data in tied_data: self.assertEqual(len(data['reactions']), 1) self.assertEqual(data['reactions'][0]['emoji_name'], 'simple_smile') self.assertTrue(data['id']) self.assertTrue(data['content'])