Some bug fixes on Probably Alive
svn: r14147
This commit is contained in:
		
							
								
								
									
										72
									
								
								src/Utils.py
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								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) | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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,  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user