From 3ff0af7c7a5b02b068ba287a7f55bd1b72ba6888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Thu, 5 Jul 2018 12:49:46 +0200 Subject: [PATCH 01/14] Send cookies only on https --- geoportal/c2cgeoportal_geoportal/lib/authentication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal/c2cgeoportal_geoportal/lib/authentication.py b/geoportal/c2cgeoportal_geoportal/lib/authentication.py index 566e0c1797..ccad1f0dcc 100644 --- a/geoportal/c2cgeoportal_geoportal/lib/authentication.py +++ b/geoportal/c2cgeoportal_geoportal/lib/authentication.py @@ -45,7 +45,7 @@ def create_authentication(settings): callback=defaultgroupsfinder, cookie_name=settings["authtkt_cookie_name"], timeout=timeout, max_age=timeout, reissue_time=reissue_time, - hashalg="sha512", http_only=True + hashalg="sha512", http_only=True, secure=True, ) basic_authentication_policy = BasicAuthAuthenticationPolicy(c2cgeoportal_check) policies = [cookie_authentication_policy, basic_authentication_policy] From ad5ce8a8afd0256551d95552ee7c1db5c5755c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Fri, 6 Jul 2018 14:23:12 +0200 Subject: [PATCH 02/14] Fix the log message --- docker/qgisserver/geomapfish_plugin/accesscontrol.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/qgisserver/geomapfish_plugin/accesscontrol.py b/docker/qgisserver/geomapfish_plugin/accesscontrol.py index 2bcb146ed1..b27656a919 100644 --- a/docker/qgisserver/geomapfish_plugin/accesscontrol.py +++ b/docker/qgisserver/geomapfish_plugin/accesscontrol.py @@ -72,7 +72,7 @@ def __init__(self, server_iface): self.layers[name] = [] self.layers[name].append(layer) QgsMessageLog.logMessage('[accesscontrol] layers: {}'.format( - json.dumps(self.layers, sort_keys=True, indent=4) + json.dumps(dict([(k, [l.name for l in v]) for k, v in self.layers.items()]), sort_keys=True, indent=4) )) server_iface.registerAccessControl(self, int(os.environ.get("GEOMAPFISH_POSITION", 100))) From 21a400aed1c5736c1c0859dc9788656c42101906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Fri, 6 Jul 2018 15:16:24 +0200 Subject: [PATCH 03/14] Secure the plugin against error --- .../geomapfish_plugin/accesscontrol.py | 98 ++++++++++++------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/docker/qgisserver/geomapfish_plugin/accesscontrol.py b/docker/qgisserver/geomapfish_plugin/accesscontrol.py index b27656a919..ad9c8352ec 100644 --- a/docker/qgisserver/geomapfish_plugin/accesscontrol.py +++ b/docker/qgisserver/geomapfish_plugin/accesscontrol.py @@ -43,37 +43,45 @@ def __init__(self, server_iface): self.server_iface = server_iface self.area_cache = {} + self.layers = None - if "GEOMAPFISH_OGCSERVER" not in os.environ: - raise GMFException("The environment variable 'GEOMAPFISH_OGCSERVER' is not defined.") - - print("Use OGC server named '{}'".format(os.environ["GEOMAPFISH_OGCSERVER"])) - - config.init(os.environ.get('GEOMAPFISH_CONFIG', '/etc/qgisserver/geomapfish.yaml')) - self.srid = config.get('srid') - - from c2cgeoportal_commons.models.main import LayerWMS, OGCServer - configure_mappers() - - engine = sqlalchemy.create_engine(config.get('sqlalchemy_slave.url')) - session_factory = sessionmaker() - session_factory.configure(bind=engine) - self.DBSession = scoped_session(session_factory) - - self.ogcserver = self.DBSession.query(OGCServer) \ - .filter(OGCServer.name == os.environ["GEOMAPFISH_OGCSERVER"]) \ - .one() + try: + if "GEOMAPFISH_OGCSERVER" not in os.environ: + raise GMFException("The environment variable 'GEOMAPFISH_OGCSERVER' is not defined.") + + print("Use OGC server named '{}'".format(os.environ["GEOMAPFISH_OGCSERVER"])) + + config.init(os.environ.get('GEOMAPFISH_CONFIG', '/etc/qgisserver/geomapfish.yaml')) + self.srid = config.get('srid') + + from c2cgeoportal_commons.models.main import LayerWMS, OGCServer + configure_mappers() + + engine = sqlalchemy.create_engine(config.get('sqlalchemy_slave.url')) + session_factory = sessionmaker() + session_factory.configure(bind=engine) + self.DBSession = scoped_session(session_factory) + + self.ogcserver = self.DBSession.query(OGCServer) \ + .filter(OGCServer.name == os.environ["GEOMAPFISH_OGCSERVER"]) \ + .one() + + layers = {} + # TODO manage groups ... + for layer in self.DBSession.query(LayerWMS).filter(LayerWMS.ogc_server_id == self.ogcserver.id).all(): + for name in layer.layer.split(','): + if name not in layers: + layers[name] = [] + layers[name].append(layer) + QgsMessageLog.logMessage('[accesscontrol] layers: {}'.format( + json.dumps(dict([(k, [l.name for l in v]) for k, v in layers.items()]), sort_keys=True, indent=4) + )) + self.layers = layers - self.layers = {} - # TODO manage groups ... - for layer in self.DBSession.query(LayerWMS).filter(LayerWMS.ogc_server_id == self.ogcserver.id).all(): - for name in layer.layer.split(','): - if name not in self.layers: - self.layers[name] = [] - self.layers[name].append(layer) - QgsMessageLog.logMessage('[accesscontrol] layers: {}'.format( - json.dumps(dict([(k, [l.name for l in v]) for k, v in self.layers.items()]), sort_keys=True, indent=4) - )) + except Exception as e: + QgsMessageLog.logMessage(traceback.format_tb(e)) + QgsMessageLog.logMessage(str(e)) + raise server_iface.registerAccessControl(self, int(os.environ.get("GEOMAPFISH_POSITION", 100))) @@ -126,6 +134,9 @@ def layerFilterSubsetString(self, layer): # NOQA """ Return an additional subset string (typically SQL) filter """ QgsMessageLog.logMessage("layerFilterSubsetString {}".format(layer.dataProvider().storageType())) + if self.layers is None: + raise Exception("The plugin is not initialised") + try: if layer.dataProvider().storageType() not in self.EXPRESSION_TYPE: return None @@ -146,14 +157,18 @@ def layerFilterSubsetString(self, layer): # NOQA return "ST_intersects({}, {})".format( QgsDataSourceUri(layer.dataProvider().dataSourceUri()).geometryColumn(), area ) - except Exception: - QgsMessageLog.logMessage(traceback.format_exc()) + except Exception as e: + QgsMessageLog.logMessage(traceback.format_tb(e)) + QgsMessageLog.logMessage(str(e)) raise def layerFilterExpression(self, layer): # NOQA """ Return an additional expression filter """ QgsMessageLog.logMessage("layerFilterExpression {}".format(layer.dataProvider().storageType())) + if self.layers is None: + raise Exception("The plugin is not initialised") + try: if layer.dataProvider().storageType() in self.EXPRESSION_TYPE: return None @@ -171,14 +186,18 @@ def layerFilterExpression(self, layer): # NOQA return "intersects($geometry, transform(geom_from_wkt('{}'), 'EPSG:{}', 'EPSG:{}')".format( area, self.srid, layer.crs().projectionAcronym() ) - except Exception: - QgsMessageLog.logMessage(traceback.format_exc()) + except Exception as e: + QgsMessageLog.logMessage(traceback.format_tb(e)) + QgsMessageLog.logMessage(str(e)) raise def layerPermissions(self, layer): # NOQA """ Return the layer rights """ QgsMessageLog.logMessage("layerPermissions {}".format(layer.name())) + if self.layers is None: + raise Exception("The plugin is not initialised") + try: rights = QgsAccessControlFilter.LayerPermissions() rights.canRead = rights.canInsert = rights.canUpdate = rights.canDelete = False @@ -203,8 +222,9 @@ def layerPermissions(self, layer): # NOQA restriction_areas is None or len(restriction_areas) > 0 return rights - except Exception: - QgsMessageLog.logMessage(traceback.format_exc()) + except Exception as e: + QgsMessageLog.logMessage(traceback.format_tb(e)) + QgsMessageLog.logMessage(str(e)) raise @staticmethod @@ -220,12 +240,16 @@ def allowToEdit(self, layer, feature): # NOQA """ Are we authorise to modify the following geometry """ QgsMessageLog.logMessage("allowToEdit") + if self.layers is None: + raise Exception("The plugin is not initialised") + try: area = self.get_area(layer, rw=True) return area is None or area.intersect(feature.geom) - except Exception: - QgsMessageLog.logMessage(traceback.format_exc()) + except Exception as e: + QgsMessageLog.logMessage(traceback.format_tb(e)) + QgsMessageLog.logMessage(str(e)) raise def cacheKey(self): # NOQA From f2f26ff565f26306dcb2dc2cf5e59792dd3475f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Fri, 6 Jul 2018 16:22:22 +0200 Subject: [PATCH 04/14] Fix role and restriction area --- .../geomapfish_plugin/accesscontrol.py | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/docker/qgisserver/geomapfish_plugin/accesscontrol.py b/docker/qgisserver/geomapfish_plugin/accesscontrol.py index ad9c8352ec..dd059d5a97 100644 --- a/docker/qgisserver/geomapfish_plugin/accesscontrol.py +++ b/docker/qgisserver/geomapfish_plugin/accesscontrol.py @@ -88,23 +88,24 @@ def __init__(self, server_iface): def get_role(self): from c2cgeoportal_commons.models.main import Role parameters = self.serverInterface().requestHandler().parameterMap() - return self.DBSession.query(Role).get(parameters['ROLE_ID']) + return self.DBSession.query(Role).get(parameters['ROLE_ID']) if 'ROLE_ID' in parameters else None - def get_restriction_areas(self, gmf_layers, rw=False, role=False): + def get_restriction_areas(self, gmf_layers, rw=False, role=None): """ None => full access [] => no access shapely.ops.cascaded_union(result) => geom of access """ - if role is False: - role = self.get_role() + + if role is None: + return [] restriction_areas = [] for layer in gmf_layers: for restriction_area in layer.restrictionareas: if role in restriction_area.roles and rw is False or restriction_area.readwrite is True: if restriction_area.area is None: - return None + return [] else: restriction_areas.append(geoalchemy2.shape.to_shape( restriction_area.area @@ -114,7 +115,7 @@ def get_restriction_areas(self, gmf_layers, rw=False, role=False): def get_area(self, layer, rw=False): role = self.get_role() - key = (layer.name(), role.name, rw) + key = (layer.name(), role.name if role is not None else None, rw) if key in self.area_cache: return self.area_cache[key] @@ -122,8 +123,8 @@ def get_area(self, layer, rw=False): gmf_layers = self.layers[layer.name()] restriction_areas = self.get_restriction_areas(gmf_layers, role=role) - if restriction_areas is None: - self.area_cache[key] = None + if len(restriction_areas) == 0: + self.area_cache[key] = [] return None area = ops.unary_union(restriction_areas).wkt @@ -179,8 +180,8 @@ def layerFilterExpression(self, layer): # NOQA return None QgsMessageLog.logMessage("intersects($geometry, geom_from_wkt('{}'))".format(area)) - #return "geometry = '{}'".format(ops.unary_union(restriction_areas).wkt) - #return "fid = 2" + # return "geometry = '{}'".format(ops.unary_union(restriction_areas).wkt) + # return "fid = 2" # TODO cache the union # TODO verify the geometry return "intersects($geometry, transform(geom_from_wkt('{}'), 'EPSG:{}', 'EPSG:{}')".format( @@ -210,16 +211,14 @@ def layerPermissions(self, layer): # NOQA if l.public is True: rights.canRead = True + role = self.get_role() if not rights.canRead: - role = self.get_role() restriction_areas = self.get_restriction_areas(gmf_layers, role=role) - if restriction_areas is not None and len(restriction_areas) == 0: - return rights - rights.canRead = True + if len(restriction_areas) > 0: + rights.canRead = True restriction_areas = self.get_restriction_areas(gmf_layers, rw=True, role=role) - rights.canInsert = rights.canUpdate = rights.canDelete = \ - restriction_areas is None or len(restriction_areas) > 0 + rights.canInsert = rights.canUpdate = rights.canDelete = len(restriction_areas) > 0 return rights except Exception as e: From 680b0651c613808719e5ba9db7fe0debe0500aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Fri, 6 Jul 2018 16:34:50 +0200 Subject: [PATCH 05/14] Fix code style --- docker/qgisserver/geomapfish_plugin/accesscontrol.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/qgisserver/geomapfish_plugin/accesscontrol.py b/docker/qgisserver/geomapfish_plugin/accesscontrol.py index dd059d5a97..8f8752bcf0 100644 --- a/docker/qgisserver/geomapfish_plugin/accesscontrol.py +++ b/docker/qgisserver/geomapfish_plugin/accesscontrol.py @@ -90,7 +90,8 @@ def get_role(self): parameters = self.serverInterface().requestHandler().parameterMap() return self.DBSession.query(Role).get(parameters['ROLE_ID']) if 'ROLE_ID' in parameters else None - def get_restriction_areas(self, gmf_layers, rw=False, role=None): + @staticmethod + def get_restriction_areas(gmf_layers, rw=False, role=None): """ None => full access [] => no access From 391c525c6bfa3c701465a6b30ebbae34fb5ba86c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Mon, 16 Jul 2018 16:17:32 +0200 Subject: [PATCH 06/14] Makes docker-compose-run compatible with Windows --- .../scaffolds/create/docker-compose-run | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-run b/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-run index c6ee0bf75a..dc31ab8c52 100755 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-run +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-compose-run @@ -7,8 +7,8 @@ import subprocess os.environ["HOME_DIR"] = os.environ["HOME"] os.environ['USER_NAME'] = getpass.getuser() -os.environ['USER_ID'] = str(os.getuid()) -os.environ['GROUP_ID'] = str(os.getgid()) +os.environ['USER_ID'] = str(os.getuid()) if os.name == "posix" else "1000" +os.environ['GROUP_ID'] = str(os.getgid()) if os.name == "posix" else "1000" try: subprocess.check_call([ From 67d09a56524a1ad612c5f9c2bed4d9fea5c6bc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Mon, 16 Jul 2018 16:53:18 +0200 Subject: [PATCH 07/14] Add editor config file --- .editorconfig | 15 +++++++++++++++ .../scaffolds/update/+dot+editorconfig | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .editorconfig create mode 100644 geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..5b1d828a07 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.js] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+editorconfig b/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+editorconfig new file mode 100644 index 0000000000..5b1d828a07 --- /dev/null +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.js] +indent_size = 2 + +[Makefile] +indent_style = tab From 546360f0c24e883e85ad07f61351aa3663d74286 Mon Sep 17 00:00:00 2001 From: Wolfgang Kaltz Date: Tue, 17 Jul 2018 16:53:09 +0200 Subject: [PATCH 08/14] use variable web_protocol (like in docker template) --- .../scaffolds/nondockercreate/mapserver/mapserver.map.mako_tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/mapserver/mapserver.map.mako_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/mapserver/mapserver.map.mako_tmpl index 1fd4219144..5f2018faba 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/mapserver/mapserver.map.mako_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/mapserver/mapserver.map.mako_tmpl @@ -70,7 +70,7 @@ MAP METADATA "wms_title" "changeme" "wms_abstract" "changeme" - "wms_onlineresource" "http://${host}/${instanceid}/wsgi/mapserv_proxy" + "wms_onlineresource" "${web_protocol}://${host}/${instanceid}/wsgi/mapserv_proxy" "wms_srs" "EPSG:{{srid}}" "wms_encoding" "UTF-8" "wms_enable_request" "*" From 5ff2cbd673224b0703577d9b0665bcfdbd0f181e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Tue, 17 Jul 2018 15:31:00 +0200 Subject: [PATCH 09/14] Fix OpenLayers in the admin interface --- .dockerignore | 1 + Dockerfile.mako | 5 ++++- Makefile | 2 +- .../nondocker-finalise.mk_tmpl | 21 ++++++++++++------- package.json | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.dockerignore b/.dockerignore index 2996088cb2..3dd1690d5f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,4 +14,5 @@ !admin/README.md !admin/requirements.txt !admin/requirements-dev.txt +!admin/npm-packages **/__pycache__/ diff --git a/Dockerfile.mako b/Dockerfile.mako index 2e6533aa8d..a53ecf1842 100644 --- a/Dockerfile.mako +++ b/Dockerfile.mako @@ -29,7 +29,10 @@ COPY commons /opt/c2cgeoportal_commons COPY geoportal /opt/c2cgeoportal_geoportal COPY admin /opt/c2cgeoportal_admin -RUN chmod go+r -R /opt/c2cgeoportal_commons /opt/c2cgeoportal_geoportal && \ +RUN \ + (cd /opt/c2cgeoportal_admin/; npm install --no-optional `cat npm-packages`) && \ + npm cache clear && \ + chmod go+r -R /opt/c2cgeoportal_commons /opt/c2cgeoportal_geoportal /opt/c2cgeoportal_admin && \ ln -s /opt/c2cgeoportal_commons/c2cgeoportal_commons/alembic /opt && \ pip install --disable-pip-version-check --no-cache-dir --no-deps \ --editable=/opt/c2cgeoportal_commons \ diff --git a/Makefile b/Makefile index 88e5466933..f085ec45cb 100644 --- a/Makefile +++ b/Makefile @@ -407,7 +407,7 @@ npm-packages: ngeo package.json npm-packages --ngeo \ coveralls gaze jasmine-core jsdoc jsdom karma karma-chrome-launcher karma-coverage \ karma-jasmine karma-sourcemap-loader karma-webpack \ - --src=ngeo/package.json --src=package.json --dst=$@ + --src=ngeo/package.json --dst=$@ echo googshift eslint-plugin-googshift >> $@ admin/npm-packages: ngeo package.json diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/nondocker-finalise.mk_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/nondocker-finalise.mk_tmpl index e5d062953c..a643d310fc 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/nondocker-finalise.mk_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/nondocker-finalise.mk_tmpl @@ -69,7 +69,7 @@ clean-all: .PHONY: build build: $(PRINT_OUTPUT_WAR) \ .build/apache.timestamp \ - .build/npm.timestamp \ + .build/admin-npm.timestamp \ # Apache @@ -192,18 +192,25 @@ endif $(PYTHON_BIN)/python -m compileall -q geoportal/$(PACKAGE)_geoportal -x geoportal/$(PACKAGE)_geoportal/static.* >/dev/null || true npm-packages: .config - $(DOCKER_RUN) cp /opt/npm-packages . + $(DOCKER_RUN) cp /opt/c2cgeoportal_admin/npm-packages $@ -.build/npm.timestamp: .config npm-packages +geoportal/npm-packages: .config + $(DOCKER_RUN) cp /opt/npm-packages $@ + +.build/admin-npm.timestamp: npm-packages + rm --force --recursive admin/node_modules + mkdir --parent admin + cat $< | xargs npm install --prefix ./admin + touch $@ + +.build/geoportal-npm.timestamp: geoportal/npm-packages rm --force --recursive admin/node_modules mkdir --parent admin - cat npm-packages | xargs npm install --prefix ./admin + cat $< | xargs npm install --prefix ./geoportal touch $@ .PHONY: serve-% -serve-%: - rm -f geoportal/node_modules - ln -s ../admin/node_modules geoportal +serve-%: .build/geoportal-npm.timestamp (cd geoportal; INTERFACE=$* NODE_ENV=development node_modules/.bin/webpack-dev-server --port=$(DEV_SERVER_PORT) -d --watch --progress \ --public=$(VISIBLE_WEB_HOST):$(VISIBLE_WEB_PORT) --disable-host-check --mode=development) rm geoportal/node_modules diff --git a/package.json b/package.json index c9fb422713..d066ae2133 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "jstree": "3.3.5", "jstreegrid": "3.9.3", "magicsuggest-alpine": "1.0.0", - "openlayers": "https://api.github.com/repos/openlayers/openlayers/tarball/f284b95cb897b3ce1b49b985b58ebe1ca76be1fe", + "openlayers": "4.6.5", "typeahead.js": "0.11.1" } } From 8d3ef1b71866d2ad2e17f6d470b3d0b69c5f09af Mon Sep 17 00:00:00 2001 From: Michael Kalbermatten Date: Wed, 18 Jul 2018 09:21:25 +0200 Subject: [PATCH 10/14] Add WMTS queryable zoom limits documentation --- doc/administrator/administrate.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/administrator/administrate.rst b/doc/administrator/administrate.rst index 1622ec3d16..e994d00617 100644 --- a/doc/administrator/administrate.rst +++ b/doc/administrator/administrate.rst @@ -181,6 +181,11 @@ To make the WMTS queryable, you should add the following ``Metadata``: * ``ogcServer`` with the name of the used ``OGC server``, * ``wmsLayers`` or ``queryLayers`` with the layers to query (groups not supported). +It is possible to give some scale limits for the queryable layers by setting +a ``minResolution`` and/or a ``maxResolution Metadata`` value(s) for the +WMTS layer. These values correspond to the WMTS layer resolution(s) which should +be the zoom limit. + Print WMTS in high quality ~~~~~~~~~~~~~~~~~~~~~~~~~~ To print the layers in high quality, you should add the following ``Metadata``: From 954b4ba09dddf0e9f56f11ef714e459f6ab1b7ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Wed, 18 Jul 2018 12:39:06 +0200 Subject: [PATCH 11/14] Don't have dupplicated fulltextsearchUrl --- geoportal/c2cgeoportal_geoportal/scaffolds/create/vars.yaml_tmpl | 1 - .../scaffolds/nondockercreate/vars.yaml_tmpl | 1 - 2 files changed, 2 deletions(-) diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/vars.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/create/vars.yaml_tmpl index 3a830afc51..e751e396d7 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/vars.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/vars.yaml_tmpl @@ -49,7 +49,6 @@ vars: partitionlimit: 5 routes: &routes authenticationBaseUrl: base - fulltextsearchUrl: fulltextsearch gmfLayersUrl: layers_root gmfRasterUrl: raster gmfProfileCsvUrl: profile.csv diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/vars.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/vars.yaml_tmpl index 70caa104d7..f3f27a9607 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/vars.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockercreate/vars.yaml_tmpl @@ -49,7 +49,6 @@ vars: partitionlimit: 5 routes: &routes authenticationBaseUrl: base - fulltextsearchUrl: fulltextsearch gmfLayersUrl: layers_root gmfRasterUrl: raster gmfProfileCsvUrl: profile.csv From 35c9e468b1d73688be34a7bff8913e8786d520be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Wed, 18 Jul 2018 12:53:31 +0200 Subject: [PATCH 12/14] Do an xmllint on the jasper report print templates --- docker/build/Dockerfile | 2 +- .../scaffolds/update/CONST_Makefile_tmpl | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/build/Dockerfile b/docker/build/Dockerfile index 6e3b8ade4c..c999164458 100644 --- a/docker/build/Dockerfile +++ b/docker/build/Dockerfile @@ -4,7 +4,7 @@ LABEL maintainer Camptocamp "info@camptocamp.com" RUN \ . /etc/os-release && \ apt-get update && \ - apt-get install --assume-yes --no-install-recommends tree apt-transport-https gettext sudo && \ + apt-get install --assume-yes --no-install-recommends tree apt-transport-https gettext sudo libxml2-utils && \ echo "deb https://deb.nodesource.com/node_6.x ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/nodesource.list && \ curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ # Docker source list should be like it but actually it's empty... diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl index 70c23a3e4d..e54e0041d9 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl @@ -390,12 +390,17 @@ docker-build: build: $(BUILD_RULES) .PHONY: checks -checks: flake8 $(CLIENT_CHECK_RULE) git-attributes yamllint spell +checks: flake8 $(CLIENT_CHECK_RULE) git-attributes yamllint spell printlint .PHONY: git-attributes git-attributes: git --no-pager diff --check `git log --oneline | tail -1 | cut --fields=1 --delimiter=' '` +PRINT_REPORTS_FILES ?= $(shell find print/print-apps -name "*.jsrml" -print) +.PHONY: printlint +printlint: $(PRINT_REPORTS_FILES) + xmllint --valid --encode utf-8 $(PRINT_REPORTS_FILES) + YAML_FILES ?= $(filter-out ./tilegeneration/config.yaml ./geoportal/config.yaml \ ./qgisserver/geomapfish.yaml ./geoportal/alembic.yaml \ ./docker-compose-dev.yaml ./docker-compose.yaml, \ From 88787d7c0a4cfc2c7acf605520a6955e24d59699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Tue, 24 Jul 2018 14:18:10 +0200 Subject: [PATCH 13/14] Factorise assert plugin initialised --- .../geomapfish_plugin/accesscontrol.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker/qgisserver/geomapfish_plugin/accesscontrol.py b/docker/qgisserver/geomapfish_plugin/accesscontrol.py index 8f8752bcf0..62291d84f3 100644 --- a/docker/qgisserver/geomapfish_plugin/accesscontrol.py +++ b/docker/qgisserver/geomapfish_plugin/accesscontrol.py @@ -85,6 +85,10 @@ def __init__(self, server_iface): server_iface.registerAccessControl(self, int(os.environ.get("GEOMAPFISH_POSITION", 100))) + def assert_plugin_initialised(self): + if self.layers is None: + raise Exception("The plugin is not initialised") + def get_role(self): from c2cgeoportal_commons.models.main import Role parameters = self.serverInterface().requestHandler().parameterMap() @@ -136,8 +140,7 @@ def layerFilterSubsetString(self, layer): # NOQA """ Return an additional subset string (typically SQL) filter """ QgsMessageLog.logMessage("layerFilterSubsetString {}".format(layer.dataProvider().storageType())) - if self.layers is None: - raise Exception("The plugin is not initialised") + self.assert_plugin_initialised() try: if layer.dataProvider().storageType() not in self.EXPRESSION_TYPE: @@ -168,8 +171,7 @@ def layerFilterExpression(self, layer): # NOQA """ Return an additional expression filter """ QgsMessageLog.logMessage("layerFilterExpression {}".format(layer.dataProvider().storageType())) - if self.layers is None: - raise Exception("The plugin is not initialised") + self.assert_plugin_initialised() try: if layer.dataProvider().storageType() in self.EXPRESSION_TYPE: @@ -197,8 +199,7 @@ def layerPermissions(self, layer): # NOQA """ Return the layer rights """ QgsMessageLog.logMessage("layerPermissions {}".format(layer.name())) - if self.layers is None: - raise Exception("The plugin is not initialised") + self.assert_plugin_initialised() try: rights = QgsAccessControlFilter.LayerPermissions() @@ -240,8 +241,7 @@ def allowToEdit(self, layer, feature): # NOQA """ Are we authorise to modify the following geometry """ QgsMessageLog.logMessage("allowToEdit") - if self.layers is None: - raise Exception("The plugin is not initialised") + self.assert_plugin_initialised() try: area = self.get_area(layer, rw=True) From 4f34d09be21f1d3bb458985283e3735a64bbc550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Thu, 26 Jul 2018 14:43:26 +0200 Subject: [PATCH 14/14] Directly use the npm package, update ngeo Fixes for ngeo upgrade --- .gitignore | 3 ++ Dockerfile.mako | 18 ++++----- Makefile | 29 +++++++++----- docker/build/Dockerfile | 4 +- docker/build/bin/docker-required | 4 +- docker/build/bin/npm-packages | 39 ------------------- .../static-ngeo/less/desktop.less_tmpl | 4 +- .../static-ngeo/less/mobile.less_tmpl | 4 +- .../+package+.less => sass/+package+.scss} | 0 .../nondockerupdate/+dot+upgrade.yaml_tmpl | 3 ++ .../scaffolds/update/+dot+upgrade.yaml_tmpl | 3 ++ .../scaffolds/update/CONST_Makefile_tmpl | 33 ++++++---------- package.json | 2 +- 13 files changed, 58 insertions(+), 88 deletions(-) rename geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/{less/+package+.less => sass/+package+.scss} (100%) diff --git a/.gitignore b/.gitignore index fd0a5b6fa6..07bed8056e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ **/__pycache__/ */.pytest_cache/ /npm-packages +/ngeo +/node_modules/ +/package-lock.json /Dockerfile /commons/tests.yaml /commons/c2cgeoportal_commons.egg-info/ diff --git a/Dockerfile.mako b/Dockerfile.mako index a53ecf1842..4e8f0c4944 100644 --- a/Dockerfile.mako +++ b/Dockerfile.mako @@ -7,16 +7,16 @@ ENV VERSION=$VERSION COPY npm-packages /opt/npm-packages RUN \ - npm install --no-optional --global `cat /opt/npm-packages` && \ - npm cache clear + npm install --no-optional --global --unsafe-perm `cat /opt/npm-packages` && \ + npm cache clear --force RUN \ - svg2ttf /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.svg \ - /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.ttf && \ - ttf2eot /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.ttf \ - /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.eot && \ - ttf2woff /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.ttf \ - /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.woff + svg2ttf /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.svg \ + /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.ttf && \ + ttf2eot /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.ttf \ + /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.eot && \ + ttf2woff /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.ttf \ + /usr/lib/node_modules/ngeo/contribs/gmf/src/fonts/gmf-icons.woff RUN \ mkdir --parents /opt/angular-locale && \ @@ -31,7 +31,7 @@ COPY admin /opt/c2cgeoportal_admin RUN \ (cd /opt/c2cgeoportal_admin/; npm install --no-optional `cat npm-packages`) && \ - npm cache clear && \ + npm cache clear --force && \ chmod go+r -R /opt/c2cgeoportal_commons /opt/c2cgeoportal_geoportal /opt/c2cgeoportal_admin && \ ln -s /opt/c2cgeoportal_commons/c2cgeoportal_commons/alembic /opt && \ pip install --disable-pip-version-check --no-cache-dir --no-deps \ diff --git a/Makefile b/Makefile index 9fa70d6db3..2e706830f1 100644 --- a/Makefile +++ b/Makefile @@ -270,13 +270,22 @@ quote: .PHONY: spell spell: codespell --quiet-level=2 --check-filenames --ignore-words=spell-ignore-words.txt \ - $(shell find -name node_modules -prune -or -name .build -prune -or -name .git -prune -or -name ngeo -prune \ - -or -name '__pycache__' -prune -or -name _build -prune \ - -or \( -type f -and -not -name '*.png' -and -not -name '*.mo' -and -not -name '*.po*' \ + $(shell find \ + -name node_modules -prune -or \ + -name .build -prune -or \ + -name .git -prune -or \ + -name ngeo -prune -or \ + -name '__pycache__' -prune -or \ + -name _build -prune -or \ + \( -type f -and -not -name '*.png' -and -not -name '*.mo' -and -not -name '*.po*' \ -and -not -name 'CONST_Makefile_tmpl' -and -not -name 'package-lock.json' \) -print) -YAML_FILES ?= $(shell find -name ngeo -prune -or -name functional -prune -or \( -name "*.yml" -or -name "*.yaml" \) -print) +YAML_FILES ?= $(shell find \ + -name node_modules -prune -or \ + -name ngeo -prune -or \ + -name functional -prune -or \ + \( -name "*.yml" -or -name "*.yaml" \) -print) .PHONY: yamllint yamllint: yamllint --strict --config-file=yamllint.yaml -s $(YAML_FILES) @@ -336,9 +345,8 @@ import-ngeo-apps: $(APPS_FILES) $(APPS_FILES_ALT) .PRECIOUS: ngeo ngeo: $(PRERULE_CMD) - if [ ! -e "ngeo" ] ; then git clone --depth=100 --branch=$(shell VERSION=$(MAIN_BRANCH) npm-packages --branch) https://github.com/camptocamp/ngeo.git ; fi - git fetch origin - git reset --hard $(shell VERSION=$(MAIN_BRANCH) npm-packages --hash) + npm install + ln -s node_modules/ngeo . touch --no-create $@ .PRECIOUS: ngeo/contribs/gmf/apps/%/index.html.ejs @@ -403,11 +411,12 @@ geoportal/c2cgeoportal_geoportal/scaffolds/create/docker-run: docker-run npm-packages: ngeo package.json $(PRERULE_CMD) - npm-packages --ngeo \ + npm-packages \ coveralls gaze jasmine-core jsdoc jsdom karma karma-chrome-launcher karma-coverage \ karma-jasmine karma-sourcemap-loader karma-webpack \ - --src=ngeo/package.json --dst=$@ - echo googshift eslint-plugin-googshift >> $@ + bootstrap-table jquery.scrollintoview jstree jstreegrid magicsuggest-alpine typeahead.js \ + --src=package.json --src=ngeo/package.json --dst=$@ + echo googshift eslint-plugin-googshift loader-utils co eslint-plugin-import >> $@ admin/npm-packages: ngeo package.json $(PRERULE_CMD) diff --git a/docker/build/Dockerfile b/docker/build/Dockerfile index c999164458..faa50d0dc5 100644 --- a/docker/build/Dockerfile +++ b/docker/build/Dockerfile @@ -5,14 +5,14 @@ RUN \ . /etc/os-release && \ apt-get update && \ apt-get install --assume-yes --no-install-recommends tree apt-transport-https gettext sudo libxml2-utils && \ - echo "deb https://deb.nodesource.com/node_6.x ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/nodesource.list && \ + echo "deb https://deb.nodesource.com/node_8.x ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/nodesource.list && \ curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ # Docker source list should be like it but actually it's empty... # echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list && \ echo "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.list && \ curl --silent https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \ apt-get update && \ - apt-get install --assume-yes --no-install-recommends 'nodejs=6.*' docker-ce openjdk-8-jre-headless && \ + apt-get install --assume-yes --no-install-recommends 'nodejs=8.*' docker-ce openjdk-8-jre-headless && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* diff --git a/docker/build/bin/docker-required b/docker/build/bin/docker-required index 575da19887..f33b5e2e5f 100755 --- a/docker/build/bin/docker-required +++ b/docker/build/bin/docker-required @@ -75,7 +75,9 @@ def main(): for pattern, replacement in replaces: filename = pattern.sub(replacement, filename) file_path = os.path.join(dir_path, filename) - if not ignores.is_ignored(file_path[len(path):], check_parents=True): + if \ + ':' not in file_path and \ + not ignores.is_ignored(file_path[len(path):], check_parents=True): print(file_path) diff --git a/docker/build/bin/npm-packages b/docker/build/bin/npm-packages index 8d3b6fc67e..65702b0fa4 100755 --- a/docker/build/bin/npm-packages +++ b/docker/build/bin/npm-packages @@ -29,7 +29,6 @@ # either expressed or implied, of the FreeBSD Project. -import os import re import json from argparse import ArgumentParser @@ -39,23 +38,6 @@ RE_NPM_VERSION = re.compile("^([0-9]+)\.([0-9]+)\.([0-9]+)$") RE_NPM_PRERELEASE_VERSION = re.compile("^([0-9]+)\.([0-9]+)\.([0-9]+)\.?([a-z]+)([0-9]+)$") -def _ngeo_version(): - if "TRAVIS_TAG" in os.environ and os.environ["TRAVIS_TAG"] != "": - match = RE_NPM_VERSION.match(os.environ["TRAVIS_TAG"]) - prerelease_match = RE_NPM_PRERELEASE_VERSION.match(os.environ["TRAVIS_TAG"]) - if match is not None: - return "{}.{}.{}".format(match.group(1), match.group(2), match.group(3)) - if prerelease_match is not None: - return "{}.{}.{}-{}.{}".format( - prerelease_match.group(1), - prerelease_match.group(2), - prerelease_match.group(3), - prerelease_match.group(4), - prerelease_match.group(5) - ) - return None - - def main(): """ Extract npm packages @@ -63,39 +45,18 @@ def main(): parser = ArgumentParser(description='Extract npm packages') - parser.add_argument('--branch', action="store_true", help="Get the ngeo branch and exit") - parser.add_argument('--hash', action="store_true", help="Get the ngeo commit hash and exit") - parser.add_argument('--ngeo', action="store_true", help="Add ngeo package") parser.add_argument('--src', action='append', default=[], metavar='SRC', help="The ngeo source file") parser.add_argument('--dst', metavar='DST', help="The destination file") parser.add_argument('excludes', nargs='*', metavar='EXCLUDE', help="The npm package to exclude") args = parser.parse_args() - if args.branch: - version = _ngeo_version() - print(os.environ["VERSION"] if version is None else version) - exit(0) - - if args.hash: - version = _ngeo_version() - if version is None: - with open("package.json") as package_file: - version = json.loads(package_file)["dependencies"]["ngeo"].split(".")[-2] - print(version) - exit(0) - packages = {} for src_ in args.src: with open(src_) as src: input_data = json.loads(src.read()) packages.update(input_data.get('devDependencies', {})) packages.update(input_data.get('dependencies', {})) - if args.ngeo: - # Freeze the ngeo version - version = _ngeo_version() - if version is not None: - packages["ngeo"] = version for package in args.excludes: if package in packages: del packages[package] diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/desktop.less_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/desktop.less_tmpl index 088db0d59e..82b10f4a4b 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/desktop.less_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/desktop.less_tmpl @@ -1,2 +1,2 @@ -@import "{{package}}.less"; -@import "/usr/lib/node_modules/ngeo/contribs/gmf/less/desktop.less"; +@import "{{package}}.scss"; +@import "~gmf/less/desktop.scss"; diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/mobile.less_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/mobile.less_tmpl index ed0c833d5e..967eb534aa 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/mobile.less_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/mobile.less_tmpl @@ -1,2 +1,2 @@ -@import "{{package}}.less"; -@import "/usr/lib/node_modules/ngeo/contribs/gmf/less/mobile.less"; +@import "{{package}}.scss"; +@import "~gmf/less/mobile.scss"; diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/+package+.less b/geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/sass/+package+.scss similarity index 100% rename from geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/less/+package+.less rename to geoportal/c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/sass/+package+.scss diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockerupdate/+dot+upgrade.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockerupdate/+dot+upgrade.yaml_tmpl index 6ba2742630..1752039022 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/nondockerupdate/+dot+upgrade.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/nondockerupdate/+dot+upgrade.yaml_tmpl @@ -198,3 +198,6 @@ files_to_move: - from: mapserver/tinyows.xml.tmpl.mako to: mapserver/tinyows.xml.mako version: 2.3 + - from: geoportal/{{package}}_geoportal/static-ngeo/less/{{package}}.less + to: geoportal/{{package}}_geoportal/static-ngeo/sass/{{package}}.scss + version: 2.4 diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl index 2f60f77fe7..fac015af8d 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl @@ -235,3 +235,6 @@ files_to_move: - from: mapserver/tinyows.xml.mako to: mapserver/tinyows.xml.tmpl.mako version: 2.3 + - from: geoportal/{{package}}_geoportal/static-ngeo/less/{{package}}.less + to: geoportal/{{package}}_geoportal/static-ngeo/sass/{{package}}.scss + version: 2.4 diff --git a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl index c79355f504..bb976af5b0 100644 --- a/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl +++ b/geoportal/c2cgeoportal_geoportal/scaffolds/update/CONST_Makefile_tmpl @@ -125,10 +125,7 @@ APP_JS_JINJA_FILES += $(shell find geoportal/$(PACKAGE)_geoportal/static-ngeo/js APP_JS_FILES += $(APP_JS_MAKO_FILES:.mako=) $(APP_JS_JINJA_FILES:.jinja=) APP_HTML_FILES += $(addprefix geoportal/$(PACKAGE)_geoportal/static-ngeo/js/apps/, $(addsuffix .html.ejs, $(NGEO_INTERFACES))) APP_DIRECTIVES_PARTIALS_FILES = $(shell find geoportal/$(PACKAGE)_geoportal/static-ngeo/components geoportal/$(PACKAGE)_geoportal/static-ngeo/partials geoportal/$(PACKAGE)_geoportal/static-ngeo/js -type f -name '*.html' 2> /dev/null) -LESS_FILES += $(shell find geoportal/$(PACKAGE)_geoportal/static-ngeo/less geoportal/$(PACKAGE)_geoportal/static-ngeo/components -type f -name '*.less' 2> /dev/null) -NGEO_GMF_FONTS = $(addprefix geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/gmf-icons, .woff .ttf .eot) -NGEO_FONTAWESOME_FONTS = $(addprefix geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/fontawesome-webfont, .woff .woff2 .ttf .eot) -NGEO_FONTS = $(NGEO_GMF_FONTS) $(NGEO_FONTAWESOME_FONTS) +SASS_FILES += $(shell find geoportal/$(PACKAGE)_geoportal/static-ngeo/sass geoportal/$(PACKAGE)_geoportal/static-ngeo/components -type f -name '*.scss' 2> /dev/null) JSON_CLIENT_LOCALISATION_FILES = $(addprefix $(APP_OUTPUT_DIR)/, $(addsuffix .json, $(LANGUAGES))) L10N_CLIENT_POSTFIX ?= client L10N_SERVER_POSTFIX ?= server @@ -416,9 +413,15 @@ yamllint: $(YAML_FILES) .PHONY: spell spell: codespell --quiet-level=2 --check-filenames --ignore-words=spell-ignore-words.txt \ - $(shell find -name node_modules -prune -or -name .git -prune -or -name '__pycache__' -prune \ - -or -name 'build' -prune -or -name '.build' -prune -or -name 'cgxp' -prune -or -name 'c2cgeoportal_*' -prune \ - -or \( -type f -and -not -name '*.png' -and -not -name '*.mo' -and -not -name '*.po*' \ + $(shell find \ + -name node_modules -prune -or \ + -name .git -prune -or \ + -name '__pycache__' -prune -or \ + -name 'build' -prune -or \ + -name '.build' -prune -or \ + -name 'cgxp' -prune -or \ + -name 'c2cgeoportal_*' -prune -or \ + \( -type f -and -not -name '*.png' -and -not -name '*.mo' -and -not -name '*.po*' \ -and -not -name 'CONST_Makefile' -and -not -name 'package-lock.json' \) -print) .PHONY: clean @@ -592,19 +595,6 @@ $(APP_OUTPUT_DIR)/angular-locale_%.js: /usr/lib/node_modules/ngeo/package.json l rm --force $@ cp /opt/angular-locale/angular-locale_`(grep $* language_mapping || echo $*) | cut --delimiter = --fields 2 | tr --delete '\r\n'`.js $@ -.PRECIOUS: geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/gmf-icons.% -geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/gmf-icons.%: /usr/lib/node_modules/ngeo/contribs/gmf/fonts/gmf-icons.% - $(PRERULE_CMD) - mkdir --parent $(dir $@) - cp $< $@ - -.PRECIOUS: geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/fontawesome-webfont.% -geoportal/$(PACKAGE)_geoportal/static-ngeo/fonts/fontawesome-webfont.%: /usr/lib/node_modules/font-awesome/fonts/fontawesome-webfont.% - $(PRERULE_CMD) - mkdir --parent $(dir $@) - cp $< $@ - - $(APP_OUTPUT_DIR)/images/: /usr/lib/node_modules/jquery-ui/themes/base/images $(PRERULE_CMD) mkdir --parent $@ @@ -618,8 +608,7 @@ $(APP_OUTPUT_DIR)/images/: /usr/lib/node_modules/jquery-ui/themes/base/images .PRECIOUS: /build/apps.%.timestamp /build/apps.%.timestamp: $(OL_JS_FILES) $(NGEO_JS_FILES) $(APP_JS_FILES) \ $(APP_HTML_FILES) geoportal/webpack.config.js \ - $(LESS_FILES) \ - $(NGEO_FONTS) \ + $(SASS_FILES) \ $(APP_OUTPUT_DIR)/images/ $(PRERULE_CMD) # Workaround to make Webpack working for ol/index.js diff --git a/package.json b/package.json index aa905de7fd..d114d01461 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "jstree": "3.3.5", "jstreegrid": "3.9.4", "magicsuggest-alpine": "1.0.0", - "ngeo": "2.4.0-daily.20180716T092301Z.76f80c4.HEAD", + "ngeo": "2.4.0-latest.20180727T081517Z.f1a2745.HEAD", "openlayers": "4.6.5", "typeahead.js": "0.11.1" }