Esempio n. 1
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    passwords_config_path = helpers.get_passwords_config_path(
        global_config['__file__'])
    if os.path.isfile(passwords_config_path):
        passwords_settings = helpers.load_config(passwords_config_path)
        settings = helpers.dicts_merge(passwords_settings.get('app:main', {}),
                                       settings)

    sql_engine = engine_from_config(settings, 'sqlalchemy.')
    authentication_secret = settings.get('authentication_secret')

    if authentication_secret is None:
        raise Exception(
            'authentication_secret must be set at [conf_type]_passwords.ini!')

    # see http://docs.pylonsproject.org/projects/pyramid//en/latest/tutorials/wiki2/authorization.html
    authn_policy = AuthTktAuthenticationPolicy(secret=authentication_secret,
                                               hashalg='sha512',
                                               callback=User.get_groups)
    authz_policy = ACLAuthorizationPolicy()
    # DBSession.configure(bind=engine)p
    Base.metadata.bind = sql_engine
    session_factory = session_factory_from_settings(settings)
    config = Configurator(settings=settings,
                          root_factory='pyragrid.db.RootFactory')
    config.set_authentication_policy(authn_policy)
    config.set_authorization_policy(authz_policy)
    config.include('pyramid_chameleon')
    config.add_translation_dirs('colander:locale', 'deform:locale',
                                'pyragrid:locale')

    def translator(term):
        # return get_localizer(get_current_request()).translate(term)
        return get_current_request().localizer.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)

    payment_systems.load_by_config(config)

    static_cache_max_age = 3600
    # TODO hacky. maybe better copy resources with gulp task?
    config.add_static_view(
        'static/fonts/bootstrap',
        '../bower_components/bootstrap-sass-official/assets/fonts/bootstrap',
        cache_max_age=static_cache_max_age)
    config.add_static_view('static/bower_components',
                           '../bower_components',
                           cache_max_age=static_cache_max_age)
    # config.add_static_view('static/dist', '../static/dist', cache_max_age=static_cache_max_age)
    config.add_static_view('static',
                           'static',
                           cache_max_age=static_cache_max_age)
    config.add_static_view('resources',
                           'resources',
                           cache_max_age=static_cache_max_age)
    config.add_static_view('static_deform', 'deform:static')

    config.add_route('index', '/')
    config.add_route('profile_edit', '/profile/edit')
    config.add_route('vk_iframe_auth', '/vkIframeAuth')
    config.add_route('test', '/t')

    # TODO delete:
    config.add_route('add_user', '/users/add')
    config.add_route('delete_user', '/users/delete/{any_data}')

    config.add_route('login', '/login')
    config.add_route('logout', '/logout')

    config.add_route('register', '/register')
    config.add_route('register_success', '/register_success')

    config.add_route('email_check_code', '/checkEmail/{code}')

    config.add_route('article', '/article/{article_system_name}')
    config.add_route('article_revision', '/article/{article_system_name}')

    config.add_route('admin_index', '/admin')
    config.add_route('admin_test', '/test')

    config.add_route('admin_users', '/admin/users')
    config.add_route('admin_users_grid', '/admin/users/grid')
    config.add_route('admin_user_enable', '/admin/users/enable/{user_id}')
    config.add_route('admin_user_disable', '/admin/users/disable/{user_id}')
    config.add_route('admin_user_edit', '/admin/users/edit/{user_id}')

    config.add_route('admin_article_edit', '/admin/article/{article_id}/edit')
    config.add_route('admin_article_enable',
                     '/admin/article/{article_id}/enable')
    config.add_route('admin_article_disable',
                     '/admin/article/{article_id}/disable')
    config.add_route('admin_article_revisions',
                     '/admin/article/{article_id}/revisions')
    config.add_route(
        'admin_article_revision',
        '/admin/article/{article_id}/revision/{article_revision_id}')
    config.add_route(
        'admin_article_revision_activate',
        '/admin/article/{article_id}/revision/{article_revision_id}/activate')
    config.add_route('admin_article_new', '/admin/new/article')
    config.add_route('admin_articles', '/admin/articles')
    config.add_route('admin_articles_grid', '/admin/articles/grid')
    config.add_route('admin_article_revisions_grid',
                     '/admin/article/{article_id}/revisions/grid')

    config.add_route('admin_goods', '/admin/goods')
    config.add_route('admin_goods_grid', '/admin/goods/grid')
    config.add_route('admin_good_new', '/admin/new/good')
    config.add_route('admin_good_edit', '/admin/good/{id}/edit')
    config.add_route('admin_good_enable', '/admin/good/{id}/enable')
    config.add_route('admin_good_disable', '/admin/good/{id}/disable')

    config.add_route('test_mail', '/test/mail')
    config.add_route('test_render', '/test/render')
    config.add_route('test_notify', '/test/notify')
    config.add_route('test_view_notify', '/test/view_notify')
    config.add_route('test_url', '/test/url')
    config.add_route('test_ajax', '/test/ajax')
    config.add_route('test_redirect', '/test/redirect')
    config.add_route('test_bootgrid_edit', '/test/bootgrid')
    config.add_route('test_script_inclusion', '/test/script_inclusion')
    config.add_route('test_db_enum', '/test/db_enum')
    config.add_route('test_filetree', '/test/filetree')
    config.add_route('test_ajax_filetree', '/test/ajax_filetree')
    config.add_route('test_filedialog', '/test/filedialog')
    config.add_route('test_droparea', '/test/droparea')
    config.add_route('test_jquery_file_upload', '/test/jquery_file_upload')
    config.add_route('test_blocks', '/test/blocks')
    config.add_route('test_nunjucks', '/test/nunjucks')
    config.add_route('test_jac', '/test/jac')
    config.add_route('test_mobx', '/test/mobx')
    config.add_route('test_mobx_fetch', '/test/mobx_fetch')

    # urlList: '/uploads/list'
    # urlInfo: '/uploads/info'
    # urlOperations: '/uploads/manage'

    config.add_route('uploads_list', '/uploads/list')
    config.add_route('uploads_info', '/uploads/info')
    config.add_route('uploads_manage', '/uploads/manage')
    config.add_route('uploads_handle_droparea', '/uploads/handleDropArea')
    config.add_route('uploads_handle_jquery_file_upload',
                     '/uploads/handleJqueryFileUpload')

    config.add_route('order_status', '/order/{id}/status')

    config.add_route('good_one_click_buy', '/goods/{id}/one_click_buy')

    config.add_notfound_view(views_articles.view_custom_not_found,
                             append_slash=True)

    config.set_session_factory(session_factory)

    config.add_subscriber(add_renderer_globals, pyramid.events.BeforeRender)

    # config.registry['mailer'] = Mailer.from_settings(settings)

    # fix vk init:
    if pyramid.threadlocal.get_current_registry().settings is None:
        pyramid.threadlocal.get_current_registry().settings = settings

    config.scan(ignore=['pyragrid.payment_systems'])
    # TODO убрать настройку jinja2 env в конфиг

    app = config.make_wsgi_app()
    jinja2_env = pyramid_jinja2.get_jinja2_environment(config)
    jac_output_dir_path = os.path.join(os.path.dirname(__file__), 'static',
                                       'dist')
    #jinja2_env.compressor_output_dir = './pyragrid/static/dist'
    jinja2_env.compressor_output_dir = jac_output_dir_path
    jinja2_env.compressor_debug = True

    # BabelCompressor.binary = './node_modules/.bin/babel'
    BabelCompressor.binary = os.path.abspath(
        os.path.join(os.path.dirname(__file__), '..', 'node_modules', '.bin',
                     'babel'))
    BabelCompressor.cwd_for_presets_search = os.path.abspath(
        os.path.join(os.path.dirname(__file__), '..'))
    BabelCompressor.presets = [
        'es2015', 'stage-0', 'react', 'es2016', 'es2017'
    ]
    # wtf? adds lines like `require("babel-runtime/core-js/object/get-prototype-of")` to the code
    # TODO https://babeljs.io/docs/plugins/transform-runtime/
    # BabelCompressor.plugins = ['transform-runtime']

    jac_default_config = JacDefaultConfig()
    jinja2_env.compressor_classes = jac_default_config.get(
        'compressor_classes')
    jinja2_env.compressor_classes['text/babel'] = BabelCompressor

    return app