Пример #1
0
    def __call__(self, request, elements, kw):
        if self.subdomain and "subdomain" in kw:
            if "subdomain_url_template" in request.registry.settings:
                subdomain_url_template = \
                    request.registry.settings["subdomain_url_template"]
            else:
                subdomain_url_template = "http://%(sub)s.%(host)s"

            kw["_app_url"] = subdomain_url_template % {
                "sub": kw["subdomain"],
                "host": request.host,
            } + request.script_name

        query = kw.get("_query", {})

        if self.version:
            from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
            query["cache_version"] = get_cache_version()

        if self.role and request.user:
            # The templates change if the user is logged in or not. Usually it is
            # the role that is making a difference, but the username is put in
            # some JS files. So we add the username to hit different cache entries.
            query["username"] = request.user.username

        kw["_query"] = query
        return elements, kw
Пример #2
0
    def __call__(self, request, elements, kw):
        if self.subdomain and "subdomain" in kw:
            if "subdomain_url_template" in request.registry.settings:
                subdomain_url_template = \
                    request.registry.settings["subdomain_url_template"]
            else:
                subdomain_url_template = "http://%(sub)s.%(host)s"

            kw["_app_url"] = subdomain_url_template % {
                "sub": kw["subdomain"],
                "host": request.host,
            } + request.script_name

        query = kw.get("_query", {})

        if self.version:
            from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
            query["cache_version"] = get_cache_version()

        if self.role and request.user:
            # The templates change if the user is logged in or not. Usually it is
            # the role that is making a difference, but the username is put in
            # some JS files. So we add the username to hit different cache entries.
            query["username"] = request.user.username

        kw["_query"] = query
        return elements, kw
Пример #3
0
def locale(request: pyramid.request.Request) -> pyramid.response.Response:
    response = HTTPFound(
        request.static_url(
            "/etc/geomapfish/static/{lang}.json".format(
                lang=request.locale_name),
            _query={"cache": get_cache_version()},
        ))
    set_common_headers(request, "api", Cache.NO, response=response)
    return response
Пример #4
0
def locale(request):
    response = HTTPFound(
        request.static_url(
            "/etc/geomapfish/static/{lang}.json".format(
                lang=request.locale_name),
            _query={"cache": get_cache_version()},
        ))
    set_common_headers(request, "api", NO_CACHE, response=response)
    return response
Пример #5
0
def locale(request: pyramid.request.Request) -> pyramid.response.Response:
    """Get the locale json file for the API."""
    response = HTTPFound(
        request.static_url(
            f"/etc/geomapfish/static/{request.locale_name}.json",
            _query={"cache": get_cache_version()},
        ))
    set_common_headers(request, "api", Cache.PUBLIC_NO, response=response)
    return response
Пример #6
0
def locale(request):
    response = HTTPFound(
        request.static_url(
            '{package}_geoportal:static-ngeo/build/{lang}.json'.format(
                package=request.registry.settings["package"],
                lang=request.locale_name),
            _query={
                'cache': get_cache_version(),
            }))
    set_common_headers(request, 'api', NO_CACHE, response=response)
    return response
Пример #7
0
    def test_constant_dynamic_cache_version(self):
        from c2cgeoportal_geoportal.views.dynamic import DynamicView

        request = self._request()
        request.registry.settings = self._get_settings(
            {"test": {"dynamic_constants": {"XTest": "cache_version"}}}
        )
        dynamic = DynamicView(request).dynamic()

        assert "XTest" in dynamic["constants"], dynamic
        from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version

        assert dynamic["constants"]["XTest"] == get_cache_version()
Пример #8
0
    def __call__(self, request: pyramid.request.Request, elements: Any, kw: Any) -> Tuple[Any, Any]:
        query = kw.get("_query", {})

        if self.version:
            query["cache_version"] = get_cache_version()

        if self.role and request.user:
            # The templates change if the user is logged in or not. Usually it is
            # the role that is making a difference, but the username is put in
            # some JS files. So we add the username to hit different cache entries.
            query["username"] = request.user.username

        kw["_query"] = query
        return elements, kw
    def test_constant_dynamic_cache_version(self):
        from c2cgeoportal_geoportal.views.dynamic import DynamicView
        request = self._request()
        request.registry.settings = self._get_settings(
            {'test': {
                'dynamic_constants': {
                    'XTest': 'cache_version'
                }
            }})
        dynamic = DynamicView(request).dynamic()

        assert 'XTest' in dynamic['constants'], dynamic
        from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
        assert dynamic['constants']['XTest'] == get_cache_version()
