merge, moved tests around
[hermes] / package / src / org / maemo / hermes / engine / friend.py
1 class Friend():
2     
3     def __init__(self, name, source=None):
4         """ source is source service, such as LinkedIn """
5         self._attributes = { "fn": name }
6         self._multi_attributes = {}
7         self._source = source 
8         
9     def __unicode__(self):
10         return self.__repr__()
11     
12     def __repr__(self):
13         return "Friend %s" % self._attributes['fn']
14     
15     # public accessors -----------------
16     
17     def get_name(self):
18         return self._attributes['fn']
19     
20     def get_nickname(self):
21         return self._attributes["nickname"]
22     
23     def add_url(self, url):
24         self._add('url', url)
25         
26     def is_empty(self):
27         for a in self._attributes:
28             return False
29         for a in self._multi_attributes:
30             return False
31         return True
32     
33     def has_birthday_date(self):
34         return self._has('bday')
35     
36     def set_name(self, name):
37         self._set('fn', name)
38     
39     def set_nickname(self, nickname):
40         self._set('nickname', nickname)
41         
42     def set_birthday_date(self, date):
43         self._set('bday', date)
44         
45     def set_photo_url(self, url):
46         self._set('photo-url', url)
47     
48     def update(self, other_friend):
49         """
50         Overwrites any attributes in this friend, with attributes from other_friend
51         """
52         
53         self._attributes.update(other_friend._attributes)
54         
55         for key in other_friend._multi_attributes.keys():
56             for value in other_friend._multi_attributes[key]:
57                 self._add(key, value)
58      
59     def update_contact(self, contact, overwrite=False):
60         """
61         Updates the contact with information from this object,
62         without overwriting unless overwrite is set to True.
63         """
64         
65         # FIXME: currently we overwrite everything 
66         self._if_defined('photo-url', contact.set_photo)
67         self._if_defined('nickname', contact.set_nickname)
68         if self._multi_attributes.has_key('url'):
69             for url in self._multi_attributes['url']:
70                 contact.add_url(url)
71
72         def fixme(arg):
73             pass
74             #print "FIXME - birthday date needs to be parsed/fixed %s before calling contact.set_birthday" % arg
75         self._if_defined('bday', fixme)
76
77     # private helpers -----------------------
78     #
79     def _if_defined(self, key, callback):
80         if self._attributes.has_key(key):
81             callback(self._attributes[key])
82     
83     def _set(self, key, value):
84         if value is not None:
85 #            print "%s SET %s to %s" % (self, key, value)
86             self._attributes[key] = value
87     
88     def _add(self, key, value):
89         if value is not None:
90             if not self._multi_attributes.has_key(key):
91                 self._multi_attributes[key] = []
92 #            print "%s ADD %s to %s" % (self, key, value)
93             self._multi_attributes[key].append(value)
94     
95     def _has(self, key):
96         return self._attributes.has_key(key) or self._multi_attributes.has_key(key)
97     
98     def _contains(self, key, value):
99         if self._attributes.has_key(key):
100             return value == self._attributes[key]
101         if self._multi_attributes.has_key(key):
102             return value in self._multi_attributes[key]
103         return False