Potion Bottle Icon Manuel d'alchimie du code Potion Bottle Icon

Informatique et politique — Une boîte à outils libres pour les organisations

- 1,001 mots - Temps de lecture estimé: 6 minutes

🌘 Introduction

J’ai préparé cette présentation pour mes collègues de travail de Desjardins. Le contenu est de nature publique, alors je le partage ici. Je vais te présenter un aspect qui provient de mon vécu de bénévole dans une organisation politique : un coffre à outils qui permet de faire beaucoup avec peu de moyens financiers, et qui permet à plusieurs bénévoles dans des environnements de travail hétérogènes de pouvoir collaborer.


Sun Face IconQuels outils libres peuvent aider une organisation politique à produire du contenu, gérer des candidats et automatiser des tâches ?Sun Face Icon


Une combinaison de Python, Inkscape, OpenCV, QGIS, Pandoc et des scripts Bash permet de produire des images personnalisées, envoyer des courriels massifs, gérer un programme politique bilingue, cadrer des photos de candidats et générer un atlas géographique — le tout avec des logiciels libres et peu de ressources.

🌘 L’importance du logiciel libre pour la production et la gestion de contenu

Pour produire de nombreuses images sur le même modèle, mais en utilisant une base de données pour ajouter des éléments de personnalisation, j’ai choisi d’utiliser le format vectoriel. En utilisant le logiciel Inkscape, je construis un gabarit qui est sauvegardé au format SVG. Ensuite, à l’aide du module xml.dom.minidom de Python, on peut manipuler les valeurs des attributs pour personnaliser le fichier.

tspan_svg_field = doc.getElementsByTagName('tspan')
tspan_svg_field[0].childNodes[0].nodeValue = "dans "+candidat_dict['CIRC_NC']
tspan_svg_field[1].childNodes[0].nodeValue = candidat_json['candidat']['prenom_candidat']+' '+candidat_json['candidat']['nom_candidat']
image_svg_field = doc.getElementsByTagName('image')
image_svg_field[1].attributes["xlink:href"].value = cropped_photo_path
image_svg_field[0].attributes["xlink:href"].value = 'logo_pcq_bilingue.png'

candidat_svg_file = open(candidat_svg_path, "w")
candidat_svg_file.write(doc.toprettyxml())

candidat_svg_file.close()

Enfin, avec cairosvg, on peut générer des images PNG prêtes pour le web.

svg2png(url=candidat_svg_path,write_to=candidat_png_path)

Une brochette de packages Python :

import pandas as pd
from types import *
import cv2 as cv #Opencv
from PIL import Image #Image from PIL
import glob
import os
import numpy
import xml.dom.minidom
from cairosvg import svg2png
import json
from rauth import OAuth2Service
import base64
import datetime
import markdown
from pytz import timezone
import sys
from slugify import slugify
from IPython import display

🌘 Envoi de courriels massifs

À quelques occasions, je devais envoyer des courriels massifs, mais personnalisés, notamment pour la création de comptes utilisateurs dans nos divers outils de communications.

Pour ce faire, j’ai construit un petit script Python qui permet de générer des courriels à partir d’un fichier CSV contenant les paramètres de personnalisation.

Les détails de ce programme sont présentés dans mon billet Envoi de courriels massifs avec Python.

🌘 Organisation d’un programme politique bilingue

#!/bin/bash
for p in source/articles/*.md
do
filename=$(basename $p)
parallel --semaphore -j+0 m2j "$p" -c -o release/${filename%.*}.json
done
proposition = json.loads(open("../../release/p"+str(numero_proposition)+".json").read())

full_html = markdown.markdown(proposition['p'+str(numero_proposition)]['content'],output_format='html5')
#!/bin/bash
for p in source/articles/*.md
do
filename=$(basename $p)
echo $p
pandoc -f markdown -t latex -o release/${filename}.tex $p
done
#!/bin/bash
last_num=$(ls p* | tail -n 1 | sed -n -re 's/^p0*([1-9][0-9]*)\.md$/\1/p')
let "current_num=${last_num}+1"
echo "Numéro courant: ${current_num}"
padded_num=$(printf "%04g" ${current_num})
echo -e "---" > "p${padded_num}.md"
echo -e "numero: ${current_num}" >> "p${padded_num}.md"
echo -e "title: \"\"" >> "p${padded_num}.md"
echo -e "tags:\n\s\s- $1\n\s\s- $2\n\s\s- " >> "p${padded_num}.md"
echo -e "---" >> "p${padded_num}.md"

🌘 Gestion de profils de candidats

Une approche similaire à la gestion des pages du programme a été appliquée à la gestion des pages de candidats. Étant donné la possibilité de nombreux changements et imprévus, le fait de pouvoir générer des pages standardisées à la volée a permis de sauver beaucoup de temps au niveau de la maintenance du site web.

🌘 Comment faire beaucoup avec peu

L’équipe TI étant pas mal limitée à moi, un mélange de scripts et d’outils de collaboration tels que Google Docs ont permis de pouvoir mettre à jour les contenus web assez facilement. Le maintien d’une qualité de données a cependant été difficile. Il est facile de casser un script qui lit un fichier lorsqu’on insère des caractères spéciaux ou on supprime un titre.

🌘 Détection de visages

La librairie OpenCV permet d’utiliser différents modèles de segmentation et d’identification d’objets. Notamment, on y retrouve quelques algorithmes de détection de visages, appelés Haar Feature-based Cascade Classifiers. Comme j’avais de nombreuses photos à cadrer afin de produire des publications web dans un format standardisé, j’ai décidé de tenter le coup avec cet outil. J’ai ainsi pu découvrir certaines de ses forces et de ses faiblesses.

Les algorithmes sont entraînés à détecter différents éléments composant un tout de façon hiérarchique. Par exemple, un visage est constitué de deux yeux, un nez et une bouche, sur lesquels on entraîne chacun un modèle prédictif. Ces trois modèles peuvent être combinés pour ensuite détecter un visage en spécifiant la position approximative et la séquence des composantes.

OpenCV permet d’utiliser directement des modèles pré-entraînés pour détecter des visages.

Voir la documentation pour plus de détails : Face Detection using Haar Cascades

Les modèles performent bien sur des photos prises en mode portrait, centrées avec un fond suffisamment uniforme. Il est aussi recommandé d’éviter les vêtements avec beaucoup de motifs. En alternant entre deux modèles, j’ai pu arriver à cadrer environ 90% des photographies reçues. Pour les 10% restants, quelques ajustements manuels et recentrage à l’aide du logiciel GIMP ont permis de les passer à l’algorithme avec un succès relatif. Ça marche ou ça ne marche pas. Mais ça peut te retourner une oreille ou un nœud de cravate au lieu d’un visage.

🌘 Production d’un atlas

Créer un atlas à partir de couches d’information et d’une couche de polygones à l’aide du logiciel QGIS.

Couches QGIS pour l'atlas du Québec

Paramétrer chaque page de l’atlas depuis une couche avec différents composants : carte, tableau.

Composeur d'atlas QGIS

Pour plus de détails, on peut consulter l’article suivant : How to Create QGIS Atlas Mapbooks.

🌘 Traduction

Pour faire la traduction, j’ai utilisé en majeure partie le site web Bing Translator.

Abonne-toi au fil RSS pour ne rien manquer.

Étiquettes