territories-dashboard-lib 0.1.33b1__py3-none-any.whl → 1.1.1.dev7__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 (77) hide show
  1. territories_dashboard_lib/geo_lib/admin.py +3 -1
  2. territories_dashboard_lib/geo_lib/migrations/0002_geoelement_linked_to_indicator.py +18 -0
  3. territories_dashboard_lib/geo_lib/migrations/0003_geofeature_color_column_geofeature_size_column.py +23 -0
  4. territories_dashboard_lib/geo_lib/models.py +17 -0
  5. territories_dashboard_lib/geo_lib/payloads.py +7 -21
  6. territories_dashboard_lib/geo_lib/views.py +58 -53
  7. territories_dashboard_lib/indicators_lib/enums.py +61 -37
  8. territories_dashboard_lib/indicators_lib/methodo_pdf.py +6 -1
  9. territories_dashboard_lib/indicators_lib/migrations/0004_alter_indicator_min_mesh.py +18 -0
  10. territories_dashboard_lib/indicators_lib/migrations/0005_auto_20251203_1621.py +124 -0
  11. territories_dashboard_lib/indicators_lib/models.py +7 -4
  12. territories_dashboard_lib/indicators_lib/payloads.py +14 -1
  13. territories_dashboard_lib/indicators_lib/query/commons.py +90 -104
  14. territories_dashboard_lib/indicators_lib/query/comparison.py +8 -3
  15. territories_dashboard_lib/indicators_lib/query/details.py +8 -13
  16. territories_dashboard_lib/indicators_lib/query/histogram.py +6 -1
  17. territories_dashboard_lib/indicators_lib/query/indicator_card.py +12 -7
  18. territories_dashboard_lib/indicators_lib/query/top_10.py +13 -12
  19. territories_dashboard_lib/indicators_lib/query/utils.py +9 -0
  20. territories_dashboard_lib/indicators_lib/table.py +15 -12
  21. territories_dashboard_lib/indicators_lib/views.py +49 -59
  22. territories_dashboard_lib/superset_lib/logic.py +24 -25
  23. territories_dashboard_lib/superset_lib/migrations/0002_alter_filter_mesh.py +18 -0
  24. territories_dashboard_lib/tracking_lib/enums.py +1 -0
  25. territories_dashboard_lib/tracking_lib/migrations/0005_alter_page_cmp_territory_mesh_alter_page_submesh_and_more.py +28 -0
  26. territories_dashboard_lib/tracking_lib/migrations/0006_alter_event_name.py +18 -0
  27. territories_dashboard_lib/tracking_lib/payloads.py +4 -2
  28. territories_dashboard_lib/tracking_lib/views.py +7 -6
  29. territories_dashboard_lib/website_lib/conf.py +28 -0
  30. territories_dashboard_lib/website_lib/context_processors.py +5 -6
  31. territories_dashboard_lib/website_lib/migrations/0005_mainconf_meshes.py +20 -0
  32. territories_dashboard_lib/website_lib/models.py +12 -0
  33. territories_dashboard_lib/website_lib/params.py +34 -22
  34. territories_dashboard_lib/website_lib/serializers.py +1 -0
  35. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/anchor.mjs +45 -0
  36. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/page.mjs +5 -9
  37. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/histogram.mjs +4 -1
  38. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/page.mjs +2 -7
  39. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/proportions.mjs +3 -2
  40. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/top10.mjs +4 -2
  41. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/utils.mjs +14 -5
  42. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/dom.mjs +0 -15
  43. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/enums.mjs +13 -10
  44. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/side_panel.mjs +1 -15
  45. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/page.mjs +5 -9
  46. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/indicatorMap.bundle.js +1 -1
  47. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/sankeyGraph.bundle.js +1 -1
  48. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/vendors.bundle.js +1 -1
  49. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css +12 -0
  50. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/header.html +1 -1
  51. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/page.html +4 -3
  52. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/anchor.html +14 -0
  53. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.html +3 -3
  54. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.html +14 -8
  55. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/select_territory.html +32 -0
  56. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html +8 -35
  57. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/histogram.html +1 -0
  58. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/no-data.html +1 -0
  59. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/proportions.html +1 -0
  60. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/top10.html +1 -0
  61. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/map.css +3 -2
  62. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.css +8 -0
  63. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.html +9 -8
  64. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/methodo.js +28 -0
  65. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/page.html +40 -0
  66. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/page.html +4 -3
  67. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/sitemap/page.html +9 -0
  68. territories_dashboard_lib/website_lib/templatetags/other_filters.py +6 -3
  69. territories_dashboard_lib/website_lib/views.py +100 -0
  70. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/METADATA +3 -3
  71. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/RECORD +74 -62
  72. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css +0 -29
  73. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html +0 -45
  74. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.js +0 -19
  75. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/WHEEL +0 -0
  76. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/licenses/licence.md +0 -0
  77. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/top_level.txt +0 -0
