# -----------------------------------------------------------------------
- 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"""
+ 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...
# -----------------------------------------------------------------------
- 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()