Failed lookup does not fail, just do not generate Coords.
authorFredrik Unger <fred@tree.se>
Sun, 11 Nov 2012 19:35:07 +0000 (20:35 +0100)
committerFredrik Unger <fred@tree.se>
Sun, 11 Nov 2012 19:35:07 +0000 (20:35 +0100)
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.

xinclude/address.py

index c99f51ad0e86bca424f21a1d613f77a7d26e268b..be9930f98136f8b899cbf32164c4c41b32d67ede 100755 (executable)
@@ -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