Source code for okcupyd.db.mailbox

import logging

import simplejson

from okcupyd import helpers
from okcupyd.db import adapters
from okcupyd.db import model, txn
from okcupyd.util import curry


log = logging.getLogger(__name__)


[docs]class Sync(object): """Sync messages from a users inbox to the okc database.""" def __init__(self, user): self._user = user
[docs] def all(self): self.update_mailbox('outbox') return self.update_mailbox('inbox')
@curry
[docs] def update_mailbox(self, mailbox_name='inbox'): """Update the mailbox associated with the given mailbox name. """ with txn() as session: last_updated_name = '{0}_last_updated'.format(mailbox_name) okcupyd_user = session.query(model.OKCupydUser).join(model.User).filter( model.User.okc_id == self._user.profile.id ).with_for_update().one() log.info(simplejson.dumps({ '{0}_last_updated'.format(mailbox_name): helpers.datetime_to_string( getattr(okcupyd_user, last_updated_name) ) })) res = self._sync_mailbox_until( getattr(self._user, mailbox_name)(), getattr(okcupyd_user, last_updated_name) ) if not res: return None, None last_updated, threads, new_messages = res if last_updated: setattr(okcupyd_user, last_updated_name, last_updated) return threads, new_messages
inbox = update_mailbox(mailbox_name='inbox') outbox = update_mailbox(mailbox_name='outbox') def _sync_mailbox_until(self, mailbox, sync_until): threads = [] messages = [] for thread in mailbox: if sync_until and sync_until > thread.datetime: break if not thread.messages: continue if not thread.with_deleted_user: thread, new_messages = adapters.ThreadAdapter(thread).get_thread() threads.append(threads) messages.extend(new_messages) try: return mailbox[0].datetime, threads, messages except IndexError: pass