diff options
Diffstat (limited to 'extensions/web/facebook/account.py')
-rw-r--r-- | extensions/web/facebook/account.py | 85 |
1 files changed, 55 insertions, 30 deletions
diff --git a/extensions/web/facebook/account.py b/extensions/web/facebook/account.py index f105fdb..a97e565 100644 --- a/extensions/web/facebook/account.py +++ b/extensions/web/facebook/account.py @@ -35,6 +35,7 @@ from gi.repository import GObject from sugar3.datastore import datastore from sugar3.graphics.alert import NotifyAlert from sugar3.graphics.icon import Icon +from sugar3.graphics.menuitem import MenuItem from jarabe.journal import journalwindow from jarabe.web import account @@ -47,7 +48,8 @@ ACCOUNT_NAME = _('Facebook') COMMENTS = 'comments' COMMENT_IDS = 'fb_comment_ids' -class FacebookAccount(account.Account): + +class Account(account.Account): ACCESS_TOKEN_KEY = "/desktop/sugar/collaboration/facebook_access_token" ACCESS_TOKEN_KEY_EXPIRATION_DATE = \ @@ -56,29 +58,51 @@ class FacebookAccount(account.Account): def __init__(self): self._client = GConf.Client.get_default() facebook.FbAccount.set_access_token(self._access_token()) - self._alert = None + self._shared_journal_entry = None def get_description(self): return ACCOUNT_NAME - def is_configured(self): - return self._access_token() is not None - - def is_active(self): + def get_token_state(self): + if self._access_token() is None: + return self.STATE_NONE expiration_date = \ self._client.get_int(self.ACCESS_TOKEN_KEY_EXPIRATION_DATE) - return expiration_date != 0 and expiration_date > time.time() + if expiration_date != 0 and expiration_date > time.time(): + return self.STATE_VALID + else: + return self.STATE_EXPIRED + + def _access_token(self): + return self._client.get_string(self.ACCESS_TOKEN_KEY) + + def get_shared_journal_entry(self): + if self._shared_journal_entry is None: + self._shared_journal_entry = _SharedJournalEntry(self) + return self._shared_journal_entry + + +class _SharedJournalEntry(account.SharedJournalEntry): + __gsignals__ = { + 'transfer-state-changed': (GObject.SignalFlags.RUN_FIRST, None, + ([str])), + } + def __init__(self, fbaccount): + self._account = fbaccount + self._alert = None def get_share_menu(self, journal_entry_metadata): - fb_share_menu = _FacebookShareMenu(journal_entry_metadata, - self.is_active()) - self._connect_transfer_signals(fb_share_menu) - return fb_share_menu + menu = _ShareMenu( + journal_entry_metadata, + self._account.get_token_state() == self._account.STATE_VALID) + self._connect_transfer_signals(menu) + return menu def get_refresh_menu(self): - fb_refresh_menu = _FacebookRefreshMenu(self.is_active()) - self._connect_transfer_signals(fb_refresh_menu) - return fb_refresh_menu + menu = _RefreshMenu( + self._account.get_token_state() == self._account.STATE_VALID) + self._connect_transfer_signals(menu) + return menu def _connect_transfer_signals(self, transfer_widget): transfer_widget.connect('transfer-state-changed', @@ -89,7 +113,6 @@ class FacebookAccount(account.Account): # First, remove any existing alert if self._alert is None: - logging.debug('creating new alert') self._alert = NotifyAlert() self._alert.props.title = ACCOUNT_NAME self._alert.connect('response', self._alert_response_cb) @@ -103,15 +126,15 @@ class FacebookAccount(account.Account): journalwindow.get_journal_window().remove_alert(alert) self._alert = None - def _access_token(self): - return self._client.get_string(self.ACCESS_TOKEN_KEY) - -class _FacebookShareMenu(account.MenuItem): - __gtype_name__ = 'JournalFacebookMenu' +class _ShareMenu(MenuItem): + __gsignals__ = { + 'transfer-state-changed': (GObject.SignalFlags.RUN_FIRST, None, + ([str])), + } def __init__(self, metadata, is_active): - account.MenuItem.__init__(self, ACCOUNT_NAME) + MenuItem.__init__(self, ACCOUNT_NAME) if is_active: icon_name = 'facebook-share' @@ -143,8 +166,6 @@ class _FacebookShareMenu(account.MenuItem): photo.connect('photo-create-failed', self._photo_create_failed_cb, tmp_file) - photo.connect('transfer-state-changed', - self._transfer_state_changed_cb) GObject.idle_add(photo.create, tmp_file) @@ -163,8 +184,8 @@ class _FacebookShareMenu(account.MenuItem): ds_object.metadata['fb_object_id'] = fb_object_id datastore.write(ds_object, update_mtime=False) except Exception as ex: - logging.debug("_photo_created_cb failed to write to datastore: " % \ - str(ex)) + logging.debug("_photo_created_cb failed to write to datastore: " % + str(ex)) def _photo_create_failed_cb(self, fb_photo, failed_reason, tmp_file): logging.debug("_photo_create_failed_cb") @@ -195,9 +216,15 @@ class _FacebookShareMenu(account.MenuItem): pixbuf.savev(image_path, 'png', [], []) -class _FacebookRefreshMenu(account.MenuItem): +class _RefreshMenu(MenuItem): + __gsignals__ = { + 'transfer-state-changed': (GObject.SignalFlags.RUN_FIRST, None, + ([str])), + 'comments-changed': (GObject.SignalFlags.RUN_FIRST, None, ([str])) + } + def __init__(self, is_active): - account.MenuItem.__init__(self, ACCOUNT_NAME) + MenuItem.__init__(self, ACCOUNT_NAME) self._is_active = is_active self._metadata = None @@ -242,8 +269,6 @@ class _FacebookRefreshMenu(account.MenuItem): self._fb_comments_downloaded_cb) fb_photo.connect('comments-download-failed', self._fb_comments_download_failed_cb) - fb_photo.connect('transfer-state-changed', - self._transfer_state_changed_cb) GObject.idle_add(fb_photo.refresh_comments) def _fb_comments_downloaded_cb(self, fb_photo, comments): @@ -278,4 +303,4 @@ class _FacebookRefreshMenu(account.MenuItem): logging.debug('_fb_comments_download_failed_cb: %s' % (failed_reason)) def get_account(): - return FacebookAccount() + return Account() |