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
):
11 namespace
= 'vcard-temp'
12 plugin_attrib
= 'vcard_temp'
13 interfaces
= set(['FN', 'VERSION'])
14 sub_interfaces
= set(['FN', 'VERSION'])
17 class Name(ElementBase
):
19 namespace
= 'vcard-temp'
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
)
28 self
._set
_sub
_text
(name
, value
, keep
=True)
32 def _get_component(self
, name
):
33 value
= self
._get
_sub
_text
(name
, '')
35 value
= [v
.strip() for v
in value
.split(',')]
38 def set_family(self
, value
):
39 self
._set
_component
('FAMILY', value
)
42 return self
._get
_component
('FAMILY')
44 def set_given(self
, value
):
45 self
._set
_component
('GIVEN', value
)
48 return self
._get
_component
('GIVEN')
50 def set_middle(self
, value
):
52 self
._set
_component
('MIDDLE', value
)
55 return self
._get
_component
('MIDDLE')
57 def set_prefix(self
, value
):
58 self
._set
_component
('PREFIX', value
)
61 return self
._get
_component
('PREFIX')
63 def set_suffix(self
, value
):
64 self
._set
_component
('SUFFIX', value
)
67 return self
._get
_component
('SUFFIX')
70 class Nickname(ElementBase
):
72 namespace
= 'vcard-temp'
74 plugin_multi_attrib
= 'nicknames'
75 interfaces
= set([name
])
78 def set_nickname(self
, value
):
83 if not isinstance(value
, list):
86 self
.xml
.text
= ','.join(value
)
88 def get_nickname(self
):
90 return self
.xml
.text
.split(',')
93 class Email(ElementBase
):
95 namespace
= 'vcard-temp'
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
):
105 namespace
= 'vcard-temp'
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
):
118 namespace
= 'vcard-temp'
120 plugin_multi_attrib
= 'telephone_numbers'
121 interfaces
= set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG',
122 'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS',
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
):
142 namespace
= 'vcard-temp'
144 plugin_multi_attrib
= 'labels'
145 interfaces
= set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT',
147 bool_interfaces
= set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM',
150 def add_line(self
, value
):
151 line
= ET
.Element('{%s}LINE' % self
.namespace
)
153 self
.xml
.append(line
)
156 lines
= self
.xml
.find('{%s}LINE' % self
.namespace
)
159 return [line
.text
for line
in lines
]
161 def set_lines(self
, values
):
167 lines
= self
.xml
.find('{%s}LINE' % self
.namespace
)
171 self
.xml
.remove(line
)
174 class Geo(ElementBase
):
176 namespace
= 'vcard-temp'
178 plugin_multi_attrib
= 'geolocations'
179 interfaces
= set(['LAT', 'LON'])
180 sub_interfaces
= interfaces
183 class Org(ElementBase
):
185 namespace
= 'vcard-temp'
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
)
194 self
.xml
.append(orgunit
)
196 def get_orgunits(self
):
197 orgunits
= self
.xml
.find('{%s}ORGUNIT' % self
.namespace
)
200 return [orgunit
.text
for orgunit
in orgunits
]
202 def set_orgunits(self
, values
):
204 for orgunit
in values
:
205 self
.add_orgunit(orgunit
)
207 def del_orgunits(self
):
208 orgunits
= self
.xml
.find('{%s}ORGUNIT' % self
.namespace
)
211 for orgunit
in orgunits
:
212 self
.xml
.remove(orgunit
)
215 class Photo(ElementBase
):
217 namespace
= 'vcard-temp'
219 plugin_multi_attrib
= 'photos'
220 interfaces
= set(['TYPE', 'EXTVAL'])
221 sub_interfaces
= interfaces
224 class Logo(ElementBase
):
226 namespace
= 'vcard-temp'
228 plugin_multi_attrib
= 'logos'
229 interfaces
= set(['TYPE', 'EXTVAL'])
230 sub_interfaces
= interfaces
233 class Sound(ElementBase
):
235 namespace
= 'vcard-temp'
237 plugin_multi_attrib
= 'sounds'
238 interfaces
= set(['PHONETC', 'EXTVAL'])
239 sub_interfaces
= interfaces
242 class BinVal(ElementBase
):
244 namespace
= 'vcard-temp'
246 interfaces
= set(['BINVAL'])
249 def setup(self
, xml
=None):
250 self
.xml
= ET
.Element('')
253 def set_binval(self
, value
):
255 parent
= self
.parent()
257 xml
= ET
.Element('{%s}BINVAL' % self
.namespace
)
258 xml
.text
= bytes(base64
.b64encode(value
)).decode('utf-8')
261 def get_binval(self
):
262 parent
= self
.parent()
263 xml
= parent
.find('{%s}BINVAL' % self
.namespace
)
265 return base64
.b64decode(bytes(xml
.text
))
268 def del_binval(self
):
269 self
.parent()._del
_sub
('{%s}BINVAL' % self
.namespace
)
272 class Classification(ElementBase
):
274 namespace
= 'vcard-temp'
276 plugin_multi_attrib
= 'classifications'
277 interfaces
= set(['PUBLIC', 'PRIVATE', 'CONFIDENTIAL'])
278 bool_interfaces
= interfaces
281 class Categories(ElementBase
):
283 namespace
= 'vcard-temp'
285 plugin_multi_attrib
= 'categories'
286 interfaces
= set([name
])
289 def set_categories(self
, values
):
290 self
.del_categories()
291 for keyword
in values
:
292 item
= ET
.Element('{%s}KEYWORD' % self
.namespace
)
294 self
.xml
.append(item
)
296 def get_categories(self
):
297 items
= self
.xml
.findall('{%s}KEYWORD' % self
.namespace
)
302 keywords
.append(item
.text
)
305 def del_categories(self
):
306 items
= self
.xml
.findall('{%s}KEYWORD' % self
.namespace
)
308 self
.xml
.remove(item
)
311 class Birthday(ElementBase
):
313 namespace
= 'vcard-temp'
315 plugin_multi_attrib
= 'birthdays'
316 interfaces
= set([name
])
319 def set_bday(self
, value
):
320 if isinstance(value
, dt
.datetime
):
321 value
= xep_0082
.format_datetime(value
)
322 self
.xml
.text
= value
325 if not self
.xml
.text
:
327 return xep_0082
.parse(self
.xml
.text
)
330 class Rev(ElementBase
):
332 namespace
= 'vcard-temp'
334 plugin_multi_attrib
= 'revision_dates'
335 interfaces
= set([name
])
338 def set_rev(self
, value
):
339 if isinstance(value
, dt
.datetime
):
340 value
= xep_0082
.format_datetime(value
)
341 self
.xml
.text
= value
344 if not self
.xml
.text
:
346 return xep_0082
.parse(self
.xml
.text
)
349 class Title(ElementBase
):
351 namespace
= 'vcard-temp'
353 plugin_multi_attrib
= 'titles'
354 interfaces
= set([name
])
357 def set_title(self
, value
):
358 self
.xml
.text
= value
364 class Role(ElementBase
):
366 namespace
= 'vcard-temp'
368 plugin_multi_attrib
= 'roles'
369 interfaces
= set([name
])
372 def set_role(self
, value
):
373 self
.xml
.text
= value
379 class Note(ElementBase
):
381 namespace
= 'vcard-temp'
383 plugin_multi_attrib
= 'notes'
384 interfaces
= set([name
])
387 def set_note(self
, value
):
388 self
.xml
.text
= value
394 class Desc(ElementBase
):
396 namespace
= 'vcard-temp'
398 plugin_multi_attrib
= 'descriptions'
399 interfaces
= set([name
])
402 def set_desc(self
, value
):
403 self
.xml
.text
= value
409 class URL(ElementBase
):
411 namespace
= 'vcard-temp'
413 plugin_multi_attrib
= 'urls'
414 interfaces
= set([name
])
417 def set_url(self
, value
):
418 self
.xml
.text
= value
424 class UID(ElementBase
):
426 namespace
= 'vcard-temp'
428 plugin_multi_attrib
= 'uids'
429 interfaces
= set([name
])
432 def set_uid(self
, value
):
433 self
.xml
.text
= value
439 class ProdID(ElementBase
):
441 namespace
= 'vcard-temp'
443 plugin_multi_attrib
= 'product_ids'
444 interfaces
= set([name
])
447 def set_prodid(self
, value
):
448 self
.xml
.text
= value
450 def get_prodid(self
):
454 class Mailer(ElementBase
):
456 namespace
= 'vcard-temp'
458 plugin_multi_attrib
= 'mailers'
459 interfaces
= set([name
])
462 def set_mailer(self
, value
):
463 self
.xml
.text
= value
465 def get_mailer(self
):
469 class SortString(ElementBase
):
471 namespace
= 'vcard-temp'
472 plugin_attrib
= 'SORT_STRING'
473 plugin_multi_attrib
= 'sort_strings'
474 interfaces
= set([name
])
477 def set_sort_string(self
, value
):
478 self
.xml
.text
= value
480 def get_sort_string(self
):
484 class Agent(ElementBase
):
486 namespace
= 'vcard-temp'
488 plugin_multi_attrib
= 'agents'
489 interfaces
= set(['EXTVAL'])
490 sub_interfaces
= interfaces
493 class JabberID(ElementBase
):
495 namespace
= 'vcard-temp'
497 plugin_multi_attrib
= 'jids'
498 interfaces
= set([name
])
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
):
510 namespace
= 'vcard-temp'
512 plugin_multi_attrib
= 'timezones'
513 interfaces
= set([name
])
516 def set_tz(self
, value
):
517 time
= xep_0082
.time(offset
=value
)
521 self
.xml
.text
= time
[-6:]
524 if not self
.xml
.text
:
525 return xep_0082
.tzutc()
526 time
= xep_0082
.parse('00:00:00%s' % self
.xml
.text
)
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
)