Пример #1
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    add_mako_renderer(config, ".html")
    config.add_static_view("static", "static", cache_max_age=3600)
    config.add_static_view("node_modules", settings.get("node_modules_path"), cache_max_age=3600)
    config.add_static_view("closure", settings.get("closure_library_path"), cache_max_age=3600)

    config.add_route("index", "/")

    config.add_route("waypoints_view", "/waypoints/{id}/{culture}")
    config.add_route("waypoints_index_default", "/waypoints")
    config.add_route("waypoints_index", "/waypoints/list*filters")
    config.add_route("waypoints_add", "/waypoints/add")
    config.add_route("waypoints_edit", "/waypoints/edit/{id}/{culture}")
    config.add_route("waypoints_history", "/waypoints/history/{id}/{culture}")
    config.add_route("waypoints_archive", "/waypoints/{id}/{culture}/{version:\d+}")
    config.add_route("waypoints_diff", "/waypoints/diff/{id}/{culture}/{v1}/{v2}")

    config.add_route("routes_view", "/routes/{id}/{culture}")
    config.add_route("routes_index_default", "/routes")
    config.add_route("routes_index", "/routes/list*filters")
    config.add_route("routes_add", "/routes/add")
    config.add_route("routes_edit", "/routes/edit/{id}/{culture}")
    config.add_route("routes_history", "/routes/history/{id}/{culture}")
    config.add_route("routes_archive", "/routes/{id}/{culture}/{version:\d+}")
    config.add_route("routes_diff", "/routes/diff/{id}/{culture}/{v1}/{v2}")

    config.add_route("auth", "/auth")

    config.scan(ignore="c2corg_ui.tests")
    return config.make_wsgi_app()
Пример #2
0
def main(global_config, **settings):
    del global_config  # unused

    config = Configurator(settings=settings)

    init_tilegeneration(settings["tilegeneration_configfile"])
    global tilegeneration  # pylint: disable=global-statement

    config.include(c2cwsgiutils.pyramid.includeme)
    health_check.HealthCheck(config)

    add_mako_renderer(config, ".html")

    config.add_route(
        "admin",
        "/{}/".format(tilegeneration.config["server"]["admin_path"]),
        request_method="GET",
    )
    config.add_route(
        "admin_run",
        "/{}/run".format(tilegeneration.config["server"]["admin_path"]),
        request_method="POST",
    )

    config.add_route("tiles", "/*path", request_method="GET")
    config.add_view(PyramidView, route_name="tiles")

    config.scan("tilecloud_chain.views")

    return config.make_wsgi_app()
Пример #3
0
def includeme(config):
    add_mako_renderer(config, '.txt')
    reg = config.registry
    region = make_region()
    region.configure_from_config(config.registry.settings,
                                 'cache.registration.')
    store = DogPileTokenStore(region)
    message_factory = RegistrationMessageFactory(
        sender=config.registry.settings['registration.mail.sender'])

    reg.utilities.register([], ITokenStore,
                           "",
                           store)
    reg.utilities.register([], ITokenGenerator,
                           "",
                           generate_uuid_token)
    reg.utilities.register([], IMessageFactory,
                           "",
                           message_factory)
    reg.utilities.register([], IUserFactory,
                           "",
                           user_factory)
    reg.adapters.register([IMailer, IMessageFactory,
                           ITokenStore, ITokenGenerator,
                           IUserFactory,
                           ],
                          IRegistration,
                          "",
                          Registration)
Пример #4
0
def main(global_config, **settings):
    from pyramid_mako import add_mako_renderer
    del global_config  # unused

    config = Configurator(settings=settings)

    init_tilegeneration(settings['tilegeneration_configfile'])
    global tilegeneration

    config.include(c2cwsgiutils.pyramid.includeme)
    health_check.HealthCheck(config)

    add_mako_renderer(config, ".html")

    config.add_route(
        'admin', '/{}/'.format(tilegeneration.config['server']['admin_path']),
        request_method='GET',
    )
    config.add_route(
        'admin_run', '/{}/run'.format(tilegeneration.config['server']['admin_path']),
        request_method='POST',
    )

    config.add_route('tiles', '/*path', request_method='GET')
    config.add_view(PyramidView, route_name='tiles')

    config.scan('tilecloud_chain.views')

    return config.make_wsgi_app()
Пример #5
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    settings = config.get_settings()

    settings.update(yaml.load(file(settings.get("app.cfg"))))

    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    config.include("pyramid_mako")

    engine = engine_from_config(settings, 'sqlalchemy.')
    sqlahelper.add_engine(engine)

    config.include(pyramid_tm.includeme)

    dbreflection.init(engine)

    config.include('.routes')

    config.scan()

    return config.make_wsgi_app()
