def findChildren(self): # we need to start with all of our "people of interest" childrenNotYetProcessed = set(self._interest_set) childrenToInclude = set() # now we find all the children of our people of interest while len(childrenNotYetProcessed) > 0: handle = childrenNotYetProcessed.pop() if handle not in childrenToInclude: person = self._db.get_person_from_handle(handle) # if this is a private record, and we're not # including private records, then go back to the # top of the while loop to get the next person if person.private and not self._incprivate: continue # remember this person! childrenToInclude.add(handle) # if we have a limit on the number of people, and we've # reached that limit, then don't attempt to find any # more children if self._limitchildren and ( self._maxchildren < (len(childrenNotYetProcessed) + len(childrenToInclude))): # get back to the top of the while loop so we can finish # processing the people queued up in the "not yet processed" list continue # iterate through this person's families for family_handle in person.get_family_handle_list(): family = self._db.get_family_from_handle(family_handle) if (family.private and self._incprivate) or not family.private: # queue up any children from this person's family for childRef in family.get_child_ref_list(): child = self._db.get_person_from_handle( childRef.ref) if (child.private and self._incprivate) or not child.private: childrenNotYetProcessed.add(child.get_handle()) self._families.add(family_handle) # include the spouse from this person's family spouse_handle = ReportUtils.find_spouse(person, family) if spouse_handle: spouse = self._db.get_person_from_handle( spouse_handle) if (spouse.private and self._incprivate) or not spouse.private: childrenToInclude.add(spouse_handle) self._families.add(family_handle) # we now merge our temp set "childrenToInclude" into our master set self._people.update(childrenToInclude)
def dump(self, level, person): self.append_text(" " * (level - 1)) self.append_text("%s. " % level) self.link(name_displayer.display_name(person.get_primary_name()), 'Person', person.handle, tooltip=_("Click to make active\n") + \ _("Right-click to edit")) self.dump_dates(person) self.append_text("\n") if level >= self.max_generations: return for family_handle in person.get_family_handle_list(): family = self.dbstate.db.get_family_from_handle(family_handle) spouse_handle = ReportUtils.find_spouse(person, family) if spouse_handle: spouse = self.dbstate.db.get_person_from_handle(spouse_handle) self.append_text(" " * (level - 1)) self.append_text(_(" sp. ")) self.link(name_displayer.display_name(spouse.get_primary_name()), 'Person', spouse.handle, tooltip=_("Click to make active\n") + \ _("Right-click to edit")) self.dump_dates(spouse) self.append_text("\n") childlist = family.get_child_ref_list()[:] for child_ref in childlist: child = self.dbstate.db.get_person_from_handle(child_ref.ref) self.dump(level + 1, child)
def __get_spouse(self, person, family): spouse_handle = ReportUtils.find_spouse(person, family) if not spouse_handle: if family.get_relationship() == FamilyRelType.MARRIED: return UnknownPerson else: return None spouse = self.dbstate.db.get_person_from_handle(spouse_handle) if self.__ignore_handle is not None and \ self.__ignore_handle in spouse.get_tag_list(): return None else: return spouse
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) if spouse: name = self._name_display.display_formal(spouse) else: name = "" text = "" spouse_mark = ReportUtils.get_person_mark(self.database, spouse) text = self.__narrator.get_married_string(family, is_first, self._name_display) if text: self.doc.write_text_citation(text, spouse_mark) is_first = False
def recurse(self, level, person, curdepth): person_handle = person.get_handle() display_num = self.objPrint.print_person(level, person) if curdepth is None: ref_str = display_num else: ref_str = curdepth + " " + display_num if person_handle not in self.person_printed: self.person_printed[person_handle] = ref_str 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) if not self.showdups and spouse_handle in self.person_printed: # Just print a reference spouse = self.database.get_person_from_handle(spouse_handle) self.objPrint.print_reference( level, spouse, self.person_printed[spouse_handle]) else: self.objPrint.print_spouse(level, spouse_handle, family) if spouse_handle: spouse_num = _("%s sp." % (ref_str)) self.person_printed[spouse_handle] = spouse_num if level >= self.max_generations: continue childlist = family.get_child_ref_list()[:] for child_ref in childlist: child = self.database.get_person_from_handle(child_ref.ref) self.recurse(level + 1, child, ref_str)
def display(self, tobj, person): """Fill text buffer tobj with detailed info on person person.""" normal = tobj.create_tag() normal.set_property('indent', 10) normal.set_property('pixels-above-lines', 1) normal.set_property('pixels-below-lines', 1) indent = tobj.create_tag() indent.set_property('indent', 30) indent.set_property('pixels-above-lines', 1) indent.set_property('pixels-below-lines', 1) title = tobj.create_tag() title.set_property('weight', pango.WEIGHT_BOLD) title.set_property('scale', pango.SCALE_LARGE) self.add(tobj, title, name_displayer.display(person)) self.add(tobj, normal, "%s:\t%s" % (_('ID'), person.get_gramps_id())) self.add(tobj, normal, "%s:\t%s" % (_('Gender'), sex[person.get_gender()])) bref = person.get_birth_ref() if bref: self.add(tobj, normal, "%s:\t%s" % (_('Birth'), self.get_event_info(bref.ref))) dref = person.get_death_ref() if dref: self.add(tobj, normal, "%s:\t%s" % (_('Death'), self.get_event_info(dref.ref))) nlist = person.get_alternate_names() if len(nlist) > 0: self.add(tobj, title, _("Alternate Names")) for name in nlist: self.add(tobj, normal, name_displayer.display_name(name)) elist = person.get_event_ref_list() if len(elist) > 0: self.add(tobj, title, _("Events")) for event_ref in person.get_event_ref_list(): event_handle = event_ref.ref role = event_ref.get_role() name = str( self.database.get_event_from_handle( event_handle).get_type()) if role.is_primary(): self.add( tobj, normal, "%s:\t%s" % (name, self.get_event_info(event_handle))) else: self.add( tobj, normal, "%s (%s):\t%s" % (name, role, self.get_event_info(event_handle))) plist = person.get_parent_family_handle_list() if len(plist) > 0: self.add(tobj, title, _("Parents")) for fid in person.get_parent_family_handle_list(): (fname, mname, gid) = self.get_parent_info(fid) self.add(tobj, normal, "%s:\t%s" % (_('Family ID'), gid)) if fname: self.add(tobj, indent, "%s:\t%s" % (_('Father'), fname)) if mname: self.add(tobj, indent, "%s:\t%s" % (_('Mother'), mname)) else: self.add(tobj, normal, _("No parents found")) self.add(tobj, title, _("Spouses")) slist = person.get_family_handle_list() if len(slist) > 0: for fid in slist: (fname, mname, pid) = self.get_parent_info(fid) family = self.database.get_family_from_handle(fid) self.add(tobj, normal, "%s:\t%s" % (_('Family ID'), pid)) spouse_id = ReportUtils.find_spouse(person, family) if spouse_id: spouse = self.database.get_person_from_handle(spouse_id) self.add(tobj, indent, "%s:\t%s" % (_('Spouse'), name_of(spouse))) relstr = str(family.get_relationship()) self.add(tobj, indent, "%s:\t%s" % (_('Type'), relstr)) event = ReportUtils.find_marriage(self.database, family) if event: self.add( tobj, indent, "%s:\t%s" % (_('Marriage'), self.get_event_info(event.get_handle()))) for child_ref in family.get_child_ref_list(): child = self.database.get_person_from_handle(child_ref.ref) self.add(tobj, indent, "%s:\t%s" % (_('Child'), name_of(child))) else: self.add(tobj, normal, _("No spouses or children found")) alist = person.get_address_list() if len(alist) > 0: self.add(tobj, title, _("Addresses")) for addr in alist: location = ", ".join([ addr.get_street(), addr.get_city(), addr.get_state(), addr.get_country(), addr.get_postal_code(), addr.get_phone() ]) self.add(tobj, normal, location.strip())
def removeUninterestingParents(self): # start with all the people we've already identified unprocessed_parents = set(self._people) while len(unprocessed_parents) > 0: handle = unprocessed_parents.pop() person = self._db.get_person_from_handle(handle) # There are a few things we're going to need, # so look it all up right now; such as: # - who is the child? # - how many children? # - parents? # - spouse? # - is a person of interest? # - spouse of a person of interest? # - same surname as a person of interest? # - spouse has the same surname as a person of interest? child_handle = None child_count = 0 spouse_handle = None spouse_count = 0 father_handle = None mother_handle = None spouse_father_handle = None spouse_mother_handle = None spouse_surname = "" surname = person.get_primary_name().get_surname() surname = surname.encode('iso-8859-1', 'xmlcharrefreplace') # first we get the person's father and mother for family_handle in person.get_parent_family_handle_list(): family = self._db.get_family_from_handle(family_handle) handle = family.get_father_handle() if handle in self._people: father_handle = handle handle = family.get_mother_handle() if handle in self._people: mother_handle = handle # now see how many spouses this person has for family_handle in person.get_family_handle_list(): family = self._db.get_family_from_handle(family_handle) handle = ReportUtils.find_spouse(person, family) if handle in self._people: spouse_count += 1 spouse = self._db.get_person_from_handle(handle) spouse_handle = handle spouse_surname = spouse.get_primary_name().get_surname() spouse_surname = spouse_surname.encode( 'iso-8859-1', 'xmlcharrefreplace') # see if the spouse has parents if not spouse_father_handle and not spouse_mother_handle: for family_handle in \ spouse.get_parent_family_handle_list(): family = self._db.get_family_from_handle( family_handle) handle = family.get_father_handle() if handle in self._people: spouse_father_handle = handle handle = family.get_mother_handle() if handle in self._people: spouse_mother_handle = handle # get the number of children that we think might be interesting for family_handle in person.get_family_handle_list(): family = self._db.get_family_from_handle(family_handle) for child_ref in family.get_child_ref_list(): if child_ref.ref in self._people: child_count += 1 child_handle = child_ref.ref # we now have everything we need -- start looking for reasons # why this is a person we need to keep in our list, and loop # back to the top as soon as a reason is discovered # if this person has many children of interest, then we # automatically keep this person if child_count > 1: continue # if this person has many spouses of interest, then we # automatically keep this person if spouse_count > 1: continue # if this person has parents, then we automatically keep # this person if father_handle is not None or mother_handle is not None: continue # if the spouse has parents, then we automatically keep # this person if spouse_father_handle is not None or spouse_mother_handle is not None: continue # if this is a person of interest, then we automatically keep if person.get_handle() in self._interest_set: continue # if the spouse is a person of interest, then we keep if spouse_handle in self._interest_set: continue # if the surname (or the spouse's surname) matches a person # of interest, then we automatically keep this person bKeepThisPerson = False for personOfInterestHandle in self._interest_set: personOfInterest = self._db.get_person_from_handle( personOfInterestHandle) surnameOfInterest = personOfInterest.get_primary_name( ).get_surname().encode('iso-8859-1', 'xmlcharrefreplace') if surnameOfInterest == surname or surnameOfInterest == spouse_surname: bKeepThisPerson = True break if bKeepThisPerson: continue # if we have a special colour to use for this person, # then we automatically keep this person if surname in self._surnamecolors: continue # if we have a special colour to use for the spouse, # then we automatically keep this person if spouse_surname in self._surnamecolors: continue # took us a while, but if we get here, then we can remove this person self._deleted_people += 1 self._people.remove(person.get_handle()) # we can also remove any families to which this person belonged for family_handle in person.get_family_handle_list(): if family_handle in self._families: self._deleted_families += 1 self._families.remove(family_handle) # if we have a spouse, then ensure we queue up the spouse if spouse_handle: if spouse_handle not in unprocessed_parents: unprocessed_parents.add(spouse_handle) # if we have a child, then ensure we queue up the child if child_handle: if child_handle not in unprocessed_parents: unprocessed_parents.add(child_handle)
def findParents(self): # we need to start with all of our "people of interest" ancestorsNotYetProcessed = set(self._interest_set) # now we find all the immediate ancestors of our people of interest while ancestorsNotYetProcessed: handle = ancestorsNotYetProcessed.pop() # One of 2 things can happen here: # 1) we've already know about this person and he/she is already # in our list # 2) this is someone new, and we need to remember him/her # # In the first case, there isn't anything else to do, so we simply # go back to the top and pop the next person off the list. # # In the second case, we need to add this person to our list, and # then go through all of the parents this person has to find more # people of interest. if handle not in self._people: person = self._db.get_person_from_handle(handle) # if this is a private record, and we're not # including private records, then go back to the # top of the while loop to get the next person if person.private and not self._incprivate: continue # remember this person! self._people.add(handle) # see if a family exists between this person and someone else # we have on our list of people we're going to output -- if # there is a family, then remember it for when it comes time # to link spouses together for family_handle in person.get_family_handle_list(): family = self._db.get_family_from_handle(family_handle) spouse_handle = ReportUtils.find_spouse(person, family) if spouse_handle: if (spouse_handle in self._people or spouse_handle in ancestorsNotYetProcessed): self._families.add(family_handle) # if we have a limit on the number of people, and we've # reached that limit, then don't attempt to find any # more ancestors if self._limitparents and ( self._maxparents < len(ancestorsNotYetProcessed) + len(self._people)): # get back to the top of the while loop so we can finish # processing the people queued up in the "not yet # processed" list continue # queue the parents of the person we're processing for family_handle in person.get_parent_family_handle_list(): family = self._db.get_family_from_handle(family_handle) if not family.private or self._incprivate: father = self._db.get_person_from_handle( family.get_father_handle()) mother = self._db.get_person_from_handle( family.get_mother_handle()) if father: if not father.private or self._incprivate: ancestorsNotYetProcessed.add( family.get_father_handle()) self._families.add(family_handle) if mother: if not mother.private or self._incprivate: ancestorsNotYetProcessed.add( family.get_mother_handle()) self._families.add(family_handle)
def findRelatedPeople(self): #TRANS: No singular form is needed. self.progress.set_pass( ngettext("Finding relationships between %d person", "Finding relationships between %d people", self.numberOfPeopleInDatabase) % self.numberOfPeopleInDatabase, self.numberOfPeopleInDatabase) # as long as we have people we haven't processed yet, keep looping while len(self.handlesOfPeopleToBeProcessed) > 0: handle = self.handlesOfPeopleToBeProcessed.pop() ### DEBUG DEBUG DEBUG # if len(self.handlesOfPeopleAlreadyProcessed) > 50: # break ### # see if we've already processed this person if handle in self.handlesOfPeopleAlreadyProcessed: continue person = self.db.get_person_from_handle(handle) # if we get here, then we're dealing with someone new self.progress.step() # remember that we've now seen this person self.handlesOfPeopleAlreadyProcessed.add(handle) # we have 4 things to do: find (1) spouses, (2) parents, siblings(3), and (4) children # step 1 -- spouses for familyHandle in person.get_family_handle_list(): family = self.db.get_family_from_handle(familyHandle) spouseHandle = ReportUtils.find_spouse(person, family) if spouseHandle and \ spouseHandle not in self.handlesOfPeopleAlreadyProcessed: self.handlesOfPeopleToBeProcessed.add(spouseHandle) # step 2 -- parents for familyHandle in person.get_parent_family_handle_list(): family = self.db.get_family_from_handle(familyHandle) fatherHandle = family.get_father_handle() motherHandle = family.get_mother_handle() if fatherHandle and \ fatherHandle not in self.handlesOfPeopleAlreadyProcessed: self.handlesOfPeopleToBeProcessed.add(fatherHandle) if motherHandle and \ motherHandle not in self.handlesOfPeopleAlreadyProcessed: self.handlesOfPeopleToBeProcessed.add(motherHandle) # step 3 -- siblings for familyHandle in person.get_parent_family_handle_list(): family = self.db.get_family_from_handle(familyHandle) for childRef in family.get_child_ref_list(): childHandle = childRef.ref if childHandle and \ childHandle not in self.handlesOfPeopleAlreadyProcessed: self.handlesOfPeopleToBeProcessed.add(childHandle) # step 4 -- children for familyHandle in person.get_family_handle_list(): family = self.db.get_family_from_handle(familyHandle) for childRef in family.get_child_ref_list(): childHandle = childRef.ref if childHandle and \ childHandle not in self.handlesOfPeopleAlreadyProcessed: self.handlesOfPeopleToBeProcessed.add(childHandle)