Réorganisation du code en modules

This commit is contained in:
Sdj Geek 2020-06-07 00:52:15 +02:00
parent f83857f4cc
commit 5f281b1511
5 changed files with 177 additions and 165 deletions

View File

@ -0,0 +1,44 @@
import peewee
database = peewee.SqliteDatabase(None)
class BddInsee:
def __init__(self, chemin_base_donnees):
database.init(chemin_base_donnees)
class Person(peewee.Model):
last_name = peewee.CharField()
first_name = peewee.CharField()
is_woman = peewee.BooleanField()
annee_naissance = peewee.IntegerField()
mois_naissance = peewee.IntegerField()
jour_naissance = peewee.IntegerField()
code_lieu_naissance = peewee.CharField()
commune_naissance = peewee.CharField()
pays_naissance = peewee.CharField()
annee_deces = peewee.IntegerField()
mois_deces = peewee.IntegerField()
jour_deces = peewee.IntegerField()
code_lieu_deces = peewee.CharField()
numero_act_deces = peewee.CharField()
class Meta:
database = database
def find_person(self, first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance):
if maiden_name:
return self.Person.select().where((self.Person.annee_naissance == int(annee_naissance))
& (self.Person.mois_naissance == int(mois_naissance))
& (self.Person.jour_naissance == int(jour_naissance))
& (self.Person.first_name.contains(first_name.upper()))
& ((self.Person.last_name.contains(last_name.upper()))
| self.Person.last_name.contains(maiden_name.upper())))
else:
return self.Person.select().where((self.Person.annee_naissance == int(annee_naissance))
& (self.Person.mois_naissance == int(mois_naissance))
& (self.Person.jour_naissance == int(jour_naissance))
& (self.Person.first_name.contains(first_name.upper()))
& (self.Person.last_name.contains(last_name.upper())))

View File

@ -0,0 +1,22 @@
import requests
###
# Registres de l'Église
def get_member_list(unit_number, cookie):
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json",
'Cookie': cookie})
r.raise_for_status()
return r.json()
def get_member_profile(member_id, cookie):
r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}',
params={'lang': "fra"},
headers={'Accept': "application/json",
'Cookie': cookie,
'Referer': f"https://lcr.churchofjesuschrist.org/records/member-profile/{member_id}?lang=fra"})
r.raise_for_status()
return r.json()

View File

