territories-dashboard-lib 0.1.39b1__tar.gz

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 (195) hide show
  1. territories_dashboard_lib-0.1.39b1/MANIFEST.in +6 -0
  2. territories_dashboard_lib-0.1.39b1/PKG-INFO +145 -0
  3. territories_dashboard_lib-0.1.39b1/README.md +119 -0
  4. territories_dashboard_lib-0.1.39b1/licence.md +72 -0
  5. territories_dashboard_lib-0.1.39b1/pyproject.toml +48 -0
  6. territories_dashboard_lib-0.1.39b1/setup.cfg +4 -0
  7. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/__init__.py +0 -0
  8. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/commons/__init__.py +0 -0
  9. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/commons/decorators.py +36 -0
  10. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/commons/models.py +9 -0
  11. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/commons/types.py +20 -0
  12. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/__init__.py +0 -0
  13. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/admin.py +64 -0
  14. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/enums.py +7 -0
  15. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/migrations/0001_initial.py +51 -0
  16. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/migrations/0002_geoelement_linked_to_indicator.py +18 -0
  17. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/migrations/__init__.py +0 -0
  18. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/models.py +63 -0
  19. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/payloads.py +65 -0
  20. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/urls.py +27 -0
  21. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/geo_lib/views.py +233 -0
  22. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/__init__.py +0 -0
  23. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/admin.py +140 -0
  24. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/enums.py +85 -0
  25. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/export.py +29 -0
  26. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/format.py +35 -0
  27. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/methodo_pdf.py +104 -0
  28. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/migrations/0001_initial.py +138 -0
  29. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/migrations/0002_filter_color_indicator_min_mesh_and_more.py +28 -0
  30. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/migrations/0003_indicator_short_title.py +18 -0
  31. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/migrations/0005_auto_20251203_1621.py +124 -0
  32. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/migrations/__init__.py +0 -0
  33. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/models.py +242 -0
  34. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/payloads.py +56 -0
  35. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/commons.py +195 -0
  36. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/comparison.py +70 -0
  37. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/details.py +70 -0
  38. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/histogram.py +88 -0
  39. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/indicator_card.py +91 -0
  40. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/top_10.py +107 -0
  41. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/query/utils.py +44 -0
  42. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/refresh_filters.py +17 -0
  43. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/table.py +154 -0
  44. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/urls.py +97 -0
  45. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/indicators_lib/views.py +498 -0
  46. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/__init__.py +0 -0
  47. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/admin.py +22 -0
  48. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/guest_token.py +64 -0
  49. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/logic.py +69 -0
  50. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/migrations/0001_initial.py +45 -0
  51. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/migrations/__init__.py +0 -0
  52. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/models.py +52 -0
  53. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/payloads.py +7 -0
  54. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/serializers.py +10 -0
  55. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/urls.py +10 -0
  56. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/superset_lib/views.py +21 -0
  57. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/__init__.py +0 -0
  58. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/enums.py +17 -0
  59. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/geolocalisation/GeoLite2-Country.mmdb +0 -0
  60. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/geolocalisation/__init__.py +0 -0
  61. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/geolocalisation/logic.py +27 -0
  62. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/logic.py +90 -0
  63. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/migrations/0001_initial.py +45 -0
  64. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/migrations/0002_alter_event_created_at_alter_page_created_at.py +24 -0
  65. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/migrations/0003_cookieinfo.py +20 -0
  66. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/migrations/0004_cookieinfo_ip_address.py +18 -0
  67. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/migrations/__init__.py +0 -0
  68. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/models.py +86 -0
  69. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/payloads.py +10 -0
  70. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/urls.py +9 -0
  71. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/tracking_lib/views.py +43 -0
  72. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/__init__.py +0 -0
  73. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/admin.py +44 -0
  74. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/conf.py +14 -0
  75. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/context_processors.py +26 -0
  76. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/forms.py +47 -0
  77. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/migrations/0001_initial.py +91 -0
  78. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/migrations/0002_mainconf_contact_email_mainconf_newsletter_link_and_more.py +28 -0
  79. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/migrations/0003_alter_mainconf_footer_navigation_and_more.py +23 -0
  80. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/migrations/0004_mainconf_description_mainconf_social_image_url.py +23 -0
  81. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/migrations/__init__.py +0 -0
  82. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/models.py +174 -0
  83. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/navigation.py +124 -0
  84. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/params.py +282 -0
  85. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/serializers.py +110 -0
  86. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/chart.js +13 -0
  87. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/chartjs-plugin-datalabels.js +1 -0
  88. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/html2canvas.js +20 -0
  89. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/data.mjs +62 -0
  90. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/history.mjs +98 -0
  91. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/main-values.mjs +34 -0
  92. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/page.mjs +107 -0
  93. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/territory-chart.mjs +141 -0
  94. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/data.mjs +59 -0
  95. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/histogram.mjs +135 -0
  96. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/map.mjs +25 -0
  97. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/page.mjs +98 -0
  98. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/proportions.mjs +100 -0
  99. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/sankey.mjs +27 -0
  100. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/table.mjs +229 -0
  101. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/top10.mjs +67 -0
  102. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/utils.mjs +17 -0
  103. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/dom.mjs +92 -0
  104. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/enums.mjs +104 -0
  105. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/export-graph.mjs +24 -0
  106. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/export.mjs +20 -0
  107. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/filters.mjs +159 -0
  108. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/format.mjs +61 -0
  109. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/side_panel.mjs +103 -0
  110. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/history.mjs +89 -0
  111. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/main-value.mjs +22 -0
  112. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/page.mjs +164 -0
  113. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/statistics.mjs +42 -0
  114. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/utils.mjs +92 -0
  115. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/static/page.mjs +35 -0
  116. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/patternomaly.js +1452 -0
  117. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/react18.js +31 -0
  118. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/reactdom18.js +267 -0
  119. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/supersetEmbed.js +355 -0
  120. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/indicatorMap.bundle.js +2 -0
  121. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/sankeyGraph.bundle.js +2 -0
  122. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/vendors.bundle.js +2 -0
  123. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/static_content.py +20 -0
  124. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/admin/indicators_lib/indicator/change_form.html +8 -0
  125. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/404.html +10 -0
  126. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/500.html +10 -0
  127. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css +83 -0
  128. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.html +59 -0
  129. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.js +47 -0
  130. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/footer.css +12 -0
  131. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/footer.html +96 -0
  132. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/header.css +26 -0
  133. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/header.html +101 -0
  134. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/header.js +102 -0
  135. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/components/histogram.html +28 -0
  136. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/components/indicateur-card.html +27 -0
  137. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/page.html +65 -0
  138. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/chart-buttons.css +16 -0
  139. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/chart-buttons.html +30 -0
  140. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.css +94 -0
  141. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.html +71 -0
  142. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.css +6 -0
  143. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.html +52 -0
  144. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/loader.html +28 -0
  145. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel.css +110 -0
  146. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel.html +27 -0
  147. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.css +20 -0
  148. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html +80 -0
  149. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.js +85 -0
  150. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css +29 -0
  151. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html +45 -0
  152. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.js +19 -0
  153. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/themes-list.css +10 -0
  154. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/themes-list.html +9 -0
  155. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/themes-nav.html +33 -0
  156. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/title.css +8 -0
  157. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/title.html +28 -0
  158. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/filters-reminder.css +17 -0
  159. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/filters-reminder.html +19 -0
  160. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/histogram.html +22 -0
  161. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/map.html +10 -0
  162. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/no-data.html +1 -0
  163. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/proportions.html +22 -0
  164. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/sankey.html +17 -0
  165. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/table-flows.html +8 -0
  166. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/table-values.html +17 -0
  167. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/table.css +83 -0
  168. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/table.html +123 -0
  169. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/top10.html +20 -0
  170. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/map.css +332 -0
  171. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.css +21 -0
  172. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.html +134 -0
  173. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/components/extremum.css +34 -0
  174. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/components/extremum.html +15 -0
  175. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/components/indicateur-card.css +57 -0
  176. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/components/indicateur-card.html +73 -0
  177. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/components/stats.html +12 -0
  178. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/page.html +80 -0
  179. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/lexique/page.css +19 -0
  180. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/lexique/page.html +23 -0
  181. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/page.html +14 -0
  182. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/sitemap/page.html +71 -0
  183. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/static/page.css +29 -0
  184. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/static/page.html +20 -0
  185. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/superset/page.css +4 -0
  186. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/superset/page.html +59 -0
  187. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/svg/delete-back.svg +1 -0
  188. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templatetags/htmlparams.py +75 -0
  189. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/templatetags/other_filters.py +38 -0
  190. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib/website_lib/views.py +212 -0
  191. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib.egg-info/PKG-INFO +145 -0
  192. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib.egg-info/SOURCES.txt +193 -0
  193. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib.egg-info/dependency_links.txt +1 -0
  194. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib.egg-info/requires.txt +11 -0
  195. territories_dashboard_lib-0.1.39b1/territories_dashboard_lib.egg-info/top_level.txt +4 -0
