From 92c9fabbc451a30ba95ee167a6c3f1e7effec325 Mon Sep 17 00:00:00 2001 From: cyril Date: Tue, 10 Aug 2021 08:40:53 +0200 Subject: [PATCH] Update event.py, mariage.py, and person.py --- src/event.py | 106 ++++++++++++++++++++++++++++--------------------- src/mariage.py | 14 +++---- src/person.py | 17 ++++---- 3 files changed, 74 insertions(+), 63 deletions(-) diff --git a/src/event.py b/src/event.py index 16de35c..3aa6e73 100644 --- a/src/event.py +++ b/src/event.py @@ -3,7 +3,7 @@ from person import Person from mariage import Mariage -event_types = ['N', 'M', 'D'] +event_types = ['N', 'M', 'A', 'D'] class Event: @@ -37,6 +37,16 @@ class Event: y, 's' if y > 1 else '' ) + + if self._type == 'A': + return '{} s\'est uni{} à {} il y a {} an{}'.format( + self._p_a.formatted_name(), + '' if self._p_a.is_male() else 'e', + self._p_b.formatted_name(), + y, + 's' if y > 1 else '' + ) + return '{}{} décédé{} il y a {} an{}'.format( self._p_a.formatted_name(), ' (a épousé {})'.format(self._p_b.formatted_name()) if self._p_b else '', @@ -60,77 +70,85 @@ class Event: def load_persons_to_dict(members_file: str) -> dict: id_to_person = {} first_line = True + # CSV structure from Heredis + # Gender,Name,First Names,N : Date of Birth,D : Date of Death,Name of father (to detect in laws) with open(members_file, 'r', encoding='utf-8') as members: for line in members: if first_line: first_line = False continue line.strip() - infos = line.split(';') - birth = infos[5].split('-') - death = None if infos[6] == 'NULL' else infos[6].split('-') - p = Person(int(infos[0]), - 'M' if infos[3] == '1' else 'F', - infos[2], - infos[1], - date(int(birth[0]), int(birth[1]), int(birth[2])), - None if not death else date(int(death[0]), int(death[1]), int(death[2])), - infos[4] == '1', - infos[7] == '1') - id_to_person[int(infos[0])] = p + infos = line.split(',') + + birth = infos[3][4:].split('/') + death = None if infos[4] == '' else infos[4][4:].split('/') + + p = Person(infos[0], # Gender + infos[2], # First names + infos[1], # Last name + date(int(birth[2]), int(birth[1]), int(birth[0])), # Date of birth YYYY MM DD + None if not death else date(int(death[2]), int(death[1]), int(death[0])), # Date of death YYYY MM DD + infos[5] == '') # If empty, this is an in law + id_to_person[p.get_hash_id()] = p return id_to_person -def load_mariage_to_dict(mariages_file: str) -> dict: - id_to_mariage = {} +def load_mariage_to_list(mariages_file: str) -> list: + mariage_lst = [] first_line = True + # CSV format from Heredis + # T : Date of Event,Name1 | Name2, FirstName1 | FirstName 2, Event long name, DoB1 | DoB2 with open(mariages_file, 'r', encoding='utf-8') as mariages: for line in mariages: if first_line: first_line = False continue line.strip() - infos = line.split(';') - if infos[3] == "NULL": # Union libre, not an event - continue - m_type = 'M' - if infos[6] == '0': - m_type = 'D' - if infos[6] == '2': - m_type = 'L' - m_date = infos[3].split('-') + infos = line.split(',') + + union_type = infos[0][0] + doe = infos[0][4:].split('/') + + name1 = infos[1].split('|')[0].strip() + name2 = infos[1].split('|')[1].strip() + + first_name1 = infos[2].split('|')[0].strip() + first_name2 = infos[2].split('|')[1].strip() + + dob1 = infos[4].split('|')[0].strip()[4:].split('/') + dob2 = infos[4].split('|')[1].strip()[4:].split('/') + + id1 = Person.get_id(first_name1, name1, date(int(dob1[2]), int(dob1[1]), int(dob1[0]))) + id2 = Person.get_id(first_name2, name2, date(int(dob2[2]), int(dob2[1]), int(dob2[0]))) + m = Mariage( - int(infos[0]), - int(infos[1]), - int(infos[2]), - date(int(m_date[0]), int(m_date[1]), int(m_date[2])), - infos[4] == '1', - infos[5] == '1', - m_type + id1, + id2, + date(int(doe[2]), int(doe[1]), int(doe[0])), + union_type ) - if m.show_mariage(): - id_to_mariage[int(infos[0])] = m - return id_to_mariage + mariage_lst.append(m) + return mariage_lst -def find_significant_other(id_to_mariage: dict, uid: int) -> int: - for m in id_to_mariage.values(): - if m.in_this_union(uid) and m.show_mariage(): +def find_significant_other(mariages: list, uid: int) -> int: + for m in mariages: + if m.in_this_union(uid): return m.get_so(uid) return -1 def create_events_from_span(start: date, end: date, members_file: str, mariages_file: str) -> list: id_to_person = load_persons_to_dict(members_file) - id_to_mariage = load_mariage_to_dict(mariages_file) + mariages = load_mariage_to_list(mariages_file) cur_year = start.year events = [] for p in id_to_person.values(): - so = find_significant_other(id_to_mariage, p.uid()) - if so == p.uid(): + so = find_significant_other(mariages, p.get_hash_id()) + if so == p.get_hash_id(): print(f"What ??? {so}") if not p.is_dead(): birth = p.birth() @@ -159,19 +177,17 @@ def create_events_from_span(start: date, end: date, members_file: str, mariages_ p, None if so == -1 else id_to_person[so]) events.append(e) - for m in id_to_mariage.values(): - if not m.show_mariage(): - continue + for m in mariages: m_date = m.event_date() date_in_year = date(cur_year, m_date.month, m_date.day) if start <= date_in_year <= end: - e = Event('M', m_date, date_in_year, + e = Event(m.union(), m_date, date_in_year, id_to_person[m.id_a()], id_to_person[m.id_b()]) events.append(e) date_in_year = date(cur_year + 1, m_date.month, m_date.day) if start <= date_in_year <= end: - e = Event('M', m_date, date_in_year, + e = Event(m.union(), m_date, date_in_year, id_to_person[m.id_a()], id_to_person[m.id_b()]) events.append(e) diff --git a/src/mariage.py b/src/mariage.py index a00bd18..24b5b6f 100644 --- a/src/mariage.py +++ b/src/mariage.py @@ -1,24 +1,17 @@ from datetime import date -unions = ['D', 'M', 'L'] # Divorce (0), Mariage ou Pacs (1), Union Libre (2) +unions = ['M', 'A'] # Mariage (0), Autre union officielle (1) class Mariage: - def __init__(self, uid: int, id_a: int, id_b: int, event_date: date, last_mariage: bool, - hide: bool, union: str): - self._uid = uid + def __init__(self, id_a: int, id_b: int, event_date: date, union: str): self._id_a = id_a self._id_b = id_b self._date = event_date - self._last_mariage = last_mariage - self._hide = hide if union not in unions: raise ValueError('{} is not in {}'.format(union, unions)) self._union = union - def show_mariage(self): - return not self._hide and self._union != 'D' and self._last_mariage - def event_date(self): return self._date @@ -35,3 +28,6 @@ class Mariage: def id_b(self): return self._id_b + + def union(self): + return self._union diff --git a/src/person.py b/src/person.py index 01949dc..9943ff1 100644 --- a/src/person.py +++ b/src/person.py @@ -4,8 +4,8 @@ genders = ['M', 'F'] class Person: - def __init__(self, uid: int, gender: str, first_name: str, last_name: str, - birth: date, death: date, in_law: bool, hide: bool): + def __init__(self, gender: str, first_name: str, last_name: str, + birth: date, death: date, in_law: bool): if gender not in genders: raise ValueError('{} is not in {}'.format(gender, genders)) self._gender = gender @@ -14,18 +14,17 @@ class Person: self._birth = birth self._death = death self._in_law = in_law - self._uid = uid - self._hide = hide - def uid(self): - return self._uid + @staticmethod + def get_id(first_name: str, name: str, dob: date): + return hash(first_name + name + dob.strftime('%Y%m%d')) + + def get_hash_id(self): + return hash(self._first + self._last + self._birth.strftime('%Y%m%d')) def is_dead(self): return self._death is not None - def hide(self): - return self._hide - def death(self, death: date = None) -> date: if death is not None: self._death = death