X-Git-Url: https://source.tree.se/git?p=treecutter.git;a=blobdiff_plain;f=xinclude%2Fcontact.py;h=c6d8034344fb903216239eed4c889f7bded73e02;hp=e7e0ab32820a0127f7344fd8b88b310cde60e5c1;hb=0f1c9ee184a72059adccdd8d197f16017af4888f;hpb=676fd9d928d47c787b38ca66011de179ae034beb diff --git a/xinclude/contact.py b/xinclude/contact.py index e7e0ab3..c6d8034 100755 --- a/xinclude/contact.py +++ b/xinclude/contact.py @@ -1,145 +1,181 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -from vobject import readComponents import sys -from address import Address + +from vobject import readComponents from geohash import encode +from urlparse import urlparse +from getpass import getpass +from lxml import etree +from lxml.builder import ElementMaker -for arg in sys.argv[1:]: - al = arg.split("=") - if al[0] == "lang": - lang = al[1] - if al[0] == "xptr": - argument = al[1] - -(cards,query) = argument.split('?') -(key, name) = query.split(':') -with open(cards, 'r') as f: - card_data = f.read() -f.closed - -# Scan for the correct card -found = None -out = u'' -for card in readComponents(card_data): -# card.prettyPrint() - if key in card.contents.keys(): - if name.decode('utf-8') == card.contents[key][0].value[0]: - found = card - if key == 'firstname': - if name.decode('utf-8') == card.n.value.given: - found = card - if key == 'surname': - if name.decode('utf-8') == card.n.value.family: - found = card - -if not found: - print query+' failed in '+cards - exit(2) -# when card is found parse it to docbook. -pn = '' - -if 'n' in found.contents.keys(): - n = found.n.value - empty = n.prefix == '' and n.given == '' and \ - n.additional =='' and n.family =='' and n.suffix == '' - if not empty: - pn += '' - if n.prefix != '': - pn += ''+n.prefix+' ' - if n.given != '': - pn += ''+n.given+' ' - if n.additional != '': - pn += ''+n.additional+' ' - if n.family != '': - pn += ''+n.family+' ' - if n.suffix != '': - pn += ''+n.suffix+' ' - pn += '' - -ad = '' -if 'adr' in found.contents.keys(): - for a, t in zip(found.contents['adr'],found.contents['tel']): - ad += '\n
' - if a.value.street != '': - ad += ''+a.value.street+'' - if a.value.code != '': - ad += ''+a.value.code+' ' - if a.value.city != '': - ad += ''+a.value.city+'' - if a.value.country != '': - ad += ''+a.value.country+'' - if t.value != '': - ad += ''+t.value+'' - ad += '
' - geostr = u''+a.value.street+', '+a.value.city+', '+a.value.country - (lat,lon) = geocode(geostr.encode('utf-8')) - mapimage([(float(lat),float(lon))]) - ad += maplink(lat,lon) - -o = '' -if 'org' in found.contents.keys(): - o = ''' - - '''+found.org.value[0]+''' - '''+ad+''' - ''' - - -url = '' -if 'url' in found.contents.keys(): - url += ' ' - -geo = '' -#if 'geo' in found.contents.keys(): -# (lat,lon) = found.geo.value.split(';') -# mapimage([(float(lat),float(lon))]) -# # create picture -# geo += maplink(lat,lon) - - -# Turn off email for now -email = '' -#if 'email' in found.contents.keys(): -# email += ''+found.email.value+'' - -if empty: - content = pn+o+url+geo+email -else: - if o == '': - content = ''+pn+ad+url+geo+email+'' - else: - content = ''+pn+''+o+''+url+geo+email+ \ - '' -out = ''' - - '''+content+''' - -''' - -ex =''' -
- Street - Postcode City - Country - +1 123 456 789 -
- - Occupation - - Organization -
- Street - Postcode City - Country - +1 123 456 789 -
-
-
- - -''' - -sys.stdout.write(out.encode('utf-8')) +from address import Address +from treecutter import constants as const + +class Contacts(object): + def __init__(self, uri): + self.uri = uri + self.card_data = None + if uri.scheme == 'file': + with open(self.uri.path, 'r') as f: + self.card_data = f.read() + f.closed + if uri.scheme == 'http': + pw = getpass() + print "http not yet implemented" + if uri.scheme == 'https': + print "https not yet implemented" + + def filter(self,query): + (key, name) = query.split(':') + card = None + for c in readComponents(self.card_data): + if key in c.contents.keys(): + if name.decode('utf-8') == c.contents[key][0].value[0]: + card = c + if key == 'firstname': + if name.decode('utf-8') == c.n.value.given: + card = c + if key == 'surname': + if name.decode('utf-8') == c.n.value.family: + card = c + return Contact(card) + +class Contact(object): + def __init__(self,card): + self.card = card + self.person = None + self.organization = Organization('') + self.address = [] + self.phone = '' + self.jobtitle = '' + self.url = '' + self.email = '' + self.parsecard() + + def parsecard(self): + if 'n' in self.card.contents.keys(): + n = self.card.n.value + empty = n.prefix == '' and n.given == '' and \ + n.additional =='' and n.family =='' and n.suffix == '' + if not empty: + self.person = Person(n.given,n.family, + n.prefix,n.additional,n.suffix) + if 'title' in self.card.contents.keys(): + self.jobtitle = self.card.title.value + + if 'org' in self.card.contents.keys(): + self.organization = Organization(self.card.org.value[0]) + + for av in self.card.contents['adr']: + a = av.value + addr = Address(a.street,a.code,a.city,a.country) + if av.type_param == 'work': + self.organization.add_address(addr) + if av.type_param == 'home': + self.address.append(addr) + addr.geocode() + + for i,t in enumerate(self.card.contents['tel']): + if av.type_param == 'cell': # Does not exist ? + self.phone = t.value + if av.type_param == 'work': + self.organization.add_phone(i,t.value) + if av.type_param == 'home': + self.address[i].add_phone(t.value) + + if 'url' in self.card.contents.keys(): + self.url = self.card.url.value + +# if 'email' in self.card.contents.keys(): +# self.email = self.card.email.value + + + def db_xml(self): + db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP) + if self.person: + pers = db.person(self.person.db_xml(),db.phone(self.phone)) + for a in self.address: + pers.append(a.db_xml()) + pers.append(db.affiliation(db.jobtitle(self.jobtitle), + self.organization.db_xml())) + pers.append(db.email(self.email)) + else: + pers = self.organization.db_xml() + pers.append(db.uri(db.link(self.url,**{const.XLINK+"href": self.url}), + type='website')) + return pers + +class Person(object): + def __init__(self,firstname,surname,honorific,othername,linage): + self.honorific = honorific + self.firstname = firstname + self.othername = othername + self.surname = surname + self.linage = linage + + def db_xml(self): + db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP) + p = db.personname( + db.honorific(self.honorific), + db.firstname(self.firstname), + db.othername(self.othername), + db.surname(self.surname), + db.linage(self.linage) + ) + return p + +class Organization(object): + def __init__(self,orgname): + self.orgname = orgname + self.address = [] + + def add_address(self,addr): + addr.set_name(self.orgname) + self.address.append(addr) + + def add_phone(self, i, phone): + # Quick fix for when an address has two phone numbers : FIXME + try: + self.address[i].add_phone(phone) + except IndexError, e: + pass + + def db_xml(self): + db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP) + org = db.org(db.orgname(self.orgname)) + for a in self.address: + org.append(a.db_xml()) + return org + +def recursively_empty(e): + if e.text or e.tag == const.DB+'imagedata': + return False + return all((recursively_empty(c) for c in e.iterchildren())) + +def clean_db(xml): + context = etree.iterwalk(xml) + for action, elem in context: + parent = elem.getparent() + if recursively_empty(elem): + parent.remove(elem) + + +if __name__ == "__main__": + for arg in sys.argv[1:]: + al = arg.split("=",1) + if al[0] == "lang": + lang = al[1] + if al[0] == "xptr": + argument = al[1] + + (uristr,query) = argument.split('|') + uri = urlparse(uristr) + contact = Contacts(uri).filter(query) + cxml = contact.db_xml() + clean_db(cxml) + + #print(etree.tostring(cxml, pretty_print=True)) + #sys.stdout.write(out.encode('utf-8')) + sys.stdout.write(etree.tostring(cxml,encoding='UTF-8',pretty_print=False))