def get_locations(search_term, geo_level=None, year="2011"): if geo_level is not None and geo_level not in geo_levels: raise ValueError("Invalid geo_level: %s" % geo_level) session = get_session() try: if geo_level: levels = [geo_level] else: levels = ["country", "province", "municipality", "subplace"] objects = set() # search at each level for level in levels: # already checked that geo_level is valid model = get_geo_model(level) if level == "subplace": # check mainplace and subplace names objects.update( session.query(Ward) .join(model) .filter(model.year == year) .filter( or_( model.subplace_name.ilike(search_term + "%"), model.subplace_name.ilike("City of %s" % search_term + "%"), model.mainplace_name.ilike(search_term + "%"), model.code == search_term, ) ) .limit(10) ) else: objects.update( session.query(model) .filter(model.year == year) .filter( or_( model.name.ilike(search_term + "%"), model.name.ilike("City of %s" % search_term + "%"), model.code == search_term.upper(), ) ) .limit(10) ) order_map = {Country: 4, Ward: 3, Municipality: 2, Province: 1} objects = sorted(objects, key=lambda o: [order_map[o.__class__], getattr(o, "name", getattr(o, "code"))]) return serialize_demarcations(objects[0:10]) finally: session.close()
def get_geography(geo_code, geo_level): """ Get a geography model (Ward, Province, etc.) for this geography, or raise LocationNotFound if it doesn't exist. """ session = get_session() try: try: model = get_geo_model(geo_level) except KeyError: raise LocationNotFound('Invalid level: %s' % geo_level) geo = session.query(model).get(geo_code) if not geo: raise LocationNotFound('Invalid level and code: %s-%s' % (geo_level, geo_code)) return geo finally: session.close()
def get_locations(search_term, levels=None, year='2009'): """ Try to find locations based on a search term, possibly limited to +levels+. Returns an ordered list of geo models. """ if levels: levels = levels.split(',') for level in levels: if not level in geo_levels: raise ValueError('Invalid geolevel: %s' % level) else: levels = geo_levels search_term = search_term.strip() session = get_session() try: objects = set() # search at each level for level in levels: # already checked that geo_level is valid model = get_geo_model(level) objects.update(session .query(model) .filter(model.year == year) .filter(or_(model.name.ilike(search_term + '%'), model.code == search_term.upper())) .limit(10) ) order_map = {County: 0, Country: 1} objects = sorted(objects, key=lambda o: [order_map[o.__class__], o.name, o.code]) return [o.as_dict() for o in objects[0:10]] finally: session.close()
def get_locations(search_term, levels=None, year='2011'): if levels: levels = levels.split(',') for level in levels: if not level in geo_levels: raise ValueError('Invalid geolevel: %s' % level) else: levels = ['country', 'province', 'municipality', 'ward', 'subplace'] search_term = search_term.strip() session = get_session() try: objects = set() # search at each level for level in levels: # already checked that geo_level is valid model = get_geo_model(level) if level == 'subplace': # check mainplace and subplace names objects.update(session .query(Ward) .join(model) .filter(model.year == year) .filter(or_(model.subplace_name.ilike(search_term + '%'), model.subplace_name.ilike('City of %s' % search_term + '%'), model.mainplace_name.ilike(search_term + '%'), model.code == search_term)) .limit(10) ) elif level == 'ward': st = search_term.lower().strip('ward').strip() filters = [model.code.like(st + '%')] try: filters.append(model.ward_no == int(st)) except ValueError as e: pass objects.update(session .query(model) .filter(model.year == year) .filter(or_(*filters)) .limit(10) ) else: objects.update(session .query(model) .filter(model.year == year) .filter(or_(model.name.ilike(search_term + '%'), model.name.ilike('City of %s' % search_term + '%'), model.code == search_term.upper())) .limit(10) ) order_map = {Country: 4, Ward: 3, Municipality: 2, Province: 1} objects = sorted(objects, key=lambda o: [order_map[o.__class__], getattr(o, 'name', getattr(o, 'code'))]) return serialize_demarcations(objects[0:10]) finally: session.close()