def save_folder_names(log, account, folder_names, db_session): """ Create Folder objects & map special folder names on Account objects. Folders that belong to an account and no longer exist in `folder_names` ARE DELETED. """ # NOTE: We don't do anything like canonicalizing to lowercase because # different backends may be case-sensitive or not. Code that references # saved folder names should canonicalize if needed when doing comparisons. assert 'inbox' in folder_names, 'Account {} has no detected inbox folder'\ .format(account.email_address) folders = dict([ (f.name.lower(), f) for f in db_session.query(Folder).filter_by(account=account).all() ]) for tag in [ 'inbox', 'drafts', 'sent', 'spam', 'trash', 'starred', 'important', 'archive', 'all' ]: if tag in folder_names: if folder_names[tag].lower() not in folders: folder = Folder.create(account, folder_names[tag], tag) attr_name = '{}_folder'.format(tag) setattr( account, attr_name, verify_folder_name(account.id, getattr(account, attr_name), folder)) if folder_names[tag].lower() in folders: del folders[folder_names[tag].lower()] # Gmail labels, user-created IMAP/EAS folders, etc. if 'extra' in folder_names: for name in folder_names['extra']: name = name[:MAX_FOLDER_NAME_LENGTH] if name.lower() not in folders: folder = Folder.create(account, name) db_session.add(folder) if name.lower() in folders: del folders[name.lower()] # This may cascade to FolderItems and ImapUid (ONLY), which is what we # want--doing the update here short-circuits us syncing that change later. log.info("Folders were deleted from the remote: {}".format(folders.keys())) for folder in folders.values(): db_session.delete(folder) db_session.commit()
def save_folder_names(log, account, folder_names, db_session): """ Create Folder objects & map special folder names on Account objects. Folders that belong to an account and no longer exist in `folder_names` ARE DELETED. """ # NOTE: We don't do anything like canonicalizing to lowercase because # different backends may be case-sensitive or not. Code that references # saved folder names should canonicalize if needed when doing comparisons. assert 'inbox' in folder_names, 'Account {} has no detected inbox folder'\ .format(account.email_address) folders = dict([(f.name.lower(), f) for f in db_session.query(Folder).filter_by(account=account).all()]) for tag in ['inbox', 'drafts', 'sent', 'spam', 'trash', 'starred', 'important', 'archive', 'all']: if tag in folder_names: if folder_names[tag].lower() not in folders: folder = Folder.create(account, folder_names[tag], tag) attr_name = '{}_folder'.format(tag) setattr(account, attr_name, verify_folder_name( account.id, getattr(account, attr_name), folder)) if folder_names[tag].lower() in folders: del folders[folder_names[tag].lower()] # Gmail labels, user-created IMAP/EAS folders, etc. if 'extra' in folder_names: for name in folder_names['extra']: name = name[:MAX_FOLDER_NAME_LENGTH] if name.lower() not in folders: folder = Folder.create(account, name) db_session.add(folder) if name.lower() in folders: del folders[name.lower()] # This may cascade to FolderItems and ImapUid (ONLY), which is what we # want--doing the update here short-circuits us syncing that change later. log.info("Folders were deleted from the remote: {}".format(folders.keys())) for folder in folders.values(): db_session.delete(folder) db_session.commit()