c2cgeoportal-geoportal 2.3.5.80__py3-none-any.whl → 2.9rc44__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 (198) hide show
  1. c2cgeoportal_geoportal/__init__.py +960 -0
  2. c2cgeoportal_geoportal/lib/__init__.py +256 -0
  3. c2cgeoportal_geoportal/lib/authentication.py +250 -0
  4. c2cgeoportal_geoportal/lib/bashcolor.py +46 -0
  5. c2cgeoportal_geoportal/lib/cacheversion.py +77 -0
  6. c2cgeoportal_geoportal/lib/caching.py +176 -0
  7. c2cgeoportal_geoportal/lib/check_collector.py +80 -0
  8. c2cgeoportal_geoportal/lib/checker.py +295 -0
  9. c2cgeoportal_geoportal/lib/common_headers.py +172 -0
  10. c2cgeoportal_geoportal/lib/dbreflection.py +266 -0
  11. c2cgeoportal_geoportal/lib/filter_capabilities.py +360 -0
  12. c2cgeoportal_geoportal/lib/fulltextsearch.py +50 -0
  13. c2cgeoportal_geoportal/lib/functionality.py +166 -0
  14. c2cgeoportal_geoportal/lib/headers.py +62 -0
  15. c2cgeoportal_geoportal/lib/i18n.py +38 -0
  16. c2cgeoportal_geoportal/lib/layers.py +132 -0
  17. c2cgeoportal_geoportal/lib/lingva_extractor.py +937 -0
  18. c2cgeoportal_geoportal/lib/loader.py +57 -0
  19. c2cgeoportal_geoportal/lib/metrics.py +117 -0
  20. c2cgeoportal_geoportal/lib/oauth2.py +1186 -0
  21. c2cgeoportal_geoportal/lib/oidc.py +304 -0
  22. c2cgeoportal_geoportal/lib/wmstparsing.py +353 -0
  23. c2cgeoportal_geoportal/lib/xsd.py +166 -0
  24. c2cgeoportal_geoportal/py.typed +0 -0
  25. c2cgeoportal_geoportal/resources.py +49 -0
  26. c2cgeoportal_geoportal/scaffolds/advance_create/ci/config.yaml +26 -0
  27. c2cgeoportal_geoportal/scaffolds/advance_create/cookiecutter.json +18 -0
  28. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.dockerignore +6 -0
  29. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml +19 -0
  30. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml +30 -0
  31. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Dockerfile +75 -0
  32. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/Makefile +6 -0
  33. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/alembic.ini +58 -0
  34. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml +19 -0
  35. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/development.ini +121 -0
  36. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +139 -0
  37. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/language_mapping +3 -0
  38. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/lingva-client.cfg +5 -0
  39. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/lingva-server.cfg +6 -0
  40. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini +38 -0
  41. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/requirements.txt +2 -0
  42. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/setup.py +25 -0
  43. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +41 -0
  44. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js +64 -0
  45. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.commons.js +11 -0
  46. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.config.js +22 -0
  47. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +42 -0
  48. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
  49. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
  50. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
  51. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
  52. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/resources.py +11 -0
  53. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/api/index.js +12 -0
  54. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/js/{{cookiecutter.package}}module.js +25 -0
  55. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py +39 -0
  56. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/views/__init__.py +0 -0
  57. c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
  58. c2cgeoportal_geoportal/scaffolds/advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile +121 -0
  59. c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
  60. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
  61. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.editorconfig +17 -0
  62. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +73 -0
  63. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +50 -0
  64. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +66 -0
  65. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
  66. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.pre-commit-config.yaml +35 -0
  67. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
  68. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
  69. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile +75 -0
  70. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +70 -0
  71. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/README.rst +29 -0
  72. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +179 -0
  73. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml +22 -0
  74. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/docker-compose-check +25 -0
  75. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +2 -0
  76. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-db.yaml +24 -0
  77. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml +513 -0
  78. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-qgis.yaml +21 -0
  79. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +65 -0
  80. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.yaml +121 -0
  81. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +102 -0
  82. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +69 -0
  83. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml +430 -0
  84. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/locale/en/LC_MESSAGES/{{cookiecutter.package}}_geoportal-client.po +6 -0
  85. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css +0 -0
  86. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css +0 -0
  87. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
  88. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/banner_left.png +0 -0
  89. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/banner_right.png +0 -0
  90. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/blank.png +0 -0
  91. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-blue.png +0 -0
  92. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-gold.png +0 -0
  93. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-green.png +0 -0
  94. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker.png +0 -0
  95. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/robot.txt.tmpl +3 -0
  96. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/data/Readme.txt +69 -0
  97. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/data/TM_EUROPE_BORDERS-0.3.sql +70 -0
  98. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
  99. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Arial.ttf +0 -0
  100. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Arialbd.ttf +0 -0
  101. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Arialbi.ttf +0 -0
  102. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Ariali.ttf +0 -0
  103. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/NotoSans-Bold.ttf +0 -0
  104. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/NotoSans-BoldItalic.ttf +0 -0
  105. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/NotoSans-Italic.ttf +0 -0
  106. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/NotoSans-Regular.ttf +0 -0
  107. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Verdana.ttf +0 -0
  108. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Verdanab.ttf +0 -0
  109. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Verdanai.ttf +0 -0
  110. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts/Verdanaz.ttf +0 -0
  111. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/fonts.conf +12 -0
  112. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/mapserver.conf +16 -0
  113. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/mapserver.map.tmpl +87 -0
  114. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/tinyows.xml.tmpl +36 -0
  115. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/A3_Landscape.jrxml +207 -0
  116. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/A3_Portrait.jrxml +185 -0
  117. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/A4_Landscape.jrxml +200 -0
  118. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/A4_Portrait.jrxml +170 -0
  119. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/config.yaml.tmpl +175 -0
  120. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/legend.jrxml +109 -0
  121. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
  122. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
  123. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/logo.png +0 -0
  124. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/north.svg +93 -0
  125. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/results.jrxml +25 -0
  126. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/project.yaml +18 -0
  127. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/pyproject.toml +7 -0
  128. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl +15 -0
  129. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/run_alembic.sh +11 -0
  130. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +126 -0
  131. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +132 -0
  132. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/setup.cfg +7 -0
  133. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +5 -0
  134. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/__init__.py +0 -0
  135. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/test_app.py +78 -0
  136. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
  137. c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
  138. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/.upgrade.yaml +67 -0
  139. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +304 -0
  140. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_create_template/tests/test_testapp.py +48 -0
  141. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/.CONST_vars.yaml.swp +0 -0
  142. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_config-schema.yaml +927 -0
  143. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml +1503 -0
  144. c2cgeoportal_geoportal/scripts/__init__.py +64 -0
  145. c2cgeoportal_geoportal/scripts/c2cupgrade.py +879 -0
  146. c2cgeoportal_geoportal/scripts/create_demo_theme.py +83 -0
  147. c2cgeoportal_geoportal/scripts/manage_users.py +140 -0
  148. c2cgeoportal_geoportal/scripts/pcreate.py +296 -0
  149. c2cgeoportal_geoportal/scripts/theme2fts.py +347 -0
  150. c2cgeoportal_geoportal/scripts/urllogin.py +81 -0
  151. c2cgeoportal_geoportal/templates/login.html +90 -0
  152. c2cgeoportal_geoportal/templates/notlogin.html +62 -0
  153. c2cgeoportal_geoportal/templates/testi18n.html +12 -0
  154. c2cgeoportal_geoportal/views/__init__.py +59 -0
  155. c2cgeoportal_geoportal/views/dev.py +57 -0
  156. c2cgeoportal_geoportal/views/dynamic.py +208 -0
  157. c2cgeoportal_geoportal/views/entry.py +174 -0
  158. c2cgeoportal_geoportal/views/fulltextsearch.py +189 -0
  159. c2cgeoportal_geoportal/views/geometry_processing.py +75 -0
  160. c2cgeoportal_geoportal/views/i18n.py +129 -0
  161. c2cgeoportal_geoportal/views/layers.py +713 -0
  162. c2cgeoportal_geoportal/views/login.py +684 -0
  163. c2cgeoportal_geoportal/views/mapserverproxy.py +234 -0
  164. c2cgeoportal_geoportal/views/memory.py +90 -0
  165. c2cgeoportal_geoportal/views/ogcproxy.py +120 -0
  166. c2cgeoportal_geoportal/views/pdfreport.py +245 -0
  167. c2cgeoportal_geoportal/views/printproxy.py +143 -0
  168. c2cgeoportal_geoportal/views/profile.py +192 -0
  169. c2cgeoportal_geoportal/views/proxy.py +261 -0
  170. c2cgeoportal_geoportal/views/raster.py +233 -0
  171. c2cgeoportal_geoportal/views/resourceproxy.py +73 -0
  172. c2cgeoportal_geoportal/views/shortener.py +152 -0
  173. c2cgeoportal_geoportal/views/theme.py +1322 -0
  174. c2cgeoportal_geoportal/views/tinyowsproxy.py +189 -0
  175. c2cgeoportal_geoportal/views/vector_tiles.py +83 -0
  176. {c2cgeoportal_geoportal-2.3.5.80.dist-info → c2cgeoportal_geoportal-2.9rc44.dist-info}/METADATA +21 -24
  177. c2cgeoportal_geoportal-2.9rc44.dist-info/RECORD +193 -0
  178. {c2cgeoportal_geoportal-2.3.5.80.dist-info → c2cgeoportal_geoportal-2.9rc44.dist-info}/WHEEL +1 -1
  179. c2cgeoportal_geoportal-2.9rc44.dist-info/entry_points.txt +28 -0
  180. c2cgeoportal_geoportal-2.9rc44.dist-info/top_level.txt +2 -0
  181. tests/__init__.py +100 -0
  182. tests/test_cachebuster.py +71 -0
  183. tests/test_caching.py +275 -0
  184. tests/test_checker.py +85 -0
  185. tests/test_decimaljson.py +47 -0
  186. tests/test_headerstween.py +64 -0
  187. tests/test_i18n.py +31 -0
  188. tests/test_init.py +193 -0
  189. tests/test_locale_negociator.py +69 -0
  190. tests/test_mapserverproxy_route_predicate.py +64 -0
  191. tests/test_raster.py +267 -0
  192. tests/test_wmstparsing.py +238 -0
  193. tests/xmlstr.py +103 -0
  194. c2cgeoportal_geoportal-2.3.5.80.dist-info/DESCRIPTION.rst +0 -8
  195. c2cgeoportal_geoportal-2.3.5.80.dist-info/RECORD +0 -7
  196. c2cgeoportal_geoportal-2.3.5.80.dist-info/entry_points.txt +0 -22
  197. c2cgeoportal_geoportal-2.3.5.80.dist-info/metadata.json +0 -1
  198. c2cgeoportal_geoportal-2.3.5.80.dist-info/top_level.txt +0 -1