@ -0,0 +1,111 @@
"""
Copyright (c) 2020 Sdj Geek
Voir le fichier LICENSE
------------------------------------------------------------------------------------------------------------------------
Ce programme permet de comparer le fichier des personnes décédées établi par l'INSEE avec les registre de membres de
l'Église, afin de déterminer si figurent dans nos registre des personnes décédées.
L'INSEE reçoit des communes les décès enregistrés. Le fichier des personnes décédées établi par l'INSEE est en accès
libre sur le site https://www.data.gouv.fr.
Comment utilise ce programme :
1) Demander le ficher de l'INSEE à cette adresse : sdjgeek@protonmail.com
2) Installer les dépendance du programme : "pip install requests peewee"
3) Configurer les paramètres du programme (fichier settings.py)
- chemin_base_donnees : Le chemin vers [le fichier téléchargé ici](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
1- Ouvrir Firefox
2- Ouvrir les outils de développement : CTRL + MAJ + E
3- Aller sur le site des outils pour greffiers : https://lds.org/lcr
4- Entrer identifiant et mot de passe SDJ
5- Aller dans la liste des membres
6- Dans l'outil de développement, cliquer sur la dernière ligne
7- Dans le paneau de droite, dans la section "En-tête de la requête", rechercher le champ "cookie"
8- Copier la valeur contenue dans ce champ
- chemin_repertoire_sortie : Le chemin vers le répertoire qui contiendra la fichiers de sortie
4) Exécuter le programme : "python3.6 trouver_decedes.py"
------------------------------------------------------------------------------------------------------------------------
Auteur : SDJ GeeK <sdjgeek@protonmail.com>
Date : 1 juin 2020
Version : 3.0
"""
import os
import peewee
import requests
from bdd_insee import BddInsee
import site_eglise
import settings as param
###
# Programme principal
def trouver_decedes(chemin_base_donnees, numeros_unites, cookie, chemin_repertoire_sortie):
base_insee = BddInsee(chemin_base_donnees)
# Boucler sur la liste des unités
for unite in numeros_unites:
print(f"Unité {unite}")
# Récupérer la liste des membres
members = site_eglise.get_member_list(unite, cookie=cookie)
# Préparer le fichier de sortie
output_file = os.path.join(chemin_repertoire_sortie, f"liste_membres_decedes_unite_{unite}.txt")
with open(output_file, 'w') as out_file:
out_file.write("Les lieux dans le fichier de l'INSEE sont donnés en Code Officiel Géographique en vigueur au moment de la prise en compte du décès\n")
# Boucler sur la liste des membres
for member in members:
# Lire les noms et date de naissance
name_registre = member['nameListPreferredLocal']
full_birthdate = member['birth']['date']['date']
maiden_name = None
ville_registre = None
# S'il s'agit d'une femme mariée, trouver son nom de jeune fille
if member['isSpouse']:
member_profile = site_eglise.get_member_profile(member['legacyCmisId'], cookie=cookie)
maiden_name = member_profile['individual']['maidenNameGroup']['name1']['family']
ville_registre = member_profile['individual']['birthPlace']
try:
last_name, first_name = name_registre.split(',')
annee_registre, mois_registre, jour_registre = full_birthdate.split('-')
except ValueError:
print(f"Error with member [{name_registre}, {full_birthdate}]")
continue
first_name = first_name.strip().split(' ')[0]
last_name = last_name.strip().split(' ')[0]
query = base_insee.find_person(first_name, last_name, maiden_name, annee_registre, mois_registre, jour_registre)
name_registre = name_registre.upper()
if maiden_name:
name_registre = f"{name_registre} née {maiden_name.upper()}"
if member['sex'] == "F":
feminin = "e"
else:
feminin = ""
for person in query:
if not ville_registre:
member_profile = site_eglise.get_member_profile(member['legacyCmisId'], cookie=cookie)
ville_registre = member_profile['individual']['birthPlace']
if not ville_registre:
ville_registre = "<VIDE>"
text = f"""
Le membre {name_registre},
{feminin} le {jour_registre:0>2}/{mois_registre:0>2}/{annee_registre:0>4} à {ville_registre.upper()}
semble être décédé{feminin}.
Dans le fichier de l'INSEE on peut trouver {person.last_name}, {person.first_name}
{feminin} le {person.jour_naissance:0>2}/{person.mois_naissance:0>2}/{person.annee_naissance:0>4} à {person.code_lieu_naissance}
décédé{feminin} le {person.jour_deces:0>2}/{person.mois_deces:0>2}/{person.annee_deces:0>4} à {person.code_lieu_deces}
"""
print(text)
out_file.write(text)
if __name__ == "__main__":
trouver_decedes(param.chemin_base_donnees, param.numeros_unites, param.cookie, param.chemin_repertoire_sortie)

View File

