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