diff --git a/purge-registres-deces-insee/bdd_insee.py b/purge-registres-deces-insee/bdd_insee.py new file mode 100644 index 0000000..c27a0d0 --- /dev/null +++ b/purge-registres-deces-insee/bdd_insee.py @@ -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()))) diff --git a/settings.py b/purge-registres-deces-insee/settings.py similarity index 100% rename from settings.py rename to purge-registres-deces-insee/settings.py diff --git a/purge-registres-deces-insee/site_eglise.py b/purge-registres-deces-insee/site_eglise.py new file mode 100644 index 0000000..83cc37e --- /dev/null +++ b/purge-registres-deces-insee/site_eglise.py @@ -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() diff --git a/purge-registres-deces-insee/trouver_decedes.py b/purge-registres-deces-insee/trouver_decedes.py new file mode 100755 index 0000000..0a9fb0c --- /dev/null +++ b/purge-registres-deces-insee/trouver_decedes.py @@ -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 +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 = "" + text = f""" +Le membre {name_registre}, +né{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} +né{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) diff --git a/trouver_decedes.py b/trouver_decedes.py deleted file mode 100755 index 14b4cce..0000000 --- a/trouver_decedes.py +++ /dev/null @@ -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 -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 = "" - text = f""" -Le membre {name_registre}, -né{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} -né{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)