@@ -60,6 +60,10 @@
60
60
  background: var(--background-alt-blue-france);
61
61
  }
62
62
 
63
+ .tdbmd-thematics .subtheme:nth-child(even) h2 button.anchor-link:hover {
64
+ background-color: #fafafa;
65
+ }
66
+
63
67
  .tdbmd-thematics .subtheme:nth-child(odd) {
64
68
  background: white;
65
69
  }
@@ -75,6 +79,14 @@
75
79
  margin: 0 1rem;
76
80
  }
77
81
 
82
+ .no-link::after {
83
+ content: none;
84
+ }
85
+
86
+ .no-link {
87
+ background-image: none;
88
+ }
89
+
78
90
  @media (min-width: 575px) {
79
91
  .tdbmd-thematics__btns {
80
92
  flex-direction: row;
@@ -36,7 +36,7 @@
36
36
  <p class="fr-header__service-title">
37
37
  {{ main_conf.title }}
38
38
  {% if ENVIRONMENT != "prd" %}
39
- <span class="fr-badge fr-badge--success fr-badge--no-icon" id="fr-badge-:Rj5ikq:">{% if ENVIRONMENT == "ppd" %}PREPROD{% else %}DEV{% endif %}</span>
39
+ <span class="fr-badge fr-badge--success fr-badge--no-icon" id="fr-badge-:Rj5ikq:">{% if ENVIRONMENT == "ppd" %}PREPROD{% elif ENVIRONMENT == "ppd-beta" %}BETA{% else %}DEV{% endif %}</span>
40
40
  {% endif %}
41
41
  </p>
42
42
  </div>
@@ -23,7 +23,6 @@
23
23
  {% include "territories_dashboard_lib/website/pages/indicators/components/indicator-card.css" %}
24
24
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.css" %}
25
25
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel.css" %}
26
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css" %}
27
26
  {% endblock %}
28
27
 
29
28
 
@@ -46,7 +45,10 @@
46
45
  id="{{sub_theme.name}}"
47
46
  class="subtheme fr-pr-md-4w fr-pl-md-4w fr-pr-2w fr-pl-2w fr-pt-5w fr-pb-5w"
48
47
  >
49
- <h2>{{ sub_theme.title }}</h2>
48
+ <h2>
49
+ {{ sub_theme.title }}
50
+ {% include "territories_dashboard_lib/website/pages/indicators/components/anchor.html" with anchor=sub_theme.name only %}
51
+ </h2>
50
52
  {% for indicator in sub_theme.indicators %}
51
53
  {% with indicator.id|stringformat:"i"|add:"-api-urls" as script_name %}
52
54
  {{ indicator|indicator_api_urls|json_script:script_name }}
@@ -56,7 +58,6 @@
56
58
  </div>
57
59
  {% endfor %}
58
60
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html" %}
59
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html" %}
60
61
  </div>
61
62
  </main>
62
63
  </div>
@@ -0,0 +1,14 @@
1
+ <button
2
+ class="fr-btn--tooltip fr-btn fr-btn--sm fr-icon-link fr-btn--tertiary-no-outline anchor-link"
3
+ title="copier le lien"
4
+ data-anchor="{{anchor}}"
5
+ type="button"
6
+ aria-describedby="copy-tooltip-{{anchor}}"
7
+ {% if indicator %}
8
+ data-indicator="{{ indicator.name }}"
9
+ data-track="true"
10
+ {% endif %}
11
+ ></button>
12
+ <span class="fr-tooltip fr-placement" id="copy-tooltip-{{anchor}}" role="tooltip">
13
+ Lien copié
14
+ </span>
@@ -42,7 +42,7 @@
42
42
  >
43
43
  <span class="tdbmd-mesh__btn-title fr-text--xs">Maille</span>
44
44
  <span class="tdbmd-mesh__btn-mesh">
45
- {{ params.meshes_titles|get_item:params.mesh }}
45
+ {{ params.meshes_short_titles|get_item:params.mesh }}
46
46
  </span>
47
47
  </button>
48
48
  <ul
@@ -60,9 +60,9 @@
60
60
  class="fr-btn fr-btn--tertiary-no-outline tdbmd-mesh__list-btn
61
61
  {% if m == params.mesh %}tdbmd-mesh__list-btn--current{% endif %}
62
62
  "
63
- aria-label="Sélectionnez {{ params.meshes_titles|get_item:m }}"
63
+ aria-label="Sélectionnez {{ params.meshes_short_titles|get_item:m }}"
64
64
  >
65
- {{ params.meshes_titles|get_item:m }}
65
+ {{ params.meshes_short_titles|get_item:m }}
66
66
  </button>
67
67
  </li>
68
68
  {% endfor %}
@@ -4,9 +4,12 @@
4
4
  data-indicator="{{ indicator.id }}"
5
5
  >
6
6
  {{ indicator|json_script:indicator.id }}
7
- <div class="fr-col-12">
7
+ <div id="{{indicator.name}}" class="fr-col-12">
8
8
  <div class="tdbmd-indicator-card fr-p-3w fr-mt-md-5w fr-mt-3w">
9
- <h3 class="fr-h6">{{indicator.title}}</h3>
9
+ <h3 class="fr-h6">
10
+ {{indicator.title}}
11
+ {% include "territories_dashboard_lib/website/pages/indicators/components/anchor.html" with anchor=indicator.name indicator=indicator only %}
12
+ </h3>
10
13
  <p>{{indicator.description}}</p>
11
14
  {% if indicator.source %}
12
15
  <p class="tdbmd-indicator-source">
@@ -15,13 +18,16 @@
15
18
  {{indicator.source}}
16
19
  </p>
17
20
  {% endif %}
18
- <button
19
- class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-line fr-btn--icon-right"
20
- aria-label="Fiche méthodologique - {{ indicator.title }}"
21
- aria-controls="slide-panel-methodo"
21
+ <a
22
+ href="{% url 'website:indicator-methodo' indicator_name=indicator.name %}"
23
+ aria-label="Accéder à la fiche méthodologique - {{ indicator.title }} - nouvel onglet"
24
+ target="_blank"
25
+ class="no-link"
22
26
  >
23
- Fiche méthodologique
24
- </button>
27
+ <button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-line fr-btn--icon-right">
28
+ Fiche méthodologique
29
+ </button>
30
+ </a>
25
31
  <div class="fr-tag-list fr-mt-4w" role="group" aria-label="Filtres disponibles">
26
32
  {% for dimension_filters in indicator.filters %}
27
33
  <div class="filters-dimension">
@@ -0,0 +1,32 @@
1
+ <div id="tabpanel-{{ key }}-panel" class="fr-tabs__panel tdbmbd-tabpanel-panel {% if selected %}fr-tabs__panel--selected{% endif %}" role="tabpanel" aria-labelledby="tabpanel-{{ key }}" tabindex="0" style="transition: none;">
2
+ <h2>
3
+ {{ title }}
4
+ </h2>
5
+ <div class="fr-input-group autocomplete-input">
6
+ <label id="territories-label-{{ key }}" class="fr-label" for="search-territories-{{ key }}">Sélectionner un territoire</label>
7
+ <div class="fr-input-wrap fr-input-wrap--addon">
8
+ <input
9
+ data-mesh="{{ key }}"
10
+ id="search-territories-{{ key }}" class="fr-input search-territory-input" aria-autocomplete="list" aria-controls="territories-menu-{{ key }}" aria-expanded="false" aria-labelledby="territories-label-{{ key }}" autocomplete="off" role="combobox" type="text"
11
+ ></input>
12
+ <button class="fr-btn fr-icon-arrow-down-s-line autocomplete-btn" aria-controls="territories-menu-{{ key }}" aria-expanded="false" tabindex="-1" title="Sélectionner un territoire">
13
+ </button>
14
+ </div>
15
+ </div>
16
+ <ul id="territories-menu-{{ key }}" data-mesh="{{ key }}" class="tdbmd-combobox-suggestions" role="listbox">
17
+ <li data-type="load"><button onclick="loadMoreTerritories(this)" data-mesh="{{ key }}" class="fr-btn fr-btn--secondary fr-btn--sm">Charger plus de résultats</button></li>
18
+ </ul>
19
+ <input id="selected-territory-id-{{ key }}" type="hidden">
20
+ <input id="selected-territory-mesh-{{ key }}" type="hidden">
21
+ <input id="selected-territory-raw-name-{{ key }}" type="hidden">
22
+ <button
23
+ id="selected-territory-validate-{{ key }}"
24
+ data-mesh="{{ key }}"
25
+ disabled
26
+ class="fr-btn validate-territory-btn"
27
+ onclick="validateTerritory(this)"
28
+ >
29
+ Valider
30
+ </button>
31
+ <em id="selected-territory-name-{{ key }}"></em>
32
+ </div>
@@ -11,7 +11,7 @@
11
11
  <div id="geo_side_panel" class="tdbmd-territory-tabs" style="margin-top: 32px;">
12
12
  <div class="fr-tabs fr-transition-none">
13
13
  <ul class="fr-tabs__list" role="tablist">
14
- {% for m in params.all_meshes %}
14
+ {% for m in params.ordered_meshes %}
15
15
  <li role="presentation">
16
16
  <button
17
17
  id="tabpanel-{{ m }}"
@@ -25,44 +25,17 @@
25
25
  {% endif %}
26
26
  role="tab"
27
27
  aria-controls="tabpanel-{{ m }}-panel">
28
- {{ params.meshes_titles|get_item:m }}
28
+ {{ params.meshes_short_titles|get_item:m }}
29
29
  </button>
30
30
  </li>
31
31
  {% endfor %}
32
32
  </ul>
33
- {% for m in params.all_meshes %}
34
- <div id="tabpanel-{{ m }}-panel" class="fr-tabs__panel tdbmbd-tabpanel-panel {% if m == params.territory_mesh %}fr-tabs__panel--selected{% endif %}" role="tabpanel" aria-labelledby="tabpanel-{{ m }}" tabindex="0" style="transition: none;">
35
- <h2>
36
- {{ params.meshes_titles|get_item:m }}
37
- </h2>
38
- <div class="fr-input-group autocomplete-input">
39
- <label id="territories-label-{{ m }}" class="fr-label" for="search-territories-{{ m }}">Sélectionner un territoire</label>
40
- <div class="fr-input-wrap fr-input-wrap--addon">
41
- <input
42
- data-mesh="{{ m }}"
43
- id="search-territories-{{ m }}" class="fr-input search-territory-input" aria-autocomplete="list" aria-controls="territories-menu-{{ m }}" aria-expanded="false" aria-labelledby="territories-label-{{ m }}" autocomplete="off" role="combobox" type="text"
44
- ></input>
45
- <button class="fr-btn fr-icon-arrow-down-s-line autocomplete-btn" aria-controls="territories-menu-{{ m }}" aria-expanded="false" tabindex="-1" title="Sélectionner un territoire">
46
- </button>
47
- </div>
48
- </div>
49
- <ul id="territories-menu-{{ m }}" data-mesh="{{ m }}" class="tdbmd-combobox-suggestions" role="listbox">
50
- <li data-type="load"><button onclick="loadMoreTerritories(this)" data-mesh="{{ m }}" class="fr-btn fr-btn--secondary fr-btn--sm">Charger plus de résultats</button></li>
51
- </ul>
52
- <input id="selected-territory-id-{{ m }}" type="hidden">
53
- <input id="selected-territory-mesh-{{ m }}" type="hidden">
54
- <input id="selected-territory-raw-name-{{ m }}" type="hidden">
55
- <button
56
- id="selected-territory-validate-{{ m }}"
57
- data-mesh="{{ m }}"
58
- disabled
59
- class="fr-btn validate-territory-btn"
60
- onclick="validateTerritory(this)"
61
- >
62
- Valider
63
- </button>
64
- <em id="selected-territory-name-{{ m }}"></em>
65
- </div>
33
+ {% for m in params.ordered_meshes %}
34
+ {% if m == params.territory_mesh %}
35
+ {% include "./select_territory.html" with selected=True key=m title=params.meshes_long_titles|get_item:m%}
36
+ {% else %}
37
+ {% include "./select_territory.html" with selected=False key=m title=params.meshes_long_titles|get_item:m%}
38
+ {% endif %}
66
39
  {% endfor %}
67
40
  </div>
68
41
  <div class="side-panel-last-close-button-container">
@@ -7,6 +7,7 @@
7
7
  <div style="width:100%; height: 400px;">
8
8
  <canvas id="histogramChart" aria-describedby="histogram-export-csv"></canvas>
9
9
  </div>
10
+ {% include "./no-data.html" %}
10
11
  {% include "./filters-reminder.html" %}
11
12
  </div>
12
13
  {% include "territories_dashboard_lib/website/pages/indicators/components/chart-buttons.html" with name="Répartition par valeurs" route="histogram" one_indicator=True tracking_objet="repartition-valeurs" %}
@@ -0,0 +1 @@
1
+ <div class="no-data-message">Il n'y a pas assez de données pour afficher le graphique.</div>
@@ -8,6 +8,7 @@
8
8
  <div style="width:100%; height: auto;">
9
9
  <canvas id="proportionsChart" aria-describedby="proportions-export-csv"></canvas>
10
10
  </div>
11
+ {% include "./no-data.html" %}
11
12
  {% include "./filters-reminder.html" %}
12
13
  </div>
13
14
  {% include "territories_dashboard_lib/website/pages/indicators/components/chart-buttons.html" with name="Répartition par dimensions" route="proportions" pattern="show" one_indicator=True tracking_objet="repartition-dimension" %}
@@ -7,6 +7,7 @@
7
7
  <div style="width:100%; height: auto;">
8
8
  <canvas id="top10Chart" aria-describedby="top-10-export-csv"></canvas>
9
9
  </div>
10
+ {% include "./no-data.html" %}
10
11
  {% include "./filters-reminder.html" %}
11
12
  </div>
12
13
  {% include "territories_dashboard_lib/website/pages/indicators/components/chart-buttons.html" with name="Top 10" route="top-10" pattern="show" one_indicator=True tracking_objet="top_10" %}
@@ -326,6 +326,7 @@
326
326
  bottom: 8px;
327
327
  right: 8px;
328
328
  font-size: 0.6rem;
329
- background-color: rgba(255, 255, 255, 0.4);
330
- padding: 4px;
329
+ background-color: rgba(255, 255, 255, 0.9);
330
+ padding: 8px 16px 0px 16px;
331
+ border-radius: 4px;
331
332
  }
@@ -11,3 +11,11 @@
11
11
  pointer-events: none;
12
12
  font-size: 12px;
13
13
  }
