Skip to content
Snippets Groups Projects
Commit 0ae74998 authored by Martin Mareš's avatar Martin Mareš
Browse files

API pro JS na zadávání škol

parent 3f1c9534
No related branches found
No related tags found
1 merge request!86Registrace
......@@ -215,6 +215,7 @@ except ImportError:
# Většina webu je v samostatných modulech
import mo.web.api
import mo.web.auth
import mo.web.jinja
import mo.web.menu
......
from flask import request
from flask.json import jsonify
from sqlalchemy.orm import joinedload
import werkzeug.exceptions
import mo.db as db
from mo.util_format import inflect_with_number
from mo.web import app
@app.route('/api/')
def api_root():
"""Slouží jako prefix pro konstrukci URL v JavaScriptu."""
raise werkzeug.exceptions.NotFound()
@app.route('/api/find-town')
def api_find_town():
query = request.args.get('q')
if query is None or len(query) < 2:
return jsonify(error='Zadejte alespoň 2 znaky jména obce.')
elif '%' in query:
return jsonify(error='Nepovolené znaky ve jménu obce.')
else:
# FIXME: Hledání bez akcentů
# FIXME: Hodil by se index...
max_places = 50
places = (db.get_session().query(db.Place)
.filter_by(level=3)
.filter(db.Place.name.ilike(query + '%'))
.options(joinedload(db.Place.parent_place))
.order_by(db.Place.name, db.Place.place_id)
.limit(max_places)
.all())
if not places:
return jsonify(error='Nenalezena žádná obec.')
# XXX: Nemůže se stát, že nastane přesná shoda a k tomu příliš mnoho nepřesných?
if len(places) >= max_places:
return jsonify(error='Nalezeno příliš mnoho obcí. Zadejte prosím více znaků jména.')
res = []
for p in places:
name = p.name
if p.name != p.parent_place.name:
name += f' (okres {p.parent_place.name})'
res.append([p.place_id, name])
msg = inflect_with_number(len(res), 'Nalezena %s obec.', 'Nalezeny %s obce.', 'Nalezeno %s obcí.')
return jsonify(found=res, msg=msg)
@app.route('/api/get-schools')
def api_get_schools():
town = request.args.get('town')
if town is None or not town.isnumeric():
raise werkzeug.exceptions.BadRequest()
town_id = int(town)
places = (db.get_session().query(db.Place)
.filter_by(level=4, type=db.PlaceType.school, parent=town_id)
.options(joinedload(db.Place.school))
.order_by(db.Place.name)
.all())
zs = []
ss = []
for p in places:
s = {
'id': p.place_id,
'name': p.name,
}
if p.school.is_zs:
zs.append(s)
if p.school.is_ss:
ss.append(s)
return jsonify(zs=zs, ss=ss)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment