territories-dashboard-lib 0.1.39b2__py3-none-any.whl → 1.1.1.dev10__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.

Potentially problematic release.


This version of territories-dashboard-lib might be problematic. Click here for more details.

Files changed (66) hide show
  1. territories_dashboard_lib/geo_lib/admin.py +2 -0
  2. territories_dashboard_lib/geo_lib/migrations/0003_geofeature_color_column_geofeature_size_column.py +23 -0
  3. territories_dashboard_lib/geo_lib/models.py +12 -0
  4. territories_dashboard_lib/geo_lib/payloads.py +7 -21
  5. territories_dashboard_lib/geo_lib/views.py +58 -53
  6. territories_dashboard_lib/indicators_lib/enums.py +61 -37
  7. territories_dashboard_lib/indicators_lib/migrations/0004_alter_indicator_min_mesh.py +18 -0
  8. territories_dashboard_lib/indicators_lib/migrations/0005_auto_20251203_1621.py +2 -2
  9. territories_dashboard_lib/indicators_lib/models.py +9 -6
  10. territories_dashboard_lib/indicators_lib/payloads.py +14 -1
  11. territories_dashboard_lib/indicators_lib/query/commons.py +90 -104
  12. territories_dashboard_lib/indicators_lib/query/comparison.py +8 -3
  13. territories_dashboard_lib/indicators_lib/query/details.py +8 -13
  14. territories_dashboard_lib/indicators_lib/query/histogram.py +0 -1
  15. territories_dashboard_lib/indicators_lib/query/indicator_card.py +12 -7
  16. territories_dashboard_lib/indicators_lib/query/top_10.py +12 -12
  17. territories_dashboard_lib/indicators_lib/query/utils.py +9 -0
  18. territories_dashboard_lib/indicators_lib/table.py +15 -12
  19. territories_dashboard_lib/indicators_lib/views.py +49 -59
  20. territories_dashboard_lib/superset_lib/logic.py +24 -25
  21. territories_dashboard_lib/superset_lib/migrations/0002_alter_filter_mesh.py +18 -0
  22. territories_dashboard_lib/tracking_lib/enums.py +2 -0
  23. territories_dashboard_lib/tracking_lib/migrations/0005_alter_page_cmp_territory_mesh_alter_page_submesh_and_more.py +28 -0
  24. territories_dashboard_lib/tracking_lib/migrations/0006_alter_event_name.py +18 -0
  25. territories_dashboard_lib/tracking_lib/payloads.py +4 -2
  26. territories_dashboard_lib/tracking_lib/views.py +7 -6
  27. territories_dashboard_lib/website_lib/conf.py +14 -0
  28. territories_dashboard_lib/website_lib/context_processors.py +2 -1
  29. territories_dashboard_lib/website_lib/migrations/0005_mainconf_meshes.py +20 -0
  30. territories_dashboard_lib/website_lib/models.py +12 -0
  31. territories_dashboard_lib/website_lib/params.py +34 -22
  32. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/anchor.mjs +43 -0
  33. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/page.mjs +7 -9
  34. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/page.mjs +2 -7
  35. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/dom.mjs +0 -15
  36. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/enums.mjs +13 -10
  37. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/side_panel.mjs +1 -15
  38. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/page.mjs +7 -9
  39. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/track-visible-indicators.mjs +121 -0
  40. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/indicatorMap.bundle.js +2 -0
  41. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/sankeyGraph.bundle.js +2 -0
  42. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/vendors.bundle.js +2 -0
  43. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css +12 -0
  44. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/page.html +4 -3
  45. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/anchor.html +14 -0
  46. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.html +3 -3
  47. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.html +14 -8
  48. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/select_territory.html +32 -0
  49. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html +8 -35
  50. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/histogram.html +1 -1
  51. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.html +9 -8
  52. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/methodo.js +28 -0
  53. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/page.html +40 -0
  54. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/page.html +4 -5
  55. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/sitemap/page.html +9 -0
  56. territories_dashboard_lib/website_lib/templatetags/other_filters.py +6 -3
  57. territories_dashboard_lib/website_lib/views.py +100 -0
  58. {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/METADATA +2 -2
  59. {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/RECORD +62 -51
  60. territories_dashboard_lib/indicators_lib/migrations/0006_alter_theme_action_theme_alter_theme_objectif_theme.py +0 -23
  61. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css +0 -29
  62. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html +0 -45
  63. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.js +0 -19
  64. {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/WHEEL +0 -0
  65. {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/licenses/licence.md +0 -0
  66. {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.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;
@@ -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">
@@ -3,7 +3,7 @@
3
3
  {% if params.mesh != params.territory_mesh and params|should_mesh_analysis:indicator %}
4
4
  <div id="histogramContainer" class="subtheme">
5
5
  <div class="fr-px-md-4w fr-px-2w fr-py-2w">
6
- {% include "territories_dashboard_lib/website/pages/indicators/components/title.html" with title="Répartition des territoires selon les valeurs de l'indicateur" key="repartition" text="Le nom des territoires s'affiche au survol s'il y a moins de 6 territoires. Précisions : Ce graphique varie selon la maille sélectionnée." %}
6
+ {% include "territories_dashboard_lib/website/pages/indicators/components/title.html" with title="Répartition des territoires selon les valeurs de l'indicateur" key="repartition" text="Le nom des territoires s'affiche au survol ds'il y a moins de 6 territoires. Précisions : Ce graphique varie selon la maille sélectionnée." %}
7
7
  <div style="width:100%; height: 400px;">
8
8
  <canvas id="histogramChart" aria-describedby="histogram-export-csv"></canvas>
9
9
  </div>
@@ -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
 
@@ -41,7 +40,6 @@
41
40
  <div>
42
41
  <div class="fr-pr-md-4w fr-pl-md-4w fr-pr-2w fr-pl-2w fr-mt-4w">
43
42
  <h1>{{ theme.title }}</h1>
44
- {% if theme.objectif_theme is not None and theme.action_theme is not None %}
45
43
  <div class="fr-grid-row">
46
44
  <div class="fr-col-12 fr-col-md-6">
47
45
  <p class="fr-text--sm fr-mb-0">
@@ -56,14 +54,16 @@
56
54
  <p class="fr-text--sm">{{ theme.action_theme }}</p>
57
55
  </div>
58
56
  </div>
59
- {% endif %}
60
57
  </div>
61
58
  {% for sub_theme in sub_themes %}
62
59
  <section
63
60
  id="{{sub_theme.name}}"
64
61
  class="subtheme fr-pr-md-4w fr-pl-md-4w fr-pr-2w fr-pl-2w fr-pt-5w fr-pb-5w"
65
62
  >
66
- <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>
67
67
  {% for indicator in sub_theme.indicators %}
68
68
  {% with indicator.id|stringformat:"i"|add:"-api-urls" as script_name %}
69
69
  {{ indicator|indicator_api_urls|json_script:script_name }}
@@ -73,7 +73,6 @@
73
73
  </section>
74
74
  {% endfor %}
75
75
  {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html" %}
76
- {% include "territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html" %}
77
76
  </div>
78
77
  </main>
79
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.39b2
3
+ Version: 1.1.1.dev10
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
@@ -11,7 +11,7 @@ Classifier: Topic :: Software Development :: Libraries
11
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