Exemple #1
0
def main(global_config, **settings):
    """ This function returns a WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    sqla_session = initialize_sql(engine)
    dogpile_region = cache.make_region()
    dogpile_region.configure_from_config(settings, 'cache.')

    def make_backend():
        return Backend(sqla_session, settings['fanart.scratch_dir'])

    class FARequest(Request):
        fanart_settings = settings
        have_backend = False
        cache_region = dogpile_region

        @reify
        def backend(self):
            backend = make_backend()
            users.get_user(self, backend)
            self.have_backend = True
            return backend

        @property
        def user(self):
            return self.backend.logged_in_user

        @reify
        def csrf_token(self):
            token = self.session.get_csrf_token()
            if hasattr(token, 'decode'):
                token = token.decode('ascii')
            return token

    session_factory = pyramid_beaker.session_factory_from_settings(settings)
    config = Configurator(settings=settings,
            root_factory=Site,
            request_factory=FARequest,
            session_factory=session_factory,
        )
    deform.Form.set_default_renderer(deform_renderer)
    config.add_tween('fanart.wsgi_app.autocommit', under=EXCVIEW)
    config.add_tween('fanart.wsgi_app.add_default_headers', under=EXCVIEW)
    config.add_subscriber(check_request_for_csrf, NewRequest)
    config.add_subscriber(set_locale, NewRequest)
    config.add_translation_dirs('colander:locale/', 'deform:locale/')
    config.add_static_view('static', 'fanart:static', cache_max_age=3600)
    config.add_static_view('static-deform', 'deform:static')
    config.add_static_view('scratch', path=settings['fanart.scratch_dir'])
    config.add_view('fanart.views.view_root', context='fanart.views.ViewBase')
    config.add_view('fanart.views:view_403', context='pyramid.httpexceptions.HTTPForbidden')
    app = config.make_wsgi_app()
    app._fanart__make_backend = make_backend
    return app
Exemple #2
0
def get_backend(arguments):
    filename, source = get_config_filename(arguments)
    if filename:
        config_filename = os.path.abspath(filename)
        del filename
        if not os.path.exists(config_filename):
            raise SystemExit('config file does not exist: {}'.format(
                config_filename))
        if arguments['--debug']:
            print('Using config file {} (from {})'.format(config_filename,
                                                          source),
                  file=sys.stderr)
        defaults = {'here': os.path.dirname(config_filename)}
        config = configparser.ConfigParser(defaults)
        config.read(config_filename)
    else:
        if arguments['--debug']:
            print('Cannot find config file', file=sys.stderr)
        config = None
    def get_value_with_source(
            argname, config_section, config_key, default=FAIL, boolean=False):
        if arguments[argname]:
            return arguments[argname], 'command line'
        try:
            section = config[config_section]
            if boolean:
                return section.getboolean(config_key), config_filename
            else:
                return section[config_key], config_filename
        except KeyError:
            pass
        return default, 'default'
    def get_value(argname, *args, **kwargs):
        value, source = get_value_with_source(argname, *args, **kwargs)
        if value is FAIL:
            if config:
                raise SystemExit('{} not given and not found in {}'.format(
                    argname, config_filename))
            else:
                raise SystemExit('{} not given, no config file found'.format(
                    argname))
        else:
            if arguments['--debug']:
                print('{}={} (from {})'.format(argname, value, source),
                    file=sys.stderr)
            return value
    db_url = get_value('--db-url', 'app:main', 'sqlalchemy.url')
    scratch_die = get_value('--scratch', 'app:main', 'fanart.scratch_dir')
    guest = get_value('--guest', 'cli', 'guest', False, boolean=True)
    user = get_value('--user', 'cli', 'user', GUEST if guest else ADMIN)

    engine = engine_from_config({'url': db_url}, prefix='')
    db = initialize_sql(engine)

    backend = Backend(db, scratch_die)
    if user is ADMIN:
        backend.login_admin()
    elif user is GUEST:
        pass
    else:
        backend.login(backend.users[user])

    return backend