# -----------------------------------------------------------------------
- def __init__(self, services, gui_progress):
- """Constructor. Passed a list of services, and a callback method
- which must implement the following API.
-
- progress(i, j) - the application is currently processing friend 'i' of
- 'j'. Should be used to provide the user a progress bar.
- """
+ def __init__(self, services, gui_progress=None):
+ """Constructor. Passed a list of services, and a
+ method which will be invoked with three arguments:
+ str Name of current step
+ int Current position
+ int Maximum value of position."""
+
# -- These fields are currently part of the API...
#
# -- Other initialisation...
#
self._services = services
- self._progress = gui_progress
+ self._progress = gui_progress or (lambda msg, i, j: None)
# -----------------------------------------------------------------------
"""Load information on the authenticated user's friends. Synchronise Facebook
profiles to contact database. If resync is false, no existing information
will be overwritten."""
-
+
class FakeContact():
def get_name(self):
return "Fredrik Wendt"
# -----------------------------------------------------------------------
def run_alt(self, overwrite_existing_fields=False):
+ self._progress("Reading contacts...", 1, 10000)
+
contacts = []
self.addresses = evolution.ebook.open_addressbook('default')
for contact in self.addresses.get_all_contacts():
contacts.append(Contact(self.addresses, contact))
+ # work out progress bar info
+ total_contacts = len(contacts) * len(self._services)
+ total_ticks = 6 * total_contacts # Number of distinct loops below
+
# warm up
+ current_tick = 1
for service in self._services:
print "pre-process:", service.get_id()
for contact in contacts:
+ self._progress("Pre-processing contacts...", current_tick, total_ticks)
+ current_tick += 1
service.pre_process_contact(contact)
# fetch data
for service in self._services:
print "process_friends:", service.get_id()
+ self._progress("Reading friends...", current_tick, total_ticks)
+ current_tick += len(contacts)
service.process_friends()
# combine results into one friend
result = Friend()
for service in self._services:
print "process_contact:", service.get_id()
+ self._progress("Processing contacts...", current_tick, total_ticks)
+ current_tick += 1
friend = service.process_contact(contact)
if friend:
contact.add_mapping(service.get_id())
# give services a chance to create new contacts
for service in self._services:
print "create_contacts:", service.get_id()
- for friend in service.create_contacts():
+ to_create = service.get_friends_to_create_contacts_for()
+ tick_increment = len(contacts) / (len(to_create) or 1)
+ print tick_increment, to_create
+ for friend in to_create:
+ self._progress("Creating contacts...", current_tick, total_ticks)
+ current_tick += tick_increment
self.create_contact_from_friend(friend)
# finalisation
for service in self._services:
print "finalize:", service.get_id()
+ self._progress("Finalising...", current_tick, total_ticks)
+ current_tick += len(contacts)
service.finalise(self.updated, overwrite_existing_fields)
# commit changes
+ tick_increment = total_contacts / (len(self.updated) or 1)
+ print tick_increment, self.updated
for contact in self.updated:
print "committing changes to:", contact.get_name(), contact
+ self._progress("Saving changes...", current_tick, total_ticks)
+ current_tick += tick_increment
self.addresses.commit_contact(contact.get_econtact())
+
+ self._progress('Finished', 1, -1)
# -----------------------------------------------------------------------
econtact.props.family_name = friend['last_name']
contact = Contact(self.addresses, econtact)
- self.addresses.add_contact(contact)
+ self.addresses.add_contact(contact.get_econtact())
self.update_contact(contact, friend)
print "Created [%s]" % (contact.get_name())
saved = self.do_accounts()
if saved == gtk.RESPONSE_DELETE_EVENT:
return
+
+ print "doing sync", main
if main:
self.main_window.set_property('sensitive', False)
thread.start_new_thread(self.sync, (widget, force, False))
else:
try:
+ self.progress('', 0, 0)
services = []
for provider in enabled:
services.append(provider.service(self))
# -----------------------------------------------------------------------
- def progress(self, i, j, main = False):
+ def progress(self, msg, i, j, main = False):
"""Part of the GUI callback API."""
if main:
if i == 0:
self.progressbar = gtk.ProgressBar()
- self.progressnote = gtk.Dialog(_("Fetching friends' info"), self.main_window)
+ self.progressnote = gtk.Dialog(_("Initialising connections"), self.main_window)
self.progressnote.vbox.add(self.progressbar)
hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 1)
self.progressnote.show_all()
elif i < j:
- if i == 1:
- self.progressnote.set_title(_("Updating contacts"))
- hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 0)
+ self.progressnote.set_title(_(msg))
+ hildon.hildon_gtk_window_set_progress_indicator(self.progressnote, 0)
self.progressbar.set_fraction(float(i) / float(j))
else:
self.progressnote.destroy()
- print i,j
+ print msg, i,j
else:
- gobject.idle_add(self.progress, i, j, True)
+ gobject.idle_add(self.progress, msg, i, j, True)
# -----------------------------------------------------------------------