@@ -0,0 +1,6 @@
1
+ recursive-include territories_dashboard_lib *.js *.mjs *.css *.html *.svg *.mmdb
2
+ include README.md
3
+ include licence.md
4
+
5
+ prune territories_dashboard_lib/website_lib/react-components
6
+ prune test_project
@@ -0,0 +1,145 @@
1
+ Metadata-Version: 2.4
2
+ Name: territories-dashboard-lib
3
+ Version: 0.1.39b1
4
+ Summary: Librairie pour la visualisation d'indicateurs territoriaux.
5
+ Author-email: Bastien <bastien@prune.sh>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Operating System :: OS Independent
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Topic :: Software Development :: Libraries
11
+ Requires-Python: <3.14,>=3.13
12
+ Description-Content-Type: text/markdown
13
+ License-File: licence.md
14
+ Requires-Dist: django>=5.1.6
15
+ Requires-Dist: django-nested-admin>=4.1.1
16
+ Requires-Dist: geoip2>=5.1.0
17
+ Requires-Dist: gunicorn>=23.0.0
18
+ Requires-Dist: ipython>=8.32.0
19
+ Requires-Dist: martor>=1.7.15
20
+ Requires-Dist: pre-commit>=4.2.0
21
+ Requires-Dist: psycopg2-binary>=2.9.10
22
+ Requires-Dist: pydantic>=2.10.6
23
+ Requires-Dist: pydantic-settings>=2.7.1
24
+ Requires-Dist: whitenoise>=6.9.0
25
+ Dynamic: license-file
26
+
27
+ # Tableau de bord des indicateurs territoriaux
28
+
29
+ ## Présentation
30
+
31
+ Bienvenue dans ce projet visant à faciliter la création de tableaux de bord territoriaux interactifs à partir de données d’indicateurs. Ce dispositif est composé de deux briques complémentaires :
32
+
33
+ ### 1. `territories_dashboard_lib`
34
+
35
+ Une **librairie Django** réutilisable, contenant des applications modulaires pour afficher rapidement un tableau de bord d'indicateurs territoriaux. Elle permet d’analyser des données à différentes mailles géographiques : nationale, régionale, départementale, et communale.
36
+ Elle comprend des fonctionnalités prêtes à l'emploi pour visualiser des données sur des thématiques comme la **mobilité durable**, la **rénovation énergétique** ou d'autres indicateurs liés au développement territorial.
37
+
38
+ ### 2. `territories_dashboard_template`
39
+
40
+ Un **template de projet Django clef en main**, conçu pour permettre à des équipes techniques de démarrer rapidement leur propre tableau de bord. Ce template utilise la librairie `territories_dashboard_lib` comme fondation.
41
+ Les utilisateurs peuvent cloner ce dépôt, l’adapter à leurs besoins, et configurer leur tableau de bord directement depuis l’interface d’administration (titre, organisme, pages de contenu statique, indicateurs à afficher...).
42
+
43
+ Le template constitue un **point de départ standard**, mais n’impose aucune restriction technique en dehors du choix de Django comme framework. Les développeurs sont libres d'étendre ou de modifier les composants selon leurs besoins.
44
+
45
+ ### Prérequis
46
+
47
+ Pour utiliser la librairie ou le template, vous devez disposer de :
48
+
49
+ - Une base de données PostgreSQL contenant les données des indicateurs territoriaux.
50
+ - Une capacité à déployer une application Django (hébergement, serveur web, etc.).
51
+
52
+ Pour obtenir des informations détaillées sur les prérequis techniques ou les données :
53
+
54
+ - **Marina Ribeiro** – Directrice de projet Mission Connaissance
55
+ marina.ribeiro@developpement-durable.gouv.fr
56
+ - **Louise Columelli** – ECOLAB
57
+ louise.columelli@developpement-durable.gouv.fr
58
+ - **Olivier Rousseau** – Expert données
59
+ olivier.rousseau@i-carre.net
60
+ - **Bastien** – Développeur web
61
+ bastien@prune.sh
62
+
63
+ ### Exemples de projets utilisant ce dispositif
64
+
65
+ - [Tableau de bord des mobilités durables](https://mobilite-durable-tdb.din.developpement-durable.gouv.fr)
66
+ - [Boussole énergétique de la rénovation des logements](https://boussole-renovation.din.developpement-durable.gouv.fr)
67
+
68
+ L’objectif de ce projet est d’**encourager la réutilisation** et l’**essaimage** de nouveaux tableaux de bord territoriaux, en mettant à disposition un socle technique commun, facilement adaptable et extensible.
69
+
70
+ ## Structure de la librairie
71
+
72
+ La librairie est composée de plusieurs **applications Django** indépendantes et complémentaires :
73
+
74
+ ### `website_lib`
75
+
76
+ Contient le code principal d’affichage des pages du tableau de bord :
77
+
78
+ - **Templates HTML Django** : dans `website_lib/templates`, organisés par page.
79
+ - **Fichiers statiques** (JS, CSS) : dans `website_lib/static`. Le JS est modulaire grâce à l’extension `.mjs`.
80
+ - **Vues Django** : dans `website_lib/views`, associées aux templates et fichiers statiques.
81
+
82
+ ### `tracking_lib`
83
+
84
+ Gère le **tracking backend** : enregistrement en base de données des visites de pages, avec leurs paramètres (indicateur sélectionné, territoire, etc.) pour permettre des analyses d’usage.
85
+
86
+ ### `superset_lib`
87
+
88
+ Permet d’**intégrer des dashboards Superset** dans les pages du site.
89
+ Superset est un outil permettant à des utilisateurs non techniques de construire des visualisations depuis une base de données.
90
+
91
+ ### `geo_lib`
92
+
93
+ Permet d’**ajouter des couches géographiques** personnalisées (points, lignes, polygones) à la carte :
94
+
95
+ - Points : ex. stationnements vélo.
96
+ - Lignes : ex. pistes cyclables.
97
+ - Polygones : ex. zones ZFE.
98
+
99
+ ### `indicators_lib`
100
+
101
+ Contient le code pour l’accès et la requête des **données d’indicateurs** dans la base PostgreSQL dédiée.
102
+
103
+ ### Composants React
104
+
105
+ Certaines visualisations complexes sont développées en **React** (ex. cartes interactives, diagrammes de Sankey).
106
+
107
+ - Les composants sont dans `website_lib/react-components/`.
108
+ - Le bundling est effectué via **Webpack**
109
+ - Les composants React sont ensuite inclus dans les templates Django.
110
+ - `cd website_lib/react-components && npm install && npm run webpack`
111
+
112
+ ## Installation
113
+
114
+ La librairie est publiée sur PyPI. Elle s’installe dans un projet Django via le package manager uv :
115
+
116
+ `uv add territories_dashboard_lib`
117
+
118
+ ### Figer la version en production
119
+
120
+ Pour éviter les mises à jour inattendues, il est conseillé de figer la version dans le fichier pyproject.toml :
121
+
122
+ ```
123
+ # Par exemple :
124
+ territories_dashboard_lib == 1.0.3
125
+ ```
126
+
127
+ ### Développement local
128
+
129
+ Pour tester une version locale de la librairie (ex : modifications en cours) :
130
+
131
+ `uv add --editable ~/territories-dashboard/territories-dashboard-lib`
132
+
133
+ ## Publication PyPI
134
+
135
+ Pour builder la librairie avant publication :
136
+
137
+ `uv run python -m build`
138
+
139
+ Pour déployer sur PyPI, vous devez :
140
+
141
+ 1. Avoir un compte PyPI.
142
+
143
+ 2. Être membre du projet sur PyPI.
144
+
145
+ 3. Lancer : `uv run twine upload dist/*`
@@ -0,0 +1,119 @@
1
+ # Tableau de bord des indicateurs territoriaux
2
+
3
+ ## Présentation
4
+
5
+ Bienvenue dans ce projet visant à faciliter la création de tableaux de bord territoriaux interactifs à partir de données d’indicateurs. Ce dispositif est composé de deux briques complémentaires :
6
+
7
+ ### 1. `territories_dashboard_lib`
8
+
9
+ Une **librairie Django** réutilisable, contenant des applications modulaires pour afficher rapidement un tableau de bord d'indicateurs territoriaux. Elle permet d’analyser des données à différentes mailles géographiques : nationale, régionale, départementale, et communale.
10
+ Elle comprend des fonctionnalités prêtes à l'emploi pour visualiser des données sur des thématiques comme la **mobilité durable**, la **rénovation énergétique** ou d'autres indicateurs liés au développement territorial.
11
+
12
+ ### 2. `territories_dashboard_template`
13
+
14
+ Un **template de projet Django clef en main**, conçu pour permettre à des équipes techniques de démarrer rapidement leur propre tableau de bord. Ce template utilise la librairie `territories_dashboard_lib` comme fondation.
15
+ Les utilisateurs peuvent cloner ce dépôt, l’adapter à leurs besoins, et configurer leur tableau de bord directement depuis l’interface d’administration (titre, organisme, pages de contenu statique, indicateurs à afficher...).
16
+
17
+ Le template constitue un **point de départ standard**, mais n’impose aucune restriction technique en dehors du choix de Django comme framework. Les développeurs sont libres d'étendre ou de modifier les composants selon leurs besoins.
18
+
19
+ ### Prérequis
20
+
21
+ Pour utiliser la librairie ou le template, vous devez disposer de :
22
+
23
+ - Une base de données PostgreSQL contenant les données des indicateurs territoriaux.
24
+ - Une capacité à déployer une application Django (hébergement, serveur web, etc.).
25
+
26
+ Pour obtenir des informations détaillées sur les prérequis techniques ou les données :
27
+
28
+ - **Marina Ribeiro** – Directrice de projet Mission Connaissance
29
+ marina.ribeiro@developpement-durable.gouv.fr
30
+ - **Louise Columelli** – ECOLAB
31
+ louise.columelli@developpement-durable.gouv.fr
32
+ - **Olivier Rousseau** – Expert données
33
+ olivier.rousseau@i-carre.net
34
+ - **Bastien** – Développeur web
35
+ bastien@prune.sh
36
+
37
+ ### Exemples de projets utilisant ce dispositif
38
+
39
+ - [Tableau de bord des mobilités durables](https://mobilite-durable-tdb.din.developpement-durable.gouv.fr)
40
+ - [Boussole énergétique de la rénovation des logements](https://boussole-renovation.din.developpement-durable.gouv.fr)
41
+
42
+ L’objectif de ce projet est d’**encourager la réutilisation** et l’**essaimage** de nouveaux tableaux de bord territoriaux, en mettant à disposition un socle technique commun, facilement adaptable et extensible.
43
+
44
+ ## Structure de la librairie
45
+
46
+ La librairie est composée de plusieurs **applications Django** indépendantes et complémentaires :
47
+
48
+ ### `website_lib`
49
+
50
+ Contient le code principal d’affichage des pages du tableau de bord :
51
+
52
+ - **Templates HTML Django** : dans `website_lib/templates`, organisés par page.
53
+ - **Fichiers statiques** (JS, CSS) : dans `website_lib/static`. Le JS est modulaire grâce à l’extension `.mjs`.
54
+ - **Vues Django** : dans `website_lib/views`, associées aux templates et fichiers statiques.
55
+
56
+ ### `tracking_lib`
57
+
58
+ Gère le **tracking backend** : enregistrement en base de données des visites de pages, avec leurs paramètres (indicateur sélectionné, territoire, etc.) pour permettre des analyses d’usage.
59
+
60
+ ### `superset_lib`
61
+
62
+ Permet d’**intégrer des dashboards Superset** dans les pages du site.
63
+ Superset est un outil permettant à des utilisateurs non techniques de construire des visualisations depuis une base de données.
64
+
65
+ ### `geo_lib`
66
+
67
+ Permet d’**ajouter des couches géographiques** personnalisées (points, lignes, polygones) à la carte :
68
+
69
+ - Points : ex. stationnements vélo.
70
+ - Lignes : ex. pistes cyclables.
71
+ - Polygones : ex. zones ZFE.
72
+
73
+ ### `indicators_lib`
74
+
75
+ Contient le code pour l’accès et la requête des **données d’indicateurs** dans la base PostgreSQL dédiée.
76
+
77
+ ### Composants React
78
+
79
+ Certaines visualisations complexes sont développées en **React** (ex. cartes interactives, diagrammes de Sankey).
80
+
81
+ - Les composants sont dans `website_lib/react-components/`.
82
+ - Le bundling est effectué via **Webpack**
83
+ - Les composants React sont ensuite inclus dans les templates Django.
84
+ - `cd website_lib/react-components && npm install && npm run webpack`
85
+
86
+ ## Installation
87
+
88
+ La librairie est publiée sur PyPI. Elle s’installe dans un projet Django via le package manager uv :
89
+
90
+ `uv add territories_dashboard_lib`
91
+
92
+ ### Figer la version en production
93
+
94
+ Pour éviter les mises à jour inattendues, il est conseillé de figer la version dans le fichier pyproject.toml :
95
+
96
+ ```
97
+ # Par exemple :
98
+ territories_dashboard_lib == 1.0.3
99
+ ```
100
+
101
+ ### Développement local
102
+
103
+ Pour tester une version locale de la librairie (ex : modifications en cours) :
104
+
105
+ `uv add --editable ~/territories-dashboard/territories-dashboard-lib`
106
+
107
+ ## Publication PyPI
108
+
109
+ Pour builder la librairie avant publication :
110
+
111
+ `uv run python -m build`
112
+
113
+ Pour déployer sur PyPI, vous devez :
114
+
115
+ 1. Avoir un compte PyPI.
116
+
117
+ 2. Être membre du projet sur PyPI.
118
+
119
+ 3. Lancer : `uv run twine upload dist/*`
@@ -0,0 +1,72 @@
1
+ LICENCE OUVERTE 2.0/OPEN LICENCE 2.0
2
+ Réutilisation de l’« Information » sous cette licence
3
+
4
+ Le « Concédant » concède au « Réutilisateur » un droit non exclusif et gratuit de libre « Réutilisation » de l’« Information » objet de la présente licence, à des fins commerciales ou non, dans le monde entier et pour une durée illimitée, dans les conditions exprimées ci-dessous.
5
+
6
+ Le « Réutilisateur » est libre de réutiliser l’« Information » :
7
+
8
+ de la communiquer, la reproduire, la copier ;
9
+ de l’adapter, la modifier, l’extraire et la transformer, notamment pour créer des « Informations dérivées » ;
10
+ de la diffuser, la redistribuer, la publier et la transmettre, de l’exploiter à titre commercial, par exemple en la combinant avec d’autres informations, ou en l’incluant dans votre propre produit ou application.
11
+
12
+ Sous réserve de :
13
+
14
+ mentionner la paternité de l’«Information» : sa source (a minima le nom du « Concédant ») et la date de la dernière mise à jour de l’« Information » réutilisée.
15
+
16
+ Le « Réutilisateur » peut notamment s’ acquitter de cette condition en indiquant l’adresse (URL) renvoyant vers « l’Information » et assurant une mention effective de sa paternité.
17
+
18
+ Par exemple :
19
+
20
+ Dans le cas d’une réutilisation de la base SIRENE de l’INSEE, mentionner l’URL du « Concédant » : www.insee.fr + la date de dernière mise à jour de l’Information réutilisée.
21
+
22
+ Cette mention de paternité ne doit ni conférer un caractère officiel à la « Réutilisation » de l’« Information », ni suggérer une quelconque reconnaissance ou caution par le « Concédant », ou par toute autre entité publique, du « Réutilisateur » ou de sa « Réutilisation ».
23
+ Données à caractère personnel
24
+
25
+ L’« Information » mise à disposition peut contenir des « Données à caractère personnel » pouvant faire l’objet d’une « Réutilisation ». Alors, le « Concédant » informe le « Réutilisateur » (par tous moyens) de leur présence, l’ « Information » peut être librement réutilisée, sans faire obstacle aux libertés accordées par la présente licence, à condition de respecter le cadre légal relatif à la protection des données à caractère personnel.
26
+ Droits de propriété intellectuelle
27
+
28
+ Il est garanti au « Réutilisateur » que l’ « Information » ne contient pas de « Droits de propriété intellectuelle » appartenant à des tiers qui pourraient faire obstacle aux libertés qui lui sont accordées par la présente licence.
29
+
30
+ Les éventuels « Droits de propriété intellectuelle » détenus par le « Concédant » sur l’ « Information » ne font pas obstacle aux libertés qui sont accordées par la présente licence. Lorsque le « Concédant » détient des « Droits de propriété intellectuelle » » sur l’ « Information », il les cède au « Réutilisateur » de façon non exclusive, à titre gracieux, pour le monde entier, pour toute la durée des « Droits de propriété intellectuelle », et le « Réutilisateur » peut en faire tout usage conformément aux libertés et aux conditions définies par la présente licence.
31
+ Responsabilité
32
+
33
+ L’ «Information» est mise à disposition telle que produite ou reçue, sans autre garantie expresse ou tacite qui n’est pas prévue par la présente licence. L’absence de défauts ou d’erreurs éventuellement contenues dans l’ «Information», comme la fourniture continue de l’ « Information » n’est pas garantie par le «Concédant». Il ne peut être tenu pour responsable de toute perte, préjudice ou dommage de quelque sorte causé à des tiers du fait de la « Réutilisation ».
34
+
35
+ Le « Réutilisateur » est seul responsable de la « Réutilisation » de l’« Information ».
36
+
37
+ La « Réutilisation » ne doit pas induire en erreur des tiers quant au contenu de l’« Information », sa source et sa date de mise à jour.
38
+ Droit applicable
39
+
40
+ La présente licence est régie par le droit français.
41
+ Compatibilité de la présente licence
42
+
43
+ Elle a été conçue pour être compatible avec toute licence libre qui exige a minima la mention de paternité. Elle est notamment compatible avec la version antérieure de la présente licence ainsi qu’avec les licences « Open Government Licence » (OGL) du Royaume-Uni, « Creative Commons Attribution » (CC-BY) de Creative Commons et « Open Data Commons Attribution » (ODC-BY) de l’Open Knowledge Foundation.
44
+ Définitions
45
+
46
+ Sont considérés, au sens de la présente licence comme :
47
+
48
+ Le « Concédant » : toute personne concédant un droit de « Réutilisation » sur l’« Information » dans les libertés et les conditions prévues par la présente licence.
49
+ L’« Information » :
50
+ toute information publique figurant dans des documents communiqués ou publiés par une administration mentionnée au premier alinéa de l’article L.300-2 du CRPA ;
51
+ toute information mise à disposition par toute personne selon les termes et conditions de la présente licence.
52
+ La « Réutilisation » : l’utilisation de l’« Information » à d’autres fins que celles pour lesquelles elle a été produite ou reçue.
53
+ Le « Réutilisateur » : toute personne qui réutilise les « Informations » conformément aux conditions de la présente licence.
54
+ Des « Données à caractère personnel » : toute information se rapportant à une personne physique identifiée ou identifiable, pouvant être identifiée directement ou indirectement. Leur « Réutilisation » est subordonnée au respect du cadre juridique en vigueur.
55
+ Une « Information dérivée » : toute nouvelle donnée ou information créées directement à partir de l’« Information » ou à partir d’une combinaison de l’ « Information » et d’autres données ou informations non soumises à cette licence.
56
+ Les « Droits de propriété intellectuelle » : tous droits identifiés comme tels par le Code de la propriété intellectuelle (droit d’auteur, droits voisins au droit d’auteur, droit sui generis des producteurs de bases de données).
57
+
58
+ À propos de cette licence
59
+
60
+ La présente licence a vocation à être utilisée par les administrations pour la réutilisation de leurs informations publiques. Elle peut également être utilisée par toute personne souhaitant mettre à disposition de l’« Information » dans les conditions définies par la présente licence.
61
+
62
+ La France est dotée d’un cadre juridique global visant à une diffusion spontanée par les administrations de leurs informations publiques afin d’en permettre la plus large réutilisation.
63
+
64
+ Le droit de la « Réutilisation » de l’« Information » des administrations est régi par le code des relations entre le public et l’administration (CRPA) et, le cas échéant, le code du patrimoine (livre II relatif aux archives).
65
+
66
+ Cette licence facilite la réutilisation libre et gratuite des informations publiques et figure parmi les licences qui peuvent être utilisées par l’administration en vertu du décret pris en application de l’article L.323-2 du CRPA.
67
+
68
+ Etalab est la mission chargée, sous l’autorité du Premier ministre, d’ouvrir le plus grand nombre de données publiques des administrations de l’État et de ses établissements publics. Elle a réalisé la Licence Ouverte pour faciliter la réutilisation libre et gratuite de ces informations publiques, telles que définies par l’article L321-1 du CRPA.
69
+
70
+ Cette licence est une version 2.0 de la Licence Ouverte.
71
+
72
+ Etalab se réserve la faculté de proposer de nouvelles versions de la Licence Ouverte. Cependant, les « Réutilisateurs » pourront continuer à réutiliser les informations disponibles sous cette licence s’ils le souhaitent.
@@ -0,0 +1,48 @@
1
+ [project]
2
+ name = "territories-dashboard-lib"
3
+ version = "0.1.39b1"
4
+ description = "Librairie pour la visualisation d'indicateurs territoriaux."
5
+ authors = [
6
+ { name = "Bastien", email = "bastien@prune.sh" }
7
+ ]
8
+ readme = "README.md"
9
+ license-files = ["licence.md"]
10
+ requires-python = ">=3.13,<3.14"
11
+
12
+ classifiers = [
13
+ "Programming Language :: Python :: 3",
14
+ "Operating System :: OS Independent",
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "Topic :: Software Development :: Libraries",
18
+ ]
19
+
20
+ dependencies = [
21
+ "django>=5.1.6",
22
+ "django-nested-admin>=4.1.1",
23
+ "geoip2>=5.1.0",
24
+ "gunicorn>=23.0.0",
25
+ "ipython>=8.32.0",
26
+ "martor>=1.7.15",
27
+ "pre-commit>=4.2.0",
28
+ "psycopg2-binary>=2.9.10",
29
+ "pydantic>=2.10.6",
30
+ "pydantic-settings>=2.7.1",
31
+ "whitenoise>=6.9.0",
32
+ ]
33
+
34
+ [tool.setuptools]
35
+ include-package-data = true
36
+
37
+ [tool.setuptools.packages.find]
38
+ exclude = ["dev"]
39
+
40
+ [build-system]
41
+ requires = ["setuptools", "wheel"]
42
+ build-backend = "setuptools.build_meta"
43
+
44
+ [dependency-groups]
45
+ dev = [
46
+ "build>=1.3.0",
47
+ "twine>=6.2.0",
48
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,36 @@
1
+ import functools
2
+ from typing import get_origin
3
+
4
+ from django.http import HttpResponse
5
+ from pydantic import ValidationError
6
+
7
+
8
+ def use_payload(payload_class):
9
+ def decorator(func):
10
+ @functools.wraps(func)
11
+ def wrapper(request, *args, **kwargs):
12
+ if request.method != "GET":
13
+ raise NotImplementedError
14
+ data = {}
15
+ for field_name, field in payload_class.model_fields.items():
16
+ url_name = field.alias if field.alias else field_name
17
+ is_list_field = get_origin(field.annotation) is list
18
+ url_value = (
19
+ request.GET.getlist(url_name)
20
+ if is_list_field
21
+ else request.GET.get(url_name)
22
+ )
23
+ if url_value is not None:
24
+ data[url_name] = url_value
25
+ try:
26
+ payload = payload_class.model_validate(data)
27
+ except ValidationError as e:
28
+ return HttpResponse(
29
+ e.json(), headers={"content_type": "application/json"}, status=400
30
+ )
31
+
32
+ return func(request, *args, payload=payload, **kwargs)
33
+
34
+ return wrapper
35
+
36
+ return decorator
@@ -0,0 +1,9 @@
1
+ from django.db import models
2
+
3
+
4
+ class CommonModel(models.Model):
5
+ created_at = models.DateTimeField(auto_now_add=True)
6
+ updated_at = models.DateTimeField(auto_now=True)
7
+
8
+ class Meta:
9
+ abstract = True
@@ -0,0 +1,20 @@
1
+ from typing import Annotated
2
+
3
+ from pydantic import StringConstraints
4
+
5
+ TerritoryCode = Annotated[
6
+ str, StringConstraints(strip_whitespace=True, pattern=r"^[A-Za-z0-9]*$")
7
+ ]
8
+
9
+ # comme un TerritoryCode mais prend en compte l'exception pour la France entière : territory=FR0,FR1,FR2-fr
10
+ MutualisedTerritoryCode = Annotated[
11
+ str, StringConstraints(strip_whitespace=True, pattern=r"^[A-Za-z0-9,]*$")
12
+ ]
13
+
14
+ SQlName = Annotated[
15
+ str, StringConstraints(strip_whitespace=True, pattern=r"^[A-Za-z0-9_]*$")
16
+ ]
17
+
18
+ SimpleIDType = Annotated[
19
+ str, StringConstraints(strip_whitespace=True, pattern=r"^[A-Za-z0-9_\-]*$")
20
+ ]
@@ -0,0 +1,64 @@
1
+ from django import forms
2
+ from django.contrib import admin
3
+ from django.db import models
4
+ from django.utils.safestring import mark_safe
5
+
6
+ from territories_dashboard_lib.geo_lib.models import GeoElement, GeoFeature
7
+
8
+
9
+ class GeoColumnInLine(admin.TabularInline):
10
+ model = GeoElement
11
+ fields = ["name", "label", "filterable", "linked_to_indicator"]
12
+ extra = 0
13
+ formfield_overrides = {
14
+ models.TextField: {"widget": forms.TextInput()},
15
+ }
16
+
17
+
18
+ class GeoFeatureForm(forms.ModelForm):
19
+ svg_file = forms.FileField(required=False, label="Charger un fichier SVG")
20
+
21
+ class Meta:
22
+ model = GeoFeature
23
+ fields = [
24
+ "indicator",
25
+ "name",
26
+ "title",
27
+ "unite",
28
+ "geo_type",
29
+ "color",
30
+ "show_on_fr_level",
31
+ "point_icon_svg",
32
+ "svg_file",
33
+ ]
34
+
35
+ def clean(self):
36
+ cleaned_data = super().clean()
37
+ svg_file = cleaned_data.get("svg_file")
38
+
39
+ if svg_file:
40
+ svg_content = svg_file.read().decode("utf-8")
41
+ cleaned_data["point_icon_svg"] = svg_content
42
+
43
+ return cleaned_data
44
+
45
+
46
+ class GeoTableAdmin(admin.ModelAdmin):
47
+ form = GeoFeatureForm
48
+ inlines = [GeoColumnInLine]
49
+ formfield_overrides = {
50
+ models.TextField: {"widget": forms.TextInput()},
51
+ }
52
+ list_display = ["__str__", "indicator"]
53
+ list_filter = ["indicator"]
54
+ readonly_fields = ["svg_preview"]
55
+
56
+ def svg_preview(self, obj):
57
+ if obj.point_icon_svg:
58
+ return mark_safe(obj.point_icon_svg)
59
+ return "-"
60
+
61
+ svg_preview.short_description = "Prévisualisation du SVG"
62
+
63
+
64
+ admin.site.register(GeoFeature, GeoTableAdmin)
@@ -0,0 +1,7 @@
1
+ from django.db import models
2
+
3
+
4
+ class GeoFeatureType(models.TextChoices):
5
+ point = "point"
6
+ line = "line"
7
+ polygon = "polygon"
@@ -0,0 +1,51 @@
1
+ # Generated by Django 5.2.3 on 2025-06-19 07:13
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ initial = True
10
+
11
+ dependencies = [
12
+ ('indicators_lib', '0001_initial'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='GeoFeature',
18
+ fields=[
19
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20
+ ('created_at', models.DateTimeField(auto_now_add=True)),
21
+ ('updated_at', models.DateTimeField(auto_now=True)),
22
+ ('name', models.TextField(help_text='attention le nom doit être exactement le même que celui en base.', verbose_name='Nom de la table en base')),
23
+ ('title', models.TextField(default='à compléter', verbose_name='Titre à afficher')),
24
+ ('unite', models.TextField(verbose_name='Unité au pluriel')),
25
+ ('geo_type', models.TextField(choices=[('point', 'Point'), ('line', 'Line'), ('polygon', 'Polygon')], default='point', verbose_name='Type de géométrie')),
26
+ ('point_icon_svg', models.TextField(blank=True, help_text="Icone SVG a utilisé pour les points.<br/>Laisser vide pour les autres types de géométrie.<br/>Veuillez charger un fichier provenant des <a href='/'>Material Icons</a> de Google.", null=True, verbose_name='Icone des points')),
27
+ ('color', models.TextField(default='#000000', help_text="Couleur des données sur la date, à renseigner au format hexadécimal, par exemple: '#05B2F9'", verbose_name='Couleur')),
28
+ ('show_on_fr_level', models.BooleanField(default=True, help_text='Décochez si la quantité de données est trop importante pour le niveau France entière.', verbose_name='Afficher au niveau France entière')),
29
+ ('indicator', models.ForeignKey(help_text="Cette donnée géographique sera ajoutée à la carte de l'indicateur.", on_delete=django.db.models.deletion.CASCADE, related_name='geo_features', to='indicators_lib.indicator')),
30
+ ],
31
+ options={
32
+ 'verbose_name': 'Données de la carte',
33
+ 'ordering': ('indicator', 'name'),
34
+ },
35
+ ),
36
+ migrations.CreateModel(
37
+ name='GeoElement',
38
+ fields=[
39
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40
+ ('created_at', models.DateTimeField(auto_now_add=True)),
41
+ ('updated_at', models.DateTimeField(auto_now=True)),
42
+ ('name', models.TextField(verbose_name='Nom de la colonne en DB')),
43
+ ('label', models.TextField()),
44
+ ('filterable', models.BooleanField(default=True, verbose_name='Filtrable')),
45
+ ('geo_feature', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='geo_lib.geofeature')),
46
+ ],
47
+ options={
48
+ 'abstract': False,
49
+ },
50
+ ),
51
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.7 on 2025-10-28 12:30
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('geo_lib', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='geoelement',
15
+ name='linked_to_indicator',
16
+ field=models.BooleanField(default=False, help_text="Si coché, le filtre de l'indicateur avec le même nom sere relié au filtre de la carte.", verbose_name="Relié aux filtres de l'indicateur"),
17
+ ),
18
+ ]