@ -1,165 +0,0 @@
"""
Copyright (c) 2020 Sdj Geek
Voir le fichier LICENSE
------------------------------------------------------------------------------------------------------------------------
Ce programme permet de comparer le fichier des personnes décédées établi par l'INSEE avec les registre de membres de
l'Église, afin de déterminer si figurent dans nos registre des personnes décédées.
L'INSEE reçoit des communes les décès enregistrés. Le fichier des personnes décédées établi par l'INSEE est en accès
libre sur le site https://www.data.gouv.fr.
Comment utilise ce programme :
1) Demander le ficher de l'INSEE à cette adresse : sdjgeek@protonmail.com
2) Installer les dépendance du programme : "pip install requests peewee"
3) Configurer les paramètres du programme (fichier settings.py)
- chemin_base_donnees : Le chemin vers [le fichier téléchargé ici](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
1- Ouvrir Firefox
2- Ouvrir les outils de développement : CTRL + MAJ + E
3- Aller sur le site des outils pour greffiers : https://lds.org/lcr
4- Entrer identifiant et mot de passe SDJ
5- Aller dans la liste des membres
6- Dans l'outil de développement, cliquer sur la dernière ligne
7- Dans le paneau de droite, dans la section "En-tête de la requête", rechercher le champ "cookie"
8- Copier la valeur contenue dans ce champ
- chemin_repertoire_sortie : Le chemin vers le répertoire qui contiendra la fichiers de sortie
4) Exécuter le programme : "python3.6 trouver_decedes.py"
------------------------------------------------------------------------------------------------------------------------
Auteur : SDJ GeeK <sdjgeek@protonmail.com>
Date : 1 juin 2020
Version : 2.0
"""
import os
import peewee
import requests
import settings as param
###
# Base de donnée INSEE
database = peewee.SqliteDatabase(param.chemin_base_donnees)
class Person(peewee.Model):
last_name = peewee.CharField()
first_name = peewee.CharField()
is_woman = peewee.BooleanField()
annee_naissance = peewee.IntegerField()
mois_naissance = peewee.IntegerField()
jour_naissance = peewee.IntegerField()
code_lieu_naissance = peewee.CharField()
commune_naissance = peewee.CharField()
pays_naissance = peewee.CharField()
annee_deces = peewee.IntegerField()
mois_deces = peewee.IntegerField()
jour_deces = peewee.IntegerField()
code_lieu_deces = peewee.CharField()
numero_act_deces = peewee.CharField()
class Meta:
database = database
def find_person(first_name, last_name, maiden_name, annee_naissance, mois_naissance, jour_naissance):
if maiden_name:
return Person.select().where((Person.annee_naissance == int(annee_naissance))
& (Person.mois_naissance == int(mois_naissance))
& (Person.jour_naissance == int(jour_naissance))
& (Person.first_name.contains(first_name.upper()))
& ((Person.last_name.contains(last_name.upper()))
| Person.last_name.contains(maiden_name.upper())))
else:
return Person.select().where((Person.annee_naissance == int(annee_naissance))
& (Person.mois_naissance == int(mois_naissance))
& (Person.jour_naissance == int(jour_naissance))
& (Person.first_name.contains(first_name.upper()))
& (Person.last_name.contains(last_name.upper())))
###
# Registres de l'Église
def get_member_list(unit_number, cookie):
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json",
'Cookie': cookie})
r.raise_for_status()
return r.json()
def get_member_profile(member_id, cookie):
r = requests.get(f'https://lcr.churchofjesuschrist.org/records/member-profile/service/{member_id}',
params={'lang': "fra"},
headers={'Accept': "application/json",
'Cookie': cookie,
'Referer': f"https://lcr.churchofjesuschrist.org/records/member-profile/{member_id}?lang=fra"})
r.raise_for_status()
return r.json()
###
# Programme principal
# Boucler sur la liste des unités
for unite in param.numeros_unites:
print(f"Unité {unite}")
# Récupérer la liste des membres
members = get_member_list(unite, cookie=param.cookie)
# Préparer le fichier de sortie
output_file = os.path.join(param.chemin_repertoire_sortie, f"liste_membres_decedes_unite_{unite}.txt")
with open(output_file, 'w') as out_file:
out_file.write("Les lieux dans le fichier de l'INSEE sont donnés en Code Officiel Géographique en vigueur au moment de la prise en compte du décès\n")
# Boucler sur la liste des membres
for member in members:
# Lire les noms et date de naissance
name_registre = member['nameListPreferredLocal']
full_birthdate = member['birth']['date']['date']
maiden_name = None
ville_registre = None
# S'il s'agit d'une femme mariée, trouver son nom de jeune fille
if member['isSpouse']:
member_profile = get_member_profile(member['legacyCmisId'], cookie=param.cookie)
maiden_name = member_profile['individual']['maidenNameGroup']['name1']['family']
ville_registre = member_profile['individual']['birthPlace']
try:
last_name, first_name = name_registre.split(',')
annee_registre, mois_registre, jour_registre = full_birthdate.split('-')
except ValueError:
print(f"Error with member [{name_registre}, {full_birthdate}]")
continue
first_name = first_name.strip().split(' ')[0]
last_name = last_name.strip().split(' ')[0]
query = find_person(first_name, last_name, maiden_name, annee_registre, mois_registre, jour_registre)
name_registre = name_registre.upper()
if maiden_name:
name_registre = f"{name_registre} née {maiden_name.upper()}"
if member['sex'] == "F":
feminin = "e"
else:
feminin = ""
for person in query:
if not ville_registre:
member_profile = get_member_profile(member['legacyCmisId'], cookie=param.cookie)
ville_registre = member_profile['individual']['birthPlace']
if not ville_registre:
ville_registre = "<VIDE>"
text = f"""
Le membre {name_registre},
{feminin} le {jour_registre:0>2}/{mois_registre:0>2}/{annee_registre:0>4} à {ville_registre.upper()}
semble être décédé{feminin}.
Dans le fichier de l'INSEE on peut trouver {person.last_name}, {person.first_name}
{feminin} le {person.jour_naissance:0>2}/{person.mois_naissance:0>2}/{person.annee_naissance:0>4} à {person.code_lieu_naissance}
décédé{feminin} le {person.jour_deces:0>2}/{person.mois_deces:0>2}/{person.annee_deces:0>4} à {person.code_lieu_deces}
"""
print(text)
out_file.write(text)