soter/soter/__init__.py

80 lines
2.9 KiB
Python

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)