Fix overzealous matching on URL; and fix "Non-string URLs" from Twitter.
[hermes] / package / src / org / maemo / hermes / engine / friend.py
index 5ed9d21..632f33a 100644 (file)
@@ -27,7 +27,15 @@ class Friend():
     # public accessors -----------------
     
     def add_url(self, url):
-        self._add('url', url)
+       if url:
+           if not isinstance(url, basestring):
+               print url
+               raise Exception('Not valid to add non-string URLs')
+            self._add('url', url)
+    
+    def add_phone(self, phone):
+       if phone:
+            self._add('phone', phone)
         
     def get_birthday_date(self):
         return self._safe_get('bday')
@@ -50,6 +58,10 @@ class Friend():
     def get_urls(self):
         try: return self._multi_attributes['url'] 
         except: return []
+    
+    def get_phones(self):
+        try: return self._multi_attributes['phone'] 
+        except: return []
         
     def get_photo_url(self):
         return self._safe_get('photo-url')
@@ -91,22 +103,32 @@ class Friend():
                 self._add(key, value)
      
     def update_contact(self, contact, overwrite=False):
-        """
-        Updates the contact with information from this object,
-        without overwriting unless overwrite is set to True.
-        """
+        """Updates the contact with information from this object,
+           without overwriting unless overwrite is set to True.
+           Returns flag indicating if anything *was* changed."""
         
-        # FIXME: currently we overwrite everything 
-        self._if_defined('photo-url', contact.set_photo)
-        self._if_defined('nickname', contact.set_nickname)
+        def set_birthday(arg):
+            # Hackily assumes Facebook format (mm/d[/y])
+            date_str = arg.split('/')
+            date_str.append('0')
+            return contact.set_birthday(int(date_str[1]),
+                                        int(date_str[0]),
+                                        int(date_str[2]))
+
+        updated = False
+        if overwrite or contact.get_photo() is None:    updated += self._if_defined('photo-url', contact.set_photo)
+        if overwrite or contact.get_nickname() is None: updated += self._if_defined('nickname', contact.set_nickname)
+        if overwrite or contact.get_birthday() is None: updated += self._if_defined('bday', set_birthday)
         if self._multi_attributes.has_key('url'):
             for url in self._multi_attributes['url']:
-                contact.add_url(url)
+                updated += contact.add_url(url)
+
+        if self._multi_attributes.has_key('phone'):
+            for phone in self._multi_attributes['phone']:
+                updated += contact.add_phone(phone)
+                
+        return updated
 
-        def fixme(arg):
-            pass
-            #print "FIXME - birthday date needs to be parsed/fixed %s before calling contact.set_birthday" % arg
-        self._if_defined('bday', fixme)
 
     # private helpers -----------------------
     #
@@ -125,8 +147,7 @@ class Friend():
         return False
     
     def _if_defined(self, key, callback):
-        if self._attributes.has_key(key):
-            callback(self._attributes[key])
+        return self._attributes.has_key(key) and callback(self._attributes[key]) or False
     
     def _has(self, key):
         return self._attributes.has_key(key) or self._multi_attributes.has_key(key)