14
+
15
+ .no-data-message {
16
+ display: none;
17
+ }
18
+
19
+ .no-data-message[data-show="true"] {
20
+ display: block;
21
+ }
@@ -39,7 +39,6 @@
39
39
  {% include "territories_dashboard_lib/website/pages/indicators/components/themes-list.css" %}
40
40
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.css" %}
41
41
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel.css" %}
42
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css" %}
43
42
  {% include "territories_dashboard_lib/website/pages/indicators/details/components/filters-reminder.css" %}
44
43
  {% include "territories_dashboard_lib/website/pages/indicators/components/chart-buttons.css" %}
45
44
  {% include "territories_dashboard_lib/website/pages/indicators/details/components/table.css" %}
@@ -85,13 +84,16 @@
85
84
  {{indicator.source}}
86
85
  </p>
87
86
  {% endif %}
88
- <button
89
- class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-line fr-btn--icon-right"
90
- aria-label="Afficher la fiche méthodologique dans la barre latérale"
91
- aria-controls="slide-panel-methodo"
87
+ <a
88
+ href="{% url 'website:indicator-methodo' indicator_name=indicator.name %}"
89
+ aria-label="Accéder à la fiche méthodologique - {{ indicator.title }} - nouvel onglet"
90
+ target="_blank"
91
+ class="no-link"
92
92
  >