Пример #6
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """

    config = Configurator(settings=settings)
    settings = config.get_settings()
    settings.update(yaml.load(file(settings.get("app.cfg"))))

    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    engine = engine_from_config(settings, 'sqlalchemy.')
    sqlahelper.add_engine(engine)
    dbreflection.init(engine)

    config.set_authorization_policy(ACLAuthorizationPolicy())

    config.add_request_method(
        _create_get_user_from_request(settings),
        name="user",
        property=True
    )

    authtkt_authentication_policy = AuthTktAuthenticationPolicy(
        settings.get('authtkt')['secret'],
        cookie_name=settings.get('authtkt')['cookie_name'],
        hashalg='sha512'
    )

    remote_user_authentication_policy = RemoteUserAuthenticationPolicy()
    policies = [remote_user_authentication_policy, authtkt_authentication_policy]
    authentication_policy = MultiAuthenticationPolicy(policies)
    config.set_authentication_policy(authentication_policy)

    config.include('pyramid_mako')
    config.include(pyramid_tm.includeme)

    config.add_static_view('static', 'static', cache_max_age=3600)

    config.add_route('home', '/')
    config.add_route('viewer', '/viewer.js')
    config.add_route('image_proxy', '/img/{type}/{id}')
    config.add_route('pdf_proxy', '/pdf/{type}/{id}.pdf')

    # historic parcels
    config.add_route('historic_parcel_get', '/historic_parcel/{id}')
    config.add_route('historic_parcel', '/historic_parcel')
    config.add_route('historic_parcel_doc', '/historic_parcel_doc')

    # print proxy routes
    config.add_route('printproxy', '/printproxy')
    config.add_route('printproxy_info', '/printproxy/info.json')
    config.add_route('printproxy_create', '/printproxy/create.json')
    config.add_route('printproxy_get', '/printproxy/{file}.printout')

    # mutation
    config.add_route('mutation_list', '/mutation/list')

    config.scan()
    return config.make_wsgi_app()
Пример #7
0
def main(global_config, **settings):

    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    add_mako_renderer(config, '.html')

    # Register a tween to get back the cache buster path.
    config.add_tween("c2corg_ui.lib.cacheversion.CachebusterTween")

    _add_static_view(config, 'static', 'c2corg_ui:static')
    config.add_static_view('node_modules', settings.get('node_modules_path'),
                           cache_max_age=3600)
    config.add_static_view('closure', settings.get('closure_library_path'),
                           cache_max_age=3600)

    config.add_route('index', '/')

    config.add_route('waypoints_view', '/waypoints/{id}/{lang}')
    config.add_route('waypoints_index', '/waypoints')
    config.add_route('waypoints_sitemap_default', '/waypoints/sitemap')
    config.add_route('waypoints_sitemap', '/waypoints/sitemap*filters')
    config.add_route('waypoints_add', '/waypoints/add')
    config.add_route('waypoints_edit', '/waypoints/edit/{id}/{lang}')
    config.add_route('waypoints_history', '/waypoints/history/{id}/{lang}')
    config.add_route('waypoints_archive',
                     '/waypoints/{id}/{lang}/{version:\d+}')
    config.add_route(
        'waypoints_diff', '/waypoints/diff/{id}/{lang}/{v1}/{v2}')

    config.add_route('routes_view', '/routes/{id}/{lang}')
    config.add_route('routes_index', '/routes')
    config.add_route('routes_sitemap_default', '/routes/sitemap')
    config.add_route('routes_sitemap', '/routes/sitemap*filters')
    config.add_route('routes_add', '/routes/add')
    config.add_route('routes_edit', '/routes/edit/{id}/{lang}')
    config.add_route('routes_history', '/routes/history/{id}/{lang}')
    config.add_route('routes_archive', '/routes/{id}/{lang}/{version:\d+}')
    config.add_route(
        'routes_diff', '/routes/diff/{id}/{lang}/{v1}/{v2}')

    config.add_route('outings_view', '/outings/{id}/{lang}')
    config.add_route('outings_index', '/outings')
    config.add_route('outings_sitemap_default', '/outings/sitemap')
    config.add_route('outings_sitemap', '/outings/sitemap*filters')
    config.add_route('outings_add', '/outings/add')
    config.add_route('outings_edit', '/outings/edit/{id}/{lang}')
    config.add_route('outings_history', '/outings/history/{id}/{lang}')
    config.add_route('outings_archive',
                     '/outings/{id}/{lang}/{version:\d+}')
    config.add_route(
        'outings_diff', '/outings/diff/{id}/{lang}/{v1}/{v2}')

    config.add_route('auth', '/auth')

    config.add_route('account', '/account')

    config.scan(ignore='c2corg_ui.tests')
    return config.make_wsgi_app()
Пример #8
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    add_mako_renderer(config, '.html')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_static_view('node_modules', settings.get('node_modules_path'),
                           cache_max_age=3600)
    config.add_static_view('closure', settings.get('closure_library_path'),
                           cache_max_age=3600)
    config.add_route('index', '/')
    config.scan()
    return config.make_wsgi_app()
Пример #9
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    add_mako_renderer(config, '.html')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_static_view('node_modules',
                           settings.get('node_modules_path'),
                           cache_max_age=3600)
    config.add_static_view('closure',
                           settings.get('closure_library_path'),
                           cache_max_age=3600)
    config.add_route('index', '/')
    config.scan()
    return config.make_wsgi_app()
Пример #10
0
def includeme(config):
    add_mako_renderer(config, '.txt')
    reg = config.registry
    region = make_region()
    region.configure_from_config(config.registry.settings,
                                 'cache.registration.')
    store = DogPileTokenStore(region)
    message_factory = RegistrationMessageFactory(
        sender=config.registry.settings['registration.mail.sender'])

    reg.utilities.register([], ITokenStore, "", store)
    reg.utilities.register([], ITokenGenerator, "", generate_uuid_token)
    reg.utilities.register([], IMessageFactory, "", message_factory)
    reg.utilities.register([], IUserFactory, "", user_factory)
    reg.adapters.register([
        IMailer,
        IMessageFactory,
        ITokenStore,
        ITokenGenerator,
        IUserFactory,
    ], IRegistration, "", Registration)
Пример #11
0
def includeme(config):
    """
    By including this in your pyramid web app you can easily provide SQLAlchemy data sets via a restful API

    :param config: The pyramid apps config object
    :type config: Configurator
    """

    # bind the mako renderer to other file extensions
    try:
        add_mako_renderer(config, ".html")
        config.commit()
    except ConfigurationConflictError as e:
        log.debug('Renderer for "html" already exists: {0}'.format(e.message))
    try:
        add_mako_renderer(config, ".js")
        config.commit()
    except ConfigurationConflictError as e:
        log.debug('Renderer for "js" already exists: {0}'.format(e.message))

    # add standard renderers
    config.add_renderer(name='geo_restful_json', factory=RestfulJson)
    config.add_renderer(name='geo_restful_geo_json', factory=RestfulGeoJson)
    config.add_renderer(name='geo_restful_xml', factory=RestfulXML)
    config.add_renderer(name='geo_restful_model_json', factory=RestfulModelJSON)
    config.add_renderer(name='geo_restful_model_xml', factory=RestfulModelXML)

    # add request attributes

    # global database connection holder see database script/rest script in api class
    # this feature is mainly used to reduce open database connections. They will be shared if they are exactly
    # the same.
    config.registry.pyramid_georest_database_connections = {}
    # global api holder
    config.registry.pyramid_georest_apis = {}
    # place where the api is available on each request
    config.registry.pyramid_georest_requested_api = None
    # place where the service is available on each request
    config.registry.pyramid_georest_requested_service = None
Пример #12
0
def main(global_config: Any, **settings: Any) -> Router:
    """Start the server in Pyramid."""
    del global_config  # unused

    config = Configurator(settings=settings)

    init_tilegeneration(settings.get("tilegeneration_configfile"))
    assert tilegeneration

    config.include(c2cwsgiutils.pyramid.includeme)
    health_check.HealthCheck(config)

    add_mako_renderer(config, ".html")

    config.add_route(
        "admin",
        f"/{tilegeneration.get_main_config().config['server']['admin_path']}/",
        request_method="GET",
    )
    config.add_route(
        "admin_run",
        f"/{tilegeneration.get_main_config().config['server']['admin_path']}/run",
        request_method="POST",
    )
    config.add_route(
        "admin_test",
        f"/{tilegeneration.get_main_config().config['server']['admin_path']}/test",
        request_method="GET",
    )

    config.add_route("tiles", "/*path", request_method="GET")
    config.add_view(PyramidView, route_name="tiles")

    config.scan("tilecloud_chain.views")

    return config.make_wsgi_app()
Пример #13
0
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
    config = Configurator(settings=settings)
    config.include('pyramid_chameleon')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('home', '/')
    add_mako_renderer(config,'.html')
    config.add_route('test_string','test/string')
    config.add_route('test_html','test/html')
    config.add_route('transmission','transmission')
    config.add_route('scan','scan')
    config.add_route('del','del')
    config.add_route('user','add/user')
    config.add_route('address','insert/address')
    config.add_route('scan_user','/scan/user')
    config.add_route('add_address','/add/adress')
    config.add_route('scan_address','/scan/address')
    config.add_route('del_address','/del/address')
    config.scan()
    return config.make_wsgi_app()
Пример #14
0
def includeme(config):  # pragma: no cover
    """
    This is the place where you should push all the initial stuff for the plugin
    :param config: The configurator object from the including pyramid module.
    :type geometries: Configurator
    """
    # If you need access to the settings in this part, you can get them via
    # settings = config.get_settings()
    global route_prefix

    config.include('pyramid_mako')

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".xml")
    add_mako_renderer(config, ".js")

    config.include('oereb_client.routes')

    def get_route_prefix(request):
        return config.route_prefix

    config.add_request_method(get_route_prefix, name='route_prefix', reify=True)
Пример #15
0
def main(global_config, **settings):

    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(
        root_factory=Root, settings=settings,
        locale_negotiator=locale_negotiator,
        authentication_policy=create_authentication(settings)
    )
    # config.add_subscriber(add_cors_headers_response_callback, NewRequest)

    # overwrite print routes
    config.add_route(
        "lux_printproxy_report_create",
        "/printproxy/report.{format}",
        request_method="POST"
    )
    config.add_route(
        "lux_printproxy_status",
        "/printproxy/status/{ref}.json",
        request_method="GET"
    )
    config.add_route(
        "lux_printproxy_report_get",
        "/printproxy/report/{ref}",
        request_method="GET"
    )
    config.add_route(
        "lux_printproxy_report_cancel",
        "/printproxy/cancel/{ref}",
        request_method="DELETE"
    )
    # mymaps routes
    config.add_route(
        "mymaps",
        "/mymaps",
        request_method="HEAD"
    )
    config.add_route(
        "mymaps_image",
        "/",
        request_method="HEAD"
    )
    config.add_route(
        "mymaps_getcategories",
        "mymaps/categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getallcategories",
        "mymaps/allcategories",
        request_method="GET"
    )

    config.add_route(
        "mymaps_getpublicmaps",
        "/mymaps/public_maps",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getpublicategories",
        "/mymaps/public_categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getmaps",
        "/mymaps/maps",
        request_method="GET"
    )
    config.add_route(
        "mymaps_features",
        "/mymaps/features/{map_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_map_info",
        "/mymaps/map_info/{map_id}",
        request_method="GET"
    )

    config.add_route(
        "predefined_wms",
        "/predefined_wms",
        request_method="GET"
    )

    config.add_route(
        "mymaps_create",
        "/mymaps/create",
        request_method="POST"
    )
    config.add_route(
        "mymaps_rate",
        "/mymaps/rate/{map_id}"
    )
    config.add_route(
        "mymaps_update",
        "/mymaps/update/{map_id}",
        request_method="PUT"
    )
    config.add_route(
        "mymaps_map",
        "/mymaps/map/{map_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_comment",
        "/mymaps/comment/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_upload_image",
        "/mymaps/upload_image",
        request_method="POST"
    )
    config.add_route(
        "mymaps_upload_symbol",
        "/mymaps/upload_symbol",
        request_method="POST"
    )
    config.add_route(
        "mymaps_get_image",
        "/mymaps/images/{filename}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_get_symbol",
        "/mymaps/symbol/{symbol_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_users_categories",
        "/mymaps/get_users_categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_get_symbols",
        "/mymaps/symbols",
        request_method="GET"
    )
    config.add_route(
        "mymaps_delete",
        "/mymaps/delete/{map_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_delete_all_features",
        "/mymaps/delete_all_features/{map_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_delete_feature",
        "/mymaps/delete_feature/{feature_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_save_feature",
        "/mymaps/save_feature/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_save_features",
        "/mymaps/save_features/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_save_order",
        "/mymaps/save_order/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_copy",
        "/mymaps/copy/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "exportgpxkml",
        "/mymaps/exportgpxkml",
        request_method="POST"
    )
    config.add_route(
        "get_arrow_color",
        "/mymaps/getarrow"
    )
    config.add_route(
        "getroute",
        "/mymaps/getroute"
    )
    config.add_route(
        "getremoteroute",
        "/router/getroute"
    )
    # geocoder routes
    config.add_route(
        "reverse_geocode",
        "/geocode/reverse"
    )
    config.add_route(
        "geocode",
        "/geocode/search"
    )
    config.add_route(
        "feedback",
        "/feedback"
    )
    # pag routes
    config.add_route(
        "pag_url",
        "/pag"
    )
    # pag routes
    config.add_route(
        "pag_report",
        "/pag/report/{oid}.pdf"
    )
    # pag routes
    config.add_route(
        "casipo_url",
        "/casipo"
    )
    # pag routes
    config.add_route(
        "casipo_report",
        "/casipo/report/{oid}.pdf"
    )
    # pds routes
    config.add_route(
        "pds_url",
        "/pds"
    )
    # pag routes
    config.add_route(
        "pds_report",
        "/pds/report/{oid}.pdf"
    )
    config.add_route(
        "pag_files",
        "/pag/files/{_file}"
    )
    config.add_route(
        "get_png",
        "/legends/get"
    )
    config.add_route(
        "get_html",
        "/legends/get_html"
    )

    # full text search routes
    config.add_route("fulltextsearch", "/fulltextsearch")

    # layer search routes
    config.add_route("layersearch", "/layersearch")

    # cms search routes
    config.add_route("cmssearch", "/cmssearch")

    # jsapi routes
    config.add_route(
        'jsapiloader',
        '/apiv3loader.js'
    )
    config.add_route(
        'jsapiexample',
        '/api-example'
    )
    config.add_route(
        'jsapilayers',
        '/jsapilayers'
    )

    config.include('c2cgeoportal')
    config.include('pyramid_closure')

    add_mako_renderer(config, '.appcache')

    config.add_translation_dirs('geoportailv3:locale/')

    # initialize database
    engines = config.get_settings()['sqlalchemy_engines']
    if engines:
        config.registry.dbmakers = {}
        for engine in engines:
            if 'url' not in engines[engine]:
                sqlahelper.add_engine(
                    sqlalchemy.create_engine(engines[engine]), name=engine)
            else:
                sqlahelper.add_engine(
                    sqlalchemy.create_engine(engines[engine]['url']),
                    name=engine)
            config.registry.dbmakers[engine] = sessionmaker(
                bind=sqlahelper.get_engine(engine))
            config.add_request_method(init_db(engine),
                                      'db_'+engine, reify=True)

    from geoportailv3.views.authentication import ldap_user_validator, \
        get_user_from_request
    ldap_settings = config.get_settings()['ldap']
    if ldap_settings:
        config.include('pyramid_ldap')

        """Config the ldap connection.
        """

        config.ldap_setup(
            ldap_settings['url'],
            ldap_settings['bind'],
            ldap_settings['passwd'],
        )

        config.ldap_set_login_query(
            ldap_settings['base_dn'],
            filter_tmpl='(login=%(login)s)',
            scope=ldap.SCOPE_SUBTREE,
            )

        config.set_request_property(
            get_user_from_request,
            name='user',
            reify=True
        )

        set_user_validator(config, ldap_user_validator)
    json_renderer = JSON()

    json_renderer.add_adapter(datetime.date, datetime_adapter)
    json_renderer.add_adapter(datetime.datetime, datetime_adapter)
    json_renderer.add_adapter(Decimal, decimal_adapter)
    config.add_renderer('json', json_renderer)

    mail_config = config.get_settings()['turbomail']
    if mail_config:
        interface.start(mail_config)

    # scan view decorator for adding routes
    config.scan()

    # add the interfaces
    add_interface(config, interface_type=INTERFACE_TYPE_NGEO_CATALOGUE)

    config.add_route("echocsv", "/profile/echocsv", request_method="POST")
    config.add_route('getuserinfo', '/getuserinfo')
    config.add_route('wms', '/ogcproxywms')
    config.add_route('https_proxy', '/httpsproxy')
    config.add_route('download_sketch', '/downloadsketch')
    config.add_route('download', '/download')
    config.add_route('download_measurement', '/downloadmeasurement')
    config.add_route('preview_measurement', '/previewmeasurement')
    config.add_route('qr', '/qr')
    config.add_route('getfeatureinfo', '/getfeatureinfo')
    config.add_route('getpoitemplate', '/getpoitemplate')
    config.add_route('getremotetemplate', '/getremotetemplate')
    config.add_route('isthemeprivate', '/isthemeprivate')
    config.add_route('download_resource', '/downloadresource')

    # Appcache manifest
    config.add_route(
        'appcache',
        '/geoportailv3.appcache'
    )

    return config.make_wsgi_app()
Пример #16
0
def includeme(config):
    """
    This function returns a Pyramid WSGI application.
    """

    settings = config.get_settings()

    config.include("c2cgeoportal_commons")

    call_hook(settings, "after_settings", settings)

    get_user_from_request = create_get_user_from_request(settings)
    config.add_request_method(get_user_from_request,
                              name="user",
                              property=True)
    config.add_request_method(get_user_from_request, name="get_user")

    # Configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal_geoportal:locale/")

    config.include('c2cwsgiutils.pyramid.includeme')
    health_check = HealthCheck(config)

    # Initialise DBSessions
    init_dbsessions(settings, config, health_check)

    # Initialize the dbreflection module
    dbreflection.init()

    checker.init(config, health_check)
    check_collector.init(config, health_check)

    config.include("pyramid_closure")

    # dogpile.cache configuration
    if 'cache' in settings:
        caching.init_region(settings['cache'])
        from c2cgeoportal_commons.models.main import InvalidateCacheEvent

        @zope.event.classhandler.handler(InvalidateCacheEvent)
        def handle(event: InvalidateCacheEvent):
            del event
            caching.invalidate_region()

    # Register a tween to get back the cache buster path.
    config.add_tween(
        "c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")

    # Bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    # Add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # Add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # Add the "xsd" renderer
    config.add_renderer(
        "xsd", XSD(sequence_callback=dbreflection.xsd_sequence_callback))

    # Add the set_user_validator directive, and set a default user validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", False):  # pragma: no cover
        # Add an OGCProxy view
        config.add_route_predicate("ogc_server", OgcproxyRoutePredicate)
        config.add_route("ogcproxy", "/ogcproxy", ogc_server=True)
        config.add_view("papyrus_ogcproxy.views:ogcproxy",
                        route_name="ogcproxy")

    # Add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route(
        "mapserverproxy",
        "/mapserv_proxy",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
    )

    # Add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy",
        "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # Add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # Add route to the export GPX/KML view
    config.add_route("exportgpxkml", "/exportgpxkml")

    # Add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # Add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword",
                     "/loginresetpassword",
                     request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route(
        "themes",
        "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # Print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("printproxy_report_create",
                     "/printproxy/report.{format}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("printproxy_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")
    config.add_route("printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")
    # For v2
    config.add_route(
        "printproxy_info",
        "/printproxy/info.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_create",
        "/printproxy/create.json",
        request_method="POST",
    )
    config.add_route(
        "printproxy_get",
        "/printproxy/{file}.printout",
        request_method="GET",
    )

    # Full-text search routes
    add_cors_route(config, "/fulltextsearch", "fulltextsearch")
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.{ext}", "profile")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # Shortener
    add_cors_route(config, "/short/create", "shortener")
    config.add_route("shortener_create",
                     "/short/create",
                     request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport",
                     "/pdfreport/{layername}/{ids}",
                     request_method="GET")

    # Add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route("layers_count",
                     "/layers/{layer_id:\\d+}/count",
                     request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("layers_read_many",
                     "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
                     request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="GET")
    config.add_route("layers_create",
                     "/layers/{layer_id:\\d+}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_update",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="PUT",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_delete",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # There is no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # Scan view decorator for adding routes
    config.scan(ignore=[
        "c2cgeoportal_geoportal.scripts", "c2cgeoportal_geoportal.wsgi_app"
    ])

    if "subdomains" in settings:  # pragma: no cover
        config.registry.registerUtility(MultiDomainStaticURLInfo(),
                                        IStaticURLInfo)

    # Add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal_geoportal:static")
    _add_static_view(config, "project", "c2cgeoportal_geoportal:project")

    add_admin_interface(config)
    add_static_view(config)

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)
Пример #17
0
def main(global_config, **settings):

    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(
        root_factory=Root, settings=settings,
        locale_negotiator=locale_negotiator,
        authentication_policy=create_authentication(settings)
    )
    # config.add_subscriber(add_cors_headers_response_callback, NewRequest)

    # overwrite print routes
    config.add_route(
        "lux_printproxy_report_create",
        "/printproxy/report.{format}",
        request_method="POST"
    )
    config.add_route(
        "lux_printproxy_status",
        "/printproxy/status/{ref}.json",
        request_method="GET"
    )
    config.add_route(
        "lux_printproxy_report_get",
        "/printproxy/report/{ref}",
        request_method="GET"
    )
    config.add_route(
        "lux_printproxy_report_cancel",
        "/printproxy/cancel/{ref}",
        request_method="DELETE"
    )
    # mymaps routes
    config.add_route(
        "mymaps",
        "/mymaps",
        request_method="HEAD"
    )
    config.add_route(
        "mymaps_image",
        "/",
        request_method="HEAD"
    )
    config.add_route(
        "mymaps_getcategories",
        "mymaps/categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getallcategories",
        "mymaps/allcategories",
        request_method="GET"
    )

    config.add_route(
        "generate_symbol_file",
        "/mymaps/generate_symbol_file",
        request_method="GET"
    )

    config.add_route(
        "mymaps_getpublicmaps",
        "/mymaps/public_maps",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getpublicategories",
        "/mymaps/public_categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_getmaps",
        "/mymaps/maps",
        request_method="GET"
    )
    config.add_route(
        "mymaps_features",
        "/mymaps/features/{map_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_map_info",
        "/mymaps/map_info/{map_id}",
        request_method="GET"
    )

    config.add_route(
        "predefined_wms",
        "/predefined_wms",
        request_method="GET"
    )

    config.add_route(
        "mymaps_create",
        "/mymaps/create",
        request_method="POST"
    )
    config.add_route(
        "mymaps_rate",
        "/mymaps/rate/{map_id}"
    )
    config.add_route(
        "mymaps_update",
        "/mymaps/update/{map_id}",
        request_method="PUT"
    )
    config.add_route(
        "mymaps_map",
        "/mymaps/map/{map_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_comment",
        "/mymaps/comment/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_upload_image",
        "/mymaps/upload_image",
        request_method="POST"
    )
    config.add_route(
        "mymaps_upload_symbol",
        "/mymaps/upload_symbol",
        request_method="POST"
    )
    config.add_route(
        "mymaps_get_image",
        "/mymaps/images/{filename}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_get_symbol",
        "/mymaps/symbol/{symbol_id}",
        request_method="GET"
    )
    config.add_route(
        "mymaps_users_categories",
        "/mymaps/get_users_categories",
        request_method="GET"
    )
    config.add_route(
        "mymaps_get_symbols",
        "/mymaps/symbols",
        request_method="GET"
    )
    config.add_route(
        "mymaps_delete",
        "/mymaps/delete/{map_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_delete_all_features",
        "/mymaps/delete_all_features/{map_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_delete_feature",
        "/mymaps/delete_feature/{feature_id}",
        request_method="DELETE"
    )
    config.add_route(
        "mymaps_save_feature",
        "/mymaps/save_feature/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_save_features",
        "/mymaps/save_features/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_save_order",
        "/mymaps/save_order/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "mymaps_copy",
        "/mymaps/copy/{map_id}",
        request_method="POST"
    )
    config.add_route(
        "exportgpxkml",
        "/mymaps/exportgpxkml",
        request_method="POST"
    )
    config.add_route(
        "get_arrow_color",
        "/mymaps/getarrow"
    )
    config.add_route(
        "getroute",
        "/mymaps/getroute"
    )
    config.add_route(
        "getremoteroute",
        "/router/getroute"
    )
    # geocoder routes
    config.add_route(
        "reverse_geocode",
        "/geocode/reverse"
    )
    config.add_route(
        "geocode",
        "/geocode/search"
    )
    config.add_route(
        "feedback",
        "/feedback"
    )
    config.add_route(
        "feedbackanf",
        "/feedbackanf"
    )
    # pag routes
    config.add_route(
        "pag_url",
        "/pag"
    )
    # pag routes
    config.add_route(
        "pag_report",
        "/pag/report/{oid}.pdf"
    )
    # pag routes
    config.add_route(
        "casipo_url",
        "/casipo"
    )
    # pag routes
    config.add_route(
        "casipo_report",
        "/casipo/report/{oid}.pdf"
    )
    # pds routes
    config.add_route(
        "pds_url",
        "/pds"
    )
    # pag routes
    config.add_route(
        "pds_report",
        "/pds/report/{oid}.pdf"
    )
    config.add_route(
        "pag_files",
        "/pag/files/{_file}"
    )
    config.add_route(
        "get_png",
        "/legends/get"
    )
    config.add_route(
        "get_html",
        "/legends/get_html"
    )

    # full text search routes
    config.add_route("fulltextsearch", "/fulltextsearch")

    # layer search routes
    config.add_route("layersearch", "/layersearch")

    # cms search routes
    config.add_route("cmssearch", "/cmssearch")

    # jsapi routes
    config.add_route(
        'jsapiloader',
        '/apiv3loader.js'
    )
    config.add_route(
        'jsapiexample',
        '/api-example'
    )
    config.add_route(
        'jsapilayers',
        '/jsapilayers'
    )

    config.include('c2cgeoportal')
    config.include('pyramid_closure')

    add_mako_renderer(config, '.appcache')

    config.add_translation_dirs('geoportailv3:locale/')

    # initialize database
    engines = config.get_settings()['sqlalchemy_engines']
    if engines:
        config.registry.dbmakers = {}
        for engine in engines:
            if 'url' not in engines[engine]:
                sqlahelper.add_engine(
                    sqlalchemy.create_engine(engines[engine]), name=engine)
            else:
                sqlahelper.add_engine(
                    sqlalchemy.create_engine(engines[engine]['url']),
                    name=engine)
            config.registry.dbmakers[engine] = sessionmaker(
                bind=sqlahelper.get_engine(engine))
            config.add_request_method(init_db(engine),
                                      'db_'+engine, reify=True)

    from geoportailv3.views.authentication import ldap_user_validator, \
        get_user_from_request
    ldap_settings = config.get_settings()['ldap']
    if ldap_settings:
        config.include('pyramid_ldap')

        """Config the ldap connection.
        """

        config.ldap_setup(
            ldap_settings['url'],
            ldap_settings['bind'],
            ldap_settings['passwd'],
        )

        config.ldap_set_login_query(
            ldap_settings['base_dn'],
            filter_tmpl='(login=%(login)s)',
            scope=ldap.SCOPE_SUBTREE,
            )

        config.set_request_property(
            get_user_from_request,
            name='user',
            reify=True
        )

        set_user_validator(config, ldap_user_validator)
    json_renderer = JSON()

    json_renderer.add_adapter(datetime.date, datetime_adapter)
    json_renderer.add_adapter(datetime.datetime, datetime_adapter)
    json_renderer.add_adapter(Decimal, decimal_adapter)
    config.add_renderer('json', json_renderer)

    mail_config = config.get_settings()['turbomail']
    if mail_config:
        interface.start(mail_config)

    # scan view decorator for adding routes
    config.scan()

    # add the interfaces
    add_interface(config, interface_type=INTERFACE_TYPE_NGEO_CATALOGUE)

    config.add_route("echocsv", "/profile/echocsv", request_method="POST")
    config.add_route('getuserinfo', '/getuserinfo')
    config.add_route('wms', '/ogcproxywms')
    config.add_route('https_proxy', '/httpsproxy')
    config.add_route('download_sketch', '/downloadsketch')
    config.add_route('download', '/download')
    config.add_route('download_measurement', '/downloadmeasurement')
    config.add_route('preview_measurement', '/previewmeasurement')
    config.add_route('qr', '/qr')
    config.add_route('getfeatureinfo', '/getfeatureinfo')
    config.add_route('getpoitemplate', '/getpoitemplate')
    config.add_route('getremotetemplate', '/getremotetemplate')
    config.add_route('isthemeprivate', '/isthemeprivate')
    config.add_route('download_resource', '/downloadresource')

    # Appcache manifest
    config.add_route(
        'appcache',
        '/geoportailv3.appcache'
    )

    return config.make_wsgi_app()
Пример #18
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    # update the settings object from the YAML application config file
    settings = config.get_settings()
    settings.update(c2c.template.get_config(settings.get("app.cfg")))

    call_hook(settings, "after_settings", settings)

    config.add_request_method(_create_get_user_from_request(settings),
                              name="user",
                              property=True)

    # configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal:locale/")

    # initialize database
    engine = sqlalchemy.engine_from_config(settings, "sqlalchemy.")
    sqlahelper.add_engine(engine)
    config.include(pyramid_tm.includeme)
    config.include("pyramid_closure")

    if "sqlalchemy_slave.url" in settings and \
            settings["sqlalchemy.url"] != settings["sqlalchemy_slave.url"]:  # pragma: nocover
        # Setup a slave DB connection and add a tween to switch between it and the default one.
        log.info("Using a slave DB for reading")
        engine_slave = sqlalchemy.engine_from_config(config.get_settings(),
                                                     "sqlalchemy_slave.")
        sqlahelper.add_engine(engine_slave, name="slave")
        config.add_tween("c2cgeoportal.models.db_chooser_tween_factory",
                         over="pyramid_tm.tm_tween_factory")

    # initialize the dbreflection module
    dbreflection.init(engine)

    # dogpile.cache configuration
    caching.init_region(settings["cache"])
    caching.invalidate_region()

    # Register a tween to get back the cache buster path.
    config.add_tween("c2cgeoportal.lib.cacheversion.CachebusterTween")

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")
    config.include("pyramid_chameleon")

    # add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # add the "xsd" renderer
    config.add_renderer(
        "xsd", XSD(sequence_callback=dbreflection._xsd_sequence_callback))

    # add the set_user_validator directive, and set a default user
    # validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", False):  # pragma: no cover
        # add an OGCProxy view
        config.add_route_predicate("ogc_server", OgcproxyRoutePredicate)
        config.add_route("ogcproxy", "/ogcproxy", ogc_server=True)
        config.add_view("papyrus_ogcproxy.views:ogcproxy",
                        route_name="ogcproxy")

    # add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route(
        "mapserverproxy",
        "/mapserv_proxy",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
    )

    # add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy",
        "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # add route to the export GPX/KML view
    config.add_route("exportgpxkml", "/exportgpxkml")

    # add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword",
                     "/loginresetpassword",
                     request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route(
        "themes",
        "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # checker routes, Checkers are web services to test and assess that
    # the application is correctly functioning.
    # These web services are used by tools like (nagios).
    config.add_route("checker_routes", "/checker_routes", request_method="GET")
    config.add_route("checker_lang_files",
                     "/checker_lang_files",
                     request_method="GET")
    config.add_route("checker_pdf3", "/checker_pdf3", request_method="GET")
    config.add_route("checker_fts", "/checker_fts", request_method="GET")
    config.add_route("checker_theme_errors",
                     "/checker_theme_errors",
                     request_method="GET")
    config.add_route("checker_phantomjs",
                     "/checker_phantomjs",
                     request_method="GET")
    # collector
    config.add_route("check_collector",
                     "/check_collector",
                     request_method="GET")

    # print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("printproxy_report_create",
                     "/printproxy/report.{format}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("printproxy_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")
    config.add_route("printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")

    # full text search routes
    add_cors_route(config, "/fulltextsearch", "fulltextsearch")
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.{ext}", "profile")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # shortener
    add_cors_route(config, "/short/create", "shortner")
    config.add_route("shortener_create",
                     "/short/create",
                     request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport",
                     "/pdfreport/{layername}/{id}",
                     request_method="GET")

    # add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route("layers_count",
                     "/layers/{layer_id:\\d+}/count",
                     request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("layers_read_many",
                     "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
                     request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="GET")
    config.add_route("layers_create",
                     "/layers/{layer_id:\\d+}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_update",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="PUT",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_delete",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # there's no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # pyramid_formalchemy's configuration
    config.include("pyramid_formalchemy")
    config.include("fa.jquery")

    # define the srid, schema and parentschema
    # as global variables to be usable in the model
    c2cgeoportal.srid = settings["srid"]
    c2cgeoportal.schema = settings["schema"]
    c2cgeoportal.parentschema = settings["parentschema"]
    c2cgeoportal.formalchemy_default_zoom = get_setting(
        settings, ("admin_interface", "map_zoom"),
        c2cgeoportal.formalchemy_default_zoom)
    c2cgeoportal.formalchemy_default_x = get_setting(
        settings, ("admin_interface", "map_x"),
        c2cgeoportal.formalchemy_default_x)
    c2cgeoportal.formalchemy_default_y = get_setting(
        settings, ("admin_interface", "map_y"),
        c2cgeoportal.formalchemy_default_y)
    c2cgeoportal.formalchemy_available_functionalities = get_setting(
        settings, ("admin_interface", "available_functionalities"),
        c2cgeoportal.formalchemy_available_functionalities)
    c2cgeoportal.formalchemy_available_metadata = get_setting(
        settings, ("admin_interface", "available_metadata"),
        c2cgeoportal.formalchemy_available_metadata)
    c2cgeoportal.formalchemy_available_metadata = [
        e if isinstance(e, basestring) else e.get("name")
        for e in c2cgeoportal.formalchemy_available_metadata
    ]

    config.add_route("checker_all", "/checker_all", request_method="GET")

    config.add_route("version_json", "/version.json", request_method="GET")

    stats.init(config)

    # scan view decorator for adding routes
    config.scan(ignore=["c2cgeoportal.tests", "c2cgeoportal.scripts"])

    if "subdomains" in settings:  # pragma: no cover
        config.registry.registerUtility(MultiDomainStaticURLInfo(),
                                        IStaticURLInfo)

    # add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal:static")
    _add_static_view(config, "project", "c2cgeoportal:project")

    add_admin_interface(config)
    add_static_view(config)

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)

    _log_versions(settings)
Пример #19
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    # update the settings object from the YAML application config file
    settings = config.get_settings()
    settings.update(yaml.load(file(settings.get("app.cfg"))))

    global srid
    global schema
    global parentschema
    global formalchemy_language
    global formalchemy_default_zoom
    global formalchemy_default_x
    global formalchemy_default_y
    global formalchemy_available_functionalities
    global formalchemy_available_metadata

    config.add_request_method(_create_get_user_from_request(settings),
                              name="user",
                              property=True)

    # configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal:locale/")

    # initialize database
    engine = sqlalchemy.engine_from_config(settings, "sqlalchemy.")
    sqlahelper.add_engine(engine)
    config.include(pyramid_tm.includeme)
    config.include("pyramid_closure")

    # initialize the dbreflection module
    dbreflection.init(engine)

    # dogpile.cache configuration
    caching.init_region(settings["cache"])
    caching.invalidate_region()

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")
    config.include("pyramid_chameleon")

    # add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # add the "xsd" renderer
    config.add_renderer(
        "xsd", XSD(sequence_callback=dbreflection._xsd_sequence_callback))

    # add the set_user_validator directive, and set a default user
    # validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", True):
        # add an OGCProxy view
        config.add_route("ogcproxy",
                         "/ogcproxy",
                         custom_predicates=(ogcproxy_route_predicate, ))
        config.add_view("papyrus_ogcproxy.views:ogcproxy",
                        route_name="ogcproxy")

    # add routes to the mapserver proxy
    config.add_route(
        "mapserverproxy",
        "/mapserv_proxy",
        custom_predicates=(mapserverproxy_route_predicate, ),
        pregenerator=C2CPregenerator(role=True),
    )

    # add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy",
        "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # add route to the export GPX/KML view
    config.add_route("exportgpxkml", "/exportgpxkml")

    # add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # add routes to the entry view class
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method=("GET", "POST"))
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword",
                     "/loginresetpassword",
                     request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route(
        "themes",
        "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # checker routes, Checkers are web services to test and assess that
    # the application is correctly functioning.
    # These web services are used by tools like (nagios).
    config.add_route("checker_main", "/checker_main", request_method="GET")
    config.add_route("checker_viewer", "/checker_viewer", request_method="GET")
    config.add_route("checker_edit", "/checker_edit", request_method="GET")
    config.add_route("checker_edit_js",
                     "/checker_edit_js",
                     request_method="GET")
    config.add_route("checker_api", "/checker_api", request_method="GET")
    config.add_route("checker_xapi", "/checker_xapi", request_method="GET")
    config.add_route("checker_lang_files",
                     "/checker_lang_files",
                     request_method="GET")
    config.add_route(
        "checker_printcapabilities",
        "/checker_printcapabilities",
        request_method="GET",
    )
    config.add_route("checker_pdf", "/checker_pdf", request_method="GET")
    config.add_route(
        "checker_print3capabilities",
        "/checker_print3capabilities",
        request_method="GET",
    )
    config.add_route("checker_pdf3", "/checker_pdf3", request_method="GET")
    config.add_route("checker_fts", "/checker_fts", request_method="GET")
    config.add_route("checker_wmscapabilities",
                     "/checker_wmscapabilities",
                     request_method="GET")
    config.add_route("checker_wfscapabilities",
                     "/checker_wfscapabilities",
                     request_method="GET")
    config.add_route("checker_theme_errors",
                     "/checker_theme_errors",
                     request_method="GET")
    # collector
    config.add_route("check_collector",
                     "/check_collector",
                     request_method="GET")

    # print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    config.add_route(
        "printproxy_info",
        "/printproxy/info.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_create",
        "/printproxy/create.json",
        request_method="POST",
    )
    config.add_route(
        "printproxy_get",
        "/printproxy/{file}.printout",
        request_method="GET",
    )
    # V3
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("printproxy_report_create",
                     "/printproxy/report.{format}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("printproxy_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")
    config.add_route("printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")

    # full text search routes
    add_cors_route(config, "/fulltextsearch", "fulltextsearch")
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.{ext}", "profile")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # shortener
    config.add_route("shortener_create",
                     "/short/create",
                     request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport",
                     "/pdfreport/{layername}/{id}",
                     request_method="GET")

    # add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route("layers_count",
                     "/layers/{layer_id:\\d+}/count",
                     request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("layers_read_many",
                     "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
                     request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="GET")
    config.add_route("layers_create",
                     "/layers/{layer_id:\\d+}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_update",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="PUT",
                     header=JSON_CONTENT_TYPE)
    config.add_route("layers_delete",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # there's no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # pyramid_formalchemy's configuration
    config.include("pyramid_formalchemy")
    config.include("fa.jquery")

    # define the srid, schema and parentschema
    # as global variables to be usable in the model
    srid = settings["srid"]
    schema = settings["schema"]
    parentschema = settings["parentschema"]
    formalchemy_default_zoom = get_setting(settings,
                                           ("admin_interface", "map_zoom"),
                                           formalchemy_default_zoom)
    formalchemy_default_x = get_setting(settings, ("admin_interface", "map_x"),
                                        formalchemy_default_x)
    formalchemy_default_y = get_setting(settings, ("admin_interface", "map_y"),
                                        formalchemy_default_y)
    formalchemy_available_functionalities = get_setting(
        settings, ("admin_interface", "available_functionalities"),
        formalchemy_available_functionalities)
    formalchemy_available_metadata = get_setting(
        settings, ("admin_interface", "available_metadata"),
        formalchemy_available_metadata)

    config.add_route("checker_all", "/checker_all", request_method="GET")

    # scan view decorator for adding routes
    config.scan(ignore="c2cgeoportal.tests")

    config.registry.registerUtility(MultiDomainStaticURLInfo(), IStaticURLInfo)

    # add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal:static")
    _add_static_view(config, "project", "c2cgeoportal:project")

    add_admin_interface(config)
    add_static_view(config)

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)
Пример #20
0
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    config.include("pyramid_assetviews")
    add_mako_renderer(config, '.html')

    # set up redis cache
    configure_caches(settings)

    # set up document text attributes parsers
    configure_parsers(settings)

    # configure connection pool for http requests
    max_connections = int(settings.get('http_request_connection_pool_size'))
    http_requests.session = requests.Session()
    # see: http://docs.python-requests.org/en/master/api/#requests.adapters.HTTPAdapter  # noqa
    # and: http://urllib3.readthedocs.io/en/1.2.1/managers.html
    adapter = requests.adapters.HTTPAdapter(
        pool_connections=1,  # number of pools (one pool per host)
        pool_maxsize=max_connections  # connections per pool
    )
    http_requests.session.mount('http://', adapter)

    # Register a tween to get back the cache buster path.
    config.add_tween("c2corg_ui.caching.cacheversion.CachebusterTween")

    # view for assets with cache buster
    _add_static_view(config, 'static', 'c2corg_ui:static')

    # favicon stuff
    filenames = [
        "android-chrome-192x192.png", "android-chrome-384x384.png",
        "apple-touch-icon.png", "browserconfig.xml", "favicon-16x16.png",
        "favicon-32x32.png", "favicon.ico", "manifest.json",
        "mstile-150x150.png", "safari-pinned-tab.svg"
    ]
    config.add_asset_views('c2corg_ui:static/favicons',
                           filenames=filenames,
                           http_cache=60 * 60 * 24 * 7)

    # robots.txt
    config.add_asset_views('c2corg_ui:static', 'robots.txt')

    # static views only used in debug mode
    config.add_static_view('node_modules',
                           settings.get('node_modules_path'),
                           cache_max_age=3600)
    config.add_static_view('closure',
                           settings.get('closure_library_path'),
                           cache_max_age=3600)

    # page views
    config.add_route('index', '/')

    config.add_route('waypoints_index', '/waypoints')
    config.add_route('waypoints_add', '/waypoints/add')
    config.add_route('waypoints_edit', '/waypoints/edit/{id:\d+}/{lang}')
    config.add_route('waypoints_history', '/waypoints/history/{id:\d+}/{lang}')
    config.add_route('waypoints_archive',
                     '/waypoints/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('waypoints_view', '/waypoints/{id:\d+}/{lang}/{slug}')
    config.add_route('waypoints_view_id_lang', '/waypoints/{id:\d+}/{lang}')
    config.add_route('waypoints_view_id', '/waypoints/{id:\d+}')
    config.add_route('waypoints_diff',
                     '/waypoints/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('waypoints_preview', '/waypoints/preview')

    config.add_route('routes_index', '/routes')
    config.add_route('routes_add', '/routes/add')
    config.add_route('routes_edit', '/routes/edit/{id:\d+}/{lang}')
    config.add_route('routes_history', '/routes/history/{id:\d+}/{lang}')
    config.add_route('routes_archive',
                     '/routes/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('routes_view', '/routes/{id:\d+}/{lang}/{slug}')
    config.add_route('routes_view_id_lang', '/routes/{id:\d+}/{lang}')
    config.add_route('routes_view_id', '/routes/{id:\d+}')
    config.add_route('routes_diff', '/routes/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('routes_preview', '/routes/preview')

    config.add_route('outings_index', '/outings')
    config.add_route('outings_add', '/outings/add')
    config.add_route('outings_edit', '/outings/edit/{id:\d+}/{lang}')
    config.add_route('outings_history', '/outings/history/{id:\d+}/{lang}')
    config.add_route('outings_archive',
                     '/outings/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('outings_view', '/outings/{id:\d+}/{lang}/{slug}')
    config.add_route('outings_view_id_lang', '/outings/{id:\d+}/{lang}')
    config.add_route('outings_view_id', '/outings/{id:\d+}')
    config.add_route('outings_diff', '/outings/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('outings_preview', '/outings/preview')

    config.add_route('articles_index', '/articles')
    config.add_route('articles_add', '/articles/add')
    config.add_route('articles_edit', '/articles/edit/{id:\d+}/{lang}')
    config.add_route('articles_history', '/articles/history/{id:\d+}/{lang}')
    config.add_route('articles_archive',
                     '/articles/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('articles_view', '/articles/{id:\d+}/{lang}/{slug}')
    config.add_route('articles_view_id_lang', '/articles/{id:\d+}/{lang}')
    config.add_route('articles_view_id', '/articles/{id:\d+}')
    config.add_route('articles_diff',
                     '/articles/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('articles_preview', '/articles/preview')

    config.add_route('books_index', '/books')
    config.add_route('books_add', '/books/add')
    config.add_route('books_edit', '/books/edit/{id:\d+}/{lang}')
    config.add_route('books_history', '/books/history/{id:\d+}/{lang}')
    config.add_route('books_archive',
                     '/books/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('books_view', '/books/{id:\d+}/{lang}/{slug}')
    config.add_route('books_view_id_lang', '/books/{id:\d+}/{lang}')
    config.add_route('books_view_id', '/books/{id:\d+}')
    config.add_route('books_diff', '/books/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('books_preview', '/books/preview')

    config.add_route('xreports_index', '/xreports')
    config.add_route('xreports_add', '/xreports/add')
    config.add_route('xreports_edit', '/xreports/edit/{id:\d+}/{lang}')
    config.add_route('xreports_history', '/xreports/history/{id:\d+}/{lang}')
    config.add_route('xreports_archive',
                     '/xreports/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('xreports_view', '/xreports/{id:\d+}/{lang}/{slug}')
    config.add_route('xreports_view_id_lang', '/xreports/{id:\d+}/{lang}')
    config.add_route('xreports_view_id', '/xreports/{id:\d+}')
    config.add_route('xreports_diff',
                     '/xreports/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('xreports_preview', '/xreports/preview')
    config.add_route('xreports_data', '/xreports/data/{id:\d+}/{lang}')

    config.add_route('images_index', '/images')
    config.add_route('images_edit', '/images/edit/{id:\d+}/{lang}')
    config.add_route('images_history', '/images/history/{id:\d+}/{lang}')
    config.add_route('images_archive',
                     '/images/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('images_view', '/images/{id:\d+}/{lang}/{slug}')
    config.add_route('images_view_id_lang', '/images/{id:\d+}/{lang}')
    config.add_route('images_view_id', '/images/{id:\d+}')
    config.add_route('images_diff', '/images/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('images_preview', '/images/preview')

    config.add_route('areas_index', '/areas')
    config.add_route('areas_edit', '/areas/edit/{id:\d+}/{lang}')
    config.add_route('areas_history', '/areas/history/{id:\d+}/{lang}')
    config.add_route('areas_archive',
                     '/areas/version/{id:\d+}/{lang}/{version:\d+}')
    config.add_route('areas_view', '/areas/{id:\d+}/{lang}/{slug}')
    config.add_route('areas_view_id_lang', '/areas/{id:\d+}/{lang}')
    config.add_route('areas_view_id', '/areas/{id:\d+}')
    config.add_route('areas_diff', '/areas/diff/{id:\d+}/{lang}/{v1}/{v2}')
    config.add_route('areas_preview', '/areas/preview')

    config.add_route('profiles_edit', '/profiles/edit/{id:\d+}/{lang}')
    config.add_route('profiles_view', '/profiles/{id:\d+}/{lang}')
    config.add_route('profiles_view_id', '/profiles/{id:\d+}')
    config.add_route('profiles_data', '/profiles/data/{id:\d+}/{lang}')
    config.add_route('profiles_preview', '/profiles/preview')

    config.add_route('auth', '/auth')
    config.add_route('auth-sso', '/auth-sso')
    config.add_route('sso-login', '/sso-login')

    config.add_route('topoguide', '/topoguide')
    config.add_route('yeti', '/yeti')
    config.add_route('serac', '/serac')

    config.add_route('account', '/account')
    config.add_route('preferences', '/preferences')
    config.add_route('mailinglists', '/mailinglists')
    config.add_route('following', '/following')

    config.add_route('sitemap_index', '/sitemap.xml')
    config.add_route('sitemap', '/sitemaps/{doc_type:[a-z]{1}}/{i:\d+}.xml')

    config.add_route('whatsnew', '/whatsnew')

    # health services
    config.add_route('health', '/health')

    config.scan(ignore='c2corg_ui.tests')
    return config.make_wsgi_app()
Пример #21
0
def main(global_config, **settings):

    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    add_mako_renderer(config, ".html")

    # set up redis cache
    configure_caches(settings)

    # set up document text attributes parsers
    configure_parsers(settings)

    # configure connection pool for http requests
    max_connections = int(settings.get("http_request_connection_pool_size"))
    http_requests.session = requests.Session()
    # see: http://docs.python-requests.org/en/master/api/#requests.adapters.HTTPAdapter  # noqa
    # and: http://urllib3.readthedocs.io/en/1.2.1/managers.html
    adapter = requests.adapters.HTTPAdapter(
        pool_connections=1, pool_maxsize=max_connections  # number of pools (one pool per host)  # connections per pool
    )
    http_requests.session.mount("http://", adapter)

    # Register a tween to get back the cache buster path.
    config.add_tween("c2corg_ui.caching.cacheversion.CachebusterTween")

    # view for assets with cache buster
    _add_static_view(config, "static", "c2corg_ui:static")

    # static views only used in debug mode
    config.add_static_view("node_modules", settings.get("node_modules_path"), cache_max_age=3600)
    config.add_static_view("closure", settings.get("closure_library_path"), cache_max_age=3600)

    # page views
    config.add_route("index", "/")

    config.add_route("waypoints_index", "/waypoints")
    config.add_route("waypoints_add", "/waypoints/add")
    config.add_route("waypoints_edit", "/waypoints/edit/{id:\d+}/{lang}")
    config.add_route("waypoints_history", "/waypoints/history/{id:\d+}/{lang}")
    config.add_route("waypoints_archive", "/waypoints/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("waypoints_view", "/waypoints/{id:\d+}/{lang}/{slug}")
    config.add_route("waypoints_view_id_lang", "/waypoints/{id:\d+}/{lang}")
    config.add_route("waypoints_view_id", "/waypoints/{id:\d+}")
    config.add_route("waypoints_diff", "/waypoints/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("waypoints_preview", "/waypoints/preview")

    config.add_route("routes_index", "/routes")
    config.add_route("routes_add", "/routes/add")
    config.add_route("routes_edit", "/routes/edit/{id:\d+}/{lang}")
    config.add_route("routes_history", "/routes/history/{id:\d+}/{lang}")
    config.add_route("routes_archive", "/routes/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("routes_view", "/routes/{id:\d+}/{lang}/{slug}")
    config.add_route("routes_view_id_lang", "/routes/{id:\d+}/{lang}")
    config.add_route("routes_view_id", "/routes/{id:\d+}")
    config.add_route("routes_diff", "/routes/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("routes_preview", "/routes/preview")

    config.add_route("outings_index", "/outings")
    config.add_route("outings_add", "/outings/add")
    config.add_route("outings_edit", "/outings/edit/{id:\d+}/{lang}")
    config.add_route("outings_history", "/outings/history/{id:\d+}/{lang}")
    config.add_route("outings_archive", "/outings/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("outings_view", "/outings/{id:\d+}/{lang}/{slug}")
    config.add_route("outings_view_id_lang", "/outings/{id:\d+}/{lang}")
    config.add_route("outings_view_id", "/outings/{id:\d+}")
    config.add_route("outings_diff", "/outings/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("outings_preview", "/outings/preview")

    config.add_route("articles_index", "/articles")
    config.add_route("articles_add", "/articles/add")
    config.add_route("articles_edit", "/articles/edit/{id:\d+}/{lang}")
    config.add_route("articles_history", "/articles/history/{id:\d+}/{lang}")
    config.add_route("articles_archive", "/articles/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("articles_view", "/articles/{id:\d+}/{lang}/{slug}")
    config.add_route("articles_view_id_lang", "/articles/{id:\d+}/{lang}")
    config.add_route("articles_view_id", "/articles/{id:\d+}")
    config.add_route("articles_diff", "/articles/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("articles_preview", "/articles/preview")

    config.add_route("books_index", "/books")
    config.add_route("books_add", "/books/add")
    config.add_route("books_edit", "/books/edit/{id:\d+}/{lang}")
    config.add_route("books_history", "/books/history/{id:\d+}/{lang}")
    config.add_route("books_archive", "/books/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("books_view", "/books/{id:\d+}/{lang}/{slug}")
    config.add_route("books_view_id_lang", "/books/{id:\d+}/{lang}")
    config.add_route("books_view_id", "/books/{id:\d+}")
    config.add_route("books_diff", "/books/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("books_preview", "/books/preview")

    config.add_route("xreports_index", "/xreports")
    # config.add_route('xreports_add', '/xreports/add')
    # config.add_route('xreports_edit', '/xreports/edit/{id:\d+}/{lang}')
    config.add_route("xreports_history", "/xreports/history/{id:\d+}/{lang}")
    config.add_route("xreports_archive", "/xreports/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("xreports_view", "/xreports/{id:\d+}/{lang}/{slug}")
    config.add_route("xreports_view_id_lang", "/xreports/{id:\d+}/{lang}")
    config.add_route("xreports_view_id", "/xreports/{id:\d+}")
    config.add_route("xreports_diff", "/xreports/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("xreports_preview", "/xreports/preview")

    config.add_route("images_index", "/images")
    config.add_route("images_edit", "/images/edit/{id:\d+}/{lang}")
    config.add_route("images_history", "/images/history/{id:\d+}/{lang}")
    config.add_route("images_archive", "/images/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("images_view", "/images/{id:\d+}/{lang}/{slug}")
    config.add_route("images_view_id_lang", "/images/{id:\d+}/{lang}")
    config.add_route("images_view_id", "/images/{id:\d+}")
    config.add_route("images_diff", "/images/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("images_preview", "/images/preview")

    config.add_route("areas_index", "/areas")
    config.add_route("areas_edit", "/areas/edit/{id:\d+}/{lang}")
    config.add_route("areas_history", "/areas/history/{id:\d+}/{lang}")
    config.add_route("areas_archive", "/areas/{id:\d+}/{lang}/{version:\d+}")
    config.add_route("areas_view", "/areas/{id:\d+}/{lang}/{slug}")
    config.add_route("areas_view_id_lang", "/areas/{id:\d+}/{lang}")
    config.add_route("areas_view_id", "/areas/{id:\d+}")
    config.add_route("areas_diff", "/areas/diff/{id:\d+}/{lang}/{v1}/{v2}")
    config.add_route("areas_preview", "/areas/preview")

    config.add_route("profiles_edit", "/profiles/edit/{id:\d+}/{lang}")
    config.add_route("profiles_view", "/profiles/{id:\d+}/{lang}")
    config.add_route("profiles_view_id", "/profiles/{id:\d+}")
    config.add_route("profiles_data", "/profiles/data/{id:\d+}/{lang}")
    config.add_route("profiles_preview", "/profiles/preview")

    config.add_route("auth", "/auth")
    config.add_route("auth-sso", "/auth-sso")

    config.add_route("account", "/account")
    config.add_route("preferences", "/preferences")
    config.add_route("mailinglists", "/mailinglists")
    config.add_route("following", "/following")

    config.add_route("robots.txt", "/robots.txt")
    config.add_route("sitemap_index", "/sitemap.xml")
    config.add_route("sitemap", "/sitemaps/{doc_type:[a-z]{1}}/{i:\d+}.xml")

    # health services
    config.add_route("health", "/health")

    config.scan(ignore="c2corg_ui.tests")
    return config.make_wsgi_app()
Пример #22
0
def main(global_config, **settings):
    del global_config  # Unused

    if len(os.environ.get('SENTRY_URL', '')) > 0:
        sentry_sdk.init(dsn=os.environ.get('SENTRY_URL', ''),
                        integrations=[PyramidIntegration()])
    """
    This function returns a Pyramid WSGI application.
    """
    config = Configurator(
        root_factory=Root,
        settings=settings,
        locale_negotiator=locale_negotiator,
        authentication_policy=create_authentication(settings))
    if os.environ.get('ALLOW_CORS', '0') == '1':
        config.add_subscriber(add_cors_headers_response_callback, NewRequest)

    if os.environ.get('DEBUG_TOOLBAR', '0') == '1':
        config.get_settings()['debugtoolbar.hosts'] = ['0.0.0.0/0']
        config.include('pyramid_debugtoolbar')

    # Workaround to not have the error: distutils.errors.DistutilsArgError: no commands supplied
    distutils.core._setup_stop_after = 'config'

    config.add_route("lux_get_thumbnail",
                     "/printproxy/thumbnail",
                     request_method="GET")
    # overwrite print routes
    config.add_route("lux_printproxy_report_create",
                     "/printproxy/report.{format}",
                     request_method="POST")
    config.add_route("lux_printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("lux_printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")
    config.add_route("lux_printproxy_report_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")

    config.include('c2cgeoportal_geoportal')
    distutils.core._setup_stop_after = None

    add_mako_renderer(config, '.appcache')

    config.add_translation_dirs('geoportailv3_geoportal:locale/')

    add_interface(config, 'main', INTERFACE_TYPE_NGEO_CATALOGUE, default=True)

    # ping routes
    config.add_route("ping", "/ping")

    # mymaps routes
    config.add_route("mymaps", "/mymaps", request_method="HEAD")
    config.add_route("mymaps_image", "/", request_method="HEAD")
    config.add_route("mymaps_get_full_mymaps",
                     "mymaps/get_full_mymaps",
                     request_method="GET")
    config.add_route("mymaps_getcategories",
                     "mymaps/categories",
                     request_method="GET")
    config.add_route("mymaps_getallcategories",
                     "mymaps/allcategories",
                     request_method="GET")

    config.add_route("generate_symbol_file",
                     "/mymaps/generate_symbol_file",
                     request_method="GET")

    config.add_route("mymaps_getpublicmaps",
                     "/mymaps/public_maps",
                     request_method="GET")
    config.add_route("mymaps_getpublicategories",
                     "/mymaps/public_categories",
                     request_method="GET")
    config.add_route("mymaps_getmaps", "/mymaps/maps", request_method="GET")
    config.add_route("mymaps_features",
                     "/mymaps/features/{map_id}",
                     request_method="GET")
    config.add_route("mymaps_map_info",
                     "/mymaps/map_info/{map_id}",
                     request_method="GET")

    config.add_route("predefined_wms", "/predefined_wms", request_method="GET")

    config.add_route("mymaps_create", "/mymaps/create", request_method="POST")
    config.add_route("mymaps_rate", "/mymaps/rate/{map_id}")
    config.add_route("mymaps_update",
                     "/mymaps/update/{map_id}",
                     request_method="PUT")
    config.add_route("get_gpx",
                     "/mymaps/get_gpx/{map_id}",
                     request_method="GET")
    config.add_route("mymaps_map",
                     "/mymaps/map/{map_id}",
                     request_method="GET")
    config.add_route("mymaps_comment",
                     "/mymaps/comment/{map_id}",
                     request_method="POST")
    config.add_route("mymaps_upload_image",
                     "/mymaps/upload_image",
                     request_method="POST")
    config.add_route("mymaps_upload_symbol",
                     "/mymaps/upload_symbol",
                     request_method="POST")
    config.add_route("mymaps_get_image",
                     "/mymaps/images/{filename}",
                     request_method="GET")
    config.add_route("mymaps_get_symbol",
                     "/mymaps/symbol/{symbol_id}",
                     request_method="GET")
    config.add_route("mymaps_users_categories",
                     "/mymaps/get_users_categories",
                     request_method="GET")
    config.add_route("mymaps_get_symbols",
                     "/mymaps/symbols",
                     request_method="GET")
    config.add_route("mymaps_delete",
                     "/mymaps/delete/{map_id}",
                     request_method="DELETE")
    config.add_route("mymaps_delete_all_features",
                     "/mymaps/delete_all_features/{map_id}",
                     request_method="DELETE")
    config.add_route("mymaps_delete_feature",
                     "/mymaps/delete_feature/{feature_id}",
                     request_method="DELETE")
    config.add_route("mymaps_save_feature",
                     "/mymaps/save_feature/{map_id}",
                     request_method="POST")
    config.add_route("mymaps_save_features",
                     "/mymaps/save_features/{map_id}",
                     request_method="POST")
    config.add_route("mymaps_save_order",
                     "/mymaps/save_order/{map_id}",
                     request_method="POST")
    config.add_route("mymaps_save_offline",
                     "/mymaps/save_offline",
                     request_method="POST")
    config.add_route("mymaps_copy",
                     "/mymaps/copy/{map_id}",
                     request_method="POST")
    config.add_route("exportgpxkml",
                     "/mymaps/exportgpxkml",
                     request_method="POST")
    config.add_route("get_arrow_color", "/mymaps/getarrow")
    config.add_route("getroute", "/mymaps/getroute")
    config.add_route("getremoteroute", "/router/getroute")
    # geocoder routes
    config.add_route("reverse_geocode", "/geocode/reverse")
    config.add_route("geocode", "/geocode/search")
    config.add_route("feedback", "/feedback")
    config.add_route("feedbackanf", "/feedbackanf")
    config.add_route("feedbackcrues", "/feedbackcrues")
    config.add_route("feedbackage", "/feedbackage")
    # user config routes
    config.add_route("get_userconfig", "/get_userconfig", request_method="GET")
    config.add_route("save_userconfig",
                     "/save_userconfig",
                     request_method="POST")
    config.add_route("delete_userconfig",
                     "/delete_userconfig",
                     request_method="DELETE")
    config.add_route("apply_mvt_config",
                     "/apply_mvt_config",
                     request_method="GET")
    # pag routes
    config.add_route("pag_url", "/pag")
    # pag routes
    config.add_route("pag_report", "/pag/report/{oid}.pdf")
    # pag routes
    config.add_route("casipo_url", "/casipo")
    # pag routes
    config.add_route("casipo_report", "/casipo/report/{oid}.pdf")
    # pds routes
    config.add_route("pds_url", "/pds")
    # pag routes
    config.add_route("pds_report", "/pds/report/{oid}.pdf")
    config.add_route("pag_files", "/pag/files/{_file}")
    config.add_route("get_png", "/legends/get")
    config.add_route("get_html", "/legends/get_html")
    config.add_route("get_metadata", "/getMetadata")
    # full text search routes
    config.add_route("fulltextsearch", "/fulltextsearch")

    # layer search routes
    config.add_route("layersearch", "/layersearch")

    # cms search routes
    config.add_route("cmssearch", "/cmssearch")

    # cms search routes
    config.add_route("featuresearch", "/featuresearch")

    # jsapi routes
    config.add_route('jsapiloader', '/apiv3loader.js')
    config.add_route('jsapiexample', '/api-example')
    config.add_route('jsapilayers', '/jsapilayers')
    config.add_route('jsapilayersfull', '/jsapilayersfull')
    config.add_route('jsapithemesfull', '/jsapithemesfull')

    config.add_route("echocsv", "/profile/echocsv", request_method="POST")
    config.add_route('getuserinfo', '/getuserinfo')
    config.add_route('wms', '/ogcproxywms')
    config.add_route('wmspoi', '/wmspoi')
    config.add_route('https_proxy', '/httpsproxy')
    config.add_route('download_sketch', '/downloadsketch')
    config.add_route('download', '/download')
    config.add_route('download_pdf', '/downloadpdf')
    config.add_route('download_measurement', '/downloadmeasurement')
    config.add_route('preview_measurement', '/previewmeasurement')
    config.add_route('qr', '/qr')
    config.add_route('getfeatureinfo', '/getfeatureinfo')
    config.add_route('getbuswidget', '/getbuswidget')
    config.add_route('getpoitemplate', '/getpoitemplate')
    config.add_route('getremotetemplate', '/getremotetemplate')
    config.add_route('isthemeprivate', '/isthemeprivate')
    config.add_route('download_resource', '/downloadresource')
    config.add_route('upload_vt_style', '/uploadvtstyle')
    config.add_route('delete_vt_style', '/deletevtstyle')
    config.add_route('get_vt_style', '/getvtstyle')

    # Service worker
    config.add_route('sw', '/sw.js')

    config.add_static_view('proj/{version}',
                           path='geoportailv3_geoportal:jsapi/')

    # Appcache manifest
    config.add_route('appcache', '/geoportailv3.appcache')
    # ldap
    from geoportailv3_geoportal.views.authentication import ldap_user_validator, \
        get_user_from_request
    ldap_settings = config.get_settings()['ldap']
    if ldap_settings:
        config.include('pyramid_ldap3')
        """Config the ldap connection.
        """

        config.ldap_setup(
            ldap_settings['url'],
            ldap_settings['bind'],
            ldap_settings['passwd'],
            use_pool=
            False,  # avoid errors like LDAPMaximumRetriesError and LDAPResponseTimeoutError
        )

        ldap_settings['filter_tmpl'] = ldap_settings['filter_tmpl'].replace(
            '%%', '%')
        config.ldap_set_login_query(
            ldap_settings['base_dn'],
            filter_tmpl=ldap_settings['filter_tmpl'],
            scope=ldap.SUBTREE,
        )

        config.set_request_property(get_user_from_request,
                                    name='user',
                                    reify=True)

        set_user_validator(config, ldap_user_validator)

    # json
    json_renderer = JSON()
    json_renderer.add_adapter(datetime.date, datetime_adapter)
    json_renderer.add_adapter(datetime.datetime, datetime_adapter)
    json_renderer.add_adapter(Decimal, decimal_adapter)
    config.add_renderer('json', json_renderer)

    # mailer
    mail_config = config.get_settings()['mailer'].copy()
    maildir = os.environ.get('MAILER_DIRECTORY', None)
    if maildir:
        # To deliver emails to a directory (for local dev)
        mail_config['transport.use'] = 'maildir'
        mail_config['transport.directory'] = maildir
    global mailer
    mailer = Mailer(mail_config)
    mailer.start()

    # Add custom table in admin interace, that means re-add all normal table

    from c2cgeoform.routes import register_models

    from c2cgeoportal_commons.models.main import (Role, LayerWMS, LayerWMTS,
                                                  Theme, LayerGroup, LayerV1,
                                                  Interface, OGCServer,
                                                  Functionality,
                                                  RestrictionArea)
    from c2cgeoportal_commons.models.static import User
    from geoportailv3_geoportal.models import LuxDownloadUrl, \
        LuxMeasurementLoginCommune, LuxMeasurementDirectory, LuxGetfeatureDefinition, \
        LuxPrintServers, LuxPredefinedWms, LuxLayerExternalWMS, LuxLayerInternalWMS

    register_models(
        config,
        (
            ('themes', Theme),
            ('layer_groups', LayerGroup),
            # ('layers_wms', LayerWMS), removed we use LuxLayerExternalWMS and LuxLayerInternalWMS instead
            ('layers_wmts', LayerWMTS),
            ('layers_v1', LayerV1),
            ('ogc_servers', OGCServer),
            ('restriction_areas', RestrictionArea),
            ('users', User),
            ('roles', Role),
            ('functionalities', Functionality),
            ('interfaces', Interface),
            ('lux_download_url', LuxDownloadUrl),
            ('lux_measurement_login_commune', LuxMeasurementLoginCommune),
            ('lux_measurement_directory', LuxMeasurementDirectory),
            ('lux_getfeature_definition', LuxGetfeatureDefinition),
            ('lux_print_servers', LuxPrintServers),
            ('lux_predefined_wms', LuxPredefinedWms),
            ('lux_layer_external_wms', LuxLayerExternalWMS),
            ('lux_layer_internal_wms', LuxLayerInternalWMS),
        ),
        'admin')

    # scan view decorator for adding routes
    config.scan()

    return config.make_wsgi_app()
Пример #23
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    # update the settings object from the YAML application config file
    settings = config.get_settings()
    settings.update(c2c.template.get_config(settings.get("app.cfg")))

    call_hook(settings, "after_settings", settings)

    config.add_request_method(_create_get_user_from_request(settings),
                              name="user", property=True)

    # configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal:locale/")

    # initialize database
    engine = sqlalchemy.engine_from_config(
        settings,
        "sqlalchemy.")
    sqlahelper.add_engine(engine)
    config.include(pyramid_tm.includeme)
    config.include("pyramid_closure")

    if "sqlalchemy_slave.url" in settings and \
            settings["sqlalchemy.url"] != settings["sqlalchemy_slave.url"]:  # pragma: nocover
        # Setup a slave DB connection and add a tween to switch between it and the default one.
        log.info("Using a slave DB for reading")
        engine_slave = sqlalchemy.engine_from_config(config.get_settings(), "sqlalchemy_slave.")
        sqlahelper.add_engine(engine_slave, name="slave")
        config.add_tween("c2cgeoportal.models.db_chooser_tween_factory",
                         over="pyramid_tm.tm_tween_factory")

    # initialize the dbreflection module
    dbreflection.init(engine)

    # dogpile.cache configuration
    caching.init_region(settings["cache"])
    caching.invalidate_region()

    # Register a tween to get back the cache buster path.
    config.add_tween("c2cgeoportal.lib.cacheversion.CachebusterTween")

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")
    config.include("pyramid_chameleon")

    # add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # add the "xsd" renderer
    config.add_renderer("xsd", XSD(
        sequence_callback=dbreflection._xsd_sequence_callback
    ))

    # add the set_user_validator directive, and set a default user
    # validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", False):  # pragma: no cover
        # add an OGCProxy view
        config.add_route_predicate("ogc_server", OgcproxyRoutePredicate)
        config.add_route(
            "ogcproxy", "/ogcproxy",
            ogc_server=True
        )
        config.add_view("papyrus_ogcproxy.views:ogcproxy", route_name="ogcproxy")

    # add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route(
        "mapserverproxy", "/mapserv_proxy",
        mapserverproxy=True, pregenerator=C2CPregenerator(role=True),
    )

    # add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy", "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # add route to the export GPX/KML view
    config.add_route("exportgpxkml", "/exportgpxkml")

    # add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword", "/loginresetpassword", request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route(
        "themes", "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # checker routes, Checkers are web services to test and assess that
    # the application is correctly functioning.
    # These web services are used by tools like (nagios).
    config.add_route("checker_routes", "/checker_routes", request_method="GET")
    config.add_route("checker_lang_files", "/checker_lang_files", request_method="GET")
    config.add_route("checker_pdf3", "/checker_pdf3", request_method="GET")
    config.add_route("checker_fts", "/checker_fts", request_method="GET")
    config.add_route("checker_theme_errors", "/checker_theme_errors", request_method="GET")
    config.add_route("checker_phantomjs", "/checker_phantomjs", request_method="GET")
    # collector
    config.add_route("check_collector", "/check_collector", request_method="GET")

    # print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities", "/printproxy/capabilities.json",
        request_method="GET", pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_report_create", "/printproxy/report.{format}",
        request_method="POST", header=JSON_CONTENT_TYPE
    )
    config.add_route(
        "printproxy_status", "/printproxy/status/{ref}.json",
        request_method="GET"
    )
    config.add_route(
        "printproxy_cancel", "/printproxy/cancel/{ref}",
        request_method="DELETE"
    )
    config.add_route(
        "printproxy_report_get", "/printproxy/report/{ref}",
        request_method="GET"
    )

    # full text search routes
    add_cors_route(config, "/fulltextsearch", "fulltextsearch")
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.{ext}", "profile")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # shortener
    add_cors_route(config, "/short/create", "shortner")
    config.add_route("shortener_create", "/short/create", request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport", "/pdfreport/{layername}/{id}", request_method="GET")

    # add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route(
        "layers_count", "/layers/{layer_id:\\d+}/count",
        request_method="GET"
    )
    config.add_route(
        "layers_metadata", "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "layers_read_many",
        "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
        request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route(
        "layers_read_one", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="GET")
    config.add_route(
        "layers_create", "/layers/{layer_id:\\d+}",
        request_method="POST", header=JSON_CONTENT_TYPE)
    config.add_route(
        "layers_update", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="PUT", header=JSON_CONTENT_TYPE)
    config.add_route(
        "layers_delete", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # there's no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # pyramid_formalchemy's configuration
    config.include("pyramid_formalchemy")
    config.include("fa.jquery")

    # define the srid, schema and parentschema
    # as global variables to be usable in the model
    c2cgeoportal.srid = settings["srid"]
    c2cgeoportal.schema = settings["schema"]
    c2cgeoportal.parentschema = settings["parentschema"]
    c2cgeoportal.formalchemy_default_zoom = get_setting(
        settings,
        ("admin_interface", "map_zoom"),
        c2cgeoportal.formalchemy_default_zoom
    )
    c2cgeoportal.formalchemy_default_x = get_setting(
        settings,
        ("admin_interface", "map_x"),
        c2cgeoportal.formalchemy_default_x
    )
    c2cgeoportal.formalchemy_default_y = get_setting(
        settings,
        ("admin_interface", "map_y"),
        c2cgeoportal.formalchemy_default_y
    )
    c2cgeoportal.formalchemy_available_functionalities = get_setting(
        settings,
        ("admin_interface", "available_functionalities"),
        c2cgeoportal.formalchemy_available_functionalities
    )
    c2cgeoportal.formalchemy_available_metadata = get_setting(
        settings,
        ("admin_interface", "available_metadata"),
        c2cgeoportal.formalchemy_available_metadata
    )
    c2cgeoportal.formalchemy_available_metadata = [
        e if isinstance(e, basestring) else e.get("name")
        for e in c2cgeoportal.formalchemy_available_metadata
    ]

    config.add_route("checker_all", "/checker_all", request_method="GET")

    config.add_route("version_json", "/version.json", request_method="GET")

    stats.init(config)

    # scan view decorator for adding routes
    config.scan(ignore=["c2cgeoportal.tests", "c2cgeoportal.scripts"])

    if "subdomains" in settings:  # pragma: no cover
        config.registry.registerUtility(
            MultiDomainStaticURLInfo(), IStaticURLInfo)

    # add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal:static")
    _add_static_view(config, "project", "c2cgeoportal:project")

    add_admin_interface(config)
    add_static_view(config)

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)

    _log_versions(settings)
Пример #24
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    # update the settings object from the YAML application config file
    settings = config.get_settings()
    settings.update(yaml.load(file(settings.get("app.cfg"))))

    global srid
    global schema
    global parentschema
    global formalchemy_language
    global formalchemy_default_zoom
    global formalchemy_default_x
    global formalchemy_default_y
    global formalchemy_available_functionalities
    global formalchemy_available_metadata

    config.set_request_property(get_user_from_request, name="user")

    # configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal:locale/")

    # initialize database
    engine = sqlalchemy.engine_from_config(settings, "sqlalchemy.")
    sqlahelper.add_engine(engine)
    config.include(pyramid_tm.includeme)
    config.include("pyramid_closure")

    # initialize the dbreflection module
    dbreflection.init(engine)

    # dogpile.cache configuration
    caching.init_region(settings["cache"])
    caching.invalidate_region()

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")
    config.include("pyramid_chameleon")

    # add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # add the "xsd" renderer
    config.add_renderer("xsd", XSD(sequence_callback=dbreflection._xsd_sequence_callback))

    # add the set_user_validator directive, and set a default user
    # validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", True):
        # add an OGCProxy view
        config.add_route("ogcproxy", "/ogcproxy", custom_predicates=(ogcproxy_route_predicate,))
        config.add_view("papyrus_ogcproxy.views:ogcproxy", route_name="ogcproxy")

    # add routes to the mapserver proxy
    config.add_route(
        "mapserverproxy",
        "/mapserv_proxy",
        custom_predicates=(mapserverproxy_route_predicate,),
        pregenerator=C2CPregenerator(role=True),
    )

    # add route to the tinyows proxy
    config.add_route("tinyowsproxy", "/tinyows_proxy", pregenerator=C2CPregenerator(role=True))

    # add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # add routes to the entry view class
    config.add_route("loginform", "/login.html", request_method="GET")
    config.add_route("login", "/login", request_method=("GET", "POST"))
    config.add_route("logout", "/logout", request_method="GET")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    config.add_route("loginresetpassword", "/loginresetpassword", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route("themes", "/themes", request_method="GET", pregenerator=C2CPregenerator(role=True))
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # checker routes, Checkers are web services to test and assess that
    # the application is correctly functioning.
    # These web services are used by tools like (nagios).
    config.add_route("checker_main", "/checker_main", request_method="GET")
    config.add_route("checker_viewer", "/checker_viewer", request_method="GET")
    config.add_route("checker_edit", "/checker_edit", request_method="GET")
    config.add_route("checker_edit_js", "/checker_edit_js", request_method="GET")
    config.add_route("checker_api", "/checker_api", request_method="GET")
    config.add_route("checker_xapi", "/checker_xapi", request_method="GET")
    config.add_route("checker_lang_files", "/checker_lang_files", request_method="GET")
    config.add_route("checker_printcapabilities", "/checker_printcapabilities", request_method="GET")
    config.add_route("checker_pdf", "/checker_pdf", request_method="GET")
    config.add_route("checker_print3capabilities", "/checker_print3capabilities", request_method="GET")
    config.add_route("checker_pdf3", "/checker_pdf3", request_method="GET")
    config.add_route("checker_fts", "/checker_fts", request_method="GET")
    config.add_route("checker_wmscapabilities", "/checker_wmscapabilities", request_method="GET")
    config.add_route("checker_wfscapabilities", "/checker_wfscapabilities", request_method="GET")
    config.add_route("checker_theme_errors", "/checker_theme_errors", request_method="GET")
    # collector
    config.add_route("check_collector", "/check_collector", request_method="GET")

    # print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    config.add_route(
        "printproxy_info", "/printproxy/info.json", request_method="GET", pregenerator=C2CPregenerator(role=True)
    )
    config.add_route("printproxy_create", "/printproxy/create.json", request_method="POST")
    config.add_route("printproxy_get", "/printproxy/{file}.printout", request_method="GET")
    # V3
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method=("GET", "OPTIONS"),
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("printproxy_report_create", "/printproxy/report.{format}", request_method=("POST", "OPTIONS"))
    config.add_route("printproxy_status", "/printproxy/status/{ref}.json", request_method=("GET", "OPTIONS"))
    config.add_route("printproxy_cancel", "/printproxy/cancel/{ref}", request_method=("DELETE", "OPTIONS"))
    config.add_route("printproxy_report_get", "/printproxy/report/{ref}", request_method="GET")

    # full text search routes
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    config.add_route("raster", "/raster", request_method="GET")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # shortener
    config.add_route("shortener_create", "/short/create", request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport", "/pdfreport/{layername}/{id}", request_method="GET")

    # add routes for the "layers" web service
    config.add_route("layers_count", "/layers/{layer_id:\\d+}/count", request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "layers_read_many", "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}", request_method="GET"
    )  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one", "/layers/{layer_id:\\d+}/{feature_id}", request_method="GET")
    config.add_route("layers_create", "/layers/{layer_id:\\d+}", request_method="POST")
    config.add_route("layers_update", "/layers/{layer_id:\\d+}/{feature_id}", request_method="PUT")
    config.add_route("layers_delete", "/layers/{layer_id:\\d+}/{feature_id}", request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # there's no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # pyramid_formalchemy's configuration
    config.include("pyramid_formalchemy")
    config.include("fa.jquery")

    # define the srid, schema and parentschema
    # as global variables to be usable in the model
    srid = settings["srid"]
    schema = settings["schema"]
    parentschema = settings["parentschema"]
    formalchemy_default_zoom = get_setting(settings, ("admin_interface", "map_zoom"), formalchemy_default_zoom)
    formalchemy_default_x = get_setting(settings, ("admin_interface", "map_x"), formalchemy_default_x)
    formalchemy_default_y = get_setting(settings, ("admin_interface", "map_y"), formalchemy_default_y)
    formalchemy_available_functionalities = get_setting(
        settings, ("admin_interface", "available_functionalities"), formalchemy_available_functionalities
    )
    formalchemy_available_metadata = get_setting(
        settings, ("admin_interface", "available_metadata"), formalchemy_available_metadata
    )

    config.add_route("checker_all", "/checker_all", request_method="GET")

    # scan view decorator for adding routes
    config.scan(ignore="c2cgeoportal.tests")

    config.registry.registerUtility(MultiDomainStaticURLInfo(), IStaticURLInfo)

    # add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal:static")
    _add_static_view(config, "project", "c2cgeoportal:project")

    add_admin_interface(config)
    add_static_view(config)
Пример #25
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    # update the settings object from the YAML application config file
    settings = config.get_settings()
    settings.update(c2c.template.get_config(settings.get("app.cfg")))

    call_hook(settings, "after_settings", settings)

    get_user_from_request = create_get_user_from_request(settings)
    config.add_request_method(get_user_from_request, name="user", property=True)
    config.add_request_method(get_user_from_request, name="get_user")

    # configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal_geoportal:locale/")

    config.include(c2cwsgiutils.pyramid.includeme)
    health_check = HealthCheck(config)

    # Initialise DBSessions
    from c2cgeoportal_commons.models import init_dbsessions
    init_dbsessions(settings, config, health_check)

    # initialize the dbreflection module
    dbreflection.init()

    from c2cgeoportal_geoportal.lib import checker, check_collector
    checker.init(config, health_check)
    check_collector.init(config, health_check)

    config.include("pyramid_closure")

    # dogpile.cache configuration
    caching.init_region(settings["cache"])
    caching.invalidate_region()

    # Register a tween to get back the cache buster path.
    config.add_tween("c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")

    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    # add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # add the "xsd" renderer
    config.add_renderer("xsd", XSD(
        sequence_callback=dbreflection.xsd_sequence_callback
    ))

    # add the set_user_validator directive, and set a default user
    # validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    if settings.get("ogcproxy_enable", False):  # pragma: no cover
        # add an OGCProxy view
        config.add_route_predicate("ogc_server", OgcproxyRoutePredicate)
        config.add_route(
            "ogcproxy", "/ogcproxy",
            ogc_server=True
        )
        config.add_view("papyrus_ogcproxy.views:ogcproxy", route_name="ogcproxy")

    # add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route(
        "mapserverproxy", "/mapserv_proxy",
        mapserverproxy=True, pregenerator=C2CPregenerator(role=True),
    )

    # add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy", "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # add routes to csv view
    config.add_route("csvecho", "/csv", request_method="POST")

    # add route to the export GPX/KML view
    config.add_route("exportgpxkml", "/exportgpxkml")

    # add routes to the echo service
    config.add_route("echo", "/echo", request_method="POST")

    # add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword", "/loginresetpassword", request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")
    config.add_route("apijs", "/api.js", request_method="GET")
    config.add_route("xapijs", "/xapi.js", request_method="GET")
    config.add_route("apihelp", "/apihelp.html", request_method="GET")
    config.add_route("xapihelp", "/xapihelp.html", request_method="GET")
    config.add_route(
        "themes", "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("invalidate", "/invalidate", request_method="GET")

    # print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities", "/printproxy/capabilities.json",
        request_method="GET", pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_report_create", "/printproxy/report.{format}",
        request_method="POST", header=JSON_CONTENT_TYPE
    )
    config.add_route(
        "printproxy_status", "/printproxy/status/{ref}.json",
        request_method="GET"
    )
    config.add_route(
        "printproxy_cancel", "/printproxy/cancel/{ref}",
        request_method="DELETE"
    )
    config.add_route(
        "printproxy_report_get", "/printproxy/report/{ref}",
        request_method="GET"
    )
    # v2
    config.add_route(
        "printproxy_info", "/printproxy/info.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_create", "/printproxy/create.json",
        request_method="POST",
    )
    config.add_route(
        "printproxy_get", "/printproxy/{file}.printout",
        request_method="GET",
    )

    # full text search routes
    add_cors_route(config, "/fulltextsearch", "fulltextsearch")
    config.add_route("fulltextsearch", "/fulltextsearch")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.{ext}", "profile")
    config.add_route("profile.csv", "/profile.csv", request_method="POST")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # shortener
    add_cors_route(config, "/short/create", "shortener")
    config.add_route("shortener_create", "/short/create", request_method="POST")
    config.add_route("shortener_get", "/short/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport", "/pdfreport/{layername}/{ids}", request_method="GET")

    # add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route(
        "layers_count", "/layers/{layer_id:\\d+}/count",
        request_method="GET"
    )
    config.add_route(
        "layers_metadata", "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "layers_read_many",
        "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
        request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route(
        "layers_read_one", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="GET")
    config.add_route(
        "layers_create", "/layers/{layer_id:\\d+}",
        request_method="POST", header=JSON_CONTENT_TYPE)
    config.add_route(
        "layers_update", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="PUT", header=JSON_CONTENT_TYPE)
    config.add_route(
        "layers_delete", "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # there is no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers/", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # scan view decorator for adding routes
    config.scan(ignore=["c2cgeoportal_geoportal.scripts", "c2cgeoportal_geoportal.wsgi_app"])

    if "subdomains" in settings:  # pragma: no cover
        config.registry.registerUtility(
            MultiDomainStaticURLInfo(), IStaticURLInfo)

    # add the static view (for static resources)
    _add_static_view(config, "static", "c2cgeoportal_geoportal:static")
    _add_static_view(config, "project", "c2cgeoportal_geoportal:project")

    add_admin_interface(config)
    add_static_view(config)

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)
Пример #26
0
def includeme(config):
    """ This function returns a Pyramid WSGI application.
    """

    settings = config.get_settings()

    yaml_config = yaml.load(file(settings.get("app.cfg")))
    settings.update(yaml_config)

    my_session_factory = SignedCookieSessionFactory(
        yaml_config['authtkt_secret'],
        cookie_name=yaml_config['authtkt_cookie_name'],
        timeout=8200
    )
    
    config.set_session_factory(my_session_factory)
    
    engine = engine_from_config(settings, 'sqlalchemy.')

    sqlahelper.add_engine(engine)

    global db_config
    db_config = yaml.load(file(settings.get('database.cfg')))['db_config']
    settings.update(yaml.load(file(settings.get('pdf.cfg'))))

    config.include(papyrus.includeme)
    config.include('pyramid_mako')
    # bind the mako renderer to other file extensions
    add_mako_renderer(config, ".js")

    config.add_renderer('geojson', GeoJSON())

    # add app configuration from db
    read_app_config(settings)

    specific_tmp_path = os.path.join(settings['specific_root_dir'], 'templates')
    specific_static_path = os.path.join(settings['specific_root_dir'], 'static')
    settings.setdefault('mako.directories',['crdppf:templates', specific_tmp_path])
    settings.setdefault('reload_templates',True)
    
    # add the static view (for static resources)
    config.add_static_view('static', 'crdppf:static',cache_max_age=3600)
    config.add_static_view('proj', 'crdppfportal:static', cache_max_age=3600)
     
    # ROUTES
    config.add_route('home', '/')
    config.add_route('images', '/static/images/')
    config.add_route('create_extract', 'create_extract')
    config.add_route('get_features', 'get_features')
    config.add_route('get_property', 'property/get')
    config.add_route('set_language', 'set_language')
    config.add_route('get_language', 'get_language')
    config.add_route('get_translation_dictionary', 'get_translation_dictionary')
    config.add_route('get_translations_list', 'get_translations_list')
    config.add_route('get_interface_config', 'get_interface_config')
    config.add_route('get_baselayers_config', 'get_baselayers_config')
    config.add_route('test', 'test')
    config.add_route('formulaire_reglements', 'formulaire_reglements')
    config.add_route('getTownList', 'getTownList')
    config.add_route('getTopicsList', 'getTopicsList')
    config.add_route('createNewDocEntry', 'createNewDocEntry')
    config.add_route('document_ref', 'getDocumentReferences')
    config.add_route('legal_documents', 'getLegalDocuments')
    config.add_route('map', 'map')
    config.add_route('configpanel', 'configpanel')
    
    config.add_route('initjs', '/init.js')
    config.add_route('globalsjs', '/globals.js')

    config.add_route('ogcproxy', '/ogcproxy')
    
    # CLIENT VIEWS
    config.add_view('crdppf.views.entry.Entry', route_name = 'images')
    config.add_view('crdppf.views.entry.Entry', route_name='test')

    # Print proxy routes
    config.add_route('printproxy_report_get', '/printproxy/report/{ref}')
    config.add_route('printproxy_status', '/printproxy/status/{ref}.json')
    config.add_route('printproxy_report_create', '/printproxy/report/{type_}/{id}')

    #~ # ADMIN VIEWS
    #~ config.add_view('crdppf.views.administration.Config', route_name='configpanel')
    #~ config.add_view('crdppf.views.administration.Config', route_name='formulaire_reglements')

    config.add_route('catchall_static', '/*subpath')
    config.add_view('crdppf.static.static_view', route_name='catchall_static')
    
    config.scan()
Пример #27
0
def includeme(config: pyramid.config.Configurator):
    """
    This function returns a Pyramid WSGI application.
    """

    settings = config.get_settings()

    config.include("c2cgeoportal_commons")

    call_hook(settings, "after_settings", settings)

    get_user_from_request = create_get_user_from_request(settings)
    config.add_request_method(get_user_from_request,
                              name="user",
                              property=True)
    config.add_request_method(get_user_from_request, name="get_user")

    # Configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal_geoportal:locale/")

    config.include('c2cwsgiutils.pyramid.includeme')
    health_check = HealthCheck(config)

    # Initialise DBSessions
    init_dbsessions(settings, config, health_check)

    # Initialize the dbreflection module
    dbreflection.init()

    checker.init(config, health_check)
    check_collector.init(config, health_check)

    # dogpile.cache configuration
    if 'cache' in settings:
        caching.init_region(settings['cache'])
        from c2cgeoportal_commons.models.main import InvalidateCacheEvent

        @zope.event.classhandler.handler(InvalidateCacheEvent)
        def handle(event: InvalidateCacheEvent):  # pylint: disable=unused-variable
            del event
            caching.invalidate_region()

    # Register a tween to get back the cache buster path.
    if 'cache_path' not in config.get_settings():
        config.get_settings()['cache_path'] = ['static']
    config.add_tween(
        "c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")
    config.add_tween("c2cgeoportal_geoportal.lib.headers.HeadersTween")

    # Bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    # Add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # Add decimal json renderer
    config.add_renderer("decimaljson", DecimalJSON())

    # Add the "xsd" renderer
    config.add_renderer("xsd", XSD(include_foreign_keys=True))

    # Add the set_user_validator directive, and set a default user validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    config.add_route('dynamic', '/dynamic.json', request_method="GET")

    # Add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route("mapserverproxy",
                     "/mapserv_proxy",
                     mapserverproxy=True,
                     pregenerator=C2CPregenerator(role=True),
                     request_method="GET")
    config.add_route("mapserverproxy_post",
                     "/mapserv_proxy",
                     mapserverproxy=True,
                     pregenerator=C2CPregenerator(role=True),
                     request_method="POST")
    add_cors_route(config, "/mapserv_proxy", "mapserver")

    # Add route to the tinyows proxy
    config.add_route(
        "tinyowsproxy",
        "/tinyows_proxy",
        pregenerator=C2CPregenerator(role=True),
    )

    # Add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchange", "login")
    config.add_route("loginchange", "/loginchange", request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword",
                     "/loginresetpassword",
                     request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")

    config.add_renderer(".map", AssetRendererFactory)
    config.add_renderer(".css", AssetRendererFactory)
    config.add_renderer(".ico", AssetRendererFactory)
    config.add_route("localejson", "/locale.json", request_method="GET")

    # Cannot be at the header to do not load the model too early
    from c2cgeoportal_geoportal.views.entry import Entry

    def add_api_route(name: str, attr: str, path: str, renderer: str):
        config.add_route(name, path, request_method="GET")
        config.add_view(Entry, attr=attr, route_name=name, renderer=renderer)

    add_api_route('favicon', 'favicon', '/favicon.ico',
                  '/etc/geomapfish/static/images/favicon.ico')
    add_api_route('apijs', 'apijs', '/api.js', "/etc/static-ngeo/api.js")
    add_api_route('apijsmap', 'apijsmap', '/api.js.map',
                  "/etc/static-ngeo/api.js.map")
    add_api_route('apicss', 'apicss', '/api.css', "/etc/static-ngeo/api.css")
    add_api_route('apihelp', 'apihelp', '/apihelp/index.html',
                  "/etc/geomapfish/static/apihelp/index.html")
    c2cgeoportal_geoportal.views.add_redirect(config, 'apihelp_redirect',
                                              '/apihelp.html',
                                              '/apihelp/index.html')

    config.add_route(
        "themes",
        "/themes",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )

    config.add_route("invalidate", "/invalidate", request_method="GET")

    # Print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("printproxy_report_create",
                     "/printproxy/report.{format}",
                     request_method="POST",
                     header=JSON_CONTENT_TYPE)
    config.add_route("printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("printproxy_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")
    config.add_route("printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")

    # Full-text search routes
    add_cors_route(config, "/search", "fulltextsearch")
    config.add_route("fulltextsearch", "/search", request_method="GET")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.json", "profile")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # Shortener
    add_cors_route(config, "/short/create", "shortener")
    config.add_route("shortener_create",
                     "/short/create",
                     request_method="POST")
    config.add_route("shortener_get", "/s/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport",
                     "/pdfreport/{layername}/{ids}",
                     request_method="GET")

    # Add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route("layers_count",
                     "/layers/{layer_id:\\d+}/count",
                     request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("layers_read_many",
                     "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
                     request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="GET")
    config.add_route("layers_create",
                     "/layers/{layer_id:\\d+}",
                     request_method="POST",
                     header=GEOJSON_CONTENT_TYPE)
    config.add_route("layers_update",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="PUT",
                     header=GEOJSON_CONTENT_TYPE)
    config.add_route("layers_delete",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # There is no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # Dev
    config.add_route("dev", "/dev/*path", request_method="GET")

    # Used memory in caches
    config.add_route("memory", "/memory", request_method="GET")

    # Scan view decorator for adding routes
    config.scan(ignore=[
        "c2cgeoportal_geoportal.lib", "c2cgeoportal_geoportal.scaffolds",
        "c2cgeoportal_geoportal.scripts"
    ])

    add_admin_interface(config)

    # Add the project static view with cache buster
    from c2cgeoportal_geoportal.lib.cacheversion import version_cache_buster
    config.add_static_view(
        name="static",
        path="/etc/geomapfish/static",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )
    config.add_cache_buster("/etc/geomapfish/static", version_cache_buster)

    # Add the project static view without cache buster
    config.add_static_view(
        name="static-ngeo",
        path="/etc/static-ngeo",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)

    c2cwsgiutils.index.additional_title = '<div class="row"><div class="col-lg-3"><h2>GeoMapFish</h2>' \
        '</div><div class="col-lg">'
    c2cwsgiutils.index.additional_auth.extend([
        '<a href="../tiles/admin/">TileCloud chain admin</a><br>',
        '<a href="../tiles/c2c/">TileCloud chain c2c tools</a><br>',
        '<a href="../invalidate">Invalidate the cache</a><br>',
        '<a href="../memory">Memory status</a><br>',
    ])
    if config.get_settings().get('enable_admin_interface', False):
        c2cwsgiutils.index.additional_noauth.append(
            '<a href="../admin/">Admin</a><br>')

    c2cwsgiutils.index.additional_noauth.append(
        '</div></div><div class="row"><div class="col-lg-3"><h3>Interfaces</h3></div><div class="col-lg">'
    )
    c2cwsgiutils.index.additional_noauth.append(
        '<a href="../">Default</a><br>')
    for interface in config.get_settings().get("interfaces", []):
        if not interface.get('default', False):
            c2cwsgiutils.index.additional_noauth.append(
                '<a href="../{interface}">{interface}</a><br>'.format(
                    interface=interface['name']))
    c2cwsgiutils.index.additional_noauth.append(
        '<a href="../apihelp/index.html">API help</a><br>')
    c2cwsgiutils.index.additional_noauth.append('</div></div><hr>')
Пример #28
0
def includeme(config: pyramid.config.Configurator) -> None:
    """Get the Pyramid WSGI application."""
    settings = config.get_settings()

    if "available_locale_names" not in settings:
        settings["available_locale_names"] = available_locale_names()

    call_hook(settings, "after_settings", settings)

    get_user_from_request = create_get_user_from_request(settings)
    config.add_request_method(get_user_from_request,
                              name="user",
                              property=True)
    config.add_request_method(get_user_from_request, name="get_user")
    # Be able for an organization to override the method to use alternate:
    # - Organization roles name for the standard roles 'anonymous', 'registered' and 'intranet'.
    config.add_request_method(lambda request, role_type: role_type,
                              name="get_organization_role")
    # - Organization print URL
    config.add_request_method(
        lambda request: request.registry.settings["print_url"],
        name="get_organization_print_url")
    # - Organization interface name (in the config and in the admin interface)
    config.add_request_method(lambda request, interface: interface,
                              name="get_organization_interface")

    # Configure 'locale' dir as the translation dir for c2cgeoportal app
    config.add_translation_dirs("c2cgeoportal_geoportal:locale/")

    config.include("pyramid_mako")
    config.include("c2cwsgiutils.pyramid.includeme")
    health_check = HealthCheck(config)
    config.registry["health_check"] = health_check

    metrics_config = config.registry.settings["metrics"]
    if metrics_config["memory_maps_rss"]:
        add_provider(MemoryMapProvider("rss"))
    if metrics_config["memory_maps_size"]:
        add_provider(MemoryMapProvider("size"))
    if metrics_config["memory_cache"]:
        add_provider(
            MemoryCacheSizeProvider(
                metrics_config.get("memory_cache_all", False)))
    if metrics_config["raster_data"]:
        add_provider(RasterDataSizeProvider())
    if metrics_config["total_python_object_memory"]:
        add_provider(TotalPythonObjectMemoryProvider())

    # Initialise DBSessions
    init_db_sessions(settings, config, health_check)

    checker.init(config, health_check)
    check_collector.init(config, health_check)

    # dogpile.cache configuration
    if "cache" in settings:
        register_backend("c2cgeoportal.hybrid",
                         "c2cgeoportal_geoportal.lib.caching",
                         "HybridRedisBackend")
        register_backend("c2cgeoportal.hybridsentinel",
                         "c2cgeoportal_geoportal.lib.caching",
                         "HybridRedisSentinelBackend")
        for name, cache_config in settings["cache"].items():
            caching.init_region(cache_config, name)

            @zope.event.classhandler.handler(InvalidateCacheEvent
                                             )  # type: ignore
            def handle(event: InvalidateCacheEvent) -> None:
                del event
                caching.invalidate_region()
                if caching.MEMORY_CACHE_DICT:
                    caching.get_region("std").delete_multi(
                        list(caching.MEMORY_CACHE_DICT.keys()))
                caching.MEMORY_CACHE_DICT.clear()

    # Register a tween to get back the cache buster path.
    if "cache_path" not in config.get_settings():
        config.get_settings()["cache_path"] = ["static", "static-geomapfish"]
    config.add_tween(
        "c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")
    config.add_tween("c2cgeoportal_geoportal.lib.headers.HeadersTween")

    # Bind the mako renderer to other file extensions
    add_mako_renderer(config, ".html")
    add_mako_renderer(config, ".js")

    # Add the "geojson" renderer
    config.add_renderer("geojson", GeoJSON())

    # Add the "xsd" renderer
    config.add_renderer("xsd", XSD(include_foreign_keys=True))

    # Add the set_user_validator directive, and set a default user validator
    config.add_directive("set_user_validator", set_user_validator)
    config.set_user_validator(default_user_validator)

    config.add_route("oauth2token", "/oauth/token", request_method="POST")
    config.add_route("oauth2loginform", "/oauth/login", request_method="GET")
    config.add_route("notlogin", "/notlogin", request_method="GET")

    config.add_route("dynamic", "/dynamic.json", request_method="GET")

    # Add routes to the mapserver proxy
    config.add_route_predicate("mapserverproxy", MapserverproxyRoutePredicate)
    config.add_route(
        "mapserverproxy",
        "/mapserv_proxy",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
        request_method="GET",
    )
    config.add_route(
        "mapserverproxy_post",
        "/mapserv_proxy",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
        request_method="POST",
    )
    # The tow next views are used to serve the application on the URL /mapserv_proxy/<ogc server name>
    # instead of /mapserv_proxy?ogcserver=<ogc server name>, required for QGIS server landing page
    config.add_route(
        "mapserverproxy_get_path",
        "/mapserv_proxy/{ogcserver}/*path",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
        request_method="GET",
    )
    config.add_route(
        "mapserverproxy_post_path",
        "/mapserv_proxy/{ogcserver}/*path",
        mapserverproxy=True,
        pregenerator=C2CPregenerator(role=True),
        request_method="POST",
    )
    add_cors_route(config, "/mapserv_proxy", "mapserver")

    # Add route to the tinyows proxy
    config.add_route("tinyowsproxy",
                     "/tinyows_proxy",
                     pregenerator=C2CPregenerator(role=True))

    # Add routes to the entry view class
    config.add_route("base", "/", static=True)
    config.add_route("loginform", "/login.html", request_method="GET")
    add_cors_route(config, "/login", "login")
    config.add_route("login", "/login", request_method="POST")
    add_cors_route(config, "/logout", "login")
    config.add_route("logout", "/logout", request_method="GET")
    add_cors_route(config, "/loginchangepassword", "login")
    config.add_route("change_password",
                     "/loginchangepassword",
                     request_method="POST")
    add_cors_route(config, "/loginresetpassword", "login")
    config.add_route("loginresetpassword",
                     "/loginresetpassword",
                     request_method="POST")
    add_cors_route(config, "/loginuser", "login")
    config.add_route("loginuser", "/loginuser", request_method="GET")
    config.add_route("testi18n", "/testi18n.html", request_method="GET")

    config.add_renderer(".map", AssetRendererFactory)
    config.add_renderer(".css", AssetRendererFactory)
    config.add_renderer(".ico", AssetRendererFactory)
    config.add_route("localejson", "/locale.json", request_method="GET")
    config.add_route("localepot", "/locale.pot", request_method="GET")

    def add_static_route(name: str, attr: str, path: str,
                         renderer: str) -> None:
        config.add_route(name, path, request_method="GET")
        config.add_view(Entry, attr=attr, route_name=name, renderer=renderer)

    add_static_route("favicon", "favicon", "/favicon.ico",
                     "/etc/geomapfish/static/images/favicon.ico")
    add_static_route("robot.txt", "robot_txt", "/robot.txt",
                     "/etc/geomapfish/static/robot.txt")
    config.add_route("apijs", "/api.js", request_method="GET")
    add_static_route("apijsmap", "apijsmap", "/api.js.map",
                     "/etc/static-ngeo/api.js.map")
    add_static_route("apicss", "apicss", "/api.css",
                     "/etc/static-ngeo/api.css")
    add_static_route("apihelp", "apihelp", "/apihelp/index.html",
                     "/etc/geomapfish/static/apihelp/index.html")
    c2cgeoportal_geoportal.views.add_redirect(config, "apihelp_redirect",
                                              "/apihelp.html", "apihelp")

    config.add_route("themes",
                     "/themes",
                     request_method="GET",
                     pregenerator=C2CPregenerator(role=True))

    config.add_route("invalidate", "/invalidate", request_method="GET")

    # Print proxy routes
    config.add_route("printproxy", "/printproxy", request_method="HEAD")
    add_cors_route(config, "/printproxy/*all", "print")
    config.add_route(
        "printproxy_capabilities",
        "/printproxy/capabilities.json",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route(
        "printproxy_report_create",
        "/printproxy/report.{format}",
        request_method="POST",
        header=JSON_CONTENT_TYPE,
    )
    config.add_route("printproxy_status",
                     "/printproxy/status/{ref}.json",
                     request_method="GET")
    config.add_route("printproxy_cancel",
                     "/printproxy/cancel/{ref}",
                     request_method="DELETE")
    config.add_route("printproxy_report_get",
                     "/printproxy/report/{ref}",
                     request_method="GET")

    # Full-text search routes
    add_cors_route(config, "/search", "fulltextsearch")
    config.add_route("fulltextsearch", "/search", request_method="GET")

    # Access to raster data
    add_cors_route(config, "/raster", "raster")
    config.add_route("raster", "/raster", request_method="GET")

    add_cors_route(config, "/profile.json", "profile")
    config.add_route("profile.json", "/profile.json", request_method="POST")

    # Access to vector tiles
    add_cors_route(config, "/vector_tiles", "vector_tiles")
    config.add_route("vector_tiles",
                     "/vector_tiles/{layer_name}/{z}/{x}/{y}.pbf",
                     request_method="GET")
    # There is no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "vector_tiles" web service
    config.add_route("vector_tiles_root",
                     "/vector_tiles",
                     request_method="HEAD")

    # Shortener
    add_cors_route(config, "/short/create", "shortener")
    config.add_route("shortener_create",
                     "/short/create",
                     request_method="POST")
    config.add_route("shortener_get", "/s/{ref}", request_method="GET")

    # Geometry processing
    config.add_route("difference", "/difference", request_method="POST")

    # PDF report tool
    config.add_route("pdfreport",
                     "/pdfreport/{layername}/{ids}",
                     request_method="GET")

    # Add routes for the "layers" web service
    add_cors_route(config, "/layers/*all", "layers")
    config.add_route("layers_count",
                     "/layers/{layer_id:\\d+}/count",
                     request_method="GET")
    config.add_route(
        "layers_metadata",
        "/layers/{layer_id:\\d+}/md.xsd",
        request_method="GET",
        pregenerator=C2CPregenerator(role=True),
    )
    config.add_route("layers_read_many",
                     "/layers/{layer_id:\\d+,?(\\d+,)*\\d*$}",
                     request_method="GET")  # supports URLs like /layers/1,2,3
    config.add_route("layers_read_one",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="GET")
    config.add_route("layers_create",
                     "/layers/{layer_id:\\d+}",
                     request_method="POST",
                     header=GEOJSON_CONTENT_TYPE)
    config.add_route(
        "layers_update",
        "/layers/{layer_id:\\d+}/{feature_id}",
        request_method="PUT",
        header=GEOJSON_CONTENT_TYPE,
    )
    config.add_route("layers_delete",
                     "/layers/{layer_id:\\d+}/{feature_id}",
                     request_method="DELETE")
    config.add_route(
        "layers_enumerate_attribute_values",
        "/layers/{layer_name}/values/{field_name}",
        request_method="GET",
        pregenerator=C2CPregenerator(),
    )
    # There is no view corresponding to that route, it is to be used from
    # mako templates to get the root of the "layers" web service
    config.add_route("layers_root", "/layers", request_method="HEAD")

    # Resource proxy (load external url, useful when loading non https content)
    config.add_route("resourceproxy", "/resourceproxy", request_method="GET")

    # Dev
    config.add_route("dev", "/dev/*path", request_method="GET")

    # Used memory in caches
    config.add_route("memory", "/memory", request_method="GET")

    # Scan view decorator for adding routes
    config.scan(ignore=[
        "c2cgeoportal_geoportal.lib",
        "c2cgeoportal_geoportal.scaffolds",
        "c2cgeoportal_geoportal.scripts",
    ])

    add_admin_interface(config)
    add_getitfixed(config)

    # Add the project static view with cache buster
    config.add_static_view(
        name="static",
        path="/etc/geomapfish/static",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )
    config.add_cache_buster("/etc/geomapfish/static", version_cache_buster)

    # Add the project static view without cache buster
    config.add_static_view(
        name="static-ngeo",
        path="/etc/static-ngeo",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )

    # Add the c2cgeoportal static view with cache buster
    config.add_static_view(
        name="static-geomapfish",
        path="c2cgeoportal_geoportal:static",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )
    config.add_cache_buster("c2cgeoportal_geoportal:static",
                            version_cache_buster)

    # Add the project static view without cache buster
    config.add_static_view(
        name="static-ngeo-dist",
        path="/opt/c2cgeoportal/geoportal/node_modules/ngeo/dist",
        cache_max_age=int(config.get_settings()["default_max_age"]),
    )

    # Handles the other HTTP errors raised by the views. Without that,
    # the client receives a status=200 without content.
    config.add_view(error_handler, context=HTTPException)

    c2cwsgiutils.index.additional_title = (
        '<div class="row"><div class="col-lg-3"><h2>GeoMapFish</h2></div><div class="col-lg">'
    )

    c2cwsgiutils.index.additional_auth.extend([
        '<a href="../tiles/admin/">TileCloud chain admin</a><br>',
        '<a href="../tiles/c2c/">TileCloud chain c2c tools</a><br>',
        '<a href="../invalidate">Invalidate the cache</a><br>',
        '<a href="../memory">Memory status</a><br>',
    ])
    if config.get_settings().get("enable_admin_interface", False):
        c2cwsgiutils.index.additional_noauth.append(
            '<a href="../admin/">Admin</a><br>')

    c2cwsgiutils.index.additional_noauth.append(
        '</div></div><div class="row"><div class="col-lg-3"><h3>Interfaces</h3></div><div class="col-lg">'
    )
    c2cwsgiutils.index.additional_noauth.append(
        '<a href="../">Default</a><br>')
    for interface in config.get_settings().get("interfaces", []):
        if not interface.get("default", False):
            c2cwsgiutils.index.additional_noauth.append(
                '<a href="../{interface}">{interface}</a><br>'.format(
                    interface=interface["name"]))
    c2cwsgiutils.index.additional_noauth.append(
        '<a href="../apihelp/index.html">API help</a><br>')
    c2cwsgiutils.index.additional_noauth.append("</div></div><hr>")