def add_message_attrs(self, db_session, new_uid, msg): """ Post-create-message bits.""" with db_session.no_autoflush: parent_thread = fetch_corresponding_thread(db_session, self.namespace_id, new_uid.message) construct_new_thread = True if parent_thread: # If there's a parent thread that isn't too long already, # add to it. Otherwise create a new thread. parent_message_count = self._count_thread_messages( parent_thread.id, db_session) if parent_message_count < MAX_THREAD_LENGTH: construct_new_thread = False if construct_new_thread: new_uid.message.thread = ImapThread.from_imap_message( db_session, new_uid.account.namespace, new_uid.message) else: parent_thread.messages.append(new_uid.message) db_session.flush() # Make sure this thread has all the correct labels common.add_any_new_thread_labels(new_uid.message.thread, new_uid, db_session) new_uid.update_flags_and_labels(msg.flags) return new_uid
def add_message_attrs(self, db_session, new_uid, msg, folder): """ Post-create-message bits.""" with db_session.no_autoflush: parent_threads = self.fetch_similar_threads(db_session, new_uid) construct_new_thread = True if parent_threads: # If there's a parent thread that isn't too long already, # add to it. Otherwise create a new thread. parent_thread = parent_threads[0] parent_message_count, = db_session.query( func.count(Message.id)). \ filter(Message.thread_id == parent_thread.id).one() if parent_message_count < MAX_THREAD_LENGTH: construct_new_thread = False if construct_new_thread: new_uid.message.thread = ImapThread.from_imap_message( db_session, new_uid.account.namespace, new_uid.message) new_uid.message.thread_order = 0 else: parent_thread = parent_threads[0] parent_thread.messages.append(new_uid.message) constructed_thread = thread_messages(parent_thread.messages) for index, message in enumerate(constructed_thread): message.thread_order = index db_session.flush() # Make sure this thread has all the correct labels common.add_any_new_thread_labels(new_uid.message.thread, new_uid, db_session) new_uid.update_imap_flags(msg.flags) return new_uid
def add_message_attrs(self, db_session, new_uid, msg): """ Post-create-message bits.""" with db_session.no_autoflush: parent_threads = self.fetch_similar_threads(db_session, new_uid) construct_new_thread = True if parent_threads: # If there's a parent thread that isn't too long already, # add to it. Otherwise create a new thread. parent_thread = parent_threads[0] parent_message_count, = db_session.query( func.count(Message.id)). \ filter(Message.thread_id == parent_thread.id).one() if parent_message_count < MAX_THREAD_LENGTH: construct_new_thread = False if construct_new_thread: new_uid.message.thread = ImapThread.from_imap_message( db_session, new_uid.account.namespace, new_uid.message) new_uid.message.thread_order = 0 else: parent_thread = parent_threads[0] parent_thread.messages.append(new_uid.message) constructed_thread = thread_messages(parent_thread.messages) for index, message in enumerate(constructed_thread): message.thread_order = index db_session.flush() # Make sure this thread has all the correct labels common.add_any_new_thread_labels(new_uid.message.thread, new_uid, db_session) new_uid.update_flags_and_labels(msg.flags) return new_uid
def add_message_attrs(self, db_session, new_uid, msg): """ Post-create-message bits.""" with db_session.no_autoflush: parent_thread = fetch_corresponding_thread( db_session, self.namespace_id, new_uid.message) construct_new_thread = True if parent_thread: # If there's a parent thread that isn't too long already, # add to it. Otherwise create a new thread. parent_message_count = self._count_thread_messages( parent_thread.id, db_session) if parent_message_count < MAX_THREAD_LENGTH: construct_new_thread = False if construct_new_thread: new_uid.message.thread = ImapThread.from_imap_message( db_session, new_uid.account.namespace, new_uid.message) else: parent_thread.messages.append(new_uid.message) db_session.flush() # Make sure this thread has all the correct labels common.add_any_new_thread_labels(new_uid.message.thread, new_uid, db_session) new_uid.update_flags_and_labels(msg.flags) return new_uid
def test_adding_message_to_thread(db): """recompute_thread_labels is not invoked when a new message is added (only when UID metadata changes, or when a UID is deleted). Test that tag changes work when adding messages to a thread.""" account = db.session.query(Account).get(ACCOUNT_ID) account.namespace.create_canonical_tags() thread = db.session.query(Thread).get(THREAD_ID) account.trash_folder = Folder(name='Trash', account=account) fld_item = FolderItem(thread=thread, folder=account.trash_folder) folder_names = [folder.name for folder in thread.folders] m = Message(namespace_id=account.namespace.id, subject='test message', thread_id=thread.id, received_date=datetime.datetime.now(), size=64, sanitized_body="body", snippet="snippet") uid = ImapUid(account=account, message=m, g_labels=['\\Inbox', 'test-label'], msg_uid=22L, folder_id=account.inbox_folder.id) uid.folder = account.inbox_folder uid2 = ImapUid(account=account, message=m, g_labels=['test-2'], msg_uid=24L, folder_id=account.trash_folder.id) uid2.folder = account.trash_folder thread.messages.append(m) add_any_new_thread_labels(thread, uid, db.session) add_any_new_thread_labels(thread, uid2, db.session) folder_names = [folder.name for folder in thread.folders] for folder in folder_names: assert folder in ['Inbox', 'Trash', 'test-label', 'test-2', '[Gmail]/All Mail', '[Gmail]/Important'],\ "all folders should be present" # Now, remove the message m.imapuids.remove(uid2) db.session.delete(uid2) db.session.flush() recompute_thread_labels(thread, db.session) folder_names = [folder.name for folder in thread.folders] assert 'test-2' not in folder_names,\ "test-2 label should have been removed from thread"
def add_message_attrs(self, db_session, new_uid, msg): """ Gmail-specific post-create-message bits. """ # Disable autoflush so we don't try to flush a message with null # thread_id, causing a crash, and so that we don't flush on each # added/removed label. with db_session.no_autoflush: new_uid.message.g_msgid = msg.g_msgid # NOTE: g_thrid == g_msgid on the first message in the thread :) new_uid.message.g_thrid = msg.g_thrid # we rely on Gmail's threading instead of our threading algorithm. new_uid.update_flags_and_labels(msg.flags, msg.g_labels) thread = new_uid.message.thread = ImapThread.from_gmail_message( db_session, new_uid.account.namespace, new_uid.message) # make sure this thread has all the correct labels common.add_any_new_thread_labels(thread, new_uid, db_session) return new_uid
def test_adding_message_to_thread(db): """recompute_thread_labels is not invoked when a new message is added (only when UID metadata changes, or when a UID is deleted). Test that tag changes work when adding messages to a thread.""" account = db.session.query(Account).get(ACCOUNT_ID) account.namespace.create_canonical_tags() thread = db.session.query(Thread).get(THREAD_ID) account.trash_folder = Folder(name='Trash', account=account) FolderItem(thread=thread, folder=account.trash_folder) folder_names = [folder.name for folder in thread.folders] m = Message(namespace_id=account.namespace.id, subject='test message', thread_id=thread.id, received_date=datetime.datetime.now(), size=64, body="body", snippet="snippet") uid = ImapUid(account=account, message=m, g_labels=['\\Inbox', 'test-label'], msg_uid=22L, folder_id=account.inbox_folder.id) uid.folder = account.inbox_folder uid2 = ImapUid(account=account, message=m, g_labels=['test-2'], msg_uid=24L, folder_id=account.trash_folder.id) uid2.folder = account.trash_folder thread.messages.append(m) add_any_new_thread_labels(thread, uid, db.session) add_any_new_thread_labels(thread, uid2, db.session) folder_names = [folder.name for folder in thread.folders] for folder in folder_names: assert folder in ['Inbox', 'Trash', 'test-label', 'test-2', '[Gmail]/All Mail', '[Gmail]/Important'],\ "all folders should be present" # Now, remove the message m.imapuids.remove(uid2) db.session.delete(uid2) db.session.flush() recompute_thread_labels(thread, db.session) folder_names = [folder.name for folder in thread.folders] assert 'test-2' not in folder_names,\ "test-2 label should have been removed from thread"
def add_message_attrs(self, db_session, new_uid, msg, folder): """ Gmail-specific post-create-message bits. """ # Disable autoflush so we don't try to flush a message with null # thread_id, causing a crash, and so that we don't flush on each # added/removed label. with db_session.no_autoflush: new_uid.message.g_msgid = msg.g_msgid # NOTE: g_thrid == g_msgid on the first message in the thread :) new_uid.message.g_thrid = msg.g_thrid # we rely on Gmail's threading instead of our threading algorithm. new_uid.message.thread_order = 0 new_uid.update_imap_flags(msg.flags, msg.g_labels) # FIXME: @karim not sure if it's necessary to clean up strings like # \\Inbox, \\Trash, etc. new_uid.g_labels = [label for label in msg.g_labels] thread = new_uid.message.thread = ImapThread.from_gmail_message( db_session, new_uid.account.namespace, new_uid.message) # make sure this thread has all the correct labels common.add_any_new_thread_labels(thread, new_uid, db_session) return new_uid