From: Fredrik Unger Date: Sun, 11 Nov 2012 19:35:07 +0000 (+0100) Subject: Failed lookup does not fail, just do not generate Coords. X-Git-Url: https://source.tree.se/git?p=treecutter.git;a=commitdiff_plain;h=e1bb8bad03ea58f9fdc6419fc1f251a17a7382d7 Failed lookup does not fail, just do not generate Coords. A failed lookup used to fail with an error message. That in turn, disturbs treecutter. Now if Coordinates are not found a Coord element is not generated. The None values in the Address are converted to '' or filled by a successful geocode. Functions c and s needs refining. Empty elements are kept or destroyed with the clean_db function. clean_db function can clean code to become invalid xml so use carefully. clean_db and the s/c functions will have to be put in a docbook/lxml module at some point. --- diff --git a/xinclude/address.py b/xinclude/address.py index c99f51a..be9930f 100755 --- a/xinclude/address.py +++ b/xinclude/address.py @@ -131,16 +131,23 @@ class Coord(object): **{const.XLINK+"href": self.osmlink()})) return uri +def c(s): + return s or '' + +def s(s,n): + return s or n + class Address(object): """Address object to contain everything known about an address""" def __init__(self,street=None,postcode=None,city=None,country=None): - self.name = None self.street = street self.postcode = postcode self.city = city self.country = country - self.phone = '' + self.country_code = None + self.phone = None + self.name = None self.coord = None def geocode(self): @@ -154,13 +161,14 @@ class Address(object): t = etree.parse('/usr/share/xml/iso-codes/iso_3166.xml') r = t.xpath('//iso_3166_entry[@name="'+self.country+'"]') if len(r)==1: - params['countrycodes'] = r[0].get("alpha_2_code") + self.country_code = r[0].get("alpha_2_code") + if self.country_code: + params['countrycodes'] = self.country_code addrlist=[] - if self.name and len(self.name)>0: - addrlist.append(u''+self.name+', '+self.street+', '+self.city) - addrlist.append(u''+self.street+', '+self.postcode+', '+self.city) - addrlist.append(u''+self.street+', '+self.city) + addrlist.append(u''+c(self.name)+', '+c(self.street)+', '+c(self.city)) + addrlist.append(u''+c(self.street)+', '+c(self.postcode)+', '+c(self.city)) + addrlist.append(u''+c(self.street)+', '+c(self.city)) for addr in addrlist: params['q'] = addr.encode('utf-8') @@ -171,11 +179,12 @@ class Address(object): places = int(root.xpath('count(//place[@place_id])')) if places == 1: place = root.find("place") + self.postcode = s(self.postcode,place.find("boundary").text) + self.city = s(self.city,place.find("city").text) + self.country = s(self.country,place.find("country").text) + self.country_code = s(self.country_code,place.find("country_code").text) self.coord=Coord(place.get("lat"),place.get("lon")) return - sys.stderr.write(u'FAILURE: Did not find:\n') - sys.stderr.write(addrlist[0].encode('utf-8')) - sys.stderr.write(url) def add_phone(self, phone): self.phone = phone @@ -185,12 +194,15 @@ class Address(object): def db_xml(self): db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP) - adr = db.address(db.street(self.street), - db.postcode(self.postcode), - db.city(self.city), - db.country(self.country), - db.phone(self.phone), - self.coord.db_xml()) + co = '' + if self.coord: + co = self.coord.db_xml() + adr = db.address(db.street(c(self.street)), + db.postcode(c(self.postcode)), + db.city(c(self.city)), + db.country(c(self.country)), + db.phone(c(self.phone)), + co) # type=self.type, return adr