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.
- territories_dashboard_lib/geo_lib/admin.py +2 -0
- territories_dashboard_lib/geo_lib/migrations/0003_geofeature_color_column_geofeature_size_column.py +23 -0
- territories_dashboard_lib/geo_lib/models.py +12 -0
- territories_dashboard_lib/geo_lib/payloads.py +7 -21
- territories_dashboard_lib/geo_lib/views.py +58 -53
- territories_dashboard_lib/indicators_lib/enums.py +61 -37
- territories_dashboard_lib/indicators_lib/migrations/0004_alter_indicator_min_mesh.py +18 -0
- territories_dashboard_lib/indicators_lib/migrations/0005_auto_20251203_1621.py +2 -2
- territories_dashboard_lib/indicators_lib/models.py +9 -6
- territories_dashboard_lib/indicators_lib/payloads.py +14 -1
- territories_dashboard_lib/indicators_lib/query/commons.py +90 -104
- territories_dashboard_lib/indicators_lib/query/comparison.py +8 -3
- territories_dashboard_lib/indicators_lib/query/details.py +8 -13
- territories_dashboard_lib/indicators_lib/query/histogram.py +0 -1
- territories_dashboard_lib/indicators_lib/query/indicator_card.py +12 -7
- territories_dashboard_lib/indicators_lib/query/top_10.py +12 -12
- territories_dashboard_lib/indicators_lib/query/utils.py +9 -0
- territories_dashboard_lib/indicators_lib/table.py +15 -12
- territories_dashboard_lib/indicators_lib/views.py +49 -59
- territories_dashboard_lib/superset_lib/logic.py +24 -25
- territories_dashboard_lib/superset_lib/migrations/0002_alter_filter_mesh.py +18 -0
- territories_dashboard_lib/tracking_lib/enums.py +2 -0
- territories_dashboard_lib/tracking_lib/migrations/0005_alter_page_cmp_territory_mesh_alter_page_submesh_and_more.py +28 -0
- territories_dashboard_lib/tracking_lib/migrations/0006_alter_event_name.py +18 -0
- territories_dashboard_lib/tracking_lib/payloads.py +4 -2
- territories_dashboard_lib/tracking_lib/views.py +7 -6
- territories_dashboard_lib/website_lib/conf.py +14 -0
- territories_dashboard_lib/website_lib/context_processors.py +2 -1
- territories_dashboard_lib/website_lib/migrations/0005_mainconf_meshes.py +20 -0
- territories_dashboard_lib/website_lib/models.py +12 -0
- territories_dashboard_lib/website_lib/params.py +34 -22
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/anchor.mjs +43 -0
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/page.mjs +7 -9
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/page.mjs +2 -7
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/dom.mjs +0 -15
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/enums.mjs +13 -10
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/side_panel.mjs +1 -15
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/page.mjs +7 -9
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/track-visible-indicators.mjs +121 -0
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/indicatorMap.bundle.js +2 -0
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/sankeyGraph.bundle.js +2 -0
- territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/vendors.bundle.js +2 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css +12 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/page.html +4 -3
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/anchor.html +14 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.html +3 -3
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.html +14 -8
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/select_territory.html +32 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html +8 -35
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/histogram.html +1 -1
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.html +9 -8
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/methodo.js +28 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/page.html +40 -0
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/page.html +4 -5
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/sitemap/page.html +9 -0
- territories_dashboard_lib/website_lib/templatetags/other_filters.py +6 -3
- territories_dashboard_lib/website_lib/views.py +100 -0
- {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/METADATA +2 -2
- {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/RECORD +62 -51
- territories_dashboard_lib/indicators_lib/migrations/0006_alter_theme_action_theme_alter_theme_objectif_theme.py +0 -23
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css +0 -29
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html +0 -45
- territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.js +0 -19
- {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/WHEEL +0 -0
- {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/licenses/licence.md +0 -0
- {territories_dashboard_lib-0.1.39b2.dist-info → territories_dashboard_lib-1.1.1.dev10.dist-info}/top_level.txt +0 -0
territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css
CHANGED
|
@@ -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>
|
|
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.
|
|
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.
|
|
63
|
+
aria-label="Sélectionnez {{ params.meshes_short_titles|get_item:m }}"
|
|
64
64
|
>
|
|
65
|
-
{{ params.
|
|
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">
|
|
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
|
-
<
|
|
19
|
-
|
|
20
|
-
aria-label="
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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
|
-
<
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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>
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
above_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:
|
|
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
|
|
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
|