c2cgeoportal-geoportal 2.9.0.227__py3-none-any.whl → 2.9.0.352__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. c2cgeoportal_geoportal/__init__.py +4 -1
  2. c2cgeoportal_geoportal/lib/__init__.py +1 -1
  3. c2cgeoportal_geoportal/lib/bashcolor.py +1 -1
  4. c2cgeoportal_geoportal/lib/cacheversion.py +1 -1
  5. c2cgeoportal_geoportal/lib/caching.py +1 -1
  6. c2cgeoportal_geoportal/lib/check_collector.py +1 -1
  7. c2cgeoportal_geoportal/lib/checker.py +1 -1
  8. c2cgeoportal_geoportal/lib/dbreflection.py +1 -1
  9. c2cgeoportal_geoportal/lib/filter_capabilities.py +1 -1
  10. c2cgeoportal_geoportal/lib/fulltextsearch.py +1 -1
  11. c2cgeoportal_geoportal/lib/functionality.py +1 -1
  12. c2cgeoportal_geoportal/lib/headers.py +1 -1
  13. c2cgeoportal_geoportal/lib/i18n.py +1 -1
  14. c2cgeoportal_geoportal/lib/layers.py +1 -1
  15. c2cgeoportal_geoportal/lib/loader.py +1 -1
  16. c2cgeoportal_geoportal/lib/metrics.py +1 -1
  17. c2cgeoportal_geoportal/lib/oauth2.py +1 -1
  18. c2cgeoportal_geoportal/lib/oidc.py +77 -59
  19. c2cgeoportal_geoportal/lib/wmstparsing.py +1 -1
  20. c2cgeoportal_geoportal/lib/xsd.py +1 -1
  21. c2cgeoportal_geoportal/resources.py +1 -1
  22. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Dockerfile +1 -1
  23. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Makefile +1 -1
  24. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +1 -1
  25. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/language_mapping +1 -0
  26. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js +11 -1
  27. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile +1 -1
  28. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +3 -3
  29. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +2 -0
  30. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +2 -2
  31. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml +2 -0
  32. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +1 -1
  33. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml +2 -0
  34. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +1 -1
  35. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +1 -1
  36. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +6 -5
  37. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml +6 -3
  38. c2cgeoportal_geoportal/scripts/__init__.py +1 -1
  39. c2cgeoportal_geoportal/scripts/create_demo_theme.py +1 -1
  40. c2cgeoportal_geoportal/scripts/manage_users.py +1 -1
  41. c2cgeoportal_geoportal/scripts/urllogin.py +1 -1
  42. c2cgeoportal_geoportal/views/__init__.py +1 -1
  43. c2cgeoportal_geoportal/views/dev.py +1 -1
  44. c2cgeoportal_geoportal/views/entry.py +4 -2
  45. c2cgeoportal_geoportal/views/geometry_processing.py +1 -1
  46. c2cgeoportal_geoportal/views/i18n.py +1 -1
  47. c2cgeoportal_geoportal/views/layers.py +1 -1
  48. c2cgeoportal_geoportal/views/login.py +12 -4
  49. c2cgeoportal_geoportal/views/mapserverproxy.py +1 -1
  50. c2cgeoportal_geoportal/views/memory.py +1 -1
  51. c2cgeoportal_geoportal/views/ogcproxy.py +1 -1
  52. c2cgeoportal_geoportal/views/pdfreport.py +1 -1
  53. c2cgeoportal_geoportal/views/printproxy.py +1 -1
  54. c2cgeoportal_geoportal/views/profile.py +1 -1
  55. c2cgeoportal_geoportal/views/raster.py +1 -1
  56. c2cgeoportal_geoportal/views/resourceproxy.py +1 -1
  57. c2cgeoportal_geoportal/views/shortener.py +8 -2
  58. c2cgeoportal_geoportal/views/theme.py +5 -0
  59. c2cgeoportal_geoportal/views/vector_tiles.py +1 -1
  60. {c2cgeoportal_geoportal-2.9.0.227.dist-info → c2cgeoportal_geoportal-2.9.0.352.dist-info}/METADATA +6 -1
  61. {c2cgeoportal_geoportal-2.9.0.227.dist-info → c2cgeoportal_geoportal-2.9.0.352.dist-info}/RECORD +74 -74
  62. tests/test_cachebuster.py +1 -1
  63. tests/test_checker.py +1 -1
  64. tests/test_decimaljson.py +1 -1
  65. tests/test_headerstween.py +1 -1
  66. tests/test_init.py +1 -1
  67. tests/test_locale_negociator.py +1 -1
  68. tests/test_mapserverproxy_route_predicate.py +1 -1
  69. tests/test_raster.py +1 -1
  70. tests/test_wmstparsing.py +1 -1
  71. tests/xmlstr.py +1 -1
  72. {c2cgeoportal_geoportal-2.9.0.227.dist-info → c2cgeoportal_geoportal-2.9.0.352.dist-info}/WHEEL +0 -0
  73. {c2cgeoportal_geoportal-2.9.0.227.dist-info → c2cgeoportal_geoportal-2.9.0.352.dist-info}/entry_points.txt +0 -0
  74. {c2cgeoportal_geoportal-2.9.0.227.dist-info → c2cgeoportal_geoportal-2.9.0.352.dist-info}/top_level.txt +0 -0
@@ -416,6 +416,9 @@ def create_get_user_from_request(
416
416
  if access_token_expires < datetime.datetime.now(datetime.timezone.utc):
417
417
  if user_info_remember["refresh_token_expires"] is None:
418
418
  return None
419
+ refresh_token = request.cookies.get("refresh_token")
420
+ if refresh_token is None:
421
+ return None
419
422
  refresh_token_expires = dateutil.parser.isoparse(
420
423
  user_info_remember["refresh_token_expires"]
421
424
  )
@@ -432,7 +435,7 @@ def create_get_user_from_request(
432
435
  return None
433
436
  token_response = oidc.get_oidc_client(
434
437
  request, request.host
435
- ).exchange_refresh_token(user_info_remember["refresh_token"])
438
+ ).exchange_refresh_token(refresh_token)
436
439
  user_info_remember = oidc.OidcRemember(request).remember(
437
440
  token_response, request.host
438
441
  )
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2021, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2014-2024, Camptocamp SA
1
+ # Copyright (c) 2014-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020-2023, Camptocamp SA
1
+ # Copyright (c) 2020-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2024, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2020-2023, Camptocamp SA
1
+ # Copyright (c) 2020-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024, Camptocamp SA
1
+ # Copyright (c) 2018-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2019-2024, Camptocamp SA
1
+ # Copyright (c) 2019-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2023, Camptocamp SA
1
+ # Copyright (c) 2018-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2021-2024, Camptocamp SA
1
+ # Copyright (c) 2021-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -32,7 +32,6 @@ import string
32
32
  from typing import TYPE_CHECKING, Any, NamedTuple, Optional, TypedDict, Union
33
33
 
34
34
  import pyramid.request
35
- import pyramid.response
36
35
  import simple_openid_connect.client
37
36
  import simple_openid_connect.data
38
37
  from pyramid.httpexceptions import HTTPBadRequest, HTTPInternalServerError, HTTPUnauthorized
@@ -88,9 +87,7 @@ class OidcRememberObject(TypedDict):
88
87
  The JSON object that is stored in a cookie to remember the user.
89
88
  """
90
89
 
91
- access_token: str
92
90
  access_token_expires: str
93
- refresh_token: str | None
94
91
  refresh_token_expires: str | None
95
92
  username: str | None
96
93
  display_name: str | None
@@ -171,62 +168,66 @@ def get_user_from_remember(
171
168
  assert models.DBSession is not None
172
169
 
173
170
  user: static.User | DynamicUser | None
174
- username = remember_object["username"]
175
- assert username is not None
176
- email = remember_object["email"]
177
- assert email is not None
178
- display_name = remember_object["display_name"] or email
179
-
180
- openid_connect_configuration = request.registry.settings.get("authentication", {}).get(
181
- "openid_connect", {}
182
- )
183
- provide_roles = openid_connect_configuration.get("provide_roles", False)
184
- if provide_roles is False:
185
- user_query = models.DBSession.query(static.User)
186
- match_field = openid_connect_configuration.get("match_field", "username")
187
- if match_field == "username":
188
- user_query = user_query.filter_by(username=username)
189
- elif match_field == "email":
190
- user_query = user_query.filter_by(email=email)
171
+ try:
172
+ username = remember_object["username"]
173
+ assert username is not None
174
+ email = remember_object["email"]
175
+ assert email is not None
176
+ display_name = remember_object["display_name"] or email
177
+
178
+ openid_connect_configuration = request.registry.settings.get("authentication", {}).get(
179
+ "openid_connect", {}
180
+ )
181
+ provide_roles = openid_connect_configuration.get("provide_roles", False)
182
+ if provide_roles is False:
183
+ user_query = models.DBSession.query(static.User)
184
+ match_field = openid_connect_configuration.get("match_field", "username")
185
+ if match_field == "username":
186
+ user_query = user_query.filter_by(username=username)
187
+ elif match_field == "email":
188
+ user_query = user_query.filter_by(email=email)
189
+ else:
190
+ raise HTTPInternalServerError(
191
+ f"Unknown match_field: '{match_field}', allowed values are 'username' and 'email'"
192
+ )
193
+ user = user_query.one_or_none()
194
+ if update_create_user is True:
195
+ if user is not None:
196
+ for field in openid_connect_configuration.get("update_fields", []):
197
+ if field == "username":
198
+ user.username = username
199
+ elif field == "display_name":
200
+ user.display_name = display_name
201
+ elif field == "email":
202
+ user.email = email
203
+ else:
204
+ raise HTTPInternalServerError(
205
+ f"Unknown update_field: '{field}', allowed values are 'username', 'display_name' and 'email'"
206
+ )
207
+ elif openid_connect_configuration.get("create_user", False) is True:
208
+ user = static.User(username=username, email=email, display_name=display_name)
209
+ models.DBSession.add(user)
191
210
  else:
192
- raise HTTPInternalServerError(
193
- f"Unknown match_field: '{match_field}', allowed values are 'username' and 'email'"
211
+ roles = []
212
+ role_names = remember_object.get("roles", [])
213
+ if role_names:
214
+ query = models.DBSession.query(main.Role).filter(main.Role.name.in_(role_names))
215
+ roles = query.all()
216
+ user = DynamicUser(
217
+ id=-1,
218
+ username=username,
219
+ display_name=display_name,
220
+ email=email,
221
+ settings_role=(
222
+ models.DBSession.query(main.Role).filter_by(name=remember_object["settings_role"]).first()
223
+ if remember_object.get("settings_role") is not None
224
+ else None
225
+ ),
226
+ roles=roles,
194
227
  )
195
- user = user_query.one_or_none()
196
- if update_create_user is True:
197
- if user is not None:
198
- for field in openid_connect_configuration.get("update_fields", []):
199
- if field == "username":
200
- user.username = username
201
- elif field == "display_name":
202
- user.display_name = display_name
203
- elif field == "email":
204
- user.email = email
205
- else:
206
- raise HTTPInternalServerError(
207
- f"Unknown update_field: '{field}', allowed values are 'username', 'display_name' and 'email'"
208
- )
209
- elif openid_connect_configuration.get("create_user", False) is True:
210
- user = static.User(username=username, email=email, display_name=display_name)
211
- models.DBSession.add(user)
212
- else:
213
- roles = []
214
- role_names = remember_object.get("roles", [])
215
- if role_names:
216
- query = models.DBSession.query(main.Role).filter(main.Role.name.in_(role_names))
217
- roles = query.all()
218
- user = DynamicUser(
219
- id=-1,
220
- username=username,
221
- display_name=display_name,
222
- email=email,
223
- settings_role=(
224
- models.DBSession.query(main.Role).filter_by(name=remember_object["settings_role"]).first()
225
- if remember_object.get("settings_role") is not None
226
- else None
227
- ),
228
- roles=roles,
229
- )
228
+ except KeyError:
229
+ _LOG.exception("Missing field in remember object")
230
+ return None
230
231
  return user
231
232
 
232
233
 
@@ -266,13 +267,30 @@ class OidcRemember:
266
267
  raise HTTPUnauthorized("See server logs for details")
267
268
 
268
269
  openid_connect = self.authentication_settings.get("openid_connect", {})
270
+ self.request.response.set_cookie(
271
+ "access_token",
272
+ token_response.access_token,
273
+ max_age=token_response.expires_in,
274
+ secure=True,
275
+ httponly=True,
276
+ samesite="Lax",
277
+ domain=self.request.domain,
278
+ )
279
+ if token_response.refresh_expires_in is not None:
280
+ self.request.response.set_cookie(
281
+ "refresh_token",
282
+ token_response.refresh_token,
283
+ max_age=token_response.refresh_expires_in,
284
+ secure=True,
285
+ httponly=True,
286
+ samesite="Lax",
287
+ domain=self.request.domain,
288
+ )
269
289
  remember_object: OidcRememberObject = {
270
- "access_token": token_response.access_token,
271
290
  "access_token_expires": (
272
291
  datetime.datetime.now(datetime.timezone.utc)
273
292
  + datetime.timedelta(seconds=token_response.expires_in)
274
293
  ).isoformat(),
275
- "refresh_token": token_response.refresh_token,
276
294
  "refresh_token_expires": (
277
295
  None
278
296
  if token_response.refresh_expires_in is None
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2024, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024, Camptocamp SA
1
+ # Copyright (c) 2018-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2023, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -19,7 +19,7 @@ RUN make build
19
19
  RUN mv webpack.apps.js webpack.apps.js.tmpl
20
20
 
21
21
  ENTRYPOINT [ "/usr/bin/eval-templates" ]
22
- CMD [ "webpack", "serve", "--open", "--mode=development", "--watch", "--no-inline" ]
22
+ CMD [ "webpack", "serve", "--open", "--mode=development" ]
23
23
 
24
24
  ###############################################################################
25
25
 
@@ -1,5 +1,5 @@
1
1
  # Language provided by the application
2
- LANGUAGES ?= en fr de
2
+ LANGUAGES ?= en fr de it rm
3
3
  NGEO_INTERFACES ?= desktop mobile iframe_api
4
4
  NGEO_API ?= TRUE
5
5
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2019-2024, Camptocamp SA
1
+ # Copyright (c) 2019-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -42,10 +42,20 @@ module.exports = {
42
42
  publicPath: devServer ? '${VISIBLE_ENTRY_POINT}dev/' : '.__ENTRY_POINT__static-ngeo/',
43
43
  },
44
44
  devServer: {
45
- publicPath: '${VISIBLE_WEB_PROTOCOL}://${VISIBLE_WEB_HOST}${VISIBLE_ENTRY_POINT}dev/',
45
+ devMiddleware: {
46
+ publicPath: '${VISIBLE_WEB_PROTOCOL}://${VISIBLE_WEB_HOST}${VISIBLE_ENTRY_POINT}dev/',
47
+ },
46
48
  port: 8080,
47
49
  host: 'webpack_dev_server',
48
50
  hot: true,
51
+ compress: false,
52
+ client: {
53
+ webSocketURL: {
54
+ hostname: 'localhost',
55
+ port: 8080,
56
+ protocol: 'ws',
57
+ },
58
+ },
49
59
  },
50
60
  entry: entry,
51
61
  plugins: plugins,
@@ -54,7 +54,7 @@ RUN \
54
54
  && mkdir --parent /usr/local/tomcat/webapps/ROOT/ \
55
55
  && mvif /tmp/config/print /tmp/config/print/print-apps /usr/local/tomcat/webapps/ROOT/ \
56
56
  && mv /tmp/config/geoportal/{{cookiecutter.package}}_geoportal/ /etc/geomapfish/ \
57
- && ( mv /tmp/config/geoportal/* /etc/geomapfish/ || true ) \
57
+ && (mv /tmp/config/geoportal/* /etc/geomapfish/ || true) \
58
58
  && chmod g+w -R \
59
59
  /etc/geomapfish \
60
60
  /etc/mapserver \
@@ -27,14 +27,14 @@ checks: prospector eslint ## Runs the checks
27
27
 
28
28
  .PHONY: prospector
29
29
  prospector: ## Runs the Prospector checks
30
- docker compose run --entrypoint= --no-deps --rm --volume=$(CURDIR)/geoportal:/app geoportal \
30
+ docker compose run --entrypoint= --rm --volume=$(CURDIR)/geoportal:/app geoportal \
31
31
  prospector --output-format=pylint --die-on-tool-error
32
32
 
33
33
  .PHONY: eslint
34
34
  eslint: ## Runs the eslint checks
35
- docker compose run --entrypoint= --no-deps --rm --volume=$(CURDIR)/geoportal:/app geoportal \
35
+ docker compose run --entrypoint= --rm --volume=$(CURDIR)/geoportal:/app geoportal \
36
36
  eslint $(find {{cookiecutter.package}} -type f -name '*.js' -print 2> /dev/null)
37
- docker compose run --entrypoint= --no-deps --rm --volume=$(CURDIR)/geoportal:/app geoportal \
37
+ docker compose run --entrypoint= --rm --volume=$(CURDIR)/geoportal:/app geoportal \
38
38
  eslint $(find {{cookiecutter.package}} -type f -name '*.ts' -print 2> /dev/null)
39
39
 
40
40
  .PHONY: qgis
@@ -149,6 +149,8 @@ def main() -> None:
149
149
  env = {"DOCKER_BUILDKIT": "1", "COMPOSE_DOCKER_CLI_BUILD": "1"}
150
150
  env.update(os.environ)
151
151
  run(args, docker_compose_build_cmd, env=env) # nosec
152
+ except KeyboardInterrupt:
153
+ sys.exit(1)
152
154
  except subprocess.CalledProcessError as e:
153
155
  print("Error with command: " + " ".join(print_args))
154
156
  sys.exit(e.returncode)
@@ -1,2 +1,2 @@
1
- c2cciutils[checks,publish]==1.7.3
2
- pre-commit==4.0.1
1
+ c2cciutils[checks,publish]==1.7.5
2
+ pre-commit==4.3.0
@@ -508,6 +508,8 @@ services:
508
508
  - AZURE_STORAGE_ACCESS_TOKEN
509
509
  - AZURE_STORAGE_ACCESS_KEY
510
510
  - AZURE_STORAGE_SAS_TOKEN
511
+ ports:
512
+ - 8080:8080
511
513
 
512
514
  db:
513
515
  image: camptocamp/postgres:${POSTGRES_TAG}
@@ -65,7 +65,7 @@ C2C_AUTH_GITHUB_CLIENT_ID=210aefe26259de1e9532
65
65
  #C2C_AUTH_GITHUB_CLIENT_SECRET=<github OAuth application client secret>
66
66
  C2C_AUTH_GITHUB_SCOPE=repo
67
67
  #C2C_AUTH_GITHUB_SECRET=<secret>
68
- #C2C_AUTH_GITHUB_PROXY_URL=https://geoservicies.camptocamp.com/redirect
68
+ #C2C_AUTH_GITHUB_PROXY_URL=https://geoservices.camptocamp.com/redirect
69
69
  C2C_USE_SESSION=true
70
70
 
71
71
  # For multi-tenant
@@ -197,6 +197,8 @@ vars:
197
197
  en: english
198
198
  de: german
199
199
  it: italian
200
+ # Fallback on italian for Romansh
201
+ rm: italian
200
202
 
201
203
  shortener:
202
204
  # Used to send a confirmation email
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- # Copyright (c) 2021-2024, Camptocamp SA
3
+ # Copyright (c) 2021-2025, Camptocamp SA
4
4
  # All rights reserved.
5
5
 
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- # Copyright (c) 2021-2024, Camptocamp SA
3
+ # Copyright (c) 2021-2025, Camptocamp SA
4
4
  # All rights reserved.
5
5
 
6
6
  # Redistribution and use in source and binary forms, with or without
@@ -65,10 +65,7 @@ Changes to apply
65
65
  be sure that you import the `gmf/controller/<interface>.scss` at the top of the file, before you
66
66
  can't use the variables.
67
67
 
68
- 2. The environment variable TILECLOUD_CHAIN_SESSION_SECRET and TILECLOUD_CHAIN_SESSION_SALT from the file
69
- `env.project` should be uncomment and filled with a strong secret, e.g. with `pwgen --secure 16`.
70
-
71
- 3. Nginject migration:
68
+ 2. Nginject migration:
72
69
  the @ngInject annotation is no more used, you should pass an array in the function or use the $inject property.
73
70
  e.g. before:
74
71
  ```javascript
@@ -95,13 +92,17 @@ Changes to apply
95
92
  Controller.$inject = ['$scope', '$injector'];
96
93
  ```
97
94
 
98
- 4. The OGC Server 'source for image/png' is renamed to 'MapServer' and
95
+ 3. The OGC Server 'source for image/png' is renamed to 'MapServer' and
99
96
  'source for image/jpeg' is renamed to 'MapServer_JPEG'.
100
97
  This is done to be able to add them in the URL path, for OGC API compatibility.
101
98
  If you use one of them in the `vars.yaml` you have to update them. Concerned variables are:
102
99
  `main_ogc_server`, `api.ogc_server`, `tinyowsproxy.ogc_server`,
103
100
  `interfaces_config.<interface>.routes.ngeoPermalinkOgcserverUrl.params.ogcserver`.
104
101
 
102
+ 5. Now MapServer will work in multi project mode by default, normally the Alembic migration script
103
+ update the MapServer OGC Server URL to `config://mapserver/mapserv_proxy/MapServer?map=MapServer`
104
+ to make it working for WMS/WFS and for OGC API.
105
+
105
106
 
106
107
  =============
107
108
  Version 2.8.0
@@ -310,8 +310,8 @@ vars:
310
310
  autoRotate: False
311
311
  gmfWMSSourceOptions:
312
312
  # The default value is 1.5 but it add a slight blur on the layer,
313
- # 1 is also possible but the application will do a getMap on all the pan.
314
- ratio: 2
313
+ # 2 is also possible but it uses many network and can break on some mobile devices.
314
+ ratio: 1
315
315
 
316
316
  dynamic_constants:
317
317
  interface: interface
@@ -765,7 +765,7 @@ vars:
765
765
  - name: directedFilterAttributes
766
766
  type: list
767
767
  description: >
768
- Comma-separated list of attributes names which should have rules already ready when using the
768
+ Comma-separated list of attribute names which should have rules already ready when using the
769
769
  filter tools.
770
770
  relevant_for:
771
771
  - layer_wms
@@ -943,6 +943,9 @@ vars:
943
943
  fr: french
944
944
  en: english
945
945
  de: german
946
+ it: italian
947
+ # Fallback on italian for Romansh
948
+ rm: italian
946
949
 
947
950
  servers:
948
951
  internal: http://localhost/
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2023, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -148,9 +148,11 @@ def canvas_view(request: pyramid.request.Request, interface_config: dict[str, An
148
148
  def custom_view(
149
149
  request: pyramid.request.Request, interface_config: dict[str, Any]
150
150
  ) -> pyramid.response.Response:
151
- """Get view used as entry point of a canvas interface."""
151
+ """Get view used as entry point of a canvas or custom interface."""
152
152
 
153
153
  set_common_headers(request, "index", Cache.PUBLIC_NO, content_type="text/html")
154
+ # Force urllogin to be converted to cookie when requesting the main HTML page
155
+ request.user # noqa
154
156
 
155
157
  html_filename = interface_config.get("html_filename", f"{interface_config['name']}.html")
156
158
  if not html_filename.startswith("/"):
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2019-2024, Camptocamp SA
1
+ # Copyright (c) 2019-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -296,10 +296,11 @@ class Login:
296
296
  if self.authentication_settings.get("openid_connect", {}).get("enabled", False):
297
297
  client = oidc.get_oidc_client(self.request, self.request.host)
298
298
  if hasattr(client, "revoke_token"):
299
- user_info = json.loads(self.request.authenticated_userid)
300
- client.revoke_token(user_info["access_token"])
301
- if user_info.get("refresh_token") is not None:
302
- client.revoke_token(user_info["refresh_token"])
299
+ access_token = self.request.cookies.get("access_token")
300
+ client.revoke_token(access_token)
301
+ refresh_token = self.request.cookies.get("refresh_token")
302
+ if refresh_token is not None:
303
+ client.revoke_token(refresh_token)
303
304
 
304
305
  headers = forget(self.request)
305
306
 
@@ -377,6 +378,10 @@ class Login:
377
378
  _LOG.info("The login '%s' does not exist.", login)
378
379
  raise HTTPUnauthorized("See server logs for details")
379
380
 
381
+ if user.deactivated:
382
+ _LOG.info("The login '%s' is deactivated.", login)
383
+ raise HTTPUnauthorized("See server logs for details")
384
+
380
385
  if self.two_factor_auth:
381
386
  if not self._validate_2fa_totp(user, otp):
382
387
  _LOG.info("The second factor is wrong for user '%s'.", login)
@@ -640,6 +645,9 @@ class Login:
640
645
  client = oidc.get_oidc_client(self.request, self.request.host)
641
646
  assert models.DBSession is not None
642
647
 
648
+ if "code_verifier" not in self.request.cookies or "code_challenge" not in self.request.cookies:
649
+ raise HTTPBadRequest("Missing code verifier or code challenge cookies.")
650
+
643
651
  token_response = client.authorization_code_flow.handle_authentication_result(
644
652
  "?" + urllib.parse.urlencode(self.request.params),
645
653
  code_verifier=self.request.cookies["code_verifier"],
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2024, Camptocamp SA
1
+ # Copyright (c) 2018-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2024, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -90,9 +90,15 @@ class Shortener:
90
90
 
91
91
  url = self.request.params["url"]
92
92
 
93
+ url_length = len(url)
94
+ if "#" in url:
95
+ url_parsed = urlparse(url)
96
+ if url_parsed.fragment:
97
+ url_length -= len(url_parsed.fragment) + 1
98
+
93
99
  # see: https://httpd.apache.org/docs/2.2/mod/core.html#limitrequestline
94
- if len(url) > 8190:
95
- raise HTTPBadRequest(f"The parameter url is too long ({len(url)} > {8190})")
100
+ if url_length > 8190:
101
+ raise HTTPBadRequest(f"The parameter url is too long ({url_length} > {8190})")
96
102
 
97
103
  allowed_hosts = self.settings.get("allowed_hosts", [])
98
104
  url_hostname, ok = is_allowed_url(self.request, url, allowed_hosts)
@@ -831,6 +831,11 @@ class Theme:
831
831
  theme_theme = {
832
832
  "id": theme.id,
833
833
  "name": theme.name,
834
+ "public": (
835
+ theme.public
836
+ or self.request.get_organization_role("anonymous")
837
+ in [role.name for role in theme.restricted_roles]
838
+ ),
834
839
  "icon": icon,
835
840
  "children": children,
836
841
  "functionalities": self._get_functionalities(theme),
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2021-2024, Camptocamp SA
1
+ # Copyright (c) 2021-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: c2cgeoportal-geoportal
3
- Version: 2.9.0.227
3
+ Version: 2.9.0.352
4
4
  Summary: c2cgeoportal geoportal
5
5
  Home-page: https://github.com/camptocamp/c2cgeoportal/
6
6
  Author: Camptocamp
@@ -27,7 +27,9 @@ Requires-Dist: PyYAML
27
27
  Requires-Dist: SQLAlchemy
28
28
  Requires-Dist: Shapely
29
29
  Requires-Dist: alembic
30
+ Requires-Dist: basicauth
30
31
  Requires-Dist: bottle
32
+ Requires-Dist: bs4
31
33
  Requires-Dist: c2cgeoportal-commons[upgrade]
32
34
  Requires-Dist: c2cwsgiutils
33
35
  Requires-Dist: defusedxml
@@ -36,6 +38,7 @@ Requires-Dist: geojson
36
38
  Requires-Dist: isodate
37
39
  Requires-Dist: lingva
38
40
  Requires-Dist: papyrus
41
+ Requires-Dist: pkce
39
42
  Requires-Dist: psycopg2
40
43
  Requires-Dist: pycryptodome
41
44
  Requires-Dist: pyotp
@@ -49,6 +52,8 @@ Requires-Dist: rasterio
49
52
  Requires-Dist: redis
50
53
  Requires-Dist: requests
51
54
  Requires-Dist: setuptools >=78.1.1
55
+ Requires-Dist: simple-openid-connect
56
+ Requires-Dist: tilecloud
52
57
  Requires-Dist: transaction
53
58
 
54
59
  c2cgeoportal is the server part of `GeoMapFish <http://geomapfish.org/>`_,
@@ -1,47 +1,47 @@
1
- c2cgeoportal_geoportal/__init__.py,sha256=hPoVL78ef1gwRn_thABVX63JpQ8huWorCJ6N4LtoR50,40070
1
+ c2cgeoportal_geoportal/__init__.py,sha256=knkBNKoGXM6jjWtMXsp65W6r5M6Yij949MjtX4MioQ4,40227
2
2
  c2cgeoportal_geoportal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- c2cgeoportal_geoportal/resources.py,sha256=n42Gns8DKw32GstDoUdNgud6xdAidaRwgAuNHqGH-c4,2158
4
- c2cgeoportal_geoportal/lib/__init__.py,sha256=_67fO_aXQZRnxPXcShHBcs38mdYU5ch0FNX89RwMTgA,10431
3
+ c2cgeoportal_geoportal/resources.py,sha256=rDruIDlzwktqj_A-DFA7ZkWwkasVZ4KELCmUe61ghGI,2158
4
+ c2cgeoportal_geoportal/lib/__init__.py,sha256=9BI0fqGiCOhegf7WmsP4_FxnlXzhZfguIwiIF1b2JI8,10431
5
5
  c2cgeoportal_geoportal/lib/authentication.py,sha256=Y45moPenxJ2dH3gIuk7yPr4tiS0Yw0OLw-bK8Ug92nE,10037
6
- c2cgeoportal_geoportal/lib/bashcolor.py,sha256=LQgOgtFUvgJ4Ed3-YW3RPjvhBMZBbXBBkUZKE4unRCI,1889
7
- c2cgeoportal_geoportal/lib/cacheversion.py,sha256=jc8jIKH_yE1NReC2kvUkTkpGERHObdWjPp6kGCWAU1o,3040
8
- c2cgeoportal_geoportal/lib/caching.py,sha256=BZzIjgEUfv7puP8XvWY6PAni7HybcLMZrGam3D3mCyA,7124
9
- c2cgeoportal_geoportal/lib/check_collector.py,sha256=98N43jvjzCOh19Agipf8varCD9S9I9V8XYQcrSujv0k,3396
10
- c2cgeoportal_geoportal/lib/checker.py,sha256=QLe0SUzfSwKYQFpGgFecWkJJlVjA1O2phwf-FvQQOUc,12547
6
+ c2cgeoportal_geoportal/lib/bashcolor.py,sha256=3Yr3QtDtvRO-KCKAPJNmxsMd6SqVwDusyZ8TfCy206w,1889
7
+ c2cgeoportal_geoportal/lib/cacheversion.py,sha256=5jtedQO6BK3lv7-q1dK1sFbuSuNFpZLr18K6gYXuTig,3040
8
+ c2cgeoportal_geoportal/lib/caching.py,sha256=r_nxHCfW5Jeb8Uzg_TXy9F45uzeG-234CexmFva2WEE,7124
9
+ c2cgeoportal_geoportal/lib/check_collector.py,sha256=endYjO9CmKlGimYuyeZKIBOb3izvbVVQXAhV8jwO7QU,3396
10
+ c2cgeoportal_geoportal/lib/checker.py,sha256=2svFaFjwQNGGqinacti-gpYiC2VAvJHkIL_R_PPX2T4,12547
11
11
  c2cgeoportal_geoportal/lib/common_headers.py,sha256=5UYHNBLHhIQZdHLj17ZeTUnCFwLLg9Yu5i47tkHZYLw,6456
12
- c2cgeoportal_geoportal/lib/dbreflection.py,sha256=viQotACmEAoLtJYHhQqAtcT3UQUvNVz9P_MlRCKgR9g,9759
13
- c2cgeoportal_geoportal/lib/filter_capabilities.py,sha256=nah7A3A_m87M5lSXcw3HRaEnHMCLnXcwTQ3PdoGN4js,14343
14
- c2cgeoportal_geoportal/lib/fulltextsearch.py,sha256=DrqO51QbDp56VpZa__2-8vp8U39izvLpyGhRCLTCaYc,2265
15
- c2cgeoportal_geoportal/lib/functionality.py,sha256=XawlxN0gIb1IB34j9vVyxyMsh0VraZXOPcGTCxg9D4c,6279
16
- c2cgeoportal_geoportal/lib/headers.py,sha256=zezJJ122edkNg41lGpK7ogE-almayvRKnEAopXI2pA8,2631
17
- c2cgeoportal_geoportal/lib/i18n.py,sha256=MoEPu4mj02KeuTJQDA1Y1btK6Ll7d089dzjRTLmedfs,1852
18
- c2cgeoportal_geoportal/lib/layers.py,sha256=DK_G0XBo1IWMOPmndWv_gYbRnE9Lg9zRTlnoXbZNgrI,4911
12
+ c2cgeoportal_geoportal/lib/dbreflection.py,sha256=cwMlq3QkTxMo0mCt3qNjGbN8pPJIre2UuLCRifs5feo,9759
13
+ c2cgeoportal_geoportal/lib/filter_capabilities.py,sha256=L_3rsVmMEHrWSCzTldrUI946Zz6kLntbWeqp9XRMFE0,14343
14
+ c2cgeoportal_geoportal/lib/fulltextsearch.py,sha256=fmvQr96hITq1ahvn8O7Acx8M5Zs_XL5SB4300cN6S2g,2265
15
+ c2cgeoportal_geoportal/lib/functionality.py,sha256=PXV5xmTg5EctMxYLaoKamw4-3COs2qRieDA66WYUmUA,6279
16
+ c2cgeoportal_geoportal/lib/headers.py,sha256=5EUWRhyQaP1768nSSvFUqurw772NAuw493sle8u535o,2631
17
+ c2cgeoportal_geoportal/lib/i18n.py,sha256=LHn21DCWHMIeMKfzNoxD0jF4gXL3p4fJq6qCz5_Ffh4,1852
18
+ c2cgeoportal_geoportal/lib/layers.py,sha256=x9iusOA65WSOcTpPEt1pyyZkH3d-5v8whQnqI2xbDt4,4911
19
19
  c2cgeoportal_geoportal/lib/lingva_extractor.py,sha256=pS-B5oTcEkW__XUop6rWKdpJhn4i7C8YNtU9JDNMEik,37601
20
- c2cgeoportal_geoportal/lib/loader.py,sha256=vfjyuN2ry33Djc5KMTbibQ96uAw8oZyomAAwk0gbW5Q,2613
21
- c2cgeoportal_geoportal/lib/metrics.py,sha256=5HryUs6Rk6cmVvag5_FN-W2gcwsyJt3Xf9105TSO4mQ,4847
22
- c2cgeoportal_geoportal/lib/oauth2.py,sha256=1hXo78-8lg3OBvB0TK5zG5QawZnvroPhaVpTBtPZg8I,41107
23
- c2cgeoportal_geoportal/lib/oidc.py,sha256=Uo6JAnKrWTaUY4_Kdl23cJFIP2C_OZjh8wWTsMB2Y-w,13095
24
- c2cgeoportal_geoportal/lib/wmstparsing.py,sha256=EWFXxZ_nK3vpx8H3dSKIJTnNAXoJmfhhHYkcG1bXluI,12379
25
- c2cgeoportal_geoportal/lib/xsd.py,sha256=V5dXPWTVIz04LoI5GDkorFnaLrLUhlw--c6NzWsAxfk,7031
20
+ c2cgeoportal_geoportal/lib/loader.py,sha256=oN76GhbLbdmCWp3DFTq16HJSylnDApuS1Ea8D-DQA3o,2613
21
+ c2cgeoportal_geoportal/lib/metrics.py,sha256=dAPdJtrtTPbwVuULZZ5dJC1JJCDbC0rJA7dtvsqIo40,4847
22
+ c2cgeoportal_geoportal/lib/oauth2.py,sha256=03nV635IkGyu0EckvUc_0akG9YzpG3PSZ2ILt2TVieI,41107
23
+ c2cgeoportal_geoportal/lib/oidc.py,sha256=PK6ot63GDg1LA82nVqvzNT8sI8-oyqk4vGpfm_MzCg0,13912
24
+ c2cgeoportal_geoportal/lib/wmstparsing.py,sha256=KFMEv7Skqc9HFA1m7x2xQMu4Bk2gJsyp5XTGwLLXb7w,12379
25
+ c2cgeoportal_geoportal/lib/xsd.py,sha256=_JDDlMIsvThb9DGmHS3XMazlRYG3AQK8kHQ4pq6sH8s,7031
26
26
  c2cgeoportal_geoportal/scaffolds/advance_create/cookiecutter.json,sha256=1LVOM-j_nd00J89q0EI3bQUvIysbidApaVHDibA2ydk,524
27
27
  c2cgeoportal_geoportal/scaffolds/advance_create/ci/config.yaml,sha256=8wB9gdivpSPH6wAy5JWhv3MDh_XzOGQX2KY5eYRtNpA,403
28
28
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.dockerignore,sha256=rPtGQNYXYoj-D94VwnVT_x-HvqldTNoz2oT7DjGpyqk,147
29
29
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml,sha256=txdVU8ikuADtWxCHWjyOBtT8wiXzf-LhT9ZMVtBiwhY,241
30
30
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml,sha256=rtVvKNsow04qQr_yXZ1yF1mPvLsyt_6Cp4Og-8yjUf4,378
31
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Dockerfile,sha256=Mnp44vCaFfNVzgRRrCZlQVQp1ly-OdJF_LIycwrfQQI,2909
32
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Makefile,sha256=ctHZV0-kh9voLpmgVK_ya68GI5VAKmxN9UiZVZKPyBo,147
31
+ c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Dockerfile,sha256=HfCI1zpZ1mjnAHXGSaLUS1ntHd-q9YhnQSh7gVNZQvo,2883
32
+ c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Makefile,sha256=-qE76wtRwY-Xr5M35ZzsamKbP6YBhncrtg_68E2VhA8,153
33
33
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/alembic.ini,sha256=U_L9gWSDWTGr-4HgQORcW5Q10TsafD6RWEudITSyEWQ,985
34
34
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml,sha256=9HMFJ_UekLUzXM5bPtixNNkeHMalo50hKjkxM_2tG2E,458
35
35
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/development.ini,sha256=SXwggEi14iish10vtLscY5kemC1nZqnQuLQSK9DgppY,3061
36
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py,sha256=JD94EpO_tVaipTxP-fL83L-hmkx1hS-_U819SdCjMlA,4981
37
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/language_mapping,sha256=jZNiCuWh5-LsU0oDmNviVfNyNqZibBXNc_rsv_OpUuE,27
36
+ c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py,sha256=C1ljEuJadGaVtqIdrYAG91Ebd7iKjVeVBZduBjvf14s,4981
37
+ c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/language_mapping,sha256=mFkl42NLiR_hUZIUFqx089IQOTuJeoOspyoovpWrFVU,36
38
38
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/lingva-client.cfg,sha256=Q5OugT3Ns7HEFxcBCejDHEkMtEUGhk__6-yONGg2ImM,117
39
39
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/lingva-server.cfg,sha256=1mRNwhmqmxlJwKucLauitmY9MHgWAyCr4N6TaqHkKsU,107
40
40
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini,sha256=ptWxF3jAE1A3IAQ7KdYSpGbPdAm3g-S-SIFXdZuFk3o,1137
41
41
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/requirements.txt,sha256=n6hSj_r5f8NmSamv1Jo7Ly6bxby8ziEeXoMmY_psgtY,55
42
42
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/setup.py,sha256=dZ-f23wZNh4TuHXCmyHRrlWR0kTVN3PKTT1FQilDeDk,694
43
43
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js,sha256=w_NXNXu_m6lE0fUrdxyyo-I1CfEyLWUzaMXMdHD4n5I,1102
44
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js,sha256=jjfTSIbQMwsoHwRtm5nEzsRjQETBQMOFPtfFVQwiHoo,2009
44
+ c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js,sha256=M65D7DPhTay63_5VuwFsLbzGXdCPLJED0grFQ7Wv11I,2187
45
45
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.commons.js,sha256=0i3s1Bi1pKQzCxTR-tfAxLsHWq3SEUF7Cw5YJxMBzMM,216
46
46
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.config.js,sha256=IFHj1YVu2aitTtQWVV6E5BaU0YDHz1qeoixaLbtRXPA,643
47
47
  c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py,sha256=u5R-1oSRn-KraRUMFqk0o2Jwd935HM7z18DICJOG9Qo,1270
@@ -63,17 +63,17 @@ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore,sha2
63
63
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.pre-commit-config.yaml,sha256=rW61ldm4Yhzj_8XSb2tZHQ10hlQ6avm-3WIv7yS5S64,774
64
64
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore,sha256=PcDfauWwzv1pnJgC9HR1zvv06Q01CwzGzzc0iLSNcZk,9
65
65
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml,sha256=WbjZCtw0hBlDB2FYJanFJzAvUsNTxgwn62YBZ-Xbwkw,43
66
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile,sha256=M_qxj20SLR1-BHnggrUJMrZcAl1AFdpzkmzlSqmkn3s,3277
67
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile,sha256=4dQQJF2FgRC20_0pSxIsNv7ASkkqxyXV_TFc1Pxbs9s,3116
66
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile,sha256=pAuz1tB5N_V2uqRpVTQOTiqKJFe1jF1kemRh2h8P6Mw,3275
67
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile,sha256=FcBsbXbi3eMnzVu7_RrQlrutInh-php3ncDizmUPeZI,3086
68
68
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/README.rst,sha256=QJcaUtT05atb5x8SJYflSt0YIJkbAz0Zh39_FYtyFks,423
69
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build,sha256=CjYe1cIL-TsKPbdxy1zStTUEGguILXpyUC63X2_Cy8c,7010
69
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build,sha256=5NvuCRfGQvIHwswE8dvTYoBQ9q1hyFKVfyx_GfRbI4w,7068
70
70
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-db.yaml,sha256=sNzJxDQX54WfKgJhhVhDm4a05z3Rz1j6Oocl1QHzeyQ,518
71
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml,sha256=YpnyvbhifVFf_8CCYska_5dFZ1SJNCHFQpJXg38hWDk,13796
71
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml,sha256=15Yj5mxF9VepDS6klJGQArIVHuIrfdXobH-2DjC0pxQ,13825
72
72
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-qgis.yaml,sha256=YE44s31kI79j5ypud4RS69sSDGFH1ROHNNAkyWxZ4jk,576
73
73
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml,sha256=X5vtxQ0pvLy6FSrooVmt90j4C4YNxtkSKzbPDOb4uB8,2615
74
74
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.yaml,sha256=ZpQ33JhdBxkoUNBV9kB5f07p8DpqgvJ3-Mp0SzLnJ6w,2380
75
75
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default,sha256=nqNpC44SfFcmlbfHIPyjRBHyFT57_bpzd5mpBo-7ShE,3300
76
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project,sha256=Bq17dg5AfDvr9zRCFL0v2_wJPCeWOOdWly6Y6GocplE,2113
76
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project,sha256=2b9geIY0sbH76HFuZJ8QToXWDptb7jgyGWuxQRs89ws,2112
77
77
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/project.yaml,sha256=PQZ87F25DbcQS_AcaT-uVmcdclkVnM3v-Te7onivXc8,655
78
78
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/pyproject.toml,sha256=RnvMmtD40v3rju1HoIOX7pQfVHUKPptxaVDoZxuF7oU,107
79
79
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/run_alembic.sh,sha256=VcrDFPAGlrxXtn4N8RcPhI90uZ8shDrGowALuwx8gnM,235
@@ -84,8 +84,8 @@ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflo
84
84
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml,sha256=AEm3dpJDVnYKy61mduSkPk10tJEkQMmhb1TQdbm0nlU,2335
85
85
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml,sha256=8doQOoZkZq4ICjOqH96egW1lsJFgL33hTPhmee8OHCs,360
86
86
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/docker-compose-check,sha256=7lnVTaaoUrC5MPGpwH2IWbzYc2KaeQMWguahsoY9Rf8,615
87
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt,sha256=DjYu5JRfvtL4CLIdZO4MNT8KNRF1CLopX1GnioADeXI,52
88
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml,sha256=rvfWX4XC4Y5VaVS9_Xpl0jpmvvQTaGirPVDGcJ8WH5k,11951
87
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt,sha256=76D4ylPFiXz65j84ND8ygSQtW53dUWNEZEF9DsCczeE,52
88
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml,sha256=xHLgFqZ1pNBl1z7PSSZ2Ci3MHBZuVm9H7dTvCCL2I9w,12009
89
89
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/locale/en/LC_MESSAGES/{{cookiecutter.package}}_geoportal-client.po,sha256=hKLs5f7EJz05ACRtyTlCtssCo99PMuj-FfOJXchMZFk,162
90
90
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/robot.txt.tmpl,sha256=JR_vIqMlHq1oSgyWPN2mtZyEpsqhjKQQecaW2pxvK54,88
91
91
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -129,66 +129,66 @@ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-app
129
129
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/north.svg,sha256=rnHO-cNiy9ZyfwvI-o2dYipzuu-vh9rn0nE45FjfOPo,2925
130
130
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/results.jrxml,sha256=gf5grUvt-oG_H0LnsNvBWMDGqvH3uuW_wfy0O-n5ui4,1309
131
131
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl,sha256=WcjfsfsfNLHAfbg84HgEIb64EDnnJJWGnyAdPTXD0PI,296
132
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup,sha256=48fii_o6y9VbAb-ToG9qU0flS6kEXk6lfHsgtufgrwg,5205
133
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore,sha256=dfOEwiN8us_JulAZCEgM9WyqHUWEbnlowOgm5nQ0NR8,5425
132
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup,sha256=4UKYnok7_U3SNIwLNCg2HxSBgvcle87ZevPzylJLC0c,5205
133
+ c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore,sha256=KvIZtviKuFtkgX7rRTWJqZXpr3VHBybA-5pAsXr-U64,5425
134
134
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/multi-tenant-update-po,sha256=w89-jvwo4v_KGrFyH6xIiQkh4cIK1PCLxmGwZ2mq630,1097
135
135
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
136
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/test_app.py,sha256=RXBFB9xc-SJ6D2UVHjooGoWbMvROiMTOxi2evFnkAtE,2961
137
137
  c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl,sha256=9fRuzdxmdnuMX_s0iaWOYwTmdDgvljGgXNfWnZTg5Ow,6171
138
138
  c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json,sha256=SoXjnW7KpNpm1fSGDEIZrr-_LbR7yiYmXKbdeXatflw,617
139
139
  c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/.upgrade.yaml,sha256=8tPCziX4Wh6a2EOdjpLtvyqNtKcI7Rtjo8-bLQO8_Gg,2741
140
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt,sha256=l-LxuoecCzWi8avbX8RDC5audvYzQ5uFIr59jSdbXsc,11901
140
+ c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt,sha256=5DeH4OUb9X2iTNFNETJwKqKSosW1KSzzpQ5zRDDlVUM,11945
141
141
  c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_create_template/tests/test_testapp.py,sha256=FNZI6uMsZttVpWi0_TEmBgV6MjQDUmE5ar9be3FFkV8,1794
142
142
  c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/.CONST_vars.yaml.swp,sha256=ZaB6IqVy0WDyGXRP7VQf8_LL_wjccSdthJtdIzw8FmE,16384
143
143
  c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_config-schema.yaml,sha256=XUtfJo3UNryr-a6RMxxi3K3XazfYL5WXN6vrreJYrUI,23696
144
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml,sha256=cPixKYiSPsW9k0d0_6g_eKdHnwMD1NTmWKWyzKQCuTU,49350
145
- c2cgeoportal_geoportal/scripts/__init__.py,sha256=hHwjhQaM_T2EaupeFIyjl0N67Bcl3M99UMcCdYAjQlQ,2929
144
+ c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml,sha256=Ex638hLeg-n5F95Ng6dnlUTlW4jnlDi-c7r_2xb2Yok,49435
145
+ c2cgeoportal_geoportal/scripts/__init__.py,sha256=KtDC_hpgvmuC83YFvdEQ4Xezk0wjhUAaBimpoOQrQso,2929
146
146
  c2cgeoportal_geoportal/scripts/c2cupgrade.py,sha256=oWgl5ngJaUVXDKJqJ33aZB8ET_XcFxsYZb18KqO4-yo,36825
147
- c2cgeoportal_geoportal/scripts/create_demo_theme.py,sha256=-SL-fvAPjgiJZEKYcbhXsZm713txhtWQB18X231k6xQ,3263
148
- c2cgeoportal_geoportal/scripts/manage_users.py,sha256=Ih3X_V_xUw59Ums4a1x6qQQtz9VtE7PaxAj-tiZIOPg,5586
147
+ c2cgeoportal_geoportal/scripts/create_demo_theme.py,sha256=dVTKUGqKFYcRVMRcLpdaNZQdp2pk8HKuSADt6ukj_XA,3263
148
+ c2cgeoportal_geoportal/scripts/manage_users.py,sha256=Q-kDVMjV7aqu--gOL_JcHxMaGY4ourqbHlCz-qeWh3Q,5586
149
149
  c2cgeoportal_geoportal/scripts/pcreate.py,sha256=xU87K_JYwFE6U4zEGjHvqNj2iiSuAhPkfWMpI576mZ8,11245
150
150
  c2cgeoportal_geoportal/scripts/theme2fts.py,sha256=tVEeqf1l_PaTw3qpNX2ZvJHu4JO6IgY6upir24HPxJM,17616
151
- c2cgeoportal_geoportal/scripts/urllogin.py,sha256=qGOOvx2ZN3qnENGzo8NScRqfFC06l1yc48vU6Qx3MBo,3319
151
+ c2cgeoportal_geoportal/scripts/urllogin.py,sha256=70cxepUejV0t94XClUC03VTsb-GlCAXwTQuF4i8m8Ag,3319
152
152
  c2cgeoportal_geoportal/templates/login.html,sha256=Jy8CUw2KrSviePknsvWJLDqCUXam-vPhnMUv7UcD4Pc,2475
153
153
  c2cgeoportal_geoportal/templates/notlogin.html,sha256=XLCwJ8q7hqk6GIaxwhyMOaMZZZvsD_MMZaCERO8n2AY,1528
154
154
  c2cgeoportal_geoportal/templates/testi18n.html,sha256=Br6Vf5zTDdaH0L07saV_8dIIT3C9xnSqh4quzTELo2s,369
155
- c2cgeoportal_geoportal/views/__init__.py,sha256=KNfldZFuKFfNjGJsE2HyW3gUfWUY5IKSPlQbwZpLH3Y,2639
156
- c2cgeoportal_geoportal/views/dev.py,sha256=4_xprN8ccbiEInXcpIWRGI55nU7LZI98JN7rNy4sQVg,2539
155
+ c2cgeoportal_geoportal/views/__init__.py,sha256=MJIH9RtjwicULXcSsyEnDd7BgHVf3o-7Ii825X0wsN4,2639
156
+ c2cgeoportal_geoportal/views/dev.py,sha256=XcJZE9SrPpJr_P2FM75CHINWEg-wQqNW_2n5uSLsSAw,2539
157
157
  c2cgeoportal_geoportal/views/dynamic.py,sha256=w92NRkIn0Ahahn0LG9F-KpMOx0lhffZxK4ecn6k8i40,8907
158
- c2cgeoportal_geoportal/views/entry.py,sha256=wlDCRGNpFlECGgwLktBEQckFAz0XBWuVwS8vHSGfBLA,6931
158
+ c2cgeoportal_geoportal/views/entry.py,sha256=95f04wfE5NiTLPgCBQTvnQ-SD6t7ofVLLfrEIqr_ng4,7048
159
159
  c2cgeoportal_geoportal/views/fulltextsearch.py,sha256=i6d0-1N2pNG6KWq9Bih_kD4TQAZ54zMbuOFZTN-fqaU,8602
160
- c2cgeoportal_geoportal/views/geometry_processing.py,sha256=5dkJ20Lk12zqfzvmfws2YFxutSX2vxzdetQ4CmYxSi8,2958
161
- c2cgeoportal_geoportal/views/i18n.py,sha256=EEyM5Y7DSuQffiwpFrkFclUcneRCiir4bakXY6lGZjI,5343
162
- c2cgeoportal_geoportal/views/layers.py,sha256=I1_9N8Zui4b2t9qfX1Z4QGX7-vOPeUKKvyJWLH8g9Fo,29226
163
- c2cgeoportal_geoportal/views/login.py,sha256=YdtAcOkdBOWcNpJEKBgtvnbhoNA_5DuMYjr9lF8ndZw,29189
164
- c2cgeoportal_geoportal/views/mapserverproxy.py,sha256=ii_389rDXNMbtk4cWD9BSp3dDBZVin0_KsbsxPvCtkk,9498
165
- c2cgeoportal_geoportal/views/memory.py,sha256=Vhw3vf4pjdl9DuW2PNOK6PZZOUPUn09Otym88_XIy3s,3754
166
- c2cgeoportal_geoportal/views/ogcproxy.py,sha256=2i3cuZ2cRybEH-DvAQbrLnUxd9y3B0iKnwkpaJvhwSc,5215
167
- c2cgeoportal_geoportal/views/pdfreport.py,sha256=XG3ZMGVa_NGY9BmSi0jVMMfJqvFauQAkhiaz_5_77Wo,9622
168
- c2cgeoportal_geoportal/views/printproxy.py,sha256=0KpG-blsFFsdmumzVQ0m_ZwMvroBQst1WWochnH6TgA,5958
169
- c2cgeoportal_geoportal/views/profile.py,sha256=tVQxJ3_eS5HcDCzQm5Loq5WEH62GtMc--bK3QVGxLmg,8431
160
+ c2cgeoportal_geoportal/views/geometry_processing.py,sha256=IWzAgi29nytLIB3PdjoLqXUoSXEO9HcMjjNWEE9shv4,2958
161
+ c2cgeoportal_geoportal/views/i18n.py,sha256=9e5VIGmKgOUTAn8R3ch98VXDpH70UZpHZ9hLkzHAW14,5343
162
+ c2cgeoportal_geoportal/views/layers.py,sha256=qGO_eQw09pcG9KerEe5y7ktlgUqcJywBPMm4KE14g44,29226
163
+ c2cgeoportal_geoportal/views/login.py,sha256=7JloyIXcYvWSA1m2dpStEZFZbTjw_dClIVyeEfZ6IKg,29579
164
+ c2cgeoportal_geoportal/views/mapserverproxy.py,sha256=zaTveZ0NK6KCcXWougfLNKqy5SIzlDUNnzGxQ0NVhKM,9498
165
+ c2cgeoportal_geoportal/views/memory.py,sha256=s8l5ewxjl_kaK7sH45SmMdr3ZZqvpW4QLKCaSh9i5YA,3754
166
+ c2cgeoportal_geoportal/views/ogcproxy.py,sha256=81S4du9IgTLe7t67QyjMNuUGZYkwaDY10hxPwLhizxg,5215
167
+ c2cgeoportal_geoportal/views/pdfreport.py,sha256=0nHsTmeTCGh_iymPYPiefxZpHh8TWkBWBC26VBwJaGA,9622
168
+ c2cgeoportal_geoportal/views/printproxy.py,sha256=gAtxZuciOUmkwlYyl6k7OTRS8yZZuF-bkxSxZdopU7k,5958
169
+ c2cgeoportal_geoportal/views/profile.py,sha256=l27iwAQMbbZXDjBbN1qWkK80JKxs5Gn6g7fafMqhNgI,8431
170
170
  c2cgeoportal_geoportal/views/proxy.py,sha256=XxOGR8Snqrd1CKkUiK4IjavCR8PiUsd3tlEM9lZE9TI,10468
171
- c2cgeoportal_geoportal/views/raster.py,sha256=kY6rYo4SxQP9JLbsq3_kdWdbaTVkdQDdpjrG9lUtAIM,9242
172
- c2cgeoportal_geoportal/views/resourceproxy.py,sha256=pcHwU6hAXHeh_Ef6tuHxpRzGje8nqVKUxyZwZKOPCjI,3189
173
- c2cgeoportal_geoportal/views/shortener.py,sha256=7_yQYPhtm-ddCLILnh2c0_WCgUq1D3bLhgyscGuTGUg,6530
174
- c2cgeoportal_geoportal/views/theme.py,sha256=GKIIkpPecz0adZyJG4XEJ6J6XB-q2R7AP7SCYKxY51o,56123
171
+ c2cgeoportal_geoportal/views/raster.py,sha256=L7VHTquNvJHC8JoIKOlDWOR0J1xiDbIEWNTd0PW9zqg,9242
172
+ c2cgeoportal_geoportal/views/resourceproxy.py,sha256=k81YAOPDgPC7NF-YvNJN-J16u4iX-RRLXRBijQ5BWnU,3189
173
+ c2cgeoportal_geoportal/views/shortener.py,sha256=aSIhmzDQ0xfSzdku-W0evfZ6PFr8wc0VSsi9UMmahA8,6722
174
+ c2cgeoportal_geoportal/views/theme.py,sha256=wTCEMn08aBN6GiTGxiTiEG-TNgjrRMpTys-5nYSQOps,56364
175
175
  c2cgeoportal_geoportal/views/tinyowsproxy.py,sha256=_wPN1Vfo4RNcCQ1xRPU_funie7mDPocL-ox_4hlF1-Y,8178
176
- c2cgeoportal_geoportal/views/vector_tiles.py,sha256=2bF3j6WvOpXAJULsEfy7pfeUBeKVheMlcUOWzHVow90,3575
176
+ c2cgeoportal_geoportal/views/vector_tiles.py,sha256=CDt62u8c93dFDiga_4qg6LqQqflC9ijO9aamhNXOrn0,3575
177
177
  tests/__init__.py,sha256=QJY_VGdOehpa3uMdeiF0boDPvH8BVgxPWJRzyDTcvwA,3826
178
- tests/test_cachebuster.py,sha256=asI1X_qI0MGklYuKuWyqvCPVbvhQcUe4fX91Dk-hUsE,2923
178
+ tests/test_cachebuster.py,sha256=D3A0DoCPZHsjMBNqEub1nXYqVI7WST1otDK9rTWiZmo,2923
179
179
  tests/test_caching.py,sha256=Juj7uwjOkjbPlTd-ll65SgWFzj3d2yDyf-eQ7ELk2eY,13222
180
- tests/test_checker.py,sha256=NaU6Ejg9XbwS2cwqXCtz5mJPRdBIPZb3d1MkXVufr0k,3638
181
- tests/test_decimaljson.py,sha256=CQrkqWs66kmq1iYur5kjzKhvdhw9b4TMcKEsuVayxA4,2223
182
- tests/test_headerstween.py,sha256=3PkfTbsUq2C7fEsckO_4aYu9-XGBSeOgf86ENSqx76o,2524
180
+ tests/test_checker.py,sha256=mKCfSmpiyVZh8n2rT40dFkTdyZLoD266-CwxqW04UnI,3638
181
+ tests/test_decimaljson.py,sha256=Jnp40YJyERCgioSRknX2auZFOF41RKSwzctjGghKis4,2223
182
+ tests/test_headerstween.py,sha256=GXRndeNk6eE55X-39YdzRsHafnjZRd1_w7cev4kHnY8,2524
183
183
  tests/test_i18n.py,sha256=-mAW0UyeNF9uqkq6O_Z0mK8gGwlHlTWI0gb9Ri_bk1M,994
184
- tests/test_init.py,sha256=79KRDBpYZ62wOHKHwkkjvq1_UuYHpPU88TNk-ZC83oM,7624
185
- tests/test_locale_negociator.py,sha256=JDRzF8_yzsgYOWHlyd_7ezOqSCvudKjeN2QjExS0a4A,3044
186
- tests/test_mapserverproxy_route_predicate.py,sha256=SzILSSzIuilzIkUYVPZiVzLwW1duQvCxxEvxSLk4p1o,3043
187
- tests/test_raster.py,sha256=82NJ2MXgZlMqs0ytN-VgNw376iURdk4PkAg__dyh5ns,11948
188
- tests/test_wmstparsing.py,sha256=xjA8nJuXFl3H5Bfs4sJw_8qX8E8qvAALK7Hs2-DTP2A,9054
189
- tests/xmlstr.py,sha256=rkTKSU4FGjupBKLx75H8o-goB0KbQrxDvdpc6xVX_uQ,5985
190
- c2cgeoportal_geoportal-2.9.0.227.dist-info/METADATA,sha256=JDKBE8K4rAL9BXZKqg1WxJFaq5WWu7xOs0q--hA-AVk,1923
191
- c2cgeoportal_geoportal-2.9.0.227.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
192
- c2cgeoportal_geoportal-2.9.0.227.dist-info/entry_points.txt,sha256=3dnX260FsLX_AubeNMdyeta_z1X4CxcD3steAlfPx2I,1414
193
- c2cgeoportal_geoportal-2.9.0.227.dist-info/top_level.txt,sha256=PJIbY7Nx51dDrJ052f5mDA7c6Tehm5aD-Gb32L_CtJA,29
194
- c2cgeoportal_geoportal-2.9.0.227.dist-info/RECORD,,
184
+ tests/test_init.py,sha256=qkgRBDRJsBY05Af010Lvv6rVgnhRfcL2TlJUaPI9odQ,7624
185
+ tests/test_locale_negociator.py,sha256=Zdr_mHp7lm5-aLKdaL9dmcxv8qMapBvCmsf524_fNv0,3044
186
+ tests/test_mapserverproxy_route_predicate.py,sha256=aH5r5MliqE5RF4J7Q-luQQ6sgOcMUKqXf5mC9zxl5QM,3043
187
+ tests/test_raster.py,sha256=IzwJMGti82B51aVfy2QbeNeJXn3B6bM-JnbYpt5KqB4,11948
188
+ tests/test_wmstparsing.py,sha256=DMUFSrJAyRfOhosD8Ap5251NCxfaX7vmkWmexdc6CDU,9054
189
+ tests/xmlstr.py,sha256=vozYRYG4sBPhasl4PemLUZxg-jAtQxUY5ntp1uDoxik,5985
190
+ c2cgeoportal_geoportal-2.9.0.352.dist-info/METADATA,sha256=CEv3sVdqL-eC1QJR8MZC9xkzJfnEBFp1xiKIeOF5L6g,2049
191
+ c2cgeoportal_geoportal-2.9.0.352.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
192
+ c2cgeoportal_geoportal-2.9.0.352.dist-info/entry_points.txt,sha256=3dnX260FsLX_AubeNMdyeta_z1X4CxcD3steAlfPx2I,1414
193
+ c2cgeoportal_geoportal-2.9.0.352.dist-info/top_level.txt,sha256=PJIbY7Nx51dDrJ052f5mDA7c6Tehm5aD-Gb32L_CtJA,29
194
+ c2cgeoportal_geoportal-2.9.0.352.dist-info/RECORD,,
tests/test_cachebuster.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2023, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/test_checker.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/test_decimaljson.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2011-2023, Camptocamp SA
1
+ # Copyright (c) 2011-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2018-2023, Camptocamp SA
1
+ # Copyright (c) 2018-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/test_init.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2012-2024, Camptocamp SA
1
+ # Copyright (c) 2012-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/test_raster.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/test_wmstparsing.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without
tests/xmlstr.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2013-2023, Camptocamp SA
1
+ # Copyright (c) 2013-2025, Camptocamp SA
2
2
  # All rights reserved.
3
3
 
4
4
  # Redistribution and use in source and binary forms, with or without