Esempio n. 1
0
File: base.py Progetto: caitp/inbox
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()
Esempio n. 2
0
File: base.py Progetto: caitp/inbox
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()