from pyramid.authentication import AuthTktAuthenticationPolicy from pyramid.authorization import ACLAuthorizationPolicy from pyramid.config import Configurator from pyramid.session import SignedCookieSessionFactory from sqlalchemy import engine_from_config from soter.factories import RootFactory from soter.models import initialize_sql from soter.renderers import json_renderer from soter.security import rolefinder def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ engine = engine_from_config(settings, 'sqlalchemy.') initialize_sql(engine) session_factory = SignedCookieSessionFactory('soter') authentication_policy = AuthTktAuthenticationPolicy('soter', timeout=900, reissue_time=90, callback=rolefinder) authorization_policy = ACLAuthorizationPolicy() config = Configurator(settings=settings, session_factory=session_factory, authentication_policy=authentication_policy, authorization_policy=authorization_policy, root_factory=RootFactory) config.add_renderer(name='json', factory=json_renderer) config.add_static_view('app', 'soter:static/app', cache_max_age=3600) config.add_static_view('assets', 'soter:static/assets', cache_max_age=3600) config.add_route('favicon', '/favicon.ico') config.add_route('home', '/') config.add_route('v1_auth', '/v1/Auth') config.add_route('v1_login', '/v1/login') config.add_route('v1_profile', '/v1/profile') config.add_route('login', '/login') config.add_route('logout', '/logout') add_route(config, 'picture', '/picture') config.add_route('picture_raw', '/p/{size}/{id}') config.add_route('upload', '/upload') config.add_route('api_upload', '/v1/upload') config.add_route('album_id_view' , '/view/{id}') config.add_route('album_id' , '/album/{id}') config.add_route('album', '/album') config.add_route('album_list', '/albums') config.add_route('api_album_id', '/v1/album/{id}') config.add_route('api_album', '/v1/album') add_route(config, 'user', '/user') add_route(config, 'role', '/role') config.scan() return config.make_wsgi_app() def pluralize(word, num=None): if num is None or num != 1: if word.endswith('y'): return word[:-1] + 'ies' elif word[-1] in 'sx' or word[-2:] in ['sh', 'ch']: return word + 'es' elif word.endswith('an'): return word[:-2] + 'en' else: return word + 's' return word def add_route(config, name, url, has_list=True, variable='id'): config.add_route(name + '_' + variable, url + '/{' + variable + '}') config.add_route(name, url) if has_list: config.add_route(name + '_list', pluralize(url)) config.add_route('api_' + name + '_' + variable, '/v1' + url + '/{' + variable + '}') config.add_route('api_' + name, '/v1' + url)