diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 97a88391a..0921e0e3f 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -2,6 +2,10 @@ * src/RelLib.py: Finish up with actual MALE, FEMALE, and UNKNOWN attributes of the Person class. + * src/ReportUtils.py: More report-related methods. + * src/plugins/DetAncestralReport.py: Use ReportUtils methods. + * src/plugins/DetDescendantReport.py: Use ReportUtils methods. + 2005-01-31 Don Allingham * various: Change Person.male, Person.female, and Person.unkwown to Person.MALE, Person.FEMALE and Person.UNKNOWN diff --git a/gramps2/src/ReportUtils.py b/gramps2/src/ReportUtils.py index 4f1d2d22d..d03e6d133 100644 --- a/gramps2/src/ReportUtils.py +++ b/gramps2/src/ReportUtils.py @@ -386,7 +386,7 @@ def insert_images(database, doc, person, w_cm=4.0, h_cm=4.0): # Strings commonly used in reports # #------------------------------------------------------------------------- -def empty_notes(): +def empty_notes(whatever): # Empty stab function for when endnotes are not needed return "" @@ -726,7 +726,8 @@ def born_died_str(database,person,endnotes=None,name_object=None,person_name=Non text = text + " " return text -def married_str(database,person,spouse,event,endnotes=None): +def married_str(database,person,spouse,event,endnotes=None, + empty_date="",empty_place="",is_first=True): """ Composes a string describing marriage of a person. @@ -754,60 +755,144 @@ def married_str(database,person,spouse,event,endnotes=None): if not endnotes: endnotes = empty_notes + date = empty_date + place = empty_place spouse_name = _nd.display(spouse) - date = event.get_date() + mdate = event.get_date() + if mdate: + date = mdate place_handle = event.get_place_handle() if place_handle: place = database.get_place_from_handle(place_handle).get_title() - else: - place = "" text = "" - if date and place: - if person.get_gender() == RelLib.Person.MALE: - text = _('He married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event), - 'date' : date, - 'place' : place} + if is_first: + if date and place: + if person.get_gender() == RelLib.Person.MALE: + text = _('He married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'date' : date, + 'place' : place} + else: + text = _('She married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'date' : date, + 'endnotes' : endnotes(event), + 'place' : place} + elif date: + if person.get_gender() == RelLib.Person.MALE: + text = _('He married %(spouse)s %(date)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'date' : date,} + else: + text = _('She married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place,} + elif place: + if person.get_gender() == RelLib.Person.MALE: + text = _('He married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place} + else: + text = _('She married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place} else: - text = _('She married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'date' : date, - 'endnotes' : endnotes(event), - 'place' : place} - elif date: - if person.get_gender() == RelLib.Person.MALE: - text = _('He married %(spouse)s %(date)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event), - 'date' : date,} - else: - text = _('She married %(spouse)s in %(place)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event), - 'place' : place,} - elif place: - if person.get_gender() == RelLib.Person.MALE: - text = _('He married %(spouse)s in %(place)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event), - 'place' : place} - else: - text = _('She married %(spouse)s in %(place)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event), - 'place' : place} + if person.get_gender() == RelLib.Person.MALE: + text = _('He married %(spouse)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event) } + else: + text = _('She married %(spouse)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event)} else: - if person.get_gender() == RelLib.Person.MALE: - text = _('He married %(spouse)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event) } + if date and place: + if person.get_gender() == RelLib.Person.MALE: + text = _('He also married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'date' : date, + 'place' : place} + else: + text = _('She also married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'date' : date, + 'endnotes' : endnotes(event), + 'place' : place} + elif date: + if person.get_gender() == RelLib.Person.MALE: + text = _('He also married %(spouse)s %(date)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'date' : date,} + else: + text = _('She also married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place,} + elif place: + if person.get_gender() == RelLib.Person.MALE: + text = _('He also married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place} + else: + text = _('She also married %(spouse)s in %(place)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event), + 'place' : place} else: - text = _('She married %(spouse)s%(endnotes)s.') % { - 'spouse' : spouse_name, - 'endnotes' : endnotes(event)} + if person.get_gender() == RelLib.Person.MALE: + text = _('He also married %(spouse)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event) } + else: + text = _('She also married %(spouse)s%(endnotes)s.') % { + 'spouse' : spouse_name, + 'endnotes' : endnotes(event)} + + if text: + text = text + " " + return text + +def married_rel_str(database,person,family,is_first=True): + spouse_handle = find_spouse(person,family) + spouse = database.get_person_from_handle(spouse_handle) + spouse_name = _nd.display(spouse) + + if is_first: + if family.get_relationship() == RelLib.Family.MARRIED: + if person.get_gender() == RelLib.Person.MALE: + text = _('He married %(spouse)s.') % { 'spouse' : spouse_name } + else: + text = _('She married %(spouse)s.') % { 'spouse' : spouse_name } + else: + if person.get_gender() == RelLib.Person.MALE: + text = _('He had relationship with %(spouse)s.') % { + 'spouse' : spouse_name } + else: + text = _('She had relationship with %(spouse)s.') % { + 'spouse' : spouse_name } + else: + if family.get_relationship() == RelLib.Family.MARRIED: + if person.get_gender() == RelLib.Person.MALE: + text = _('He also married %(spouse)s.') % { 'spouse' : spouse_name } + else: + text = _('She also married %(spouse)s.') % { 'spouse' : spouse_name } + else: + if person.get_gender() == RelLib.Person.MALE: + text = _('He also had relationship with %(spouse)s.') % { + 'spouse' : spouse_name } + else: + text = _('She also had relationship with %(spouse)s.') % { + 'spouse' : spouse_name } if text: text = text + " " return text @@ -890,6 +975,8 @@ def child_str(person,person_name=0,father_name="",mother_name="",dead=0): else: text = _("She is the daughter of %(father)s.") % { 'father' : father_name, } + if text: + text = text + " " return text def find_spouse(person,family): @@ -898,10 +985,13 @@ def find_spouse(person,family): else: spouse_id = family.get_mother_handle() return spouse_id - if text: - text = text + " " - return text +def find_marriage(database,family): + for event_handle in family.get_event_list(): + event = database.get_event_from_handle(event_handle) + if event and event.get_name() == "Marriage": + return event + return None def born_str(database,person,person_name=None,empty_date="",empty_place=""): """ @@ -1392,13 +1482,13 @@ def buried_str(database,person,person_name=None,empty_date="",empty_place=""): text = text + " " return text -_rtyle = { - RelLib.Family.MARRIED : _("Married"), - RelLib.Family.UNMARRIED : _("Unmarried"), - RelLib.Family.CIVIL_UNION : _("Civil Union"), - RelLib.Family.UNKNOWN : _("Unknown"), - RelLib.Family.OTHER : _("Other"), +_rtype = { + RelLib.Family.MARRIED : _("Married"), + RelLib.Family.UNMARRIED : _("Unmarried"), + RelLib.Family.CIVIL_UNION : _("Civil Union"), + RelLib.Family.UNKNOWN : _("Unknown"), + RelLib.Family.OTHER : _("Other"), } -def relationship_name(type): - return _rtype.get(type) +def relationship_name(rtype): + return _rtype.get(rtype) diff --git a/gramps2/src/plugins/DetAncestralReport.py b/gramps2/src/plugins/DetAncestralReport.py index 4ec5e746e..cef4dc29c 100644 --- a/gramps2/src/plugins/DetAncestralReport.py +++ b/gramps2/src/plugins/DetAncestralReport.py @@ -1,7 +1,8 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2004 Bruce J. DeGrasse +# Copyright (C) 2000-2002 Bruce J. DeGrasse +# Copyright (C) 2000-2005 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,14 +43,15 @@ import gtk # #------------------------------------------------------------------------ import RelLib -import Errors -from QuestionDialog import ErrorDialog import Report import BaseDoc import ReportOptions import const +import ReportUtils from DateHandler import displayer as _dd +from NameDisplay import displayer as _nd +EMPTY_ENTRY = "_____________" #------------------------------------------------------------------------ # # @@ -101,8 +103,18 @@ class DetAncestorReport(Report.Report): self.childRef = options_class.handler.options_dict['desref'] self.addImages = options_class.handler.options_dict['incphotos'] - self.genIDs = {} - self.prevGenIDs= {} + self.gen_handles = {} + self.prev_gen_hanldes= {} + + if self.blankDate: + self.EMPTY_DATE = EMPTY_ENTRY + else: + self.EMPTY_DATE = "" + + if self.blankPlace: + self.EMPTY_PLACE = EMPTY_ENTRY + else: + self.EMPTY_PLACE = "" def apply_filter(self,person_handle,index): if (not person_handle) or (index >= 2**self.max_generations): @@ -116,60 +128,162 @@ class DetAncestorReport(Report.Report): self.apply_filter(family.get_father_handle(),index*2) self.apply_filter(family.get_mother_handle(),(index*2)+1) - def calcAge(self, ind): - """ Calulate age - APHRASE= - at the age of NUMBER UNIT(S) - UNIT= year | month | day - UNITS= years | months | days - null - """ + def write_report(self): + self.apply_filter(self.start_person.get_handle(),1) - birth_handle = ind.get_birth_handle() + name = self.start_person.get_primary_name().get_regular_name() + self.doc.start_paragraph("DAR-Title") + title = _("Detailed Ancestral Report for %s") % name + self.doc.write_text(title) + self.doc.end_paragraph() + + keys = self.map.keys() + keys.sort() + generation = 0 + need_header = 1 + + for key in keys : + if generation == 0 or key >= 2**generation: + if self.pgbrk and generation > 0: + self.doc.page_break() + self.doc.start_paragraph("DAR-Generation") + t = _("%s Generation") % DetAncestorReport.gen[generation+1] + self.doc.write_text(t) + self.doc.end_paragraph() + generation = generation + 1 + if self.childRef: + self.prev_gen_hanldes= self.gen_handles.copy() + self.gen_handles.clear() + + person_handle = self.map[key] + person = self.database.get_person_from_handle(person_handle) + self.gen_handles[person_handle]= key + dupPerson = self.write_person(key) + if dupPerson == 0: # Is this a duplicate ind record + if person.get_gender() == RelLib.Person.FEMALE and \ + self.listChildren: + for family_handle in person.get_family_handle_list(): + family = self.database.get_family_from_handle(family_handle) + self.write_children(family) + + def write_person(self, key): + """Output birth, death, parentage, marriage and notes information """ + + person_handle = self.map[key] + person = self.database.get_person_from_handle(person_handle) + if self.addImages: + ReportUtils.insert_images(self.database,self.doc,person) + + self.doc.start_paragraph("DAR-First-Entry","%s." % str(key)) + + name = _nd.display(person) + + if self.firstName: + firstName = person.get_primary_name().get_first_name() + elif person.get_gender() == RelLib.Person.MALE: + firstName = _("He") + else: + firstName = _("She") + + self.doc.start_bold() + self.doc.write_text(name) + self.doc.end_bold() + + if self.dupPerson: + # Check for duplicate record (result of distant cousins marrying) + keys = self.map.keys() + keys.sort() + for dkey in keys: + if dkey >= key: + break + if self.map[key] == self.map[dkey]: + self.doc.write_text(_("%(name)s is the same person as [%(id_str)s].") % + { 'name' : '', 'id_str' : str(dkey) }) + self.doc.end_paragraph() + return 1 # Duplicate person + + # Check birth record + birth_handle = person.get_birth_handle() if birth_handle: - birth = self.database.get_event_from_handle(birth_handle).get_date_object() - birth_year_valid = birth.get_year_valid() - else: - birth_year_valid = None - death_handle = ind.get_death_handle() - if death_handle: - death = self.database.get_event_from_handle(death_handle).get_date_object() - death_year_valid = death.get_year_valid() - else: - death_year_valid = None - the_text = "" - if birth_year_valid and death_year_valid: - age = death.get_year() - birth.get_year() - units = 3 # year - if birth.get_month_valid() and death.get_month_valid(): - if birth.get_month() > death.get_month(): - age = age -1 - if birth.get_day_valid() and death.get_day_valid(): - if birth.get_month() == death.get_month() and birth.get_day() > death.get_day(): - age = age -1 - if age == 0: - age = death.get_month() - birth.get_month() # calc age in months - if birth.get_day() > death.get_day(): - age = age - 1 - units = 2 # month - if age == 0: - age = death.get-day() + 31 - birth.get_day() # calc age in days - units = 1 # day - if age > 1: - if units == 1: - the_text = _(" at the age of %d days") % age - elif units == 2: - the_text = _(" at the age of %d months") % age - else: - the_text = _(" at the age of %d years") % age + text = ReportUtils.born_str(self.database,person,"", + self.EMPTY_DATE,self.EMPTY_PLACE) + if text: + self.doc.write_text(text) + + if person.get_death_handle(): + age,units = self.calc_age(person) + text = ReportUtils.died_str(self.database,person,firstName, + self.EMPTY_DATE,self.EMPTY_PLACE,age,units) + if text: + self.doc.write_text(text) + + text = ReportUtils.buried_str(self.database,person,firstName, + self.EMPTY_DATE,self.EMPTY_PLACE) + if text: + self.doc.write_text(text) + + self.write_parents(person, firstName) + self.write_marriage(person) + self.doc.end_paragraph() + + if key == 1: + self.write_mate(person) + + if person.get_note() != "" and self.includeNotes: + self.doc.start_paragraph("DAR-NoteHeader") + self.doc.start_bold() + self.doc.write_text(_("Notes for %(name)s" % { 'name': name } )) + self.doc.end_bold() + self.doc.end_paragraph() + self.doc.write_note(person.get_note(),person.get_note_format(),"DAR-Entry") + + return 0 # Not duplicate person + + def write_parents(self, person, firstName): + family_handle = person.get_main_parents_family_handle() + if family_handle: + family = self.database.get_family_from_handle(family_handle) + mother_handle = family.get_mother_handle() + father_handle = family.get_father_handle() + if mother_handle: + mother = self.database.get_person_from_handle(mother_handle) + mother_name = mother.get_primary_name().get_regular_name() else: - if units == 1: - the_text = _(" at the age of %d day") % age - elif units == 2: - the_text = _(" at the age of %d month") % age - else: - the_text = _(" at the age of %d year") % age - return the_text + mother_name = "" + if father_handle: + father = self.database.get_person_from_handle(father_handle) + father_name = father.get_primary_name().get_regular_name() + else: + father_name = "" + + text = ReportUtils.child_str(person,firstName, + father_name,mother_name, + bool(person.get_death_handle())) + if text: + self.doc.write_text(text) + + def write_marriage(self, person): + """ + Output marriage sentence. + """ + is_first = True + for family_handle in person.get_family_handle_list(): + family = self.database.get_family_from_handle(family_handle) + spouse_handle = ReportUtils.find_spouse(person,family) + spouse = self.database.get_person_from_handle(spouse_handle) + marriage_event = ReportUtils.find_marriage(self.database,family) + text = "" + if marriage_event: + text = ReportUtils.married_str(self.database,person,spouse, + marriage_event,None, + self.EMPTY_DATE,self.EMPTY_PLACE, + is_first) + else: + text = ReportUtils.married_rel_str(self.database,person,family, + is_first) + if text: + self.doc.write_text(text) + is_first = False def write_children(self, family): """ List children @@ -227,8 +341,8 @@ class DetAncestorReport(Report.Report): death_handle = child.get_death_handle() if self.childRef: - if self.prevGenIDs.get(child_handle) != None: - name= "[" + str(self.prevGenIDs.get(child_handle)) + "] "+ name + if self.prev_gen_hanldes.get(child_handle) != None: + name= "[" + str(self.prev_gen_hanldes.get(child_handle)) + "] "+ name if birth_handle: birth = self.database.get_event_from_handle(birth_handle) @@ -315,348 +429,6 @@ class DetAncestorReport(Report.Report): self.doc.end_paragraph() - def write_person(self, key): - """Output birth, death, parentage, marriage and notes information """ - - person_handle = self.map[key] - person = self.database.get_person_from_handle(person_handle) - if self.addImages: - self.insert_images(person) - - self.doc.start_paragraph("DAR-First-Entry","%s." % str(key)) - - name = person.get_primary_name().get_regular_name() - - if self.firstName: - firstName = person.get_primary_name().get_first_name() - elif person.get_gender() == RelLib.Person.MALE: - firstName = _("He") - else: - firstName = _("She") - - self.doc.start_bold() - self.doc.write_text(name) - self.doc.end_bold() - - if self.dupPerson: - # Check for duplicate record (result of distant cousins marrying) - keys = self.map.keys() - keys.sort() - for dkey in keys: - if dkey >= key: - break - if self.map[key] == self.map[dkey]: - self.doc.write_text(_(" is the same person as [%s].") % str(dkey)) - self.doc.end_paragraph() - return 1 # Duplicate person - - # Check birth record - birth_handle = person.get_birth_handle() - if birth_handle: - self.write_birth(person) - if person.get_death_handle(): - self.write_death(person, firstName) - self.write_parents(person, firstName) - self.write_marriage(person) - self.doc.end_paragraph() - - if key == 1: self.write_mate(person) - - if person.get_note() != "" and self.includeNotes: - self.doc.start_paragraph("DAR-NoteHeader") - self.doc.start_bold() - self.doc.write_text(_("Notes for %s" % name)) - self.doc.end_bold() - self.doc.end_paragraph() - self.doc.write_note(person.get_note(),person.get_note_format(),"DAR-Entry") - - return 0 # Not duplicate person - - def write_birth(self, person): - """ Check birth record - Statement formats name precedes this - was born on DATE. - was born on ________. - was born on Date in Place. - was born on ________ in PLACE. - was born in ____________. - was born in the year YEAR. - was born in PLACE. - was born in ____________. - """ - - birth_handle = person.get_birth_handle() - if birth_handle: - birth = self.database.get_event_from_handle(birth_handle) - date = birth.get_date_object() - if birth.get_place_handle(): - place = self.database.get_place_from_handle(birth.get_place_handle()).get_title() - if place[-1:] == '.': - place = place[:-1] - elif self.blankDate: - place= "______________" - else: place= "" - - if _dd.display(date) != "": - if date.get_day_valid() and date.get_month_valid() and \ - self.fullDate: - if place: - self.doc.write_text(_(" was born on %s in %s.") % (_dd.display(date), place)) - else: - self.doc.write_text(_(" was born on %s.") % _dd.display(date)) - elif place: - self.doc.write_text(_(" was born in the year %s in %s.") % \ - (date.get_year(), place)) - else: - self.doc.write_text(_(" was born in the year %s.") % date.get_year()) - elif place: - self.doc.write_text(_(" was born in %s.") % place) - else: - self.doc.write_text(_(".")) - - return - self.doc.write_text(_(".")) - return - - def write_death(self, person, firstName): - """ Write obit sentence - Statement format: DPHRASE APHRASE BPHRASE - DPHRASE= - FIRSTNAME died on FULLDATE in PLACE - FIRSTNAME died on FULLDATE - FIRSTNAME died in PLACE - FIRSTNAME died on FULLDATE in PLACE - FIRSTNAME died in YEAR in PLACE - FIRSTNAME died in YEAR - - APHRASE= see calcAge - at the age of NUMBER UNIT(S) - null - - where - UNIT= year | month | day - UNITS= years | months | days - - BPHRASE= - , and was buried on FULLDATE in PLACE. - , and was buried on FULLDATE. - , and was buried in PLACE. - . - """ - t= "" - death_handle = person.get_death_handle() - if death_handle: - death = self.database.get_event_from_handle(death_handle) - date = death.get_date_object() - if death.get_place_handle(): - place = self.database.get_place_from_handle(death.get_place_handle()).get_title() - if place[-1:] == '.': - place = place[:-1] - elif self.blankPlace: - place= "_____________" - else: - place = "" - - if _dd.display(date): - if date.get_day() and date.get_month() and self.fullDate: - fulldate = _dd.display(date) - elif date.get_month() and self.fullDate: - fulldate= "%s %s" % (date.get_month(), date.get_year()) - else: fulldate= "" - elif self.blankDate: - fulldate= "_____________" - else: fulldate= "" - - if fulldate: - if place: - t= _(" %s died on %s in %s") % (firstName, fulldate, place) - else: t= _(" %s died on %s") % (firstName, fulldate) - elif date.get_year() > 0: - if place: - t= _(" %s died in %s in %s") % (firstName, date.get_year(), place) - else: t= _(" %s died in %s") % (firstName, date.get_year()) - elif place: - t= _(" %s died in %s") % (firstName, place) - - if self.calcAgeFlag: - t= t + self.calcAge(person) - - if t != "": - self.doc.write_text(t) - else: - return - - t= "" - famList = person.get_family_handle_list() - if len(famList) > 0: - for fam_id in famList: - fam = self.database.get_family_from_handle(fam_id) - buried = None - if buried: - date = buried.get_date_object() - place = buried.get_place_name() - if place[-1:] == '.': - place = place[:-1] - fulldate= "" - if date.get_date() != "": - if date.getDayValid() and date.getMonthValid() and \ - self.fullDate: - fulldate= date.get_date() - elif self.blankDate: - fulldate= "___________" - - if fulldate != "" and place != "": - t= _(" And %s was buried on %s in %s.") % (firstName, fulldate, place) - elif fulldate != "" and place == "": - t= _(" And %s was buried on %s.") % (firstName, fulldate) - elif fulldate == "" and place != "": - t= _(" And %s was buried in %s.") % (firstName, place) - - if t != "": - self.doc.write_text(t) - else: self.doc.write_text(".") - - def write_parents(self, person, firstName): - """ Ouptut parents sentence - Statement format: - - FIRSTNAME is the son of FATHER and MOTHER. - FIRSTNAME is the son of FATHER. - FIRSTNAME is the son of MOTHER. - FIRSTNAME is the daughter of FATHER and MOTHER. - FIRSTNAME is the daughter of FATHER. - FIRSTNAME is the daughter of MOTHER. - """ - ext_family_handle = person.get_main_parents_family_handle() - if ext_family_handle: - ext_family = self.database.get_family_from_handle(ext_family_handle) - if ext_family.get_father_handle(): - father_obj = self.database.get_person_from_handle(ext_family.get_father_handle()) - father = father_obj.get_primary_name().get_regular_name() - else: - father= "" - if ext_family.get_mother_handle(): - mother_obj = self.database.get_person_from_handle(ext_family.get_mother_handle()) - mother = mother_obj.get_primary_name().get_regular_name() - else: - mother= "" - - if father or mother: - if person.get_gender() == RelLib.Person.MALE: - if father: - if mother: - self.doc.write_text(_(" %s is the son of %s and %s.") % \ - (firstName, father, mother)) - else: - self.doc.write_text(_(" %s is the son of %s.") % \ - (firstName, father)) - else: - self.doc.write_text(_(" %s is the son of %s.") % \ - (firstName, mother)) - else: - if father: - if mother: - self.doc.write_text(_(" %s is the daughter of %s and %s.") % \ - (firstName, father, mother)) - else: - self.doc.write_text(_(" %s is the daughter of %s.") % \ - (firstName, father)) - else: - self.doc.write_text(_(" %s is the daughter of %s.") % \ - (firstName, mother)) - - - def write_marriage(self, person): - """ Output marriage sentence - HE/SHE married SPOUSE on FULLDATE in PLACE. - HE/SHE married SPOUSE on FULLDATE. - HE/SHE married SPOUSE in PLACE. - HE/SHE married SPOUSE - HE/SHE married on FULLDATE in PLACE. - HE/SHE married on FULLDATE. - HE/SHE married in PLACE. - """ - famList= person.get_family_handle_list() - if len(famList) > 0: - fam_num= 0 - endOfSent= "" - for fam_id in famList: - fam = self.database.get_family_from_handle(fam_id) - fam_num= fam_num + 1 - spouse= "" - t= "" - if person.get_gender() == RelLib.Person.MALE: - if fam.get_mother_handle(): - mother = self.database.get_person_from_handle(fam.get_mother_handle()) - spouse = mother.get_primary_name().get_regular_name() - if fam_num == 1: - heshe = _("He") - elif fam_num < len(famList): - heshe = _(",") - else: heshe = _("and he") - else: - if fam_num == 1: - heshe = _("She") - elif fam_num < len(famList): - heshe = _(",") - else: heshe = _("and she") - - if fam.get_father_handle(): - father = self.database.get_person_from_handle(fam.get_father_handle()) - spouse = father.get_primary_name().get_regular_name() - - for event_handle in fam.get_event_list(): - if event_handle: - event = self.database.get_event_from_handle(event_handle) - if event.get_name() == "Marriage": - marriage = event - break - else: - marriage = None - - fulldate = "" - place = "" - if marriage: - if marriage.get_place_handle(): - place = self.database.get_place_from_handle(marriage.get_place_handle()).get_title() - elif self.blankPlace: - place= "____________" - - date = marriage.get_date_object() - if date: - if date.get_year_valid(): - if date.get_day_valid() and date.get_month_valid() and \ - self.fullDate: - fulldate = _dd.display(date) - elif self.blankDate: - fulldate= "__________" - - if spouse: - if not fulldate and not place: - t= _(" %s married %s") % (heshe, spouse) - elif not fulldate and place: - t= _(" %s married %s in %s") % (heshe, spouse, place) - elif fulldate and not place: - t= _(" %s married %s on %s") % (heshe, spouse, fulldate) - else: - t= _(" %s married %s on %s in %s") % \ - (heshe, spouse, fulldate, place) - else: - if not fulldate and not place: - t= _(" %s married") % heshe - elif not fulldate and place: - t= _(" %s married in %s") % (heshe, place) - elif fulldate and not place: - t= _(" %s married on %s") % (heshe, fulldate) - elif fulldate and place: - t= _(" %s married on %s in %s") % \ - (heshe, fulldate, place) - - if t != "": - self.doc.write_text(t) - endOfSent= "." - if fam_num == len(famList): self.doc.write_text(endOfSent) - def write_mate(self, mate): """Output birth, death, parentage, marriage and notes information """ @@ -682,7 +454,7 @@ class DetAncestorReport(Report.Report): if person: if self.addImages: - self.insert_images(ind) + ReportUtils.insert_images(self.database,self.doc,ind) self.doc.start_paragraph("DAR-Entry") @@ -691,9 +463,21 @@ class DetAncestorReport(Report.Report): self.doc.write_text(person) - self.write_birth(ind) + text = ReportUtils.born_str(self.database,ind,"", + self.EMPTY_DATE,self.EMPTY_PLACE) + if text: + self.doc.write_text(text) - self.write_death(ind, firstName) + age,units = self.calc_age(ind) + text = ReportUtils.died_str(self.database,ind,heshe, + self.EMPTY_DATE,self.EMPTY_PLACE,age,units) + if text: + self.doc.write_text(text) + + text = ReportUtils.buried_str(self.database,ind,heshe, + self.EMPTY_DATE,self.EMPTY_PLACE) + if text: + self.doc.write_text(text) self.write_parents(ind, firstName) @@ -703,64 +487,54 @@ class DetAncestorReport(Report.Report): and mate.get_gender() == RelLib.Person.MALE: self.write_children(fam) - #-------------------------------------------------------------------- - # - # - # - #-------------------------------------------------------------------- - def insert_images(self, person): + def calc_age(self, ind): + """ + Calulate age. + + Returns a tuple (age,units) where units is an integer representing + time units: + no age info: 0 + years: 1 + months: 2 + days: 3 + """ - photos = person.get_media_list() - for photo in photos : - object_handle = photo.get_reference_handle() - object = self.database.get_object_from_handle(object_handle) - if object.get_mime_type()[0:5] == "image": - file = object.get_path() - self.doc.add_media_object(file,"row",4.0,4.0) + age = 0 + units = 0 + if not self.calcAgeFlag: + return (age,units) - #-------------------------------------------------------------------- - # - # - # - #-------------------------------------------------------------------- - def write_report(self): - self.apply_filter(self.start_person.get_handle(),1) + birth_handle = ind.get_birth_handle() + if birth_handle: + birth = self.database.get_event_from_handle(birth_handle).get_date_object() + birth_year_valid = birth.get_year_valid() + else: + birth_year_valid = None + death_handle = ind.get_death_handle() + if death_handle: + death = self.database.get_event_from_handle(death_handle).get_date_object() + death_year_valid = death.get_year_valid() + else: + death_year_valid = None - name = self.start_person.get_primary_name().get_regular_name() - self.doc.start_paragraph("DAR-Title") - title = _("Detailed Ancestral Report for %s") % name - self.doc.write_text(title) - self.doc.end_paragraph() - - keys = self.map.keys() - keys.sort() - generation = 0 - need_header = 1 - - for key in keys : - if generation == 0 or key >= 2**generation: - if self.pgbrk and generation > 0: - self.doc.page_break() - self.doc.start_paragraph("DAR-Generation") - t = _("%s Generation") % DetAncestorReport.gen[generation+1] - self.doc.write_text(t) - self.doc.end_paragraph() - generation = generation + 1 - if self.childRef: - self.prevGenIDs= self.genIDs.copy() - self.genIDs.clear() - - person_handle = self.map[key] - person = self.database.get_person_from_handle(person_handle) - self.genIDs[person_handle]= key - dupPerson= self.write_person(key) - if dupPerson == 0: # Is this a duplicate ind record - if person.get_gender() == RelLib.Person.FEMALE and \ - self.listChildren and \ - len(person.get_family_handle_list()) > 0: - family_handle = person.get_family_handle_list()[0] - family = self.database.get_family_from_handle(family_handle) - self.write_children(family) + if birth_year_valid and death_year_valid: + age = death.get_year() - birth.get_year() + units = 1 # year + if birth.get_month_valid() and death.get_month_valid(): + if birth.get_month() > death.get_month(): + age = age -1 + if birth.get_day_valid() and death.get_day_valid(): + if birth.get_month() == death.get_month() and birth.get_day() > death.get_day(): + age = age -1 + if age == 0: + age = death.get_month() - birth.get_month() # calc age in months + if birth.get_day() > death.get_day(): + age = age - 1 + units = 2 # month + if age == 0: + age = death.get-day() + 31 - birth.get_day() # calc age in days + units = 3 # day + return (age,units) #------------------------------------------------------------------------ # diff --git a/gramps2/src/plugins/DetDescendantReport.py b/gramps2/src/plugins/DetDescendantReport.py index 5c618a9ae..071d2b0b5 100644 --- a/gramps2/src/plugins/DetDescendantReport.py +++ b/gramps2/src/plugins/DetDescendantReport.py @@ -1,7 +1,8 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2004 Bruce J. DeGrasse +# Copyright (C) 2000-2002 Bruce J. DeGrasse +# Copyright (C) 2000-2005 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -391,7 +392,7 @@ class DetDescendantReport(Report.Report): if birth_handle: birth = self.database.get_event_from_handle(birth_handle) date_obj = birth.get_date_object() - date_txt = birth.get_date() + date_txt = birth.get_date() if birth.get_place_handle(): place = self.database.get_place_from_handle(birth.get_place_handle()).get_title() if place[-1:] == '.': @@ -443,7 +444,7 @@ class DetDescendantReport(Report.Report): , and was buried in PLACE. . """ - t= "" + t1 = "" death_handle = person.get_death_handle() if death_handle: death = self.database.get_event_from_handle(death_handle) @@ -474,53 +475,60 @@ class DetDescendantReport(Report.Report): if fulldate: if place: - t = _(" %s died on %s in %s") % (firstName, fulldate, place) + t1 = _(" %s died on %s in %s") % (firstName, fulldate, place) else: - t = _(" %s died on %s") % (firstName, fulldate) + t1 = _(" %s died on %s") % (firstName, fulldate) elif date_obj.get_year() > 0: if place: - t = _(" %s died in %s in %s") % (firstName, date_obj.get_year(), place) + t1 = _(" %s died in %s in %s") % (firstName, date_obj.get_year(), place) else: - t = _(" %s died in %s") % (firstName, date_obj.get_year()) + t1 = _(" %s died in %s") % (firstName, date_obj.get_year()) elif place: - t = _(" %s died in %s") % (firstName, place) + t1 = _(" %s died in %s") % (firstName, place) if self.calcAgeFlag: - t = t + self.calcAge(person) + t1 = t1 + self.calcAge(person) - if t: - self.doc.write_text(t) + t2 = "" + event_list = person.get_event_list() + for event_handle in event_list: + if event_handle: + event = self.database.get_event_from_handle(event_handle) + if event.get_name() == "Burial": + burial = event + break + else: + burial = None - t = "" - famList = person.get_family_handle_list() - if len(famList): - for fam_id in famList: - fam = self.database.get_family_from_handle(fam_id) - buried = None - if buried: - date_obj = buried.get_date_object() - date_txt = buried.get_date() - place = buried.get_place_name() - if place[-1:] == '.': - place = place[:-1] - fulldate= "" - if date_txt: - if date_obj.get_day_valid() and date_obj.get_month_valid() and \ - self.fullDate: - fulldate = date_txt - elif self.blankDate: - fulldate= "___________" + if burial: + place = "" + if burial.get_place_handle(): + place = self.database.get_place_from_handle(burial.get_place_handle()) + elif self.blankPlace: + place = "____________" + + if place[-1:] == '.': + place = place[:-1] - if fulldate and place: - t = _(" And %s was buried on %s in %s.") % (firstName, fulldate, place) - elif fulldate and not place: - t = _(" And %s was buried on %s.") % (firstName, fulldate) - elif not fulldate and place: - t = _(" And %s was buried in %s.") % (firstName, place) + fulldate = "" + date_obj = burial.get_date_object() + if date_obj: + if date_obj.get_day_valid() and date_obj.get_month_valid() and \ + self.fullDate: + fulldate = burial.get_date() + elif self.blankDate: + fulldate= "___________" + if fulldate and place: + t2 = _(" and %s was buried on %s in %s") % (firstName, fulldate, place) + elif fulldate and not place: + t2 = _(" and %s was buried on %s") % (firstName, fulldate) + elif not fulldate and place: + t2 = _(" and %s was buried in %s") % (firstName, place) + + t = t1 + t2 if t: self.doc.write_text(t) - else: self.doc.write_text(".") def write_parents(self, person, firstName): @@ -581,84 +589,89 @@ class DetDescendantReport(Report.Report): HE/SHE married SPOUSE """ famList = person.get_family_handle_list() - if len(famList): - fam_num= 0 - for fam_id in famList: - fam = self.database.get_family_from_handle(fam_id) - fam_num= fam_num + 1 - spouse = "" - if person.get_gender() == RelLib.Person.MALE: - mother_handle = fam.get_mother_handle() - if mother_handle: - spouse = self.database.get_person_from_handle(mother_handle).get_primary_name().get_regular_name() - if fam_num == 1: - heshe = _("He") - elif fam_num < len(famList): - heshe = _(",") - else: - heshe = _("and he") + for fam_num in range(len(famList)): + fam_id = famList[fam_num] + fam = self.database.get_family_from_handle(fam_id) + spouse = "" + t = "" + if person.get_gender() == RelLib.Person.MALE: + mother_handle = fam.get_mother_handle() + if mother_handle: + spouse = self.database.get_person_from_handle(mother_handle).get_primary_name().get_regular_name() + if fam_num == 0: + heshe = _(" He") + elif fam_num < len(famList)-1: + heshe = _(",") else: - if fam_num == 1: - heshe = _("She") - elif fam_num < len(famList): - heshe = _(",") - else: - heshe = _("and she") - - father_handle = fam.get_father_handle() - if father_handle: - spouse = self.database.get_person_from_handle(father_handle).get_primary_name().get_regular_name() - - for event_handle in fam.get_event_list(): - if event_handle: - event = self.database.get_event_from_handle(event_handle) - if event.get_name() == "Marriage": - marriage = event - break + heshe = _(" and he") + else: + if fam_num == 0: + heshe = _(" She") + elif fam_num < len(famList)-1: + heshe = _(",") else: - marriage = None + heshe = _(" and she") - fulldate = "" - place = "" - if marriage: - if marriage.get_place_handle(): - place = self.database.get_place_from_handle(marriage.get_place_handle()).get_title() - elif self.blankPlace: - place= "____________" + father_handle = fam.get_father_handle() + if father_handle: + spouse = self.database.get_person_from_handle(father_handle).get_primary_name().get_regular_name() - date_obj = marriage.get_date_object() - if date_obj: - if date_obj.get_year_valid(): - if date_obj.get_day_valid() and date_obj.get_month_valid() and \ + for event_handle in fam.get_event_list(): + if event_handle: + event = self.database.get_event_from_handle(event_handle) + if event.get_name() == "Marriage": + marriage = event + break + else: + marriage = None + + fulldate = "" + place = "" + if marriage: + if marriage.get_place_handle(): + place = self.database.get_place_from_handle(marriage.get_place_handle()).get_title() + elif self.blankPlace: + place = "____________" + + date_obj = marriage.get_date_object() + if date_obj: + if date_obj.get_year_valid(): + if date_obj.get_day_valid() and date_obj.get_month_valid() and \ self.fullDate: - fulldate = marriage.get_date() - elif self.blankDate: - fulldate = "__________" + fulldate = marriage.get_date() + elif self.blankDate: + fulldate = "__________" + if fam.get_relationship() == RelLib.Family.MARRIED: if spouse: if not fulldate and not place: - t = _(" %s married %s") % (heshe, spouse) + t = _("%s married %s") % (heshe, spouse) elif not fulldate and place: - t = _(" %s married %s in %s") % (heshe, spouse, place) + t = _("%s married %s in %s") % (heshe, spouse, place) elif fulldate and not place: - t = _(" %s married %s on %s") % (heshe, spouse, fulldate) + t = _("%s married %s on %s") % (heshe, spouse, fulldate) else: - t = _(" %s married %s on %s in %s") % \ + t = _("%s married %s on %s in %s") % \ (heshe, spouse, fulldate, place) else: if not fulldate and not place: - t = _(" %s married") % heshe + t = _("%s married") % heshe elif not fulldate and place: - t = _(" %s married in %s") % (heshe, place) + t = _("%s married in %s") % (heshe, place) elif fulldate and not place: - t = _(" %s married on %s") % (heshe, fulldate) + t = _("%s married on %s") % (heshe, fulldate) else: - t = _(" %s married on %s in %s") % \ + t = _("%s married on %s in %s") % \ (heshe, fulldate, place) + else: # Not a marriage + if spouse != "": + t = _("%s had a relationship with %s") % (heshe, spouse) + else: + t = _("%s had a relationship with") % heshe - if t: - self.doc.write_text(t) - if fam_num == len(famList): + if t != "": + self.doc.write_text(t) + if fam_num == len(famList)-1: self.doc.write_text(".") def write_mate(self, person): @@ -769,11 +782,10 @@ class DetDescendantReport(Report.Report): self.genIDs[person_handle]= key dupPerson= self.write_person(key) if dupPerson == 0: # Is this a duplicate ind record - if self.listChildren and \ - len(person.get_family_handle_list()) > 0: - family_handle = person.get_family_handle_list()[0] - family = self.database.get_family_from_handle(family_handle) - self.write_children(family) + if self.listChildren: + for family_handle in person.get_family_handle_list(): + family = self.database.get_family_from_handle(family_handle) + self.write_children(family) #------------------------------------------------------------------------ #