Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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()
Ejemplo n.º 4
0
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()