Merge branch 'master' of git@83.233.175.44:hermes
authorAndrew Flegg <andrew@bleb.org>
Tue, 8 Jun 2010 21:44:42 +0000 (22:44 +0100)
committerAndrew Flegg <andrew@bleb.org>
Tue, 8 Jun 2010 21:44:42 +0000 (22:44 +0100)
Conflicts:

package/src/org/maemo/hermes/engine/hermes.py

1  2 
package/src/org/maemo/hermes/engine/facebook/service.py
package/src/org/maemo/hermes/engine/hermes.py
package/src/org/maemo/hermes/engine/service.py

@@@ -14,7 -14,7 +14,7 @@@ class Service(org.maemo.hermes.engine.s
  
  
      # -----------------------------------------------------------------------
 -    def __init__(self, facebook):
 +    def __init__(self, facebook, create_birthday_only = False):
          """Initialise the Facebook service, finding Facebook API keys in gconf and
             having a gui_callback available."""
          
  
      # -----------------------------------------------------------------------
      def process_contact(self, contact):
+         matched_friend = None
          if self._friends_by_contact.has_key(contact):
-             return
+             matched_friend = self._friends_by_contact[contact]
          
-         matched_friend = None
          # we might get a hit if the friend has setup a URL with another service,
          # such as putting the id link to Facebook on the Twitter account's profile
-         for url in contact.get_urls():
-             if url in self._friends_by_url:
-                 matched_friend = self._friends_by_url[url]
-                 self._register_match(contact, matched_friend)
-                 print contact.get_name(), " -> match by url -> ", matched_friend
-                 return
+         if not matched_friend:
+             for url in contact.get_urls():
+                 if url in self._friends_by_url:
+                     matched_friend = self._friends_by_url[url]
+                     self._register_match(contact, matched_friend)
+                     print contact.get_name(), " -> match by url -> ", matched_friend
+                     break
  
          if not matched_friend:
              for id in contact.get_identifiers():
                      matched_friend = self._friends_by_name.pop(id)
                      self._register_match(contact, matched_friend)
                      print contact.get_name(), " -> match by name -> ", matched_friend
-                     return
+                     break
+                 
+         return matched_friend
      
  
      # -----------------------------------------------------------------------
      def _register_match(self, contact, friend):
+         friend.set_contact(contact)
          self._friends_without_contact.discard(friend)
          self._friends_by_contact[contact] = friend
          self._contacts_by_friend[friend] = contact
  
      # -----------------------------------------------------------------------
      def _get_friends_data(self):
          """Returns a list of dicts, where each dict represents a friend/contact"""
@@@ -1,3 -1,6 +1,6 @@@
+ from org.maemo.hermes.engine.friend import Friend
+ import evolution
  class Hermes:
      """Encapsulate the process of syncing online friends' information with the
         Evolution contacts' database. This should be used as follows:
          
          # -- These fields are currently part of the API...
          #
-         self.updated   = []
-         self.matched   = []
+         self.updated = []
+         self.matched = []
          self.unmatched = []
-         self.friends   = {}
+         self.friends = {}
          self.addresses = None
          
          # -- Other initialisation...
@@@ -35,7 -38,7 +38,7 @@@
      
      
      # -----------------------------------------------------------------------
-     def run(self, resync = False):
+     def run(self, resync=False):
          """Load information on the authenticated user's friends. Synchronise Facebook
             profiles to contact database. If resync is false, no existing information
             will be overwritten."""
              def get_name(self):
                  return "Fredrik Wendt"
              def get_emails(self):
-                 return ["fredrik@wendt.se","maemohermes@wendt.se"]
+                 return ["fredrik@wendt.se", "maemohermes@wendt.se"]
              def get_photo(self):
                  return None
 +            def get_mapped_to(self):
 +                return set(["facebook", "gravatar"])
          self.matched = [FakeContact()]
   
  #        self._sync_job = SyncJob(services, [FakeContact()], self.progress)
  #        self._sync_job.get_updated_contacts()
  #        self._sync_job.get_matched_contacts()
          pass
+     
+     
+     # -----------------------------------------------------------------------
+     def run_alt(self, overwrite_existing_fields=False):
+         print "+++ Syncing contacts..."
+         self.addresses = evolution.ebook.open_addressbook('default')
+         print "+++ Contact store created..."
+         contacts = self.addresses.get_all_contacts()
  
+         # warm up
+         for service in self._services:
+             for contact in contacts:
+                 service.pre_process_contact(contact)
+                 
+         # fetch data
+         for service in self._services:
+             service.process_friends()
+         
+         # combine results into one friend
+         for contact in contacts:
+             result = Friend()
+             for service in self._services:
+                 friend = service.process_contact(contact)
+                 if (friend):
+                     friend.decorate(result)
+             
+             self.update_contact(friend, overwrite_existing_fields)
+         
  
      # -----------------------------------------------------------------------
-     def update_contact(self, contact, friend, resync = False):
+     def update_contact(self, contact, friend, resync=False):
          """Update the given contact with information from the given friend."""
          
-         friend.update_contact(contact, resync)
-     
- """        
-  friends = ()
-  for service in services:
-    for friend in service.get_friends():
-      friends.add(friend)
+         print "updating contact ", contact, " with friend ", friend
  
-  all_contacts = get_contacts_as_set()
-  contacts = set()
-  updated_contacts = set()
-  for econtact in addressbook.get_all_contacts():
-    contact = Contact(addressbook, econtact)
-    contacts.add(contact)
-    for service in something.get_services_by_prioritisation():
-      if service.process_contact(contact):
-        updated_contacts.add(contact)
 -
+     def create_contact_from_friend(self, friend):
+         contact = evolution.ebook.EContact()
+         contact.props.full_name = friend['name']
+         contact.props.given_name = friend['first_name']
+         contact.props.family_name = friend['last_name']
+         
+         self.update_contact(contact, friend)
+         
+         self.addresses.add_contact(contact)
+         self.updated.append(contact)
+         self.addresses.commit_contact(contact)
+         
+         print "Created [%s]" % (contact.get_name())
+         self.matched.append(contact)
  
-  for service in something.get_services_by_prioritisation():
-    service.finalise(updated_contacts)
  
-  for contact in updated_contacts:
-    contact.save()
- """
+     def commit(self):
+         self.store.close()
@@@ -36,9 -36,8 +36,8 @@@ class Service
      
      # -----------------------------------------------------------------------
      def process_contact(self, contact):
-         """Called for each contact in the address book. Any friends linked to
-            from the contact should have their matching updated. The back end should 
-            enrich the friend passed with any meta-data it can."""
+         """Called for each contact in the address book. If the contact can be 
+            matched to a Friend, than return the Friend object or None."""
             
          pass
      
@@@ -61,7 -60,6 +60,7 @@@
  
  
      # -----------------------------------------------------------------------
 +    ###DEPRECATED
      def _create_friend(self, name):
          """Used to create a Friend object for a contact"""