93
- Fiche méthodologique
94
- </button>
93
+ <button class="fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-line fr-btn--icon-right">
94
+ Fiche méthodologique
95
+ </button>
96
+ </a>
95
97
  </div>
96
98
  <div class="fr-px-md-4w fr-px-2w">
97
99
  <div id="filtres" class="fr-tag-list fr-mt-4w" role="group" aria-label="Filtres disponibles">
@@ -127,7 +129,6 @@
127
129
  {% include "./components/table-flows.html" %}
128
130
  </div>
129
131
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html" %}
130
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html" %}
131
132
  </div>
132
133
  </div>
133
134
  </div>
@@ -0,0 +1,28 @@
1
+ function getIndicator() {
2
+ return JSON.parse(document.getElementById("indicator-js").textContent);
3
+ }
4
+
5
+ async function downloadMethodo() {
6
+ const indicator = getIndicator();
7
+ const response = await fetch(`/api/indicators/${indicator.name}/methodo/`);
8
+
9
+ if (!response.ok) {
10
+ throw new Error("Failed to fetch the PDF file.");
11
+ }
12
+
13
+ // Create a download link
14
+ const blob = await response.blob();
15
+ const url = window.URL.createObjectURL(blob);
16
+ const a = document.createElement("a");
17
+ a.href = url;
18
+ a.download = `${indicator.title}.pdf`;
19
+ a.click();
20
+ window.URL.revokeObjectURL(url);
21
+ }
22
+
23
+ document.addEventListener("DOMContentLoaded", () => {
24
+ const buttons = document.querySelectorAll(".methodo-export-button");
25
+ buttons.forEach((button) => {
26
+ button.addEventListener("click", downloadMethodo);
27
+ });
28
+ });
@@ -0,0 +1,40 @@
1
+ {% extends "territories_dashboard_lib/website/layout/base.html" %}
2
+
3
+ {% load static %}
4
+ {% load other_filters %}
5
+
6
+ {% block page_title %}Méthodologie : {{indicator.title}}{% endblock %}
7
+
8
+ {% block extra_head %}
9
+ {{ indicator|json_script:"indicator-js" }}
10
+ <script>{% include "./methodo.js" %}</script>
11
+ {% endblock %}
12
+
13
+ {% block main %}
14
+ <div class="fr-container fr-pt-5w fr-pb-10w">
15
+ <nav role="navigation" class="fr-breadcrumb" aria-label="vous êtes ici :">
16
+ <button class="fr-breadcrumb__button" aria-expanded="false" aria-controls="breadcrumb-1">Voir le fil d’Ariane</button>
17
+ <div class="fr-collapse" id="breadcrumb-1">
18
+ <ol class="fr-breadcrumb__list">
19
+ <li>
20
+ <a class="fr-breadcrumb__link" href="/">Accueil</a>
21
+ </li>
22
+ <li>
23
+ <a class="fr-breadcrumb__link" href="{% url 'website:theme' theme_name=theme.name %}">{{theme.title}}</a>
24
+ </li>
25
+ <li>
26
+ <a class="fr-breadcrumb__link" href="{% url 'website:indicator-details' indicator_name=indicator.name %}">{{indicator.title}}</a>
27
+ </li>
28
+ <li>
29
+ <a class="fr-breadcrumb__link" aria-current="page">Méthodologie</a>
30
+ </li>
31
+ </ol>
32
+ </div>
33
+ </nav>
34
+ <h1>Fiche méthodologique : {{ indicator.title }}</h1>
35
+ <p>Thématique : {{ indicator.theme }}</p>
36
+ <button class="methodo-export-button fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-pdf-line fr-btn--icon-right fr-mb-4w">Exporter la fiche méthodologique</button>
37
+ <div class="tdbmd-markdown">{{ indicator.methodo_html | safe }}</div>
38
+ <button class="methodo-export-button fr-btn fr-btn--secondary fr-btn--sm fr-icon-file-pdf-line fr-btn--icon-right">Exporter la fiche méthodologique</button>
39
+ </div>
40
+ {% endblock %}
@@ -24,7 +24,6 @@
24
24
  {% include "territories_dashboard_lib/website/pages/indicators/components/indicator-card.css" %}
25
25
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.css" %}
26
26
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel.css" %}
27
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css" %}
28
27
  {% endblock %}
29
28
 
30
29
 
@@ -61,7 +60,10 @@
61
60
  id="{{sub_theme.name}}"
62
61
  class="subtheme fr-pr-md-4w fr-pl-md-4w fr-pr-2w fr-pl-2w fr-pt-5w fr-pb-5w"
63
62
  >
64
- <h2>{{ sub_theme.title }}</h2>
63
+ <h2>
64
+ {{ sub_theme.title }}
65
+ {% include "territories_dashboard_lib/website/pages/indicators/components/anchor.html" with anchor=sub_theme.name only %}
66
+ </h2>
65
67
  {% for indicator in sub_theme.indicators %}
66
68
  {% with indicator.id|stringformat:"i"|add:"-api-urls" as script_name %}
67
69
  {{ indicator|indicator_api_urls|json_script:script_name }}
@@ -71,7 +73,6 @@
71
73
  </section>
72
74
  {% endfor %}
73
75
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html" %}
74
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html" %}
75
76
  </div>
76
77
  </main>
77
78
  </div>
@@ -40,6 +40,15 @@
40
40
  {% endfor %}
41
41
  </ul>
42
42
  <br/>
43
+ <h3>Fiches méthodologiques</h3>
44
+ <ul>
45
+ {% for indicator in indicators %}
46
+ <li>
47
+ <a href="{% url 'website:indicator-methodo' indicator_name=indicator.name %}">Méthodologie : {{indicator.title}}</a>
48
+ </li>
49
+ {% endfor %}
50
+ </ul>
51
+ <br/>
43
52
  {% if ENABLE_SUPERSET and dashboards %}
44
53
  <h3>Portraits de territoires</h3>
45
54
  <ul>
@@ -1,6 +1,7 @@
1
1
  from django import template
2
2
  from django.urls import reverse
3
- from territories_dashboard_lib.indicators_lib.enums import get_all_meshes
3
+
4
+ from territories_dashboard_lib.website_lib.conf import get_meshes_for_current_project
4
5
 
5
6
  register = template.Library()
6
7
 
@@ -33,6 +34,8 @@ def indicator_api_urls(indicator_dict):
33
34
 
34
35
  @register.filter
35
36
  def should_mesh_analysis(params, indicator):
36
- meshes = get_all_meshes()
37
- above_min_mesh = meshes.index(params["mesh"]) <= meshes.index(indicator["min_mesh"])
37
+ all_meshes = get_meshes_for_current_project()
38
+ above_min_mesh = all_meshes.index(params["mesh"]) <= all_meshes.index(
39
+ indicator["min_mesh"]
40
+ )
38
41
  return above_min_mesh
@@ -1,3 +1,5 @@
1
+ from django.conf import settings
2
+ from django.http import HttpResponse
1
3
  from django.shortcuts import get_object_or_404, redirect, render
2
4
  from django.urls import reverse
3
5
  from django.views.decorators.gzip import gzip_page
