def languages(request): if request.params.get('search'): return quicksearch(request) res = dict( countries=json.dumps([ '%s (%s)' % (c.name, c.id) for c in DBSession.query(Country).order_by(Country.description)]), params={ 'name': '', 'iso': '', 'namequerytype': 'part', 'country': ''}, message=None) for param, default in res['params'].items(): res['params'][param] = request.params.get(param, default).strip() if res['params']['country']: country = res['params']['country'] try: alpha2 = country.split('(')[1].split(')')[0] \ if len(country) > 2 else country.upper() raise HTTPFound(location=request.route_url( 'languages_alt', ext='map.html', _query=dict(country=alpha2))) except IndexError: pass res['params']['multilingual'] = 'multilingual' in request.params if request.params.get('alnum'): l = Languoid.get(request.params.get('alnum'), default=None) if l: raise HTTPFound(location=request.resource_url(l)) res['message'] = 'No matching languoids found' if (res['params']['iso'] and len(res['params']['iso']) < 2) or ( res['params']['name'] and len(res['params']['name']) < 2 and res['params']['namequerytype'] == 'part'): res.update( message='Please enter at least two characters to search', map=None, languoids=[]) return res languoids = list(getLanguoids(**res['params'])) if not languoids and \ (res['params']['name'] or res['params']['iso'] or res['params']['country']): res['message'] = 'No matching languoids found' #if len(languoids) == 1: # raise HTTPFound(request.resource_url(languoids[0])) map_, icon_map, family_map = get_selected_languages_map(request, languoids) layer = list(map_.get_layers())[0] if not layer.data['features']: map_ = None res.update(map=map_, languoids=languoids) return res
def quicksearch(request): message = None query = DBSession.query(Languoid) term = request.params['search'].strip() titlecase = term.istitle() term = term.lower() params = {'iso': '', 'country': '', 'name': '', 'namequerytype': 'part', 'multilingual': ''} if not term: query = None elif len(term) < 3: query = None message = ('Please enter at least four characters for a name search ' 'or three characters for an iso code') elif len(term) == 3 and not titlecase: query = query.filter(Languoid.identifiers.any( type=IdentifierType.iso.value, name=term)) kind = 'ISO 639-3' elif len(term) == 8 and GLOTTOCODE_PATTERN.match(term): query = query.filter(Languoid.id == term) kind = 'Glottocode' else: _query = query.filter(func.lower(Languoid.name) == term) if DBSession.query(_query.exists()).scalar(): query = _query else: query = query.filter(or_( func.lower(Languoid.name).contains(term), Languoid.identifiers.any(and_( Identifier.type == u'name', Identifier.description == Languoid.GLOTTOLOG_NAME, func.lower(Identifier.name).contains(term))))) kind = 'name part' params['name'] = term if query is None: languoids = [] else: languoids = query.order_by(Languoid.name)\ .options(joinedload(Languoid.family)).all() if not languoids: term_pre = HTML.kbd(term, style='white-space: pre') message = 'No matching languoids found for %s "' % kind + term_pre + '"' elif len(languoids) == 1: raise HTTPFound(request.resource_url(languoids[0])) map_, icon_map, family_map = get_selected_languages_map(request, languoids) layer = list(map_.get_layers())[0] if not layer.data['features']: map_ = None countries = json.dumps(['%s (%s)' % (c.name, c.id) for c in DBSession.query(Country).order_by(Country.description)]) return {'message': message, 'params': params, 'languoids': languoids, 'map': map_, 'countries': countries}
def quicksearch(request): message = None query = DBSession.query(Languoid) term = request.params['search'].strip() titlecase = term.istitle() term = term.lower() params = {'iso': '', 'country': '', 'name': '', 'namequerytype': 'part', 'multilingual': ''} if not term: query = None elif len(term) < 3: query = None message = ('Please enter at least four characters for a name search ' 'or three characters for an iso code') elif len(term) == 3 and not titlecase: query = query.filter(Languoid.identifiers.any( type=IdentifierType.iso.value, name=term)) kind = 'ISO 639-3' elif len(term) == 8 and GLOTTOCODE_PATTERN.match(term): query = query.filter(Languoid.id == term) kind = 'Glottocode' else: query = query.filter(Languoid.active == True, Languoid.identifiers.any(and_( Identifier.type == u'name', Identifier.description == u'Glottolog', func.lower(Identifier.name).contains(term)))) kind = 'name part' params['name'] = term if query is None: languoids = [] else: languoids = query.order_by(Languoid.name)\ .options(joinedload(Languoid.family)).all() if not languoids: message = 'No matching languoids found for %s "%s"' % (kind, term) elif len(languoids) == 1: raise HTTPFound(request.resource_url(languoids[0])) map_, icon_map, family_map = get_selected_languages_map(request, languoids) layer = list(map_.get_layers())[0] if not layer.data['features']: map_ = None countries = json.dumps(['%s (%s)' % (c.name, c.id) for c in DBSession.query(Country).order_by(Country.description)]) return {'message': message, 'params': params, 'languoids': languoids, 'map': map_, 'countries': countries}
def quicksearch(request): message = None query = DBSession.query(Languoid) term = request.params['search'].strip() titlecase = term.istitle() term = term.lower() params = { 'iso': '', 'country': '', 'name': '', 'namequerytype': 'part', 'multilingual': '' } if not term: query = None elif len(term) < 3: query = None message = ('Please enter at least four characters for a name search ' 'or three characters for an iso code') elif len(term) == 3 and not titlecase: query = query.filter( Languoid.identifiers.any(type=IdentifierType.iso.value, name=term)) kind = 'ISO 639-3' elif len(term) == 8 and GLOTTOCODE_PATTERN.match(term): query = query.filter(Languoid.id == term) kind = 'Glottocode' else: _query = query.filter(func.lower(Languoid.name) == term) if DBSession.query(_query.exists()).scalar(): query = _query else: query = query.filter( or_( func.lower(Languoid.name).contains(term), Languoid.identifiers.any( and_(Identifier.type == u'name', Identifier.description == Languoid.GLOTTOLOG_NAME, func.lower(Identifier.name).contains(term))))) kind = 'name part' params['name'] = term if query is None: languoids = [] else: languoids = query.order_by(Languoid.name)\ .options(joinedload(Languoid.family)).all() if not languoids: term_pre = HTML.kbd(term, style='white-space: pre') message = 'No matching languoids found for %s "' % kind + term_pre + '"' elif len(languoids) == 1: raise HTTPFound(request.resource_url(languoids[0])) map_, icon_map, family_map = get_selected_languages_map(request, languoids) layer = list(map_.get_layers())[0] if not layer.data['features']: map_ = None return { 'message': message, 'params': params, 'languoids': languoids, 'map': map_, 'countries': countries_as_json() }