Пример #10
0
    def __call__(self, request, elements, kw):
        query = kw.get("_query", {})

        if self.version:
            from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
            query["cache_version"] = get_cache_version()

        if self.role and request.user:
            # The templates change if the user is logged in or not. Usually it is
            # the role that is making a difference, but the username is put in
            # some JS files. So we add the username to hit different cache entries.
            query["username"] = request.user.username

        kw["_query"] = query
        return elements, kw
Пример #11
0
    def dynamic(self) -> Dict[str, Any]:
        original_interface_name = self.request.params.get("interface")
        interface_name = self.request.get_organization_interface(
            original_interface_name)

        if interface_name not in self.interfaces_config:
            raise HTTPNotFound(
                "Interface {} doesn't exists in the 'interfaces_config'.")

        interface_config = self.interfaces_config[interface_name]
        lang_urls_suffix = interface_config.get("lang_urls_suffix", "")

        i18next_configuration = self.settings.get("i18next", {})
        i18next_configuration.setdefault("backend", {})
        if "loadPath" not in i18next_configuration["backend"]:
            path: List[str] = [
                self.request.route_url("base").rstrip("/"),
                "static-{{ns}}",
                get_cache_version(),
                "locales",
                "{{lng}}.json",
            ]
            i18next_configuration["backend"]["loadPath"] = "/".join(path)

        dynamic = {
            "interface":
            interface_name,
            "cache_version":
            get_cache_version(),
            "two_factor":
            self.request.registry.settings.get("authentication",
                                               {}).get("two_factor", False),
            "lang_urls": {
                lang: self.request.static_url(
                    f"/etc/geomapfish/static/{lang}{lang_urls_suffix}.json", )
                for lang in
                self.request.registry.settings["available_locale_names"]
            },
            "i18next_configuration":
            i18next_configuration,
            "fulltextsearch_groups":
            self._fulltextsearch_groups(),
        }

        constants = self._interface(interface_config, interface_name,
                                    original_interface_name, dynamic)

        do_redirect = False
        url = None
        if "redirect_interface" in interface_config:
            no_redirect_query: Dict[str, Union[str, List[str]]] = {
                "no_redirect": "t"
            }
            if "query" in self.request.params:
                query = urllib.parse.parse_qs(self.request.params["query"][1:],
                                              keep_blank_values=True)
                no_redirect_query.update(query)
            else:
                query = {}
            theme = None
            if "path" in self.request.params:
                match = re.match(".*/theme/(.*)", self.request.params["path"])
                if match is not None:
                    theme = match.group(1)
            if theme is not None:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=query).replace("+", "%20")
            else:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"],
                    _query=query).replace("+", "%20")

            if "no_redirect" in query:
                constants["redirectUrl"] = ""
            else:
                if interface_config.get("do_redirect", False):
                    do_redirect = True
                else:
                    constants["redirectUrl"] = no_redirect_url

        set_common_headers(self.request, "dynamic", Cache.PUBLIC_NO)
        return {
            "constants": constants,
            "doRedirect": do_redirect,
            "redirectUrl": url
        }
Пример #12
0
    def dynamic(self) -> Dict[str, Any]:
        interface_name = self.request.params.get("interface")

        if interface_name not in self.interfaces_config:
            raise HTTPNotFound(
                "Interface {} doesn't exists in the 'interfaces_config'.")

        interface_config = self.interfaces_config[interface_name]

        dynamic = {
            "interface":
            interface_name,
            "cache_version":
            get_cache_version(),
            "two_factor":
            self.request.registry.settings.get("authentication",
                                               {}).get("two_factor", False),
            "lang_urls": {
                lang: self.request.static_url(
                    "/etc/geomapfish/static/{lang}.json".format(lang=lang),
                    _query={"cache": get_cache_version()},
                )
                for lang in
                self.request.registry.settings["available_locale_names"]
            },
            "fulltextsearch_groups":
            self._fulltextsearch_groups(),
        }

        constants = self._interface(interface_config, interface_name, dynamic)

        do_redirect = False
        url = None
        if "redirect_interface" in interface_config:
            no_redirect_query: Dict[str, Union[str, List[str]]] = {
                "no_redirect": "t"
            }
            if "query" in self.request.params:
                query = urllib.parse.parse_qs(self.request.params["query"][1:],
                                              keep_blank_values=True)
                no_redirect_query.update(query)
            else:
                query = {}
            theme = None
            if "path" in self.request.params:
                match = re.match(".*/theme/(.*)", self.request.params["path"])
                if match is not None:
                    theme = match.group(1)
            if theme is not None:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=query).replace("+", "%20")
            else:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"],
                    _query=query).replace("+", "%20")

            if "no_redirect" in query:
                constants["redirectUrl"] = ""
            else:
                if interface_config.get("do_redirect", False):
                    do_redirect = True
                else:
                    constants["redirectUrl"] = no_redirect_url

        set_common_headers(self.request, "dynamic", Cache.NO)
        return {
            "constants": constants,
            "doRedirect": do_redirect,
            "redirectUrl": url
        }
