def compute_geoCode(r, component): g = geocoders.Google() place, (lat, lng) = cache.ram(r.name, lambda: g.geocode(r.name), None) return eval(component)
Anthony On Thursday, May 17, 2012 11:44:16 AM UTC-4, Gabriella Canavesi wrote: > > Hi Anthony, thanks for the answer, > Your solution is pretty nice but I am still calling it 3 times which > actually is the main problem since I am asking 'google' 3 times the same > stuff. > Is it possible to store the answer somewhere (cache?) the first time > and then use the cache copy for the latter calls? > > Regards, > Paolo > > Il 17.05.2012 15:09 Anthony ha scritto: > > To get it down to it down to one function, how about: > > > > def compute_geoCode(r, component): > > g = geocoders.Google() > > place, (lat, lng) = g.geocode(r.name [4]) > > return eval(component) > > > > db.cities.full_address.compute = lambda r: compute_geoCode(r, > > 'place') > > db.cities.lat.compute = lambda r: compute_geoCode(r, 'lat') > > db.cities.lgt.compute = lambda r: compute_geoCode(r, 'lng') > > > > Anthony > > > > On Thursday, May 17, 2012 4:35:46 AM UTC-4, Gabriella Canavesi wrote: > > > >> Hi all, > >> I have a simple table with 3 computed fields, the function that set > >> their values is almost the same. However, unfortunately I had to set > >> up > >> three different functions because I didn't find a better approach. > >> The code: > >> db.define_table('cities', > >> Field('name', 'string', requires=IS_TRIM()), > >> Field('full_address', 'string',requires=IS_TRIM()), > >> Field("lat", "double", label=T('Latitude')), > >> Field("lgt", "double", label=T('Longitude'))) > >> > >> db.cities.full_address.compute = compute_geoCode_place > >> db.cities.lat.compute = compute_geoCode_lat > >> db.cities.lgt.compute = compute_geoCode_lng > >> > >> def compute_geoCode_place(r): > >> g = geocoders.Google() > >> place, (lat, lng) = g.geocode(r.name [1]) > >> return place > >> > >> def compute_geoCode_lat(r): > >> g = geocoders.Google() > >> place, (lat, lng) = g.geocode(r.name [2]) > >> return lat > >> > >> def compute_geoCode_lng(r): > >> g = geocoders.Google() > >> place, (lat, lng) = g.geocode(r.name [3]) > >> return lng > >> > >> What I would like to find is a way to fire the execution of a > >> function > >> when the form is submitted. More or less something like a compute > >> action > >> at table level. > >> > >> Regards, > >> > >> -- > >> Paolo > > > > > > Links: > > ------ > > [1] http://r.name > > [2] http://r.name > > [3] http://r.name > > [4] http://r.name/ > > -- > Paolo >