diff --git a/commons/c2cgeoportal_commons/models/main.py b/commons/c2cgeoportal_commons/models/main.py index 59c18984ccd..1d38d3e4bb7 100644 --- a/commons/c2cgeoportal_commons/models/main.py +++ b/commons/c2cgeoportal_commons/models/main.py @@ -46,6 +46,7 @@ import colander from deform.widget import HiddenWidget, SelectWidget, TextAreaWidget from c2cgeoform.ext import colander_ext, deform_ext +import c2cwsgiutils.broadcast from c2cgeoportal_commons.config import config from c2cgeoportal_commons.models import Base, _ @@ -62,6 +63,7 @@ class InvalidateCacheEvent: pass +@c2cwsgiutils.broadcast.decorator() def cache_invalidate_cb(*args: List[Any]) -> None: zope.event.notify(InvalidateCacheEvent()) diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-build.yaml.mako b/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-build.yaml.mako index 1295e9d3ead..a608a199676 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-build.yaml.mako +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-build.yaml.mako @@ -32,7 +32,7 @@ ${service_defaults('mapserver', 80)}\ - run links: - mapserver -${service_defaults('geoportal', 80)}\ +${service_defaults('geoportal-run', 80)}\ - HOME_DIR - USER_NAME - USER_ID diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl index 87fc204f5a9..c63cb0a3479 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_vars.yaml_tmpl @@ -46,11 +46,8 @@ vars: POSTGRES_DB: geomapfish POSTGRES_USER: www-data POSTGRES_PASSWORD: www-data - geoportal: - environment: - VISIBLE_WEB_HOST: '{docker_host}' - VISIBLE_WEB_PROTOCOL: '{docker_web_protocol}' - VISIBLE_ENTRY_POINT: '{docker_entry_point}' + geoportal-run: + environment: &geo-run-env PGHOST: 172.17.0.1 PGHOST_SLAVE: 172.17.0.1 PGPORT: 5432 @@ -59,11 +56,19 @@ vars: PGDATABASE: geomapfish PGSCHEMA: main PGSCHEMA_STATIC: main_static + geoportal: + environment: + <<: *geo-run-env + VISIBLE_WEB_HOST: '{docker_host}' + VISIBLE_WEB_PROTOCOL: '{docker_web_protocol}' + VISIBLE_ENTRY_POINT: '{docker_entry_point}' TINYOWS_URL: http://tinyows/ MAPSERVER_URL: http://mapserver/ PRINT_URL: http://print:8080/print/ REDIS_HOST: redis REDIS_PORT: 6379 + C2C_REDIS_URL: redis://redis:6379 + C2C_BROADCAST_PREFIX: c2cgeoportal_ tilecloudchain: environment: VISIBLE_ENTRY_POINT: '{docker_entry_point}' diff --git a/geoportal/c2cgeoportal_geoportal/views/entry.py b/geoportal/c2cgeoportal_geoportal/views/entry.py index df3f457bb3c..0eba80f24e4 100644 --- a/geoportal/c2cgeoportal_geoportal/views/entry.py +++ b/geoportal/c2cgeoportal_geoportal/views/entry.py @@ -49,13 +49,14 @@ from sqlalchemy.orm import subqueryload from sqlalchemy.orm.exc import NoResultFound from owslib.wms import WebMapService +import zope.event.classhandler from c2cgeoportal_commons import models from c2cgeoportal_commons.models import main, static from c2cgeoportal_geoportal.lib import get_setting, get_protected_layers_query, \ get_url2, get_url, get_typed, get_types_map, add_url_params from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version -from c2cgeoportal_geoportal.lib.caching import get_region, invalidate_region, \ +from c2cgeoportal_geoportal.lib.caching import get_region, \ set_common_headers, NO_CACHE, PUBLIC_CACHE, PRIVATE_CACHE from c2cgeoportal_geoportal.lib.functionality import get_functionality, get_mapserver_substitution_params from c2cgeoportal_geoportal.lib.wmstparsing import parse_extent, TimeInformation @@ -115,6 +116,7 @@ class Entry: WFS_NS = "http://www.opengis.net/wfs" default_ogc_server = None external_ogc_server = None + server_wms_capabilities = {} def __init__(self, request): self.request = request @@ -160,6 +162,13 @@ def __init__(self, request): ", ".join([i[0] for i in models.DBSession.query(main.OGCServer.name).all()]) ) + from c2cgeoportal_commons.models.main import InvalidateCacheEvent + + @zope.event.classhandler.handler(InvalidateCacheEvent) + def handle(event: InvalidateCacheEvent): + del event + Entry.server_wms_capabilities = {} + @view_config(route_name="testi18n", renderer="testi18n.html") def testi18n(self): # pragma: no cover _ = self.request.translate @@ -200,6 +209,9 @@ def _get_metadatas(self, item, errors): def _wms_getcap(self, ogc_server=None): ogc_server = (ogc_server or self.default_ogc_server) + if ogc_server.id in self.server_wms_capabilities: + return self.server_wms_capabilities[ogc_server.id] + url, content, errors = self._wms_getcap_cached( ogc_server, self._get_capabilities_cache_role_key(ogc_server) ) @@ -215,6 +227,9 @@ def _wms_getcap(self, ogc_server=None): "\nURL: {}\n{}".format(url, content) errors.add(error) log.error(error, exc_info=True) + + self.server_wms_capabilities[ogc_server.id] = (wms, errors) + return wms, errors @cache_region.cache_on_arguments() @@ -1008,7 +1023,7 @@ def _get_functionalities(theme): @staticmethod @view_config(route_name="invalidate", renderer="json") def invalidate_cache(): # pragma: no cover - invalidate_region() + c2cgeoportal_commons.models.main.cache_invalidate_cb() return { "success": True }