@@ -160,6 +162,28 @@ def indicator_details_view(request, *, indicator_name, context):
160
162
  return response
161
163
 
162
164
 
165
+ @gzip_page
166
+ def indicator_methodo_view(request, *, indicator_name):
167
+ indicator = get_object_or_404(Indicator, name=indicator_name)
168
+ theme = indicator.sub_theme.theme
169
+ context = {
170
+ "indicator": serialize_indicator(indicator),
171
+ "theme": theme,
172
+ }
173
+ response = render(
174
+ request,
175
+ "territories_dashboard_lib/website/pages/indicators/methodo/page.html",
176
+ context,
177
+ )
178
+ response = track_page(
179
+ request=request,
180
+ response=response,
181
+ indicator=indicator,
182
+ theme=theme,
183
+ )
184
+ return response
185
+
186
+
163
187
  @with_params
164
188
  def superset_view(request, dashboard_name, context):
165
189
  dashboard = get_object_or_404(Dashboard, short_name=dashboard_name)
@@ -210,3 +234,79 @@ def sitemap_view(request):
210
234
  )
211
235
  response = track_page(request=request, response=response)
212
236
  return response
237
+
238
+
239
+ def _get_base_url(request):
240
+ return (
241
+ settings.BASE_URL
242
+ if hasattr(settings, "BASE_URL")
243
+ else request.build_absolute_uri("/")[:-1]
244
+ )
245
+
246
+
247
+ def raw_sitemap_view(request):
248
+ """Generate XML sitemap for search engines."""
249
+ base_url = _get_base_url(request)
250
+
251
+ urls = []
252
+
253
+ # Landing page
254
+ urls.append(f"{base_url}{reverse('website:landing-page')}")
255
+
256
+ # Theme pages
257
+ for theme in Theme.objects.all().order_by("ordering"):
258
+ urls.append(
259
+ f"{base_url}{reverse('website:theme', kwargs={'theme_name': theme.name})}"
260
+ )
261
+
262
+ # Comparison pages
263
+ for theme in Theme.objects.all().order_by("ordering"):
264
+ urls.append(
265
+ f"{base_url}{reverse('website:comparison', kwargs={'theme_name': theme.name})}"
266
+ )
267
+
268
+ # Indicator detail pages
269
+ for indicator in Indicator.objects.all().order_by("index_in_theme"):
270
+ urls.append(
271
+ f"{base_url}{reverse('website:indicator-details', kwargs={'indicator_name': indicator.name})}"
272
+ )
273
+ # Indicator methodology pages
274
+ urls.append(
275
+ f"{base_url}{reverse('website:indicator-methodo', kwargs={'indicator_name': indicator.name})}"
276
+ )
277
+
278
+ # Static pages
279
+ for static_page in StaticPage.objects.all():
280
+ urls.append(
281
+ f"{base_url}{reverse('website:static-page', kwargs={'page_url': static_page.url})}"
282
+ )
283
+
284
+ # Lexique page (if glossary items exist)
285
+ if GlossaryItem.objects.exists():
286
+ urls.append(f"{base_url}{reverse('website:lexique')}")
287
+
288
+ # Sitemap page itself
289
+ urls.append(f"{base_url}{reverse('website:sitemap')}")
290
+
291
+ # Generate XML
292
+ xml_lines = [
293
+ '<?xml version="1.0" encoding="UTF-8"?>',
294
+ '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
295
+ ]
296
+
297
+ for url in urls:
298
+ xml_lines.append(" <url>")
299
+ xml_lines.append(f" <loc>{url}</loc>")
300
+ xml_lines.append(" </url>")
301
+
302
+ xml_lines.append("</urlset>")
303
+
304
+ xml_content = "\n".join(xml_lines)
305
+
306
+ return HttpResponse(xml_content, content_type="application/xml")
307
+
308
+
309
+ def robots_txt_view(request):
310
+ base_url = _get_base_url(request)
311
+ text_content = f"User-agent: *\nSitemap: {base_url}/sitemap.xml"
312
+ return HttpResponse(text_content, content_type="text/plain")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: territories-dashboard-lib
3
- Version: 0.1.33b1
3
+ Version: 1.1.1.dev7
4
4
  Summary: Librairie pour la visualisation d'indicateurs territoriaux.
5
5
  Author-email: Bastien <bastien@prune.sh>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -8,10 +8,10 @@ Classifier: Operating System :: OS Independent
8
8
  Classifier: Development Status :: 3 - Alpha
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: Topic :: Software Development :: Libraries
11
- Requires-Python: >=3.13
11
+ Requires-Python: <3.14,>=3.13
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: licence.md
14
- Requires-Dist: django>=5.1.6
14
+ Requires-Dist: django<6
15
15
  Requires-Dist: django-nested-admin>=4.1.1
16
16
  Requires-Dist: geoip2>=5.1.0
17
17
  Requires-Dist: gunicorn>=23.0.0