5221: Duplicate Families in Descendant Report

svn: r18184
This commit is contained in:
Paul Franklin
2011-09-21 05:40:03 +00:00
parent 19eb347b4a
commit 3ed68aed28

View File

@@ -6,6 +6,7 @@
# Copyright (C) 2009 Gary Burton # Copyright (C) 2009 Gary Burton
# Copyright (C) 2010 Craig J. Anderson # Copyright (C) 2010 Craig J. Anderson
# Copyright (C) 2010 Jakim Friant # Copyright (C) 2010 Jakim Friant
# Copyright (C) 2011 Matt Keenan (matt.keenan@gmail.com)
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -63,8 +64,24 @@ from gen.utils import (get_birth_or_fallback, get_death_or_fallback,
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
class PrintSimple(): class PrintSimple():
def __init__(self, showdups):
self.showdups = showdups
self.num = {0:1}
def number(self, level): def number(self, level):
return "%d." % level if self.showdups:
# Just show original simple numbering
to_return = "%d." % level
else:
to_return = str(level)
if level > 1:
to_return += "-" + str(self.num[level-1])
to_return += "."
self.num[level] = 1
self.num[level-1] = self.num[level-1] + 1
return to_return
#------------------------------------------------------------------------ #------------------------------------------------------------------------
@@ -191,6 +208,7 @@ class Printinfo():
self.doc.write_text(self._name_display.display(person), mark) self.doc.write_text(self._name_display.display(person), mark)
self.dump_string(person) self.dump_string(person)
self.doc.end_paragraph() self.doc.end_paragraph()
return display_num
def print_spouse(self, level, spouse_handle, family_handle): def print_spouse(self, level, spouse_handle, family_handle):
#Currently print_spouses is the same for all numbering systems. #Currently print_spouses is the same for all numbering systems.
@@ -203,6 +221,16 @@ class Printinfo():
self.dump_string(spouse, family_handle) self.dump_string(spouse, family_handle)
self.doc.end_paragraph() self.doc.end_paragraph()
def print_reference(self, level, person, display_num):
#Person and their family have already been printed so
#print reference here
mark = ReportUtils.get_person_mark(self.database, person)
self.doc.start_paragraph("DR-Spouse%d" % min(level, 32))
name = self._name_display.display(person)
self.doc.write_text(_("sp. see %(reference)s : %(spouse)s") %
{'reference':display_num, 'spouse':name}, mark)
self.doc.end_paragraph()
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
@@ -220,29 +248,49 @@ class RecurseDown():
objPrint: A Printinfo derived class that prints person objPrint: A Printinfo derived class that prints person
information on the report information on the report
""" """
def __init__(self, max_generations, database, objPrint): def __init__(self, max_generations, database, objPrint, showdups):
self.max_generations = max_generations self.max_generations = max_generations
self.database = database self.database = database
self.objPrint = objPrint self.objPrint = objPrint
self.showdups = showdups
self.person_printed = {}
def recurse(self, level, person): def recurse(self, level, person, curdepth):
self.objPrint.print_person(level, person) 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(): for family_handle in person.get_family_handle_list():
family = self.database.get_family_from_handle(family_handle) family = self.database.get_family_from_handle(family_handle)
spouse_handle = ReportUtils.find_spouse(person, family) spouse_handle = ReportUtils.find_spouse(person, family)
self.objPrint.print_spouse(level, spouse_handle, family)
if level >= self.max_generations: if not self.showdups and spouse_handle in self.person_printed:
continue # Just print a reference
spouse = self.database.get_person_from_handle(spouse_handle)
self.objPrint.print_reference(level, spouse,
self.person_printed[person_handle])
else:
self.objPrint.print_spouse(level, spouse_handle, family)
childlist = family.get_child_ref_list()[:] spouse_num = _("%s sp." % (ref_str))
for child_ref in childlist: self.person_printed[spouse_handle] = spouse_num
child = self.database.get_person_from_handle(child_ref.ref)
self.recurse(level+1, child)
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)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
@@ -265,6 +313,7 @@ class DescendantReport(Report):
gen - Maximum number of generations to include. gen - Maximum number of generations to include.
name_format - Preferred format to display names name_format - Preferred format to display names
dups - Whether to include duplicate descendant trees
""" """
Report.__init__(self, database, options_class) Report.__init__(self, database, options_class)
@@ -280,9 +329,10 @@ class DescendantReport(Report):
self.by_birthdate = sort.by_birthdate self.by_birthdate = sort.by_birthdate
#Initialize the Printinfo class #Initialize the Printinfo class
self._showdups = menu.get_option_by_name('dups').get_value()
numbering = menu.get_option_by_name('numbering').get_value() numbering = menu.get_option_by_name('numbering').get_value()
if numbering == "Simple": if numbering == "Simple":
obj = PrintSimple() obj = PrintSimple(self._showdups)
elif numbering == "de Villiers/Pama": elif numbering == "de Villiers/Pama":
obj = PrintVilliers() obj = PrintVilliers()
elif numbering == "Meurgey de Tupigny": elif numbering == "Meurgey de Tupigny":
@@ -310,8 +360,9 @@ class DescendantReport(Report):
self.doc.write_text(title, mark) self.doc.write_text(title, mark)
self.doc.end_paragraph() self.doc.end_paragraph()
recurse = RecurseDown(self.max_generations, self.database, self.objPrint) recurse = RecurseDown(self.max_generations, self.database,
recurse.recurse(1, self.center_person) self.objPrint, self._showdups)
recurse.recurse(1, self.center_person, None)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
@@ -364,6 +415,10 @@ class DescendantOptions(MenuReportOptions):
divs.set_help(_("Whether to show divorce information in the report.")) divs.set_help(_("Whether to show divorce information in the report."))
menu.add_option(category_name, "divs", divs) menu.add_option(category_name, "divs", divs)
dups = BooleanOption(_('Show duplicate trees'), True)
dups.set_help(_("Whether to show duplicate family trees in the report."))
menu.add_option(category_name, "dups", dups)
def make_default_style(self, default_style): def make_default_style(self, default_style):
"""Make the default output style for the Descendant Report.""" """Make the default output style for the Descendant Report."""
f = FontStyle() f = FontStyle()