Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/extensions/web
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/web')
-rw-r--r--extensions/web/facebook/account.py85
-rw-r--r--extensions/web/twitter/account.py84
2 files changed, 106 insertions, 63 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()
diff --git a/extensions/web/twitter/account.py b/extensions/web/twitter/account.py
index a2e4bf0..934396d 100644
--- a/extensions/web/twitter/account.py
+++ b/extensions/web/twitter/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
@@ -51,7 +52,7 @@ COMMENT_IDS = 'twr_comment_ids'
COMMENT_LAST_ID = 'last_comment_id'
-class TwitterAccount(account.Account):
+class Account(account.Account):
CONSUMER_TOKEN_KEY = "/desktop/sugar/collaboration/twitter_consumer_token"
CONSUMER_SECRET_KEY = "/desktop/sugar/collaboration/twitter_consumer_secret"
@@ -62,37 +63,56 @@ class TwitterAccount(account.Account):
self._client = GConf.Client.get_default()
ctoken, csecret, atoken, asecret = self._access_tokens()
TwrAccount.set_secrets(ctoken, csecret, atoken, asecret)
- self._alert = None
+ self._shared_journal_entry = None
def get_description(self):
return ACCOUNT_NAME
- def is_configured(self):
- return None not in self._access_tokens()
+ def get_token_state(self):
+ if None in self._access_tokens():
+ return self.STATE_NONE
+ else:
+ # No expiration date
+ return self.STATE_VALID
+
+ def _access_tokens(self):
+ return (self._client.get_string(self.CONSUMER_TOKEN_KEY),
+ self._client.get_string(self.CONSUMER_SECRET_KEY),
+ self._client.get_string(self.ACCESS_TOKEN_KEY),
+ self._client.get_string(self.ACCESS_SECRET_KEY))
- def is_active(self):
- # No expiration date
- return None not in self._access_tokens()
+ 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, twaccount):
+ self._account = twaccount
+ self._alert = None
def get_share_menu(self, journal_entry_metadata):
- twr_share_menu = _TwitterShareMenu(journal_entry_metadata,
- self.is_active())
- self._connect_transfer_signals(twr_share_menu)
- return twr_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):
- twr_refresh_menu = _TwitterRefreshMenu(self.is_active())
- self._connect_transfer_signals(twr_refresh_menu)
- return twr_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',
self._transfer_state_changed_cb)
def _transfer_state_changed_cb(self, widget, state_message):
- logging.debug('_transfer_state_changed_cb')
-
- # First, remove any existing alert
if self._alert is None:
self._alert = NotifyAlert()
self._alert.props.title = ACCOUNT_NAME
@@ -107,18 +127,11 @@ class TwitterAccount(account.Account):
journalwindow.get_journal_window().remove_alert(alert)
self._alert = None
- def _access_tokens(self):
- return (self._client.get_string(self.CONSUMER_TOKEN_KEY),
- self._client.get_string(self.CONSUMER_SECRET_KEY),
- self._client.get_string(self.ACCESS_TOKEN_KEY),
- self._client.get_string(self.ACCESS_SECRET_KEY))
-
-class _TwitterShareMenu(account.MenuItem):
- __gtype_name__ = 'JournalTwitterMenu'
+class _ShareMenu(MenuItem):
def __init__(self, metadata, is_active):
- account.MenuItem.__init__(self, ACCOUNT_NAME)
+ MenuItem.__init__(self, ACCOUNT_NAME)
if is_active:
icon_name = 'twitter-share'
@@ -183,9 +196,9 @@ class _TwitterShareMenu(account.MenuItem):
pixbuf.savev(image_path, 'png', [], [])
-class _TwitterRefreshMenu(account.MenuItem):
+class _RefreshMenu(MenuItem):
def __init__(self, is_active):
- account.MenuItem.__init__(self, ACCOUNT_NAME)
+ MenuItem.__init__(self, ACCOUNT_NAME)
self._is_active = is_active
self._metadata = None
@@ -217,11 +230,14 @@ class _TwitterRefreshMenu(account.MenuItem):
logging.debug('_twr_refresh_menu_clicked_cb')
if self._metadata is None:
- logging.debug('_twr_refresh_menu_clicked_cb called without metadata')
+ logging.debug(
+ '_twr_refresh_menu_clicked_cb called without metadata')
return
if 'twr_object_id' not in self._metadata:
- logging.debug('_twr_refresh_menu_clicked_cb called without twr_object_id in metadata')
+ logging.debug(
+ '_twr_refresh_menu_clicked_cb called without twr_object_id \
+in metadata')
return
self.emit('transfer-state-changed', _('Download started'))
@@ -234,7 +250,8 @@ class _TwitterRefreshMenu(account.MenuItem):
status_id = ds_object.metadata[COMMENT_LAST_ID]
timeline = TwrTimeline()
- timeline.connect('mentions-downloaded', self._twr_mentions_downloaded_cb)
+ timeline.connect('mentions-downloaded',
+ self._twr_mentions_downloaded_cb)
timeline.mentions_timeline(since_id=status_id)
def _twr_mentions_downloaded_cb(self, timeline, comments):
@@ -254,7 +271,8 @@ class _TwitterRefreshMenu(account.MenuItem):
new_comment = False
for comment in comments:
# XXX hope for a better API
- if comment['in_reply_to_status_id_str'] != self._metadata['twr_object_id']:
+ if comment['in_reply_to_status_id_str'] != \
+ self._metadata['twr_object_id']:
continue
if comment['id_str'] not in ds_comment_ids:
@@ -280,4 +298,4 @@ class _TwitterRefreshMenu(account.MenuItem):
logging.debug('_twr_comments_download_failed_cb: %s' % (failed_reason))
def get_account():
- return TwitterAccount()
+ return Account()