conduit r1925 - in trunk: . conduit/modules/GoogleModule



Author: jstowers
Date: Mon Mar 16 10:00:06 2009
New Revision: 1925
URL: http://svn.gnome.org/viewvc/conduit?rev=1925&view=rev

Log:
2009-03-16  John Stowers  <john stowers gmail com>

	* conduit/modules/GoogleModule/GoogleModule.py:
	* conduit/modules/GoogleModule/contacts-config.glade: Allow
	selecting groups when configuring google contacts.
	Fixes #574907 (Michael Thompson)




Modified:
   trunk/ChangeLog
   trunk/conduit/modules/GoogleModule/GoogleModule.py
   trunk/conduit/modules/GoogleModule/contacts-config.glade

Modified: trunk/conduit/modules/GoogleModule/GoogleModule.py
==============================================================================
--- trunk/conduit/modules/GoogleModule/GoogleModule.py	(original)
+++ trunk/conduit/modules/GoogleModule/GoogleModule.py	Mon Mar 16 10:00:06 2009
@@ -10,6 +10,7 @@
 from gettext import gettext as _
 import logging
 log = logging.getLogger("modules.Google")
+import gtk
 
 import conduit
 import conduit.dataproviders.DataProvider as DataProvider
@@ -811,6 +812,7 @@
     def __init__(self, *args):
         _GoogleBase.__init__(self,gdata.contacts.service.ContactsService())
         DataProvider.TwoWay.__init__(self)
+        self.selectedGroup = None
         
     def _google_contact_from_conduit_contact(self, contact, gc=None):
         """
@@ -930,10 +932,21 @@
         return c
 
     def _get_all_contacts(self):
-        feed = self.service.GetContactsFeed()
-        if not feed.entry:
-            return []
-        return [str(contact.id.text) for contact in feed.entry]
+        if self.selectedGroup:
+            query=gdata.contacts.service.ContactsQuery(group=self.selectedGroup.get_feed_link())
+            log.debug("Group query uri = %s" % query.ToUri())
+            feed = self.service.GetContactsFeed(query.ToUri())
+        else:
+            feed = self.service.GetContactsFeed()
+        res = []
+        while True:
+            for contact in feed.entry:
+                res.append(str(contact.id.text))
+            nextLink = feed.GetNextLink()
+            if nextLink == None:
+                break
+            feed = self.service.GetContactsFeed(uri=nextLink.href)
+        return res
         
     def refresh(self):
         DataProvider.TwoWay.refresh(self)
@@ -997,6 +1010,36 @@
     def finish(self, aborted, error, conflict):
         DataProvider.TwoWay.finish(self)
 
+    def _get_all_groups(self):
+        '''Get a list of addressbook groups'''
+        self._do_login()
+        #System Groups are only returned in version 2 of the API
+        query=gdata.contacts.service.GroupsQuery()
+        query['v']='2'
+        feed = self.service.GetContactsFeed(query.ToUri())
+        for entry in feed.entry:
+            yield _GoogleContactGroup.from_google_format(entry)
+
+    def _load_groups(self, widget, tree):        
+        sourceComboBox = tree.get_widget("Group")
+        store = sourceComboBox.get_model()
+        store.clear()
+
+        self._set_username(tree.get_widget("username").get_text())
+        self._set_password(tree.get_widget("password").get_text())
+        
+        try:
+            for group in self._get_all_groups():
+                rowref = store.append( (group.get_name(), group) )
+                if group == self.selectedGroup:
+                    sourceComboBox.set_active_iter(rowref)
+        except gdata.service.BadAuthentication:
+            errorMsg = "Login Failed"
+            errorDlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, message_format=errorMsg, buttons=gtk.BUTTONS_OK)
+            errorDlg.run()
+            errorDlg.destroy()
+            return
+        
     def configure(self, window):
         """
         Configures the PicasaTwoWay
@@ -1009,18 +1052,80 @@
         #get a whole bunch of widgets
         username = widget.get_widget("username")
         password = widget.get_widget("password")
+        group = widget.get_widget("Group")
+        store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
+        group.set_model(store)
         
         #preload the widgets        
         username.set_text(self.username)
         password.set_text(self.password)
         
+        signalConnections = { "on_getGroups_clicked" : (self._load_groups, widget) }
+        widget.signal_autoconnect( signalConnections )
+        
+        if self.selectedGroup is not None:
+            rowref = store.append( (self.selectedGroup.get_name(), self.selectedGroup) )
+            group.set_active_iter(rowref)
+            
         dlg = widget.get_widget("GoogleContactsConfigDialog")
         response = Utils.run_dialog (dlg, window)
         if response == True:
             self._set_username(username.get_text())
             self._set_password(password.get_text())
-        dlg.destroy()    
+            self.selectedGroup = store.get_value(group.get_active_iter(),1)
+        dlg.destroy()
+
+    def get_configuration(self):
+        conf = _GoogleBase.get_configuration(self)
+        if self.selectedGroup != None:
+            conf.update({
+                "selectedGroupName"  :   self.selectedGroup.get_name(),
+                "selectedGroupURI"   :   self.selectedGroup.get_uri()})
+        return conf
+            
+    def set_configuration(self, config):
+        _GoogleBase.set_configuration(self, config)
+        if "selectedGroupName" in config:
+            if "selectedGroupURI" in config:
+                self.selectedGroup = _GoogleContactGroup(
+                                            config['selectedGroupName'],
+                                            config['selectedGroupURI']
+                                            )
+
+    def is_configured (self, isSource, isTwoWay):
+        if not _GoogleBase.is_configured(self, isSource, isTwoWay):
+            return False
+        if self.selectedGroup == None:
+            return False
+        return True
+
+class _GoogleContactGroup:
+    def __init__(self, name, uri):
+        self.uri = uri
+        self.name = name
+
+    @classmethod    
+    def from_google_format(cls, group):
+        uri = group.id.text
+        name = group.title.text
+        return cls(name, uri)
         
+    def __eq__(self, other):
+        if other is None:
+            return False
+        else:
+            return self.get_uri() == other.get_uri()
+        
+    def get_uri(self):
+        return self.uri
+        
+    def get_name(self):
+        return self.name
+    
+    def get_feed_link(self):
+        return self.get_uri()
+        
+
 class _GoogleDocument:
     def __init__(self, doc):
         self.id = doc.GetSelfLink().href

Modified: trunk/conduit/modules/GoogleModule/contacts-config.glade
==============================================================================
--- trunk/conduit/modules/GoogleModule/contacts-config.glade	(original)
+++ trunk/conduit/modules/GoogleModule/contacts-config.glade	Mon Mar 16 10:00:06 2009
@@ -68,6 +68,67 @@
       </child>
 
       <child>
+	<widget class="GtkComboBox" id="Group">
+	  <property name="visible">True</property>
+	  <property name="can_default">True</property>
+	  <property name="has_default">True</property>
+	  <property name="items" translatable="yes"></property>
+	  <property name="add_tearoffs">False</property>
+	  <property name="focus_on_click">True</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkLabel" id="label77">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">&lt;b&gt;Group&lt;/b&gt;</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">True</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkButton" id="getGroups">
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="label" translatable="yes">Get Addressbook Groups</property>
+	  <property name="use_underline">True</property>
+	  <property name="relief">GTK_RELIEF_NORMAL</property>
+	  <property name="focus_on_click">True</property>
+	  <signal name="clicked" handler="on_getGroups_clicked" last_modification_time="Tue, 10 Mar 2009 19:15:11 GMT"/>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
 	<widget class="GtkLabel" id="label74">
 	  <property name="visible">True</property>
 	  <property name="label" translatable="yes">&lt;b&gt;Account Details&lt;/b&gt;</property>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]