From e16a75f449f3e3c40f9a168095a21d778f40fc7c Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Wed, 27 Jan 2010 06:06:35 +0000 Subject: [PATCH] Some bug fixes on Probably Alive svn: r14147 --- src/Utils.py | 72 +++++++++++++++++---- src/plugins/quickview/AgeOnDate.py | 28 +++----- src/plugins/tool/CalculateEstimatedDates.py | 2 + 3 files changed, 71 insertions(+), 31 deletions(-) diff --git a/src/Utils.py b/src/Utils.py index e25865e50..966e81b47 100644 --- a/src/Utils.py +++ b/src/Utils.py @@ -525,7 +525,7 @@ class ProbablyAlive(object): explain = _("birth date") if death_date and birth_date: - return (birth_date, death_date, explain, "") # direct self evidence + return (birth_date, death_date, explain, person) # direct self evidence # Neither birth nor death events are available. Try looking # at siblings. If a sibling was born more than X years past, @@ -606,6 +606,23 @@ class ProbablyAlive(object): date1, date2, explain, other = self.probably_alive_range(mother, is_spouse=True) if date1 and date2: return date1, date2, _("a spouse, ") + explain, other + # Let's check the family events and see if we find something + for ref in family.get_event_ref_list(): + if ref: + event = self.db.get_event_from_handle(ref.ref) + if event: + date = event.get_date_object() + year = date.get_year() + if year != 0: + other = None + if person.handle == mother_handle and father_handle: + other = self.db.get_person_from_handle(father_handle) + elif person.handle == father_handle and mother_handle: + other = self.db.get_person_from_handle(mother_handle) + return (gen.lib.Date().copy_ymd(year - self.AVG_GENERATION_GAP), + gen.lib.Date().copy_ymd(year + (self.MAX_AGE_PROB_ALIVE - + self.AVG_GENERATION_GAP)), + _("event with spouse"), other) # Try looking for descendants that were born more than a lifespan # ago. @@ -798,7 +815,8 @@ def probably_alive(person, db, limit=0, max_sib_age_diff=None, max_age_prob_alive=None, - avg_generation_gap=None): + avg_generation_gap=None, + return_range=False): """ Return true if the person may be alive on current_date. @@ -815,24 +833,56 @@ def probably_alive(person, db, """ pb = ProbablyAlive(db, max_sib_age_diff, max_age_prob_alive, avg_generation_gap) - birth, death, explain, relative = pb.probably_alive_range(person, db) + birth, death, explain, relative = pb.probably_alive_range(person) if death is None: # no evidence... can't say if alive/dead - return True + if return_range: + return (True, birth, death, explain, relative) + else: + return True # must have est dates if current_date: # date in which to consider alive # SPECIAL CASE: Today: if current_date.match(gen.lib.date.Today(), "=="): if person.get_death_ref(): - return False + if return_range: + return (False, birth, death, explain, relative) + else: + return False + # if death in the future: + if (gen.lib.date.Today() - death)[0] < 0: + if return_range: + return (True, birth, death, explain, relative) + else: + return True + ########### Not today, or today and no death ref: if limit: death += limit # add these years to death - if death.match(gen.lib.date.Today(), ">"): - return True + # if the current - birth is too big, not alive: + if (current_date - birth)[0] > max_age_prob_alive: + if return_range: + return (False, birth, death, explain, relative) + else: + return False + # Finally, check to see if current_date is between dates result = (current_date.match(birth, ">=") and current_date.match(death, "<=")) - return result - # else, they have a est death date, and no current_date give, thus dead - return False + if return_range: + return (result, birth, death, explain, relative) + else: + return result + # Future death: + if (gen.lib.date.Today() - death)[0] < 0: + if return_range: + return (True, birth, death, explain, relative) + else: + return True + # else, they have a est death date, and Today, thus dead + else: + if return_range: + return (False, birth, death, explain, relative) + else: + return False + def probably_alive_range(person, db, max_sib_age_diff=None, @@ -844,7 +894,7 @@ def probably_alive_range(person, db, """ pb = ProbablyAlive(db, max_sib_age_diff, max_age_prob_alive, avg_generation_gap) - return pb.probably_alive_range(person, db) + return pb.probably_alive_range(person) #------------------------------------------------------------------------- # diff --git a/src/plugins/quickview/AgeOnDate.py b/src/plugins/quickview/AgeOnDate.py index 23cac96dd..824994468 100644 --- a/src/plugins/quickview/AgeOnDate.py +++ b/src/plugins/quickview/AgeOnDate.py @@ -28,6 +28,7 @@ Display references for any object """ from Simple import SimpleAccess, SimpleDoc, SimpleTable +from Utils import probably_alive from gen.ggettext import gettext as _ import DateHandler import gen.lib @@ -54,26 +55,13 @@ def run(database, document, date): stab.columns(_("Person"), _("Age")) # Actual Date makes column unicode matches = 0 for person in sdb.all_people(): - birth_date = None - birth_str = "" - birth_sort = 0 - birth_ref = gen.lib.Person.get_birth_ref(person) - birth_date = get_event_date_from_ref(database, birth_ref) - death_ref = gen.lib.Person.get_death_ref(person) - death_date = get_event_date_from_ref(database, death_ref) - if birth_date: - if (birth_date.get_valid() and birth_date < date and - birth_date.get_year() != 0 and - ((death_date is None) or (death_date > date))): - diff_span = (date - birth_date) - if ((death_date is not None) or - (death_date is None and - int(diff_span)/365.0 <= config.get('behavior.max-age-prob-alive'))): - birth_str = str(diff_span) - birth_sort = int(diff_span) - if birth_str != "": - stab.row(person, birth_str) - stab.row_sort_val(1, diff_span) + alive, birth, death, explain, relative = \ + probably_alive(person, database, date, return_range=True) + # Doesn't show people probably alive but no way of figuring an age: + if alive and birth: + diff_span = (date - birth) + stab.row(person, str(diff_span)) + stab.row_sort_val(1, int(diff_span)) matches += 1 sdoc.paragraph(_("\n%d matches.\n") % matches) diff --git a/src/plugins/tool/CalculateEstimatedDates.py b/src/plugins/tool/CalculateEstimatedDates.py index 180b1df33..e4d71f5fc 100644 --- a/src/plugins/tool/CalculateEstimatedDates.py +++ b/src/plugins/tool/CalculateEstimatedDates.py @@ -352,6 +352,8 @@ class CalcToolManagedWindow(PluginWindows.ToolManagedWindowBatch): date1 = gen.lib.Date() if add_death == 1 and not death_ref: # no date date2 = gen.lib.Date() + if person == other: + other = None stab.row("checkbox", person, action,