Abstraction de site_eglise pour donner possibilité de recevoir une liste de membre par un autre moyen

This commit is contained in:
Sdj Geek 2020-07-18 16:18:17 +02:00
parent b83958fd51
commit 3fec540b67
3 changed files with 173 additions and 60 deletions

View File

@ -0,0 +1,82 @@
from abc import ABC, abstractmethod
class MembreBase(ABC):
def __init__(self, provider):
self.provider = provider
# Données issues des registres
self.r_id = None
self.r_first_name = None
self.r_last_name = None
self.r_maiden_name = None
self.r_annee = None
self.r_mois = None
self.r_jour = None
self.r_ville = None
self.r_sexe = None
# Données issues de l'INSEE
self.i_first_name = None
self.i_last_name = None
self.i_annee_naissance = None
self.i_mois_naissance = None
self.i_jour_naissance = None
self.i_ville_naissance = None
self.i_annee_deces = None
self.i_mois_deces = None
self.i_jour_deces = None
self.i_ville_deces = None
def get_nom_registres(self):
nom_registres = f"{self.r_last_name}, {self.r_first_name}"
if self.r_maiden_name:
nom_registres = f"{nom_registres} née {self.r_maiden_name.upper()}"
return nom_registres
def set_insee(self, insee):
self.i_first_name = insee.first_name
self.i_last_name = insee.last_name
self.i_annee_naissance = insee.annee_naissance
self.i_mois_naissance = insee.mois_naissance
self.i_jour_naissance = insee.jour_naissance
self.i_ville_naissance = insee.code_lieu_naissance
self.i_annee_deces = insee.annee_deces
self.i_mois_deces = insee.mois_deces
self.i_jour_deces = insee.jour_deces
self.i_ville_deces = insee.code_lieu_deces
def get_texte_decede(self):
if self.r_sexe == "F":
feminin = "e"
elif self.r_sexe == "M":
feminin = ""
else:
feminin = "(e)"
return f"""
Le membre {self.get_nom_registres()} ({self.r_id}),
{feminin} le {self.r_jour:0>2}/{self.r_mois:0>2}/{self.r_annee:0>4} à {self.r_ville.upper()}
semble être décédé{feminin}.
Dans le fichier de l'INSEE on peut trouver {self.i_last_name}, {self.i_first_name}
{feminin} le {self.i_jour_naissance:0>2}/{self.i_mois_naissance:0>2}/{self.i_annee_naissance:0>4} à {self.i_ville_naissance}
décédé{feminin} le {self.i_jour_deces:0>2}/{self.i_mois_deces:0>2}/{self.i_annee_deces:0>4} à {self.i_ville_deces}
"""
class MembreProvider(ABC):
@abstractmethod
def load(self):
pass
@abstractmethod
def get_name(self):
pass
@abstractmethod
def __len__(self):
pass
@abstractmethod
def get_member_list(self):
pass

View File

@ -9,29 +9,77 @@ Classe d'accès aux données du site de l'Église
import requests
import browser_cookie3
from membre_base import MembreBase, MembreProvider
class SiteEglise:
def __init__(self, cookie_path=None):
class SiteEglise(MembreProvider):
def __init__(self, unit, cookie_path=None):
"""
:param cookie_path: chemin vers le répertoire inscrire les fichiers de sortie
"""
self.unite = unit
self.cookie_jar = browser_cookie3.firefox(cookie_file=cookie_path)
self.as_json = None
def get_member_list(self, unit_number):
def __len__(self):
return len(self.as_json)
class Membre(MembreBase):
def __init__(self, provider, data):
super().__init__(provider)
self.completed = False
# Données fournies
self.r_id = data['legacyCmisId']
self.r_last_name, self.r_first_name = data['nameListPreferredLocal'].split(',')
self.r_last_name = self.r_last_name.strip().split(' ')[0]
self.r_first_name = self.r_first_name.strip().split(' ')[0]
self.r_annee, self.r_mois, self.r_jour = data['birth']['date']['date'].split('-')
self.r_sexe = data['sex']
# Rechercher le nom de jeune fille si besoin
if data['isSpouse']:
self.complete()
def complete(self):
if not self.completed:
member_profile = self.provider.get_member_profile(self.r_id)
self.r_maiden_name = member_profile['individual']['maidenNameGroup']['name1']['family']
self.r_ville = member_profile['individual']['birthPlace']
if not self.r_ville:
self.r_ville = "<VIDE>"
self.completed = True
def set_insee(self, insee):
self.complete()
super().set_insee(insee)
def get_name(self):
return f"Unité_{self.unite}"
def load(self):
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': self.unite},
headers={'Accept': "application/json"},
cookies=self.cookie_jar)
r.raise_for_status()
self.as_json = r.json()
return len(self.as_json)
def get_member_list(self):
"""Recevoir la liste des membres
:param unit_number: numéro de l'unité (paroisse, branche)
:returns: la liste des membres sous forme d'objet JSON
"""
r = requests.get('https://lcr.churchofjesuschrist.org/services/umlu/report/member-list',
params={'lang': "fra", 'unitNumber': unit_number},
headers={'Accept': "application/json"},
cookies=self.cookie_jar)
r.raise_for_status()
return r.json()
for member in self.as_json:
try:
yield self.Membre(self, member)
except ValueError:
print(f"Error with member [{member['nameListPreferredLocal']}, {member['birth']['date']['date']}]")
continue
def get_member_profile(self, member_id):
"""Recevoir les informations sur un membre

View File

@ -22,74 +22,46 @@ def default_tracker(step=None, text=None, set_max=None):
print(text)
def trouver_decedes(chemin_base_donnees, numeros_unites, chemin_repertoire_sortie, cookie_path=None, tracker=None):
def trouver_decedes(chemin_base_donnees, numeros_unites, chemin_repertoire_sortie, cookie_path=None, excel_path=None,
tracker=None):
"""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 chemin_repertoire_sortie: chemin vers le répertoire inscrire les fichiers de sortie
:param cookie_path: chemin vers la base de donnée des cookies
:param excel_path: chemin vers le fichier Excel contenant la liste des membres à rechercher
:param tracker: Objet permettant de suivre l'avancée du traitement
"""
# Tracker par défaut
if tracker is None:
tracker = default_tracker
# Initialiser les accès aux données (INSEE et site de l'Église)
# Initialiser les accès aux données INSEE
base_insee = BddInsee(chemin_base_donnees)
site_eglise = SiteEglise(cookie_path)
# Boucler sur la liste des unités
# Initialiser les fournisseurs de liste de membres
fournisseurs_membres = list()
if excel_path:
raise NotImplementedError
for unite in numeros_unites:
tracker(text=f"Unité {unite}")
fournisseurs_membres.append(SiteEglise(unite, cookie_path))
# Boucler sur la liste fournisseurs
for member_provider in fournisseurs_membres:
tracker(set_max=member_provider.load())
tracker(text=member_provider.get_name())
# Récupérer la liste des membres
members = site_eglise.get_member_list(unite)
members = member_provider.get_member_list()
# Préparer le fichier de sortie
output_file = os.path.join(chemin_repertoire_sortie, f"liste_membres_decedes_unite_{unite}.txt")
output_file = os.path.join(chemin_repertoire_sortie, f"liste_membres_decedes_{member_provider.get_name()}.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
tracker(set_max=len(members))
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'])
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 = ""
query = base_insee.find_person(member.r_first_name, member.r_last_name, member.r_maiden_name,
member.r_annee, member.r_mois, member.r_jour)
for person in query:
if not ville_registre:
member_profile = site_eglise.get_member_profile(member['legacyCmisId'])
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}
"""
member.set_insee(person)
text = member.get_texte_decede()
tracker(text=text)
out_file.write(text)
tracker(step=1)
@ -99,7 +71,18 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Recherche des personnes décédées dans les registres.')
parser.add_argument('chemin_base_donnees', type=str, help="chemin vers la base de données")
parser.add_argument('chemin_repertoire_sortie', type=str, help="chemin vers le répertoire de sortie")
parser.add_argument('numeros_unites', type=str, help="numéros des l'unités à traiter, séparés par des virgules (ex: 123,753,469)")
parser.add_argument('--cookie', '-c', type=str, help='chemin vers la base de donnée des cookies de Firefox')
parser.add_argument('--numeros_unites', '-u', type=str, help="numéros des l'unités à traiter, séparés par des virgules (ex: 123,753,469)")
parser.add_argument('--cookie', '-c', type=str, help="chemin vers la base de donnée des cookies de Firefox")
parser.add_argument('--excel', '-e', type=str, help="chemin vers le fichier Excel contenant la liste des membres à rechercher")
args = parser.parse_args()
trouver_decedes(args.chemin_base_donnees, args.numeros_unites.split(','), args.chemin_repertoire_sortie, args.cookie)
if args.numeros_unites:
numeros_unites = args.numeros_unites.split(',')
else:
numeros_unites = list()
trouver_decedes(chemin_base_donnees=args.chemin_base_donnees,
numeros_unites=numeros_unites,
chemin_repertoire_sortie=args.chemin_repertoire_sortie,
cookie_path=args.cookie,
excel_path=args.excel)