Skip to content
Snippets Groups Projects
Select Git revision
  • 6e5eaf5db3b6a3657cb127dbb0e1ab52ba640123
  • master default protected
2 results

Makefile

Blame
  • __init__.py 2.38 KiB
    from flask import Flask, request, g, session
    import flask.logging
    from flask_sqlalchemy import SQLAlchemy
    import os
    import locale
    import logging
    from flask_bootstrap import Bootstrap
    import werkzeug.exceptions
    import mo.config as config
    
    import mo.db as db
    import mo.users
    
    # Aplikační objekt
    app = Flask(__name__, instance_path=os.path.abspath('data'), static_folder=os.path.abspath('static'))
    app.config.from_object(config)
    app.jinja_options['extensions'].append('jinja2.ext.do')
    app.jinja_env.lstrip_blocks = True
    app.jinja_env.trim_blocks = True
    db.flask_db = SQLAlchemy(app, metadata=db.metadata)
    
    Bootstrap(app)  # make bootstrap libs accessible for the app
    
    # Nastavíme logování:
    #   - kořenový logger dostane flaskový handler, aby se logovaly hlášky ze všech komponent
    #   - app.logger (což Flask založil jako podřízený logger) nastavíme, aby nepropagoval výše
    # FIXME: Ještě je potřeba dořešit, že flaskový development server loguje každý request dvojmo.
    app.logger.setLevel(logging.DEBUG)
    app.logger.propagate = False
    root_logger = logging.getLogger()
    root_logger.addHandler(flask.logging.default_handler)
    root_logger.setLevel(logging.DEBUG)
    
    # Budeme používat české locale
    locale.setlocale(locale.LC_COLLATE, 'cs_CZ.UTF-8')
    
    
    class NeedLoginError(werkzeug.exceptions.Forbidden):
        description = 'Need to log in'
    
    
    def need_login():
        if not g.user:
            raise NeedLoginError()
    
    
    def init_request():
        if 'uid' in session:
            user = mo.users.user_by_uid(session['uid'])
            if not user:
                # Uživatel mezitím přestal existovat
                app.logging.error('Zrušena session pro neexistujícího uživatele uid=%s', session['uid'])
                return mo.web.main.logout()
        else:
            user = None
        g.user = user
        mo.util.current_log_user = user
    
        # K některým podstromům je nutné mít speciální oprávnění
        # XXX: Když celá aplikace běží v adresáři, request.path je relativní ke kořeni aplikace, ne celého webu
        path = request.path
        if path.startswith('/org/'):
            if not user:
                raise NeedLoginError()
            if not (user.is_org or user.is_admin):
                raise werkzeug.exceptions.Forbidden()
    
    
    app.before_request(init_request)
    
    
    # Většina webu je v samostatných modulech
    import mo.web.main
    import mo.web.org
    import mo.web.org_contest
    import mo.web.org_place
    import mo.web.org_users
    import mo.web.menu