Skip to content
Snippets Groups Projects
Select Git revision
  • 31139484b19235ed3ca7418ec5e79da84b06fbc5
  • devel default
  • master
  • fo
  • jirka/typing
  • fo-base
  • mj/submit-images
  • jk/issue-96
  • jk/issue-196
  • honza/add-contestant
  • honza/mr7
  • honza/mrf
  • honza/mrd
  • honza/mra
  • honza/mr6
  • honza/submit-images
  • honza/kolo-vs-soutez
  • jh-stress-test-wip
  • shorten-schools
19 results

api.py

Blame
  • api.py 2.44 KiB
    from flask import request
    from flask.json import jsonify
    from sqlalchemy import func
    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:
            max_places = 50
            places = (db.get_session().query(db.Place)
                      .filter_by(level=3)
                      .filter(func.lower(db.f_unaccent(db.Place.name)).like(func.lower(db.f_unaccent(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)