__init__.py 2.24 KB
import csv
import deform
from pkg_resources import resource_filename
from pyramid.i18n import get_localizer
from pyramid.threadlocal import get_current_request
from pyramid.config import Configurator
from pyramid_beaker import session_factory_from_settings
from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
from sqlalchemy import engine_from_config
from .models import (
    DBSession,
    Base,
    )
from .security import (
    group_finder,
    get_user,
    )
from .tools.this_framework import get_locale_name
from .views import RemoveSlashNotFoundViewFactory


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine
    session_factory = session_factory_from_settings(settings)
    config = Configurator(
        settings=settings,
        root_factory='web_starter.models.ziggurat.RootFactory',
        session_factory=session_factory,
        locale_negotiator=get_locale_name)
    config.include('pyramid_beaker')
    config.include('pyramid_chameleon')

    authn_policy = AuthTktAuthenticationPolicy(
            'sosecret', callback=group_finder, hashalg='sha512')
    config.set_authentication_policy(authn_policy)

    authz_policy = ACLAuthorizationPolicy()
    config.set_authorization_policy(authz_policy)

    config.add_request_method(get_user, 'user', reify=True)
    config.add_notfound_view(RemoveSlashNotFoundViewFactory())        
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_static_view('deform_static', 'deform:static')
    config.add_translation_dirs('locale')

    def translator(term):
        return get_localizer(get_current_request()).translate(term)

    deform_template_dir = resource_filename('deform', 'templates/')
    zpt_renderer = deform.ZPTRendererFactory(
            [deform_template_dir],
            translator=translator,)
    deform.Form.set_default_renderer(zpt_renderer)

    with open('routes.csv') as f:
        c = csv.DictReader(f)
        for row in c:
            config.add_route(row['name'], row['path'])
    config.scan()
    return config.make_wsgi_app()