Пример #13
0
    def dynamic(self):
        interfaces_names = [
            interface['name'] for interface in self.settings.get('interfaces')
        ]
        default_interfaces_names = [
            interface['name'] for interface in self.settings.get('interfaces')
            if interface.get('default', False)
        ]
        assert len(default_interfaces_names) == 1, "More than one default interface in: " + \
            json.dumps(self.settings.get('interfaces'))
        default_interface_name = default_interfaces_names[0]
        interface_name = self.request.params.get('interface')
        if interface_name not in interfaces_names:
            interface_name = default_interface_name
        interface_config = self.interfaces_config[interface_name]

        dynamic = {
            'interface':
            interface_name,
            'cache_version':
            get_cache_version(),
            'lang_urls': {
                lang: self.request.static_url(
                    '/etc/geomapfish/static/{lang}.json'.format(
                        package=self.request.registry.settings["package"],
                        lang=lang,
                        _query={
                            'cache': get_cache_version(),
                        }))
                for lang in
                self.request.registry.settings["available_locale_names"]
            },
            'fulltextsearch_groups': [
                group[0] for group in models.DBSession.query(
                    func.distinct(main.FullTextSearch.layer_name)).filter(
                        main.FullTextSearch.layer_name.isnot(None)).all()
            ],
        }

        constants = {
            name: value
            for name, value in self.get('constants', interface_name).items()
        }
        constants.update({
            name: dynamic[value]
            for name, value in self.get('dynamic_constants',
                                        interface_name).items()
            if value is not None
        })
        constants.update({
            name: self.request.static_url(static_['name']) +
            static_.get('append', '')
            for name, static_ in self.get('static', interface_name).items()
        })

        routes = dict(currentInterfaceUrl={'name': interface_name})
        routes.update(self.get('routes', interface_name))
        for constant, config in routes.items():
            params = {}
            params.update(config.get('params', {}))
            for name, dyn in config.get('dynamic_params', {}).items():
                params[name] = dynamic[dyn]
            constants[constant] = self.request.route_url(
                config['name'],
                *config.get('elements', []),
                _query=params,
                **config.get('kw', {}))

        do_redirect = False
        url = None
        if 'redirect_interface' in interface_config:
            no_redirect_query = {'no_redirect': 't'}
            if 'query' in self.request.params:
                query = urllib.parse.parse_qs(self.request.params['query'][1:])
                no_redirect_query.update(query)
            else:
                query = {}
            theme = None
            if 'path' in self.request.params:
                match = re.match('.*/theme/(.*)', self.request.params['path'])
                if match is not None:
                    theme = match.group(1)
            if theme is not None:
                no_redirect_url = self.request.route_url(
                    interface_config['redirect_interface'] + 'theme',
                    themes=theme,
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config['redirect_interface'] + 'theme',
                    themes=theme,
                    _query=query)
            else:
                no_redirect_url = self.request.route_url(
                    interface_config['redirect_interface'],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config['redirect_interface'], _query=query)

            if 'no_redirect' in query:
                constants['redirectUrl'] = ''
            else:
                if interface_config.get('do_redirect', False):
                    do_redirect = True
                else:
                    constants['redirectUrl'] = no_redirect_url

        set_common_headers(self.request, "dynamic", NO_CACHE)
        return {
            'constants': constants,
            'doRedirect': do_redirect,
            'redirectUrl': url,
        }
Пример #14
0
 def test_cache(self):
     init_region({"backend": "dogpile.cache.memory"}, "std")
     cache_version = get_cache_version()
     assert cache_version == get_cache_version()