@@ -0,0 +1,166 @@
1
+ # Copyright (c) 2018-2024, Camptocamp SA
2
+ # All rights reserved.
3
+
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+
7
+ # 1. Redistributions of source code must retain the above copyright notice, this
8
+ # list of conditions and the following disclaimer.
9
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ # this list of conditions and the following disclaimer in the documentation
11
+ # and/or other materials provided with the distribution.
12
+
13
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17
+ # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ # The views and conclusions contained in the software and documentation are those
25
+ # of the authors and should not be interpreted as representing official policies,
26
+ # either expressed or implied, of the FreeBSD Project.
27
+
28
+
29
+ import xml.etree.ElementTree # nosec
30
+ from collections.abc import Callable
31
+ from io import BytesIO
32
+ from typing import Any, cast
33
+
34
+ import sqlalchemy.orm.mapper
35
+ import sqlalchemy.sql.elements
36
+ import sqlalchemy.sql.schema
37
+ from papyrus.xsd import XSDGenerator as PapyrusXSDGenerator
38
+ from papyrus.xsd import tag
39
+ from sqlalchemy.orm.properties import ColumnProperty
40
+ from sqlalchemy.orm.util import class_mapper
41
+
42
+
43
+ def _element_callback(tb: str, column: sqlalchemy.sql.elements.NamedColumn[Any]) -> None:
44
+ if column.info.get("readonly"):
45
+ with tag(tb, "xsd:annotation"):
46
+ with tag(tb, "xsd:appinfo"):
47
+ with tag(tb, "readonly", {"value": "true"}):
48
+ pass
49
+
50
+
51
+ class XSDGenerator(PapyrusXSDGenerator): # type: ignore
52
+ """Extends the PapyrusXSDGenerator."""
53
+
54
+ def __init__(
55
+ self,
56
+ include_primary_keys: bool = False,
57
+ include_foreign_keys: bool = False,
58
+ sequence_callback: Callable[[xml.etree.ElementTree.TreeBuilder, type[str]], None] | None = None,
59
+ element_callback: (
60
+ Callable[[xml.etree.ElementTree.TreeBuilder, sqlalchemy.sql.expression.ColumnElement[Any]], None]
61
+ | None
62
+ ) = None,
63
+ ) -> None:
64
+ super().__init__(
65
+ include_primary_keys=include_primary_keys,
66
+ include_foreign_keys=include_foreign_keys,
67
+ sequence_callback=sequence_callback,
68
+ element_callback=element_callback or _element_callback,
69
+ )
70
+
71
+ def add_class_properties_xsd(self, tb: str, cls: type) -> None:
72
+ """
73
+ Add the XSD for the class properties to the ``TreeBuilder``.
74
+
75
+ And call the user ``sequence_callback``.
76
+ """
77
+ mapper: sqlalchemy.orm.Mapper[Any] = class_mapper(cls)
78
+ properties = []
79
+ if cls.__attributes_order__: # type: ignore[attr-defined]
80
+ for attribute_name in cls.__attributes_order__: # type: ignore[attr-defined]
81
+ attr = mapper.attrs.get(attribute_name)
82
+ if attr:
83
+ properties.append(attr)
84
+
85
+ # Add other attributes
86
+ for p in mapper.iterate_properties:
87
+ if p not in properties:
88
+ properties.append(p)
89
+ else:
90
+ properties = mapper.iterate_properties
91
+
92
+ for p in properties:
93
+ if isinstance(p, ColumnProperty):
94
+ self.add_column_property_xsd(tb, p)
95
+
96
+ if self.sequence_callback:
97
+ self.sequence_callback(tb, cls)
98
+
99
+ def add_column_property_xsd(self, tb: str, column_property: ColumnProperty[Any]) -> None:
100
+ column = column_property.columns[0]
101
+ if column.foreign_keys:
102
+ self.add_association_proxy_xsd(tb, column_property)
103
+ return
104
+
105
+ super().add_column_property_xsd(tb, column_property)
106
+
107
+ def add_association_proxy_xsd(self, tb: str, column_property: ColumnProperty[Any]) -> None:
108
+ from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
109
+
110
+ assert DBSession is not None
111
+
112
+ column = column_property.columns[0]
113
+ proxy = column.info["association_proxy"]
114
+ attribute = column_property.class_attribute
115
+ cls = attribute.parent.entity
116
+ association_proxy = getattr(cls, proxy)
117
+ relationship_property = class_mapper(cls).get_property(association_proxy.target)
118
+ target_cls = relationship_property.argument
119
+ query = DBSession.query(getattr(target_cls, association_proxy.value_attr))
120
+ if association_proxy.order_by is not None:
121
+ query = query.order_by(getattr(target_cls, association_proxy.order_by))
122
+ attrs = {}
123
+ if association_proxy.nullable:
124
+ attrs["minOccurs"] = "0"
125
+ attrs["nillable"] = "true"
126
+ attrs["name"] = proxy
127
+ with tag(tb, "xsd:element", attrs) as tb2:
128
+ with tag(tb2, "xsd:simpleType") as tb3:
129
+ with tag(tb3, "xsd:restriction", {"base": "xsd:string"}) as tb4:
130
+ for (value,) in query:
131
+ with tag(tb4, "xsd:enumeration", {"value": value}):
132
+ pass
133
+ self.element_callback(tb4, column)
134
+
135
+
136
+ class XSD:
137
+ """The XSD file generator on a pyramid view."""
138
+
139
+ def __init__(
140
+ self,
141
+ include_primary_keys: bool = False,
142
+ include_foreign_keys: bool = False,
143
+ sequence_callback: Callable[[xml.etree.ElementTree.TreeBuilder, type[str]], None] | None = None,
144
+ element_callback: (
145
+ Callable[[xml.etree.ElementTree.TreeBuilder, sqlalchemy.sql.expression.ColumnElement[Any]], None]
146
+ | None
147
+ ) = None,
148
+ ) -> None:
149
+ self.generator = XSDGenerator(
150
+ include_primary_keys=include_primary_keys,
151
+ include_foreign_keys=include_foreign_keys,
152
+ sequence_callback=sequence_callback,
153
+ element_callback=element_callback,
154
+ )
155
+
156
+ def __call__(self, table: str) -> Callable[[type[str] | type[bytes], dict[str, Any]], bytes | None]:
157
+ def _render(cls: type[str] | type[bytes], system: dict[str, Any]) -> bytes | None:
158
+ request = system.get("request")
159
+ if request is not None:
160
+ response = request.response
161
+ response.content_type = "application/xml"
162
+ io = self.generator.get_class_xsd(BytesIO(), cls)
163
+ return cast(bytes, io.getvalue())
164
+ return None
165
+
166
+ return _render
File without changes
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2011-2023, Camptocamp SA
2
+ # All rights reserved.
3
+
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+
7
+ # 1. Redistributions of source code must retain the above copyright notice, this
8
+ # list of conditions and the following disclaimer.
9
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ # this list of conditions and the following disclaimer in the documentation
11
+ # and/or other materials provided with the distribution.
12
+
13
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17
+ # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ # The views and conclusions contained in the software and documentation are those
25
+ # of the authors and should not be interpreted as representing official policies,
26
+ # either expressed or implied, of the FreeBSD Project.
27
+
28
+
29
+ import pyramid.request
30
+
31
+
32
+ class Root:
33
+ """The pyramid root object."""
34
+
35
+ def __init__(self, request: pyramid.request.Request):
36
+ self.request = request
37
+
38
+
39
+ def defaultgroupsfinder(username: str, request: pyramid.request.Request) -> list[str]:
40
+ """
41
+ Get the c2cgeoportal default group finder.
42
+
43
+ To be used as the callback of the ``AuthTktAuthenticationPolicy`` or any callback-based authentication
44
+ policy.
45
+ """
46
+ del username # unused
47
+ if not hasattr(request, "user") or request.user is None:
48
+ return []
49
+ return [role.name for role in request.user.roles]
@@ -0,0 +1,26 @@
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/camptocamp/c2cciutils/master/c2cciutils/schema.json
2
+
3
+ checks:
4
+ black: False
5
+ isort: False
6
+ prettier: False
7
+ codespell: False
8
+ eof: False
9
+ required_workflows: False
10
+ dependabot_config: False
11
+ prospector_config: False
12
+ setup: False
13
+
14
+ version:
15
+ branch_to_version_re:
16
+ - from: (prod-[0-9]+-[0-9]+)
17
+ to: \1
18
+ - from: (int-[0-9]+-[0-9]+)
19
+ to: \1
20
+
21
+ publish:
22
+ pypi: false
23
+ docker:
24
+ images:
25
+ - name: camptocamp/{{cookiecutter.package}}-config
26
+ - name: camptocamp/{{cookiecutter.package}}-geoportal
@@ -0,0 +1,18 @@
1
+ {
2
+ "project": "test_project",
3
+ "package": "test_project",
4
+ "srid": "2056",
5
+ "extent": "",
6
+ "extent_mapserver": "",
7
+ "authtkt_secret": "",
8
+ "unsafe_long_version": false,
9
+ "geomapfish_version": "",
10
+ "geomapfish_main_version": "",
11
+ "geomapfish_main_version_dash": "",
12
+ "geomapfish_main_minor_version": "",
13
+ "geomapfish_version_tag": "",
14
+ "geomapfish_version_tag_env": "",
15
+ "geomapfish_major_version_tag": "",
16
+ "geomapfish_major_version_tag_env": "",
17
+ "_copy_without_render": ["*.po", "*/contextualdata.html"]
18
+ }
@@ -0,0 +1,6 @@
1
+ Dockerfile
2
+ vars*.yaml
3
+ CONST_vars.yaml
4
+ CONST_config-schema.yaml
5
+ {{cookiecutter.package}}_geoportal/locale
6
+ {{cookiecutter.package}}_geoportal/static
@@ -0,0 +1,19 @@
1
+ extends:
2
+ - eslint:recommended
3
+
4
+ globals:
5
+ '{{cookiecutter.package}}': false
6
+
7
+ env:
8
+ es6: true
9
+ node: true
10
+ browser: true
11
+ jquery: true
12
+
13
+ parserOptions:
14
+ sourceType: module
15
+ ecmaVersion: 2020
16
+
17
+ rules:
18
+ no-console: 0
19
+ no-unused-vars: 0
@@ -0,0 +1,30 @@
1
+ inherits:
2
+ - duplicated
3
+ - utils:no-design-checks
4
+
5
+ max-line-length: 110
6
+
7
+ pycodestyle:
8
+ options:
9
+ max-line-length: 110
10
+ disable:
11
+ - E203
12
+
13
+ pylint:
14
+ options:
15
+ max-line-length: 110
16
+ disable:
17
+ - too-many-locals
18
+ - too-many-statements
19
+ - too-many-branches
20
+ - c-extension-no-member
21
+
22
+ pyflakes:
23
+ disable:
24
+ - F401
25
+
26
+ mccabe:
27
+ run: false
28
+
29
+ bandit:
30
+ run: true
@@ -0,0 +1,75 @@
1
+ ARG {{cookiecutter.geomapfish_version_tag}}
2
+ ARG {{cookiecutter.geomapfish_major_version_tag}}
3
+
4
+ FROM camptocamp/geomapfish-tools:{{cookiecutter.geomapfish_version_tag_env}} AS builder
5
+ LABEL maintainer Camptocamp "info@camptocamp.com"
6
+
7
+ COPY requirements.txt /tmp/requirements.txt
8
+ RUN --mount=type=cache,target=/root/.cache \
9
+ python3 -m pip install --disable-pip-version-check --requirement=/tmp/requirements.txt
10
+
11
+ WORKDIR /app
12
+ COPY webpack.*.js Makefile CONST_Makefile /app/
13
+ COPY {{cookiecutter.package}}_geoportal/static-ngeo /app/{{cookiecutter.package}}_geoportal/static-ngeo
14
+ RUN make apps
15
+
16
+ COPY . /app
17
+
18
+ RUN make build
19
+ RUN mv webpack.apps.js webpack.apps.js.tmpl
20
+
21
+ ENTRYPOINT [ "/usr/bin/eval-templates" ]
22
+ CMD [ "webpack", "serve", "--open", "--mode=development", "--watch", "--no-inline" ]
23
+
24
+ ###############################################################################
25
+
26
+ FROM camptocamp/geomapfish:{{cookiecutter.geomapfish_major_version_tag_env}} AS runner
27
+
28
+ COPY requirements.txt /tmp/requirements.txt
29
+ RUN --mount=type=cache,target=/root/.cache \
30
+ python3 -m pip install --disable-pip-version-check --requirement=/tmp/requirements.txt
31
+
32
+ WORKDIR /app
33
+ COPY . /app
34
+ # Workaround, see:https://github.com/moby/moby/issues/37965
35
+ RUN true
36
+ COPY --from=builder /opt/c2cgeoportal/geoportal/node_modules/ngeo/dist/* /etc/static-ngeo/
37
+ RUN rm /etc/static-ngeo/*.html
38
+ COPY --from=builder /etc/static-ngeo/* /etc/static-ngeo/
39
+ COPY --from=builder /app/alembic.ini /app/alembic.yaml ./
40
+ RUN chmod go+w /etc/static-ngeo/
41
+
42
+ RUN --mount=type=cache,target=/root/.cache \
43
+ python3 -m pip install --disable-pip-version-check --editable=/app/ \
44
+ && python3 -m compileall -q /venv/lib/python3.* \
45
+ -x '/(ptvsd|.*pydev.*|networkx|scaffolds|yaml_include)/' \
46
+ && python3 -m compileall -q /app/{{cookiecutter.package}}_geoportal -x /app/{{cookiecutter.package}}_geoportal/static.* \
47
+ && pip freeze > /requirements.txt
48
+
49
+ ARG GIT_HASH
50
+ RUN c2cwsgiutils-genversion ${GIT_HASH}
51
+
52
+ ARG PGSCHEMA
53
+ ENV PGSCHEMA=${PGSCHEMA}
54
+
55
+ ENTRYPOINT [ "/usr/bin/eval-templates" ]
56
+ CMD ["gunicorn", "--paste=/app/production.ini"]
57
+
58
+ ENV VISIBLE_ENTRY_POINT=/ \
59
+ AUTHTKT_TIMEOUT=86400 \
60
+ AUTHTKT_REISSUE_TIME=9000 \
61
+ AUTHTKT_MAXAGE=86400 \
62
+ AUTHTKT_COOKIENAME=auth_tkt \
63
+ AUTHTKT_HTTP_ONLY=True \
64
+ AUTHTKT_SECURE=True \
65
+ AUTHTKT_SAMESITE=Lax \
66
+ BASICAUTH=False \
67
+ LOG_LEVEL=INFO \
68
+ C2CGEOPORTAL_LOG_LEVEL=INFO \
69
+ C2CWSGIUTILS_LOG_LEVEL=INFO \
70
+ GUNICORN_LOG_LEVEL=INFO \
71
+ SQL_LOG_LEVEL=WARNING \
72
+ DOGPILECACHE_LOG_LEVEL=INFO \
73
+ OTHER_LOG_LEVEL=WARNING \
74
+ DEVELOPMENT=0 \
75
+ LOG_TYPE=console
@@ -0,0 +1,6 @@
1
+ # Language provided by the application
2
+ LANGUAGES ?= en fr de
3
+ NGEO_INTERFACES ?= desktop mobile iframe_api
4
+ NGEO_API ?= TRUE
5
+
6
+ include CONST_Makefile
@@ -0,0 +1,58 @@
1
+ [DEFAULT]
2
+ app.cfg = %(here)s/alembic.yaml
3
+ script_location = /opt/alembic
4
+ version_table = alembic_version
5
+
6
+ [main]
7
+ type = main
8
+ version_locations = /opt/alembic/main/
9
+
10
+ [static]
11
+ type = static
12
+ version_locations = /opt/alembic/static/
13
+
14
+ [getitfixed]
15
+ script_location = getitfixed:alembic
16
+ version_locations = getitfixed:alembic/versions/
17
+ schema = getitfixed
18
+
19
+ # Logging configuration
20
+ [loggers]
21
+ keys = root,sqlalchemy,alembic
22
+
23
+ [handlers]
24
+ keys = console, json
25
+ handlers = %(LOG_TYPE)s
26
+
27
+ [formatters]
28
+ keys = generic
29
+
30
+ [logger_root]
31
+ level = WARN
32
+ handlers = console
33
+ qualname =
34
+
35
+ [logger_sqlalchemy]
36
+ level = WARN
37
+ handlers =
38
+ qualname = sqlalchemy.engine
39
+
40
+ [logger_alembic]
41
+ level = INFO
42
+ handlers =
43
+ qualname = alembic
44
+
45
+ [handler_console]
46
+ class = StreamHandler
47
+ args = (sys.stderr,)
48
+ level = NOTSET
49
+ formatter = generic
50
+
51
+ [handler_json]
52
+ class = c2cwsgiutils.pyramid_logging.JsonLogHandler
53
+ args = (sys.stdout,)
54
+ level = NOTSET
55
+
56
+ [formatter_generic]
57
+ format = %(levelname)-5.5s [%(name)s] %(message)s
58
+ datefmt = %H:%M:%S
@@ -0,0 +1,19 @@
1
+ ---
2
+ vars:
3
+ schema: '{PGSCHEMA}'
4
+ schema_static: '{PGSCHEMA_STATIC}'
5
+ sqlalchemy.url: postgresql://{PGUSER}:{PGPASSWORD}@{PGHOST}:{PGPORT}/{PGDATABASE}?sslmode={PGSSLMODE}
6
+ srid: {{cookiecutter.srid}}
7
+ environment:
8
+ - name: PGHOST
9
+ - name: PGPORT
10
+ default: '5432'
11
+ - name: PGUSER
12
+ - name: PGPASSWORD
13
+ - name: PGDATABASE
14
+ - name: PGSSLMODE
15
+ default: prefer
16
+ - name: PGSCHEMA
17
+ default: main
18
+ - name: PGSCHEMA_STATIC
19
+ default: main_static
@@ -0,0 +1,121 @@
1
+ ###
2
+ # app configuration
3
+ # https://docs.pylonsproject.org/projects/pyramid/en/1.6-branch/narr/environment.html
4
+ # this file consider that you use paste.
5
+ ###
6
+
7
+ [app:app]
8
+ use = egg:{{cookiecutter.package}}_geoportal
9
+ filter-with = proxy-prefix
10
+
11
+ pyramid.reload_templates = %(DEVELOPMENT)s
12
+ pyramid.debug_authorization = %(DEVELOPMENT)s
13
+ pyramid.debug_notfound = %(DEVELOPMENT)s
14
+ pyramid.debug_routematch = %(DEVELOPMENT)s
15
+ pyramid.debug_templates = %(DEVELOPMENT)s
16
+
17
+ pyramid.includes = pyramid_debugtoolbar
18
+ # Be careful when manipulate this,
19
+ # if a hacker has access to the debug toolbar,
20
+ # it's a severe security issue
21
+ # With the provided values, the debug toolbar is only available from the Docker network
22
+ debugtoolbar.hosts = 172.17.0.0/16
23
+ 172.18.0.0/16
24
+ 172.19.0.0/16
25
+ mako.directories = {{cookiecutter.package}}_geoportal:templates
26
+ c2cgeoportal_geoportal:templates
27
+
28
+ authtkt_secret = %(AUTHTKT_SECRET)s
29
+ authtkt_cookie_name = %(AUTHTKT_COOKIENAME)s
30
+ authtkt_timeout = %(AUTHTKT_TIMEOUT)s
31
+ authtkt_max_age = %(AUTHTKT_MAXAGE)s
32
+ authtkt_reissue_time = %(AUTHTKT_REISSUE_TIME)s
33
+ authtkt_http_only = %(AUTHTKT_HTTP_ONLY)s
34
+ authtkt_secure = %(AUTHTKT_SECURE)s
35
+ authtkt_samesite = %(AUTHTKT_SAMESITE)s
36
+ basicauth = %(BASICAUTH)s
37
+
38
+ app.cfg = /etc/geomapfish/config.yaml
39
+
40
+ tm.annotate_user = false
41
+
42
+ [server:main]
43
+ use = egg:waitress#main
44
+ listen = *:8080
45
+
46
+ [filter:proxy-prefix]
47
+ use = egg:PasteDeploy#prefix
48
+ prefix = %(VISIBLE_ENTRY_POINT)s
49
+
50
+ [pipeline:main]
51
+ pipeline = egg:c2cwsgiutils#client_info egg:c2cwsgiutils#sentry app
52
+
53
+ ###
54
+ # logging configuration
55
+ # https://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/logging.html
56
+ ###
57
+
58
+ [loggers]
59
+ keys = root, sqlalchemy, gunicorn, c2cgeoportal_commons, c2cgeoportal_geoportal, c2cgeoportal_admin, {{cookiecutter.package}}_geoportal, c2cwsgiutils, dogpilecache
60
+
61
+ [handlers]
62
+ keys = console
63
+
64
+ [formatters]
65
+ keys = generic
66
+
67
+ [logger_root]
68
+ level = %(OTHER_LOG_LEVEL)s
69
+ handlers = console
70
+
71
+ [logger_c2cgeoportal_commons]
72
+ level = %(C2CGEOPORTAL_LOG_LEVEL)s
73
+ handlers =
74
+ qualname = c2cgeoportal_commons
75
+
76
+ [logger_c2cgeoportal_geoportal]
77
+ level = %(C2CGEOPORTAL_LOG_LEVEL)s
78
+ handlers =
79
+ qualname = c2cgeoportal_geoportal
80
+
81
+ [logger_c2cgeoportal_admin]
82
+ level = %(C2CGEOPORTAL_LOG_LEVEL)s
83
+ handlers =
84
+ qualname = c2cgeoportal_admin
85
+
86
+ [logger_{{cookiecutter.package}}_geoportal]
87
+ level = %(LOG_LEVEL)s
88
+ handlers =
89
+ qualname = {{cookiecutter.package}}_geoportal
90
+
91
+ [logger_c2cwsgiutils]
92
+ level = %(C2CWSGIUTILS_LOG_LEVEL)s
93
+ handlers =
94
+ qualname = c2cwsgiutils
95
+
96
+ [logger_gunicorn]
97
+ level = %(GUNICORN_LOG_LEVEL)s
98
+ handlers =
99
+ qualname = gunicorn
100
+
101
+ [logger_sqlalchemy]
102
+ level = %(SQL_LOG_LEVEL)s
103
+ handlers =
104
+ qualname = sqlalchemy.engine
105
+ # "level = INFO" logs SQL queries.
106
+ # "level = DEBUG" logs SQL queries and results.
107
+ # "level = WARN" logs neither. (Recommended for production systems.)
108
+
109
+ [logger_dogpilecache]
110
+ level = %(DOGPILECACHE_LOG_LEVEL)s
111
+ handlers =
112
+ qualname = dogpile.cache
113
+
114
+ [handler_console]
115
+ class = StreamHandler
116
+ args = (sys.stderr,)
117
+ level = NOTSET
118
+ formatter = generic
119
+
120
+ [formatter_generic]
121
+ format = %(levelname)-5.5s [%(name)s] %(message)s