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
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
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
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
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
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
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()
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()
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
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 }
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 }
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, }
def test_cache(self): init_region({"backend": "dogpile.cache.memory"}, "std") cache_version = get_cache_version() assert cache_version == get_cache_version()
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, }
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()
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 }
def test_nocache(self): init_region({"backend": "dogpile.cache.null"}, "std") assert get_cache_version() != get_cache_version()