Add birthday parsing/setting.
[hermes] / package / src / org / maemo / hermes / engine / friend.py
index 0264aaa..c1347be 100644 (file)
@@ -1,20 +1,62 @@
 class Friend():
+    """Encapsulate the data from a remote service.
     
-    def __init__(self, name):
-        self._attributes = { "fn": name }
+       Copyright (c) Fredrik Wendt <fredrik@wendt.se> 2010.
+       Released under the Artistic Licence."""
+
+    
+    def __init__(self, name=None, source=None, props=None):
+        """ source is source service, such as LinkedIn """
+        self._attributes = {};
+        if name: self._set('fn', name)
         self._multi_attributes = {}
+        self._source = source
+        if props:
+            for key in props:
+                self._set(key, props[key])
         
+    def __getitem__(self, key):
+        return self._safe_get(key)
+                              
     def __unicode__(self):
         return self.__repr__()
     
     def __repr__(self):
-        return "Friend %s" % self._attributes['fn']
+        return "Friend %s" % self.get_name()
     
     # public accessors -----------------
     
     def add_url(self, url):
         self._add('url', url)
         
+    def get_birthday_date(self):
+        return self._safe_get('bday')
+    
+    def get_contact(self):
+        return self._safe_get('contact')
+    
+    def get_name(self):
+        return self._safe_get('fn')
+    
+    def get_source(self):
+        return self._source
+    
+    def set_source(self, source):
+        self._source = source
+    
+    def get_nickname(self):
+        return self._safe_get("nickname")
+    
+    def get_urls(self):
+        try: return self._multi_attributes['url'] 
+        except: return []
+        
+    def get_photo_url(self):
+        return self._safe_get('photo-url')
+    
+    def has_birthday_date(self):
+        return self._has('bday')
+    
     def is_empty(self):
         for a in self._attributes:
             return False
@@ -22,9 +64,6 @@ class Friend():
             return False
         return True
     
-    def has_birthday_date(self):
-        return self._has('bday')
-    
     def set_name(self, name):
         self._set('fn', name)
     
@@ -34,10 +73,13 @@ class Friend():
     def set_birthday_date(self, date):
         self._set('bday', date)
         
+    def set_contact(self, contact):
+        self._set('contact', contact)
+        
     def set_photo_url(self, url):
         self._set('photo-url', url)
     
-    def update(self, other_friend):
+    def update_from_friend(self, other_friend, overwrite=False):
         """
         Overwrites any attributes in this friend, with attributes from other_friend
         """
@@ -49,34 +91,31 @@ 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
+            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)
+                
+        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 -----------------------
     #
-    def _if_defined(self, key, callback):
-        if self._attributes.has_key(key):
-            callback(self._attributes[key])
-    
-    def _set(self, key, value):
-        if value is not None:
-#            print "%s SET %s to %s" % (self, key, value)
-            self._attributes[key] = value
-    
     def _add(self, key, value):
         if value is not None:
             if not self._multi_attributes.has_key(key):
@@ -84,6 +123,25 @@ class Friend():
 #            print "%s ADD %s to %s" % (self, key, value)
             self._multi_attributes[key].append(value)
     
+    def _contains(self, key, value):
+        if self._attributes.has_key(key):
+            return value == self._attributes[key]
+        if self._multi_attributes.has_key(key):
+            return value in self._multi_attributes[key]
+        return False
+    
+    def _if_defined(self, key, callback):
+        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)
-
+    
+    def _safe_get(self, key):
+        try: return self._attributes[key]
+        except: return None
+        
+    def _set(self, key, value):
+        if value is not None:
+#            print "%s SET %s to %s" % (self, key, value)
+            self._attributes[key] = value
+