Пример #15
0
    def dynamic(self):
        interface_name = self.request.params.get('interface')
        if interface_name not in self.settings.get('interfaces'):
            interface_name = self.settings.get('default_interface')
        interface_config = self.interfaces_config[interface_name]

        dynamic = {
            'interface':
            interface_name,
            'cache_version':
            get_cache_version(),
            'lang_urls': {
                lang: self.request.static_url(
                    '{package}_geoportal:static-ngeo/build/{lang}.json'.format(
                        package=self.request.registry.settings["package"],
                        lang=lang))
                for lang in
                self.request.registry.settings["available_locale_names"]
            },
            'fulltextsearch_groups': [
                group[0] for group in models.DBSession.query(
                    func.distinct(main.FullTextSearch.layer_name)).filter(
                        main.FullTextSearch.layer_name.isnot(None)).all()
            ],
        }

        constants = {
            name: value
            for name, value in self.get('constants', interface_name).items()
        }
        constants.update({
            name: dynamic[value]
            for name, value in self.get('dynamic_constants',
                                        interface_name).items()
        })
        constants.update({
            name: self.request.static_url(static_['name']) +
            static_.get('append', '')
            for name, static_ in self.get('static', interface_name).items()
        })

        routes = dict(currentInterfaceUrl={'name': interface_name})
        routes.update(self.get('routes', interface_name))
        for constant, config in routes.items():
            params = {}
            params.update(config.get('params', {}))
            for name, dyn in config.get('dynamic_params', {}).items():
                params[name] = dynamic[dyn]
            constants[constant] = self.request.route_url(config['name'],
                                                         _query=params)

        do_redirect = False
        url = None
        if 'redirect_interface' in interface_config:
            no_redirect_query = {'no_redirect': 't'}
            if 'query' in self.request.params:
                query = urllib.parse.parse_qs(self.request.params['query'][1:])
                no_redirect_query.update(query)
            else:
                query = {}
            if 'themes' in self.request.matchdict:
                no_redirect_url = self.request.route_url(
                    interface_config['redirect_interface'] + 'theme',
                    themes=self.request.matchdict['themes'],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config['redirect_interface'] + 'theme',
                    themes=self.request.matchdict['themes'],
                    _query=query)
            else:
                no_redirect_url = self.request.route_url(
                    interface_config['redirect_interface'],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config['redirect_interface'], _query=query)

            if 'no_redirect' in query:
                constants['redirectUrl'] = ''
            else:
                if interface_config.get('do_redirect', False):
                    do_redirect = True
                else:
                    constants['redirectUrl'] = no_redirect_url

        set_common_headers(self.request, "dynamic", NO_CACHE)
        return {
            'constants': constants,
            'doRedirect': do_redirect,
            'redirectUrl': url,
        }
Пример #16
0
 def test_cache_invalidation(self):
     init_region({"backend": "dogpile.cache.memory"}, "std")
     cache_version = get_cache_version()
     invalidate_region()
     assert cache_version != get_cache_version()
Пример #17
0
    def dynamic(self):
        interfaces_names = [
            interface["name"] for interface in self.settings.get("interfaces")
        ]
        default_interfaces_names = [
            interface["name"] for interface in self.settings.get("interfaces")
            if interface.get("default", False)
        ]
        assert len(default_interfaces_names
                   ) == 1, "More than one default interface in: " + json.dumps(
                       self.settings.get("interfaces"))
        default_interface_name = default_interfaces_names[0]
        interface_name = self.request.params.get("interface")
        if interface_name not in interfaces_names:
            interface_name = default_interface_name
        interface_config = self.interfaces_config[interface_name]

        dynamic = {
            "interface":
            interface_name,
            "cache_version":
            get_cache_version(),
            "two_factor":
            self.request.registry.settings.get("authentication",
                                               {}).get("two_factor", False),
            "lang_urls": {
                lang: self.request.static_url(
                    "/etc/geomapfish/static/{lang}.json".format(lang=lang),
                    _query={"cache": get_cache_version()},
                )
                for lang in
                self.request.registry.settings["available_locale_names"]
            },
            "fulltextsearch_groups":
            self._fulltextsearch_groups(),
        }

        constants = self._interface(self.default, interface_name, dynamic, {})
        constants = self._interface(interface_config, interface_name, dynamic,
                                    constants)

        do_redirect = False
        url = None
        if "redirect_interface" in interface_config:
            no_redirect_query = {"no_redirect": "t"}
            if "query" in self.request.params:
                query = urllib.parse.parse_qs(self.request.params["query"][1:])
                no_redirect_query.update(query)
            else:
                query = {}
            theme = None
            if "path" in self.request.params:
                match = re.match(".*/theme/(.*)", self.request.params["path"])
                if match is not None:
                    theme = match.group(1)
            if theme is not None:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"] + "theme",
                    themes=theme,
                    _query=query)
            else:
                no_redirect_url = self.request.route_url(
                    interface_config["redirect_interface"],
                    _query=no_redirect_query)
                url = self.request.route_url(
                    interface_config["redirect_interface"], _query=query)

            if "no_redirect" in query:
                constants["redirectUrl"] = ""
            else:
                if interface_config.get("do_redirect", False):
                    do_redirect = True
                else:
                    constants["redirectUrl"] = no_redirect_url

        set_common_headers(self.request, "dynamic", NO_CACHE)
        return {
            "constants": constants,
            "doRedirect": do_redirect,
            "redirectUrl": url
        }
Пример #18
0
 def test_nocache(self):
     init_region({"backend": "dogpile.cache.null"}, "std")
     assert get_cache_version() != get_cache_version()