Bump to 1.3.1
[slixmpp.git] / sleekxmpp / plugins / xep_0054 / stanza.py
blob72da0b512fed810bf78f5c27a9d8cb7aa5dbc2e4
1 import base64
2 import datetime as dt
4 from sleekxmpp.util import bytes
5 from sleekxmpp.xmlstream import ElementBase, ET, register_stanza_plugin, JID
6 from sleekxmpp.plugins import xep_0082
9 class VCardTemp(ElementBase):
10 name = 'vCard'
11 namespace = 'vcard-temp'
12 plugin_attrib = 'vcard_temp'
13 interfaces = set(['FN', 'VERSION'])
14 sub_interfaces = set(['FN', 'VERSION'])
17 class Name(ElementBase):
18 name = 'N'
19 namespace = 'vcard-temp'
20 plugin_attrib = name
21 interfaces = set(['FAMILY', 'GIVEN', 'MIDDLE', 'PREFIX', 'SUFFIX'])
22 sub_interfaces = interfaces
24 def _set_component(self, name, value):
25 if isinstance(value, list):
26 value = ','.join(value)
27 if value is not None:
28 self._set_sub_text(name, value, keep=True)
29 else:
30 self._del_sub(name)
32 def _get_component(self, name):
33 value = self._get_sub_text(name, '')
34 if ',' in value:
35 value = [v.strip() for v in value.split(',')]
36 return value
38 def set_family(self, value):
39 self._set_component('FAMILY', value)
41 def get_family(self):
42 return self._get_component('FAMILY')
44 def set_given(self, value):
45 self._set_component('GIVEN', value)
47 def get_given(self):
48 return self._get_component('GIVEN')
50 def set_middle(self, value):
51 print(value)
52 self._set_component('MIDDLE', value)
54 def get_middle(self):
55 return self._get_component('MIDDLE')
57 def set_prefix(self, value):
58 self._set_component('PREFIX', value)
60 def get_prefix(self):
61 return self._get_component('PREFIX')
63 def set_suffix(self, value):
64 self._set_component('SUFFIX', value)
66 def get_suffix(self):
67 return self._get_component('SUFFIX')
70 class Nickname(ElementBase):
71 name = 'NICKNAME'
72 namespace = 'vcard-temp'
73 plugin_attrib = name
74 plugin_multi_attrib = 'nicknames'
75 interfaces = set([name])
76 is_extension = True
78 def set_nickname(self, value):
79 if not value:
80 self.xml.text = ''
81 return
83 if not isinstance(value, list):
84 value = [value]
86 self.xml.text = ','.join(value)
88 def get_nickname(self):
89 if self.xml.text:
90 return self.xml.text.split(',')
93 class Email(ElementBase):
94 name = 'EMAIL'
95 namespace = 'vcard-temp'
96 plugin_attrib = name
97 plugin_multi_attrib = 'emails'
98 interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400', 'USERID'])
99 sub_interfaces = set(['USERID'])
100 bool_interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400'])
103 class Address(ElementBase):
104 name = 'ADR'
105 namespace = 'vcard-temp'
106 plugin_attrib = name
107 plugin_multi_attrib = 'addresses'
108 interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INTL',
109 'PREF', 'POBOX', 'EXTADD', 'STREET', 'LOCALITY',
110 'REGION', 'PCODE', 'CTRY'])
111 sub_interfaces = set(['POBOX', 'EXTADD', 'STREET', 'LOCALITY',
112 'REGION', 'PCODE', 'CTRY'])
113 bool_interfaces = set(['HOME', 'WORK', 'DOM', 'INTL', 'PREF'])
116 class Telephone(ElementBase):
117 name = 'TEL'
118 namespace = 'vcard-temp'
119 plugin_attrib = name
120 plugin_multi_attrib = 'telephone_numbers'
121 interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG',
122 'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS',
123 'PREF', 'NUMBER'])
124 sub_interfaces = set(['NUMBER'])
125 bool_interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER',
126 'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM',
127 'ISDN', 'PCS', 'PREF'])
129 def setup(self, xml=None):
130 super(Telephone, self).setup(xml=xml)
131 self._set_sub_text('NUMBER', '', keep=True)
133 def set_number(self, value):
134 self._set_sub_text('NUMBER', value, keep=True)
136 def del_number(self):
137 self._set_sub_text('NUMBER', '', keep=True)
140 class Label(ElementBase):
141 name = 'LABEL'
142 namespace = 'vcard-temp'
143 plugin_attrib = name
144 plugin_multi_attrib = 'labels'
145 interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT',
146 'PREF', 'lines'])
147 bool_interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM',
148 'INT', 'PREF'])
150 def add_line(self, value):
151 line = ET.Element('{%s}LINE' % self.namespace)
152 line.text = value
153 self.xml.append(line)
155 def get_lines(self):
156 lines = self.xml.find('{%s}LINE' % self.namespace)
157 if lines is None:
158 return []
159 return [line.text for line in lines]
161 def set_lines(self, values):
162 self.del_lines()
163 for line in values:
164 self.add_line(line)
166 def del_lines(self):
167 lines = self.xml.find('{%s}LINE' % self.namespace)
168 if lines is None:
169 return
170 for line in lines:
171 self.xml.remove(line)
174 class Geo(ElementBase):
175 name = 'GEO'
176 namespace = 'vcard-temp'
177 plugin_attrib = name
178 plugin_multi_attrib = 'geolocations'
179 interfaces = set(['LAT', 'LON'])
180 sub_interfaces = interfaces
183 class Org(ElementBase):
184 name = 'ORG'
185 namespace = 'vcard-temp'
186 plugin_attrib = name
187 plugin_multi_attrib = 'organizations'
188 interfaces = set(['ORGNAME', 'ORGUNIT', 'orgunits'])
189 sub_interfaces = set(['ORGNAME', 'ORGUNIT'])
191 def add_orgunit(self, value):
192 orgunit = ET.Element('{%s}ORGUNIT' % self.namespace)
193 orgunit.text = value
194 self.xml.append(orgunit)
196 def get_orgunits(self):
197 orgunits = self.xml.find('{%s}ORGUNIT' % self.namespace)
198 if orgunits is None:
199 return []
200 return [orgunit.text for orgunit in orgunits]
202 def set_orgunits(self, values):
203 self.del_orgunits()
204 for orgunit in values:
205 self.add_orgunit(orgunit)
207 def del_orgunits(self):
208 orgunits = self.xml.find('{%s}ORGUNIT' % self.namespace)
209 if orgunits is None:
210 return
211 for orgunit in orgunits:
212 self.xml.remove(orgunit)
215 class Photo(ElementBase):
216 name = 'PHOTO'
217 namespace = 'vcard-temp'
218 plugin_attrib = name
219 plugin_multi_attrib = 'photos'
220 interfaces = set(['TYPE', 'EXTVAL'])
221 sub_interfaces = interfaces
224 class Logo(ElementBase):
225 name = 'LOGO'
226 namespace = 'vcard-temp'
227 plugin_attrib = name
228 plugin_multi_attrib = 'logos'
229 interfaces = set(['TYPE', 'EXTVAL'])
230 sub_interfaces = interfaces
233 class Sound(ElementBase):
234 name = 'SOUND'
235 namespace = 'vcard-temp'
236 plugin_attrib = name
237 plugin_multi_attrib = 'sounds'
238 interfaces = set(['PHONETC', 'EXTVAL'])
239 sub_interfaces = interfaces
242 class BinVal(ElementBase):
243 name = 'BINVAL'
244 namespace = 'vcard-temp'
245 plugin_attrib = name
246 interfaces = set(['BINVAL'])
247 is_extension = True
249 def setup(self, xml=None):
250 self.xml = ET.Element('')
251 return True
253 def set_binval(self, value):
254 self.del_binval()
255 parent = self.parent()
256 if value:
257 xml = ET.Element('{%s}BINVAL' % self.namespace)
258 xml.text = bytes(base64.b64encode(value)).decode('utf-8')
259 parent.append(xml)
261 def get_binval(self):
262 parent = self.parent()
263 xml = parent.find('{%s}BINVAL' % self.namespace)
264 if xml is not None:
265 return base64.b64decode(bytes(xml.text))
266 return b''
268 def del_binval(self):
269 self.parent()._del_sub('{%s}BINVAL' % self.namespace)
272 class Classification(ElementBase):
273 name = 'CLASS'
274 namespace = 'vcard-temp'
275 plugin_attrib = name
276 plugin_multi_attrib = 'classifications'
277 interfaces = set(['PUBLIC', 'PRIVATE', 'CONFIDENTIAL'])
278 bool_interfaces = interfaces
281 class Categories(ElementBase):
282 name = 'CATEGORIES'
283 namespace = 'vcard-temp'
284 plugin_attrib = name
285 plugin_multi_attrib = 'categories'
286 interfaces = set([name])
287 is_extension = True
289 def set_categories(self, values):
290 self.del_categories()
291 for keyword in values:
292 item = ET.Element('{%s}KEYWORD' % self.namespace)
293 item.text = keyword
294 self.xml.append(item)
296 def get_categories(self):
297 items = self.xml.findall('{%s}KEYWORD' % self.namespace)
298 if items is None:
299 return []
300 keywords = []
301 for item in items:
302 keywords.append(item.text)
303 return keywords
305 def del_categories(self):
306 items = self.xml.findall('{%s}KEYWORD' % self.namespace)
307 for item in items:
308 self.xml.remove(item)
311 class Birthday(ElementBase):
312 name = 'BDAY'
313 namespace = 'vcard-temp'
314 plugin_attrib = name
315 plugin_multi_attrib = 'birthdays'
316 interfaces = set([name])
317 is_extension = True
319 def set_bday(self, value):
320 if isinstance(value, dt.datetime):
321 value = xep_0082.format_datetime(value)
322 self.xml.text = value
324 def get_bday(self):
325 if not self.xml.text:
326 return None
327 return xep_0082.parse(self.xml.text)
330 class Rev(ElementBase):
331 name = 'REV'
332 namespace = 'vcard-temp'
333 plugin_attrib = name
334 plugin_multi_attrib = 'revision_dates'
335 interfaces = set([name])
336 is_extension = True
338 def set_rev(self, value):
339 if isinstance(value, dt.datetime):
340 value = xep_0082.format_datetime(value)
341 self.xml.text = value
343 def get_rev(self):
344 if not self.xml.text:
345 return None
346 return xep_0082.parse(self.xml.text)
349 class Title(ElementBase):
350 name = 'TITLE'
351 namespace = 'vcard-temp'
352 plugin_attrib = name
353 plugin_multi_attrib = 'titles'
354 interfaces = set([name])
355 is_extension = True
357 def set_title(self, value):
358 self.xml.text = value
360 def get_title(self):
361 return self.xml.text
364 class Role(ElementBase):
365 name = 'ROLE'
366 namespace = 'vcard-temp'
367 plugin_attrib = name
368 plugin_multi_attrib = 'roles'
369 interfaces = set([name])
370 is_extension = True
372 def set_role(self, value):
373 self.xml.text = value
375 def get_role(self):
376 return self.xml.text
379 class Note(ElementBase):
380 name = 'NOTE'
381 namespace = 'vcard-temp'
382 plugin_attrib = name
383 plugin_multi_attrib = 'notes'
384 interfaces = set([name])
385 is_extension = True
387 def set_note(self, value):
388 self.xml.text = value
390 def get_note(self):
391 return self.xml.text
394 class Desc(ElementBase):
395 name = 'DESC'
396 namespace = 'vcard-temp'
397 plugin_attrib = name
398 plugin_multi_attrib = 'descriptions'
399 interfaces = set([name])
400 is_extension = True
402 def set_desc(self, value):
403 self.xml.text = value
405 def get_desc(self):
406 return self.xml.text
409 class URL(ElementBase):
410 name = 'URL'
411 namespace = 'vcard-temp'
412 plugin_attrib = name
413 plugin_multi_attrib = 'urls'
414 interfaces = set([name])
415 is_extension = True
417 def set_url(self, value):
418 self.xml.text = value
420 def get_url(self):
421 return self.xml.text
424 class UID(ElementBase):
425 name = 'UID'
426 namespace = 'vcard-temp'
427 plugin_attrib = name
428 plugin_multi_attrib = 'uids'
429 interfaces = set([name])
430 is_extension = True
432 def set_uid(self, value):
433 self.xml.text = value
435 def get_uid(self):
436 return self.xml.text
439 class ProdID(ElementBase):
440 name = 'PRODID'
441 namespace = 'vcard-temp'
442 plugin_attrib = name
443 plugin_multi_attrib = 'product_ids'
444 interfaces = set([name])
445 is_extension = True
447 def set_prodid(self, value):
448 self.xml.text = value
450 def get_prodid(self):
451 return self.xml.text
454 class Mailer(ElementBase):
455 name = 'MAILER'
456 namespace = 'vcard-temp'
457 plugin_attrib = name
458 plugin_multi_attrib = 'mailers'
459 interfaces = set([name])
460 is_extension = True
462 def set_mailer(self, value):
463 self.xml.text = value
465 def get_mailer(self):
466 return self.xml.text
469 class SortString(ElementBase):
470 name = 'SORT-STRING'
471 namespace = 'vcard-temp'
472 plugin_attrib = 'SORT_STRING'
473 plugin_multi_attrib = 'sort_strings'
474 interfaces = set([name])
475 is_extension = True
477 def set_sort_string(self, value):
478 self.xml.text = value
480 def get_sort_string(self):
481 return self.xml.text
484 class Agent(ElementBase):
485 name = 'AGENT'
486 namespace = 'vcard-temp'
487 plugin_attrib = name
488 plugin_multi_attrib = 'agents'
489 interfaces = set(['EXTVAL'])
490 sub_interfaces = interfaces
493 class JabberID(ElementBase):
494 name = 'JABBERID'
495 namespace = 'vcard-temp'
496 plugin_attrib = name
497 plugin_multi_attrib = 'jids'
498 interfaces = set([name])
499 is_extension = True
501 def set_jabberid(self, value):
502 self.xml.text = JID(value).bare
504 def get_jabberid(self):
505 return JID(self.xml.text)
508 class TimeZone(ElementBase):
509 name = 'TZ'
510 namespace = 'vcard-temp'
511 plugin_attrib = name
512 plugin_multi_attrib = 'timezones'
513 interfaces = set([name])
514 is_extension = True
516 def set_tz(self, value):
517 time = xep_0082.time(offset=value)
518 if time[-1] == 'Z':
519 self.xml.text = 'Z'
520 else:
521 self.xml.text = time[-6:]
523 def get_tz(self):
524 if not self.xml.text:
525 return xep_0082.tzutc()
526 time = xep_0082.parse('00:00:00%s' % self.xml.text)
527 return time.tzinfo
530 register_stanza_plugin(VCardTemp, Name)
531 register_stanza_plugin(VCardTemp, Address, iterable=True)
532 register_stanza_plugin(VCardTemp, Agent, iterable=True)
533 register_stanza_plugin(VCardTemp, Birthday, iterable=True)
534 register_stanza_plugin(VCardTemp, Categories, iterable=True)
535 register_stanza_plugin(VCardTemp, Desc, iterable=True)
536 register_stanza_plugin(VCardTemp, Email, iterable=True)
537 register_stanza_plugin(VCardTemp, Geo, iterable=True)
538 register_stanza_plugin(VCardTemp, JabberID, iterable=True)
539 register_stanza_plugin(VCardTemp, Label, iterable=True)
540 register_stanza_plugin(VCardTemp, Logo, iterable=True)
541 register_stanza_plugin(VCardTemp, Mailer, iterable=True)
542 register_stanza_plugin(VCardTemp, Note, iterable=True)
543 register_stanza_plugin(VCardTemp, Nickname, iterable=True)
544 register_stanza_plugin(VCardTemp, Org, iterable=True)
545 register_stanza_plugin(VCardTemp, Photo, iterable=True)
546 register_stanza_plugin(VCardTemp, ProdID, iterable=True)
547 register_stanza_plugin(VCardTemp, Rev, iterable=True)
548 register_stanza_plugin(VCardTemp, Role, iterable=True)
549 register_stanza_plugin(VCardTemp, SortString, iterable=True)
550 register_stanza_plugin(VCardTemp, Sound, iterable=True)
551 register_stanza_plugin(VCardTemp, Telephone, iterable=True)
552 register_stanza_plugin(VCardTemp, Title, iterable=True)
553 register_stanza_plugin(VCardTemp, TimeZone, iterable=True)
554 register_stanza_plugin(VCardTemp, UID, iterable=True)
555 register_stanza_plugin(VCardTemp, URL, iterable=True)
557 register_stanza_plugin(Photo, BinVal)
558 register_stanza_plugin(Logo, BinVal)
559 register_stanza_plugin(Sound, BinVal)
561 register_stanza_plugin(Agent, VCardTemp)