Ajout de commentaires

This commit is contained in:
Sdj Geek 2020-06-09 00:16:00 +02:00
parent 7c8ce98489
commit 3734eeed87
6 changed files with 140 additions and 49 deletions

View File

@ -1,5 +1,8 @@
# Changelog # Changelog
### [v3.1] - 2020-06-08
- Amélioration de la documentation
### [v3.0] - 2020-06-07 ### [v3.0] - 2020-06-07
- Réorganisation du code en modules - Réorganisation du code en modules
- Ajout du script permettant de créer la base de donnée SQLite - Ajout du script permettant de créer la base de donnée SQLite

View File

@ -1,31 +1,34 @@
# Purge Registres Décès INSEE # Purge Registres Décès INSEE
Ce programme s'adresse essentiellement aux greffiers des pieux, paroisse et Ce programme s'adresse essentiellement aux greffiers des pieux,
branches de France, de l'Église de Jésus Christ des Saints des Derniers Jours. paroisse et branches de France, de l'Église de Jésus Christ des Saints
des Derniers Jours.
## Objectif ## Objectif
La tenue à jour des registres de l'Église n'est pas une tache aisée. Une des La tenue à jour des registres de l'Église n'est pas une tache
difficultés est liée au fait que lorsqu'un membre s'éloigne de l'Église, ses aisée. Une des difficultés est liée au fait que lorsqu'un membre
informations personnelles (adresse, téléphone, etc) ne sont plus mises à jour. s'éloigne de l'Église, ses informations personnelles (adresse,
téléphone, etc) ne sont plus mises à jour.
L'INSEE tient un fichier des personnes décédées en France de 1970 à L'INSEE tient un fichier des personnes décédées en France de 1970 à
aujourd'hui. Ce fichier est disponible en [données aujourd'hui. Ce fichier est disponible en [données
ouvertes](https://fr.wikipedia.org/wiki/Donn%C3%A9es_ouvertes) sur [le site du ouvertes](https://fr.wikipedia.org/wiki/Donn%C3%A9es_ouvertes) sur [le
site du
gouvernement](https://www.data.gouv.fr/fr/datasets/fichier-des-personnes-decedees/). gouvernement](https://www.data.gouv.fr/fr/datasets/fichier-des-personnes-decedees/).
Ce fichier est une aubaine, car il permet de savoir si un membre de l'Église Ce fichier est une aubaine, car il permet de savoir si un membre de
est décédé sans que nous le sachions. Si une personne figure à la fois dans l'Église est décédé sans que nous le sachions. Si une personne figure
les registres de l'Église et dans le fichier de l'INSEE, alors une mise à jour à la fois dans les registres de l'Église et dans le fichier de
du registre de l'Église est nécessaire. l'INSEE, alors une mise à jour du registre de l'Église est nécessaire.
Parcourir à la main le registre de membres de paroisse est une tache longue et Parcourir à la main le registre de membres de paroisse est une tache
fastidieuse. Ce programme permet de comparer automatiquement le registre de longue et fastidieuse. Ce programme permet de comparer automatiquement
paroisse avec le fichier de l'INSEE, et donne la liste des membres trouvés le registre de paroisse avec le fichier de l'INSEE, et donne la liste
dans le fichier de l'INSEE. des membres trouvés dans le fichier de l'INSEE.
Le fichier de l'INSEE est actualisé de façon mensuelle. Il semble intéressant Le fichier de l'INSEE est actualisé de façon mensuelle. Il semble
d'utiliser ce programme régulièrement (une fois par an par exemple) pour intéressant d'utiliser ce programme régulièrement (une fois par an par
s'assurer que les registres restent à jour. exemple) pour s'assurer que les registres restent à jour.
## Pré-requis ## Pré-requis
@ -56,49 +59,67 @@ cd purge-registres-deces-insee
```bash ```bash
python3 -m venv localenv python3 -m venv localenv
. localenv/bin/activate source localenv/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
``` ```
## Utilisation ## Utilisation
Le début du fichier ```trouver_deces.py``` contient les paramètres à configurer : Le fichier ```purge-registres-deces-insee/settings.py``` contient les
paramètres à configurer :
- chemin_base_donnees : Le chemin vers le [fichier
téléchargé](https://git.roflcopter.fr/sdjgeek/purge-registres-deces-insee/-/wikis/home#t%C3%A9l%C3%A9charger-la-base-de-donn%C3%A9e)
- numeros_unites : La liste des unités que le programme doit
tester. La liste commence par le caractère '['. Les numéros d'unités
sont séparés par des virgules. La liste se termine par le caractère
']'. Par exemple [47823, 67745, 31456]
- cookie : Les cookies de la session au compte SDJ. Pour obtenir ces
cookies il faut :
- chemin_base_donnees : Le chemin vers le fichier téléchargé (me contacter)
- numeros_unites : La liste des unités que le programme doit tester. La liste commence par le caractère '['. Les
numéros d'unités sont séparés par des virgules. La liste se termine par le caractère ']'. Par exemple
[47823, 67745, 31456]
- cookie : Les cookies de la session au compte SDJ. Pour obtenir ces cookies il faut
1- Ouvrir Firefox 1- Ouvrir Firefox
2- Ouvrir les outils de développement : CTRL + MAJ + E 2- Ouvrir les outils de développement : CTRL + MAJ + E
3- Aller sur le site des outils pour greffiers : https://lds.org/lcr 3- Aller sur le site des outils pour greffiers : https://lds.org/lcr
4- Entrer identifiant et mot de passe SDJ 4- Entrer identifiant et mot de passe SDJ
5- Aller dans la liste des membres 5- Aller dans la liste des membres
6- Dans l'outil de développement, cliquer sur la dernière ligne 6- Dans l'outil de développement, cliquer sur la dernière ligne
7- Dans le panneau de droite, dans la section "En-tête de la requête", rechercher le champ "cookie"
7- Dans le panneau de droite, dans la section "En-tête de la requête",
rechercher le champ "cookie"
8- Copier la valeur contenue dans ce champ 8- Copier la valeur contenue dans ce champ
- chemin_repertoire_sortie : Le chemin vers le répertoire qui contiendra la fichiers de sortie
- chemin_repertoire_sortie : Le chemin vers le répertoire qui
contiendra la fichiers de sortie
Une fois la configuration effectuée, lancer le script : Une fois la configuration effectuée, lancer le script :
```bash ```bash
. localenv/bin/activate . localenv/bin/activate
python trouver_deces.py python purge-registres-deces-insee/trouver_deces.py
``` ```
Le script mettra un peu de temps à s'exécuter. En fin d'exécution, le fichier Le script mettra un peu de temps à s'exécuter. En fin d'exécution, le
liste_membres_decedes_unite_{unite}.txt contiendra la liste des membres fichier liste_membres_decedes_unite_{unite}.txt contiendra la liste
trouvés dans le fichier de l'INSEE. Il est recommandé de contrôler les des membres trouvés dans le fichier de l'INSEE. Il est recommandé de
informations du membres avant de le déclarer comme décédé dans les registres contrôler les informations du membres avant de le déclarer comme
de l'Église. décédé dans les registres de l'Église.
## Licence ## Licence
Copyright (c) 2020 Sdj Geek Copyright (c) 2020 Sdj Geek
Ce logiciel est sous licence MIT/X Consortium. Elle donne à toute personne Ce logiciel est sous licence MIT/X Consortium. Elle donne à toute
recevant le logiciel (et ses fichiers) le droit illimité de l'utiliser, le personne recevant le logiciel (et ses fichiers) le droit illimité de
copier, le modifier, le fusionner, le publier, le distribuer, le vendre et le l'utiliser, le copier, le modifier, le fusionner, le publier, le
"sous-licencier" (l'incorporer dans une autre licence). La seule obligation distribuer, le vendre et le "sous-licencier" (l'incorporer dans une
est d'incorporer la notice de licence et de copyright dans toutes les autre licence). La seule obligation est d'incorporer la notice de
copies. Voir le fichier [LICENSE](LICENSE) pour le texte complet. licence et de copyright dans toutes les copies. Voir le fichier
[LICENSE](LICENSE) pour le texte complet.

View File

@ -1,19 +1,35 @@
"""Classe d'accès aux données INSEE dans la base SQLite
"""
import os import os
import peewee import peewee
# Objet de connexion à la base
database = peewee.SqliteDatabase(None) database = peewee.SqliteDatabase(None)
class BddInsee: class BddInsee:
"""Classe encapsulant les accès aux données.
"""
def __init__(self, chemin_base_donnees): def __init__(self, chemin_base_donnees):
"""Initialisation
:param chemin_base_donnees: chemin vers le fichier SQLite
"""
new = not os.path.isfile(chemin_base_donnees) new = not os.path.isfile(chemin_base_donnees)
database.init(chemin_base_donnees) database.init(chemin_base_donnees)
if new: if new:
database.create_tables([self.Person]) database.create_tables([self.Person])
class Person(peewee.Model): class Person(peewee.Model):
"""Classe représentant une personne dans la base
"""
last_name = peewee.CharField() last_name = peewee.CharField()
first_name = peewee.CharField() first_name = peewee.CharField()
is_woman = peewee.BooleanField() is_woman = peewee.BooleanField()
@ -33,6 +49,17 @@ class BddInsee:
database = database database = database
def find_person(self, first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance): def find_person(self, first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance):
"""Rechercher une personne dans la base
:param first_name: prénom de la personne à rechercher
:param last_name: nom de famille de la personne à rechercher
:param maiden_name: nom de jeune fille de la personne à rechercher (None si non défini)
:param annee_naissance: année de naissance de la personne à rechercher
:param mois_naissance: mois de naissance de la personne à rechercher
:param jour_naissance: jour de naissance de la personne à rechercher
:returns: liste contenant un dictionnaire par personne trouvée
"""
if maiden_name: if maiden_name:
return self.Person.select().where((self.Person.annee_naissance == int(annee_naissance)) return self.Person.select().where((self.Person.annee_naissance == int(annee_naissance))
& (self.Person.mois_naissance == int(mois_naissance)) & (self.Person.mois_naissance == int(mois_naissance))
@ -48,6 +75,12 @@ class BddInsee:
& (self.Person.last_name.contains(last_name.upper()))) & (self.Person.last_name.contains(last_name.upper())))
def import_data_list(self, data_list): def import_data_list(self, data_list):
"""Insérer des données dans la base
:param data_list: liste de dictionnaires contenant les
informations à insérer
"""
with database.atomic(): with database.atomic():
for batch in peewee.chunked(data_list, 70): for batch in peewee.chunked(data_list, 70):
self.Person.insert_many(batch).execute() self.Person.insert_many(batch).execute()

View File

@ -29,6 +29,12 @@ from bdd_insee import BddInsee
def parse_insee_file(data_file_path): def parse_insee_file(data_file_path):
"""Parse un fichier de l'INSEE
:param data_file_path: chemin vers le fichier à parser
:returns: liste de dictionnaires contenant les informations à insérer
"""
data_list = [] data_list = []
with open(data_file_path, 'r', encoding='latin1') as data_file: with open(data_file_path, 'r', encoding='latin1') as data_file:
for line in data_file.readlines(): for line in data_file.readlines():
@ -56,6 +62,12 @@ def parse_insee_file(data_file_path):
def completer_bdd_insee(chemin_base_donnees, chemin_repertoire_donnees): def completer_bdd_insee(chemin_base_donnees, chemin_repertoire_donnees):
"""Ajouter des données dans la base
:param chemin_base_donnees: chemin vers le fichier SQLite
:param chemin_repertoire_donnees: chemin vers le répertoire contenant les fichiers de l'INSEE
"""
base_insee = BddInsee(chemin_base_donnees) base_insee = BddInsee(chemin_base_donnees)
for file_path in sorted(glob.glob(os.path.join(chemin_repertoire_donnees, "deces-*.txt"))): for file_path in sorted(glob.glob(os.path.join(chemin_repertoire_donnees, "deces-*.txt"))):
print(f"Import du fichier {file_path}") print(f"Import du fichier {file_path}")

View File

@ -1,9 +1,18 @@
"""Classe d'accès aux données du site de l'Église
"""
import requests import requests
###
# Registres de l'Église
def get_member_list(unit_number, cookie): def get_member_list(unit_number, cookie):
"""Recevoir la liste des membres
:param unit_number: numéro de l'unité (paroisse, branche)
:param cookie: le cookie de session pour l'accès au site
:returns: la liste des membres sous forme d'objet JSON
"""
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list', r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number}, params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json", headers={'Accept': "application/json",
@ -13,6 +22,13 @@ def get_member_list(unit_number, cookie):
def get_member_profile(member_id, cookie): def get_member_profile(member_id, cookie):
"""Recevoir les informations sur un membre
:param member_id: ID du membre
:param cookie: le cookie de session pour l'accès au site
:returns: les informations sur le membre sous forme d'objet JSON
"""
r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}', r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}',
params={'lang': "fra"}, params={'lang': "fra"},
headers={'Accept': "application/json", headers={'Accept': "application/json",

View File

@ -47,9 +47,15 @@ import site_eglise
import settings as param import settings as param
###
# Programme principal
def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoire_sortie): def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoire_sortie):
"""Recherche les personnes décédées dans les registres
:param chemin_base_donnees: chemin vers le fichier SQLite
:param numeros_unites: liste des numéros d'unités à analyser
:param cookie: le cookie de session pour l'accès au site
:param chemin_repertoire_sortie: chemin vers le répertoire inscrire les fichiers de sortie
"""
base_insee = BddInsee(chemin_base_donnees) base_insee = BddInsee(chemin_base_donnees)
# Boucler sur la liste des unités # Boucler sur la liste des unités
for unite in numeros_unites: for unite in numeros_unites: