Hi all

I have a curious problem with a complex data replication issue.

Basically, we use SalesForce as a CRM system. We also have a bunch of
users who aren't allowed a SF license due to cost reasons, and they
interact with SF via our own Django website that communicates to SF
via an API.

With this API, we can CRUD all salesforce objects. We can also fetch
all changes since (specific time), so we maintain a local copy of all
our SF data in django models, synchronizing changes every 10 minutes
throughout the day. This actually works quite well!

The problem comes with using django idioms like get_or_create(), when
an object is created directly on SF in the period since the last
synchronization. In this example, we want to get_or_create a Contact
with a specific email address. There is no Contact locally with the
specified email address, so get_or_create tries to create a new one.

Using the API, this issues the appropriate query to SF, but since the
Contact already exists on SF, an exception is raised.

get_or_create(), create() all work via save(), so my idea is to catch
this specific error in save, re-synchronise the database against the
remote end, pull the freshly synced record out of the database, and
replace self.__dict__ with new_item.__dict__, looking something like
this:

  def save(self, *args, **kwargs):
      try:
          super(Contact, self).save(*args, **kwargs)
      except ValueError, e:
          if 'Contact already exists' in unicode(e):
              # Synchronize Contact objects with SF
              run_log = SyncRunLog(start_time=datetime.now())
              run_log.save()
              Contact.update(run_log)
              # The contact should now be available locally
              try:
                  synched_contact = Contact.objects.get(email=self.email)
                  self.__dict__ = synched_contact.__dict__
              except Contact.DoesNotExist:
                  # Still not there, raise a new ValueError
                  raise ValueError(
                          'Failed to find contact %s after resyncing '
                          'Contact following this error: %s'
                          % (self.email, unicode(e)))
          else:
              raise e

Is there an obvious issue with doing this? Can I simply replace
self.__dict__ like that without bad consequences?

Cheers

Tom

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to