__init__.py 2.56 KB
import os
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 pyramid_mailer import mailer_factory_from_settings
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


here = os.path.abspath(os.path.dirname(__file__))
routes_file = os.path.join(here, 'routes.csv')


def set_paths(config):
    with open(routes_file) as f:
        c = csv.DictReader(f)
        for row in c:
            path = row['path'] or '/' + row['name']
            config.add_route(row['name'], path)
    config.scan()


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)


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_tm')
    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')

    config.registry['mailer'] = mailer_factory_from_settings(settings)
    set_paths(config)
    return config.make_wsgi_app()