Ajouts déplacements + popovers avec les informations

Signed-off-by: Emmy D'Anello <ynerant@emy.lu>
This commit is contained in:
Emmy D'Anello 2023-04-21 12:06:48 +02:00
parent 2fcdac3dd9
commit aa5743e1e8
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
4 changed files with 335 additions and 24 deletions

View File

@ -1,16 +1,309 @@
{ {
"67": [ "05": {
{ "title": "Déplacements dans les Hautes-Alpes",
"date": "2023-04-19", "moves": [
"day_number": 2, {
"description": "Emmanuel Macron en déplacement Muttersholtz et à Sélestat dans le Bas-Rhin pour parler Jeux Olympiques" "day_number": 11,
} "description": "Marc Fesneau sera à Gap au salon de lélevage."
], }
"34": [ ]
{ },
"date": "2023-04-20", "14": {
"day_number": 3, "title": "Déplacements dans le Calvados",
"description": "Emmanuel Macron en déplacement à Ganges en Hérault pour parler éducation" "moves": [
} {
] "day_number": 5,
"description": " Mobilisation à Caen à 11h place Bouchard contre la venue de la caravane SNU."
}
]
},
"21": {
"title": "Déplacements en Côte d'Or",
"moves": [
{
"day_number": 3,
"cancelled": true,
"description": "Annulation de la venue dAgnès Firmin Le Bodo à la conférence sur le thème de la fin de vie à Dijon à la salle Devosges"
}
]
},
"25": {
"title": "Déplacements dans le Doubs",
"moves":
[
{
"day_number": 4,
"description": "Venue du ministre des armées Sébastien Lecornu à 17h rue Max Vuillemain à Besançon"
}
]
},
"26": {
"title": "Déplacements dans la Drôme",
"moves": [
{
"day_number": 3,
"cancelled": true,
"description": "Annulation de la visite d'Éric Dupond Moretti."
},
{
"day_number": 4,
"description": "Venue du ministre chargé de l'industrie Roland Lescure et de la ministre de la transition énergétique Agnès Pannier-Runacher sur le site de la centrale nucléaire du Tricastin."
}
]
},
"28": {
"title": "Déplacements en Eure-et-Loir",
"moves": [
{
"day_number": 1,
"description": "Comité d'accueil lors de la venue d'Olivier Dussopt pour la mise en œuvre de la réforme des retraites."
}
]
},
"31": {
"title": "Déplacements en Haute-Garonne",
"moves": [
{
"day_number": 4,
"description": "Annulation de la visite de Carole Grandjean à 11h au lycée hôtelier de Toulouse."
}
]
},
"33": {
"title": "Déplacements en Gironde",
"moves": [
{
"day_number": 0,
"cancelled": true,
"description": "Déplacement annulé de Darmanin et Fesneau à La-Teste-de-Buch sur les moyens dédiés à la lutte contre les incendies"
}
]
},
"34": {
"title": "Déplacements dans l'Hérault",
"moves": [
{
"day_number": 3,
"description": "Manifestation à la gare de Montpellier Saint-Roch contre la venue d'Emmanuel Macron dans l'Hérault."
},
{
"day_number": 3,
"description": "Emmanuel Macron en déplacement à Ganges pour parler éducation."
},
{
"day_number": 3,
"description": "Annulation du déplacement prévu d'Emmanuel Macron à Lunel."
}
]
},
"36": {
"title": "Déplacements dans l'Indre",
"moves": [
{
"day_number": 4,
"description": " Elisabeth Borne en déplacement à Valençay et à Châteauroux."
}
]
},
"39": {
"title": "Déplacements dans le Jura",
"moves": [
{
"day_number": 4,
"description": "Venue de la ministre à l'égalité hommes-femmes à Lons-le-Saunier. Comité de non-accueil organisé par l'intersyndicale."
}
]
},
"44": {
"title": "Déplacements en Loire-Atlantique",
"moves": [
{
"day_number": 2,
"cancelled": true,
"description": "Le village du SNU de Nantes plie bagage au bout d'1h et Sarah El Haïry renonce à venir faire un discours."
},
{
"day_number": 4,
"description": "Olivia Grégoire à la Baule à 8h30 et à Guérande à 9h40."
}
]
},
"47": {
"title":"Déplacements dans le Lot-et-Garonne",
"moves": [
{
"day_number": 2,
"description": "Casserolade et mise en sobriété énergétique du bar à Agen qui accueillait le ministre de la Transition Numérique Jean-Noël Barrot."
}
]
},
"57": {
"title": "Déplacements en Moselle",
"moves": [
{
"day_number": 1,
"cancelled": true,
"description": "Annulation de la participation de la ministre de la Culture Rima Abdul-Malak à Politéïa, le festival quelle avait décidé de marrainer"
}
]
},
"60": {
"title": "Déplacements dans l'Oise",
"moves": [
{
"day_number": 0,
"cancelled": true,
"description": "Jean-Christophe Combe, le ministre des Solidarités, de lAutonomie et des Personnes Handicapées, ne viendra pas à Chantilly."
}
]
},
"64": {
"title": "Déplacements dans les Pyrénées-Atlantiques",
"moves": [
{
"day_number": 4,
"description": "Gabriel Attal, repas officiel à la villa St Basil's dans le quartier Trespoey à Pau."
}
]
},
"67": {
"title": "Déplacements dans le Bas-Rhin",
"moves": [
{
"day_number": 2,
"description": "Emmanuel Macron en déplacement Muttersholtz et à Sélestat dans le Bas-Rhin pour parler Jeux Olympiques"
}
]
},
"71": {
"title": "Déplacements en Saône-et-Loire",
"moves": [
{
"day_number": 4,
"description": "Visite d'Olivier Dussopt à 9h à l'entreprise Margaritelli à Fontaines."
},
{
"day_number": 4,
"description": "Visite d'Olivier Dussopt à l'entreprise Novium à 14h à Montceau les Mines."
}
]
},
"72": {
"title": "Déplacements dans la Sarthe",
"moves": [
{
"day_number": 2,
"description": "Casserolades au Mans et en forêt de Bercé pour accueillir Christophe Béchu."
}
]
},
"80": {
"title": "Déplacements dans la Somme",
"moves": [
{
"day_number": 4,
"description": "Bruno Le Maire et Christophe Béchu en déplacement à Nesle."
}
]
},
"75": {
"title": "Déplacements à Paris",
"moves": [
{
"day_number": 15,
"cancelled": true,
"description": "Annulation de la visite dÉtat du président algérien."
},
{
"day_number": 1,
"description": " Comité de non accueil pour JC. Combe et G. Darrieussecq en visite à la CAF de Paris."
}
]
},
"77": {
"title": "Déplacements en Seine-et-Marne",
"moves": [
{
"day_number": 2,
"description": "Comité de non accueil pour la visite de Yaël Braun-Pivet au Centre Social et Culturel de Pontault-Combault."
},
{
"day_number": 12,
"description": " Caravane du SNU devant le centre commercial BAY 2 à Torcy."
}
]
},
"78": {
"title": "Déplacements dans les Yvelines",
"moves": [
{
"day_number": 3,
"description": "Comité de non accueil pour la ministre des sports Amélie Oudéa-Castéra vers l'Arena de Nanterre."
},
{
"day_number": 9,
"description": "Caravane du SNU Place Notre-Dame à Versailles."
}
]
},
"83": {
"title": "Déplacements dans le Var",
"moves": [
{
"day_number": 10,
"cancelled": true,
"description": "Le président de la République devait participer à une réunion à Toulon sur le thème du Service national universel (SNU). Il a finalement renoncé à ce projet en raison du contexte social."
},
{
"day_number": 3,
"description": "Olivier Véran en visite à Brignolles."
}
]
},
"90": {
"title": "Déplacements dans le Territoire de Belfort",
"moves": [
{
"day_number": 3,
"description": "Comité de non accueil pour Lecronu au 1er régiment d'artillerie à Bourogne, près de Belfort"
},
{
"day_number": 4,
"description": "Visite d'Olivier Becht, le ministre du commerce extérieur et de l'attractivité, à l'usine d'Alstom à Belfort en début d'après-midi"
}
]
},
"91": {
"title": "Déplacements dans l'Essonne",
"moves": [
{
"day_number": 1,
"cancelled": true,
"description": "Sylvie Retailleau annule sa venue à l'Université Paris Saclay où un bâtiment a été mis en sobriété énergétique."
}
]
},
"93": {
"title": "Déplacements en Seine-Saint-Denis",
"moves": [
{
"day_number": 4,
"cancelled": true,
"description": "Annulation de la participation d'Olivier Klein à lAssemblée Générale Ordinaire de lADIL de la Seine-Saint-Denis."
},
{
"day_number": 4,
"cancelled": true,
"description": "Annulation de la venue du ministre de la santé François Braun à Ville Evrard."
},
{
"day_number": 4,
"description": "Venue du ministre de la Santé François Braun à 13h30 au centre médical Cap Horn à Montreuil."
},
{
"day_number": 2,
"description": "Casserolades lors de la visite de la ministre Carole Grandjean au CFA des métiers du luxe à Pantin."
}
]
}
} }

View File

@ -34,9 +34,13 @@ def generate():
for event in day['events']: for event in day['events']:
for medium in event['media']: for medium in event['media']:
if 'subtitles_link' in medium: if 'subtitles_link' in medium:
dest_file = os.path.join('output/subtitles', medium['subtitles_file'])
if os.path.isfile(dest_file):
continue
req = requests.get(medium['subtitles_link'], stream=True) req = requests.get(medium['subtitles_link'], stream=True)
with open(os.path.join('output/subtitles', medium['subtitles_file']), 'wb') as f: with open(dest_file, 'wb') as f:
for chunk in req.iter_content(chunk_size=1024): for chunk in req.iter_content(chunk_size=1024):
if chunk: if chunk:
f.write(chunk) f.write(chunk)
@ -46,12 +50,12 @@ def generate():
template = env.get_template("template.html.j2") template = env.get_template("template.html.j2")
with open('output/index.html', 'w') as f: with open('output/index.html', 'w') as f:
f.write(template.render(data=data, current_day=(date.today() - BASE_DATE).days)) f.write(template.render(data=data, current_day=(date.today() - BASE_DATE).days, departement_shapes=shapes, apaisement=movings, today=date.today()))
svg_template = env.get_template("France_departements.svg.j2") svg_template = env.get_template("France_departements.svg.j2")
with open('output/France_departements.svg', 'w') as f: with open('output/France_departements.svg', 'w') as f:
f.write(svg_template.render(data=data, departement_shapes=shapes, apaisement=movings, today=date.today())) f.write(svg_template.render(data=data, current_day=(date.today() - BASE_DATE).days, departement_shapes=shapes, apaisement=movings, today=date.today(), svg_only=True))
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="587.5" height="550" id="svg2" version="1.0"> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="587.5" height="550" id="svg2" version="1.0">
<metadata id="metadata7"> <metadata id="metadata7">
<rdf:RDF> <rdf:RDF>
@ -19,7 +18,7 @@
.dpt-path { .dpt-path {
opacity: 1; opacity: 1;
color: #000000; color: #000000;
fill: #ff0000; fill: #aaaaff;
fill-opacity: 1; fill-opacity: 1;
fill-rule: evenodd; fill-rule: evenodd;
stroke: #5d5d5d; stroke: #5d5d5d;
@ -40,13 +39,17 @@
} }
.dpt-apaise { .dpt-apaise {
fill: #00ff00; fill: #55ff55;
} }
.dpt-prevu { .dpt-prevu {
fill: #ffa500; fill: #ffa500;
} }
.dpt-cancelled {
fill: #aa1111;
}
.pref-path { .pref-path {
opacity: 1; opacity: 1;
color: #000000; color: #000000;
@ -106,7 +109,10 @@
<g inkscape:groupmode="layer" id="layer10" inkscape:label="Département" style="display:inline"> <g inkscape:groupmode="layer" id="layer10" inkscape:label="Département" style="display:inline">
{% for dpt, path in departement_shapes.items() %} {% for dpt, path in departement_shapes.items() %}
<path id="departement{{ dpt }}" class="{% if dpt in apaisement %}dpt-apaise {% endif %}dpt-path" d="{{ path }}" {% if dpt in apaisement %}title="{% for mvmt in apaisement[dpt] %}Le {{ mvmt.date }} : {{ mvmt.description }}{% endfor %}"{% endif %}/> <path id="departement{{ dpt }}"
class="{% if dpt in apaisement %}{% for mvmt in apaisement[dpt].moves %}{% if mvmt.cancelled %}dpt-cancelled{% elif mvmt.day_number < current_day %}dpt-apaise{% else %}dpt-prevu{% endif %} {% endfor %}{% endif %}dpt-path"
d="{{ path }}"
{% if dpt in apaisement and not svg_only %}data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-container="body" data-bs-title="{{ apaisement[dpt].title }}" data-bs-content="<ul class='list-group list-group-flush'>{% for mvmt in apaisement[dpt].moves %}<li class='list-group-item'>Le {{ mvmt.day_number|to_date }} : {{ mvmt.description }}</li>{% endfor %}</ul>"{% endif %}/>
{% endfor %} {% endfor %}
</g> </g>
<g inkscape:groupmode="layer" id="layer4" inkscape:label="Préfecture" style="display:inline"> <g inkscape:groupmode="layer" id="layer4" inkscape:label="Préfecture" style="display:inline">
@ -202,8 +208,6 @@
<path sodipodi:type="arc" class="pref-path" id="path2401" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-159.411,-245.8166)"/> <path sodipodi:type="arc" class="pref-path" id="path2401" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-159.411,-245.8166)"/>
<path sodipodi:type="arc" class="pref-path" id="path2403" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-143.6668,-240.0162)"/> <path sodipodi:type="arc" class="pref-path" id="path2403" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-143.6668,-240.0162)"/>
<path sodipodi:type="arc" class="pref-path" id="path2405" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-107.4828,-225.1006)"/> <path sodipodi:type="arc" class="pref-path" id="path2405" sodipodi:cx="536.13281" sodipodi:cy="521.3075" sodipodi:rx="2.34375" sodipodi:ry="2.34375" d="M 538.47656 521.3075 A 2.34375 2.34375 0 1 1 533.78906,521.3075 A 2.34375 2.34375 0 1 1 538.47656 521.3075 z" transform="translate(-107.4828,-225.1006)"/>
<path sodipodi:type="star" style="opacity:1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" id="path17914" sodipodi:sides="5" sodipodi:cx="279.53775" sodipodi:cy="131.12292" sodipodi:r1="4.1226993" sodipodi:r2="1.4242409" sodipodi:arg1="0.93901779" sodipodi:arg2="1.5258971" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 281.97254,134.44985 L 279.60168,132.54573 L 277.12604,134.46662 L 278.20434,131.62339 L 275.61245,129.86251 L 278.64973,130.00943 L 279.52349,127.00025 L 280.32234,129.93428 L 283.45424,129.83538 L 280.91067,131.5018 L 281.97254,134.44985 z " transform="translate(0.462561,0.759965)"/>
<path sodipodi:type="arc" style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.43383271;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" id="path17916" sodipodi:cx="275.44052" sodipodi:cy="126.13353" sodipodi:rx="3.8329053" sodipodi:ry="3.8329053" d="M 279.27343 126.13353 A 3.8329053 3.8329053 0 1 1 271.60762,126.13353 A 3.8329053 3.8329053 0 1 1 279.27343 126.13353 z" transform="matrix(1.152518,0,0,1.152518,-37.38373,-13.52132)"/>
</g> </g>

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -118,7 +118,13 @@
</div> </div>
<div class="text-center my-5"> <div class="text-center my-5">
<img src="France_departements.svg" class="w-100" alt="Carte des différents rassemblements par département"> {% include "France_departements.svg.j2" %}
<p>
<i>Une autre carte similaire ayant inspiré le jeu de données est disponible sur le site d'<a href="https://france.attac.org/se-mobiliser/retraites-pour-le-droit-a-une-retraite-digne-et-heureuse/article/on-ne-les-lache-pas-la-carte-des-mobilisations">ATTAC</a>.</i>
</p>
<p>
<i>Récupérez la carte au format SVG <a href="France_departements.svg">ici</a>.</i>
</p>
</div> </div>
</main> </main>
@ -134,6 +140,10 @@
<script src="theme.js"></script> <script src="theme.js"></script>
<script> <script>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
// Enable popovers
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl, {html: true}))
let baseDate = new Date("2023-04-17 20:00:00+0200") let baseDate = new Date("2023-04-17 20:00:00+0200")
let baseDateDay = new Date("2023-04-17 00:00:00+0200") let baseDateDay = new Date("2023-04-17 00:00:00+0200")
let endDate = new Date("2023-07-26 20:00:00+0200") let endDate = new Date("2023-07-26 20:00:00+0200")