Update to the place report by derHeinzi which link persons and events at a place. #4622

svn: r16615
This commit is contained in:
Gary Burton 2011-02-13 22:09:12 +00:00
parent 6c30648c00
commit b9d7035a2d

View File

@ -35,15 +35,18 @@ from gen.ggettext import gettext as _
# gramps modules # gramps modules
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
from gen.plug.menu import FilterOption, PlaceListOption from gen.plug.menu import FilterOption, PlaceListOption, EnumeratedListOption, \
BooleanOption
from gen.plug.report import Report from gen.plug.report import Report
from gui.plug.report import MenuReportOptions from gui.plug.report import MenuReportOptions
from gen.plug.docgen import (IndexMark, FontStyle, ParagraphStyle, TableStyle, from gen.plug.docgen import (IndexMark, FontStyle, ParagraphStyle, TableStyle,
TableCellStyle, FONT_SANS_SERIF, FONT_SERIF, TableCellStyle, FONT_SANS_SERIF, FONT_SERIF,
INDEX_TYPE_TOC, PARA_ALIGN_CENTER) INDEX_TYPE_TOC, PARA_ALIGN_CENTER)
from gen.proxy import PrivateProxyDb
import DateHandler import DateHandler
import Sort import Sort
from gen.display.name import displayer as _nd from gen.display.name import displayer as _nd
from gui.utils import ProgressMeter
class PlaceReport(Report): class PlaceReport(Report):
""" """
@ -62,6 +65,8 @@ class PlaceReport(Report):
that come in the options class. that come in the options class.
places - List of places to report on. places - List of places to report on.
center - Center of report, person or event
incpriv - Whether to include private data
""" """
@ -69,10 +74,18 @@ class PlaceReport(Report):
menu = options_class.menu menu = options_class.menu
places = menu.get_option_by_name('places').get_value() places = menu.get_option_by_name('places').get_value()
self.center = menu.get_option_by_name('center').get_value()
self.incpriv = menu.get_option_by_name('incpriv').get_value()
if self.incpriv:
self.database = database
else:
self.database = PrivateProxyDb(database)
filter_option = menu.get_option_by_name('filter') filter_option = menu.get_option_by_name('filter')
self.filter = filter_option.get_filter() self.filter = filter_option.get_filter()
self.sort = Sort.Sort(database) self.sort = Sort.Sort(self.database)
if self.filter.get_name() != '': if self.filter.get_name() != '':
# Use the selected filter to provide a list of place handles # Use the selected filter to provide a list of place handles
@ -90,6 +103,9 @@ class PlaceReport(Report):
is opened and ready for writing. is opened and ready for writing.
""" """
# Create progress meter bar
self.progress = ProgressMeter(_("Place Report"), '')
# Write the title line. Set in INDEX marker so that this section will be # Write the title line. Set in INDEX marker so that this section will be
# identified as a major category if this is included in a Book report. # identified as a major category if this is included in a Book report.
@ -100,16 +116,26 @@ class PlaceReport(Report):
self.doc.end_paragraph() self.doc.end_paragraph()
self.__write_all_places() self.__write_all_places()
# Close the progress meter
self.progress.close()
def __write_all_places(self): def __write_all_places(self):
""" """
This procedure writes out each of the selected places. This procedure writes out each of the selected places.
""" """
place_nbr = 1 place_nbr = 1
self.progress.set_pass(_("Generating report"), len(self.place_handles))
for handle in self.place_handles: for handle in self.place_handles:
self.__write_place(handle, place_nbr) self.__write_place(handle, place_nbr)
self.__write_referenced_events(handle) if self.center == "Event":
self.__write_referenced_persons(handle) self.__write_referenced_events(handle)
elif self.center == "Person":
self.__write_referenced_persons(handle)
else:
raise AttributeError("no such center: '%s'" % self.center)
place_nbr += 1 place_nbr += 1
# increment progress bar
self.progress.step()
def __write_place(self, handle, place_nbr): def __write_place(self, handle, place_nbr):
""" """
@ -151,7 +177,8 @@ class PlaceReport(Report):
self.doc.write_text(title) self.doc.write_text(title)
self.doc.end_paragraph() self.doc.end_paragraph()
self.doc.start_table("EventTable", "PLC-EventTable") self.doc.start_table("EventTable", "PLC-EventTable")
column_titles = [_("Date"), _("Type of Event"), _("Description")] column_titles = [_("Date"), _("Type of Event"),
_("Person"), _("Description")]
self.doc.start_row() self.doc.start_row()
for title in column_titles: for title in column_titles:
self.doc.start_cell("PLC-TableColumn") self.doc.start_cell("PLC-TableColumn")
@ -161,13 +188,43 @@ class PlaceReport(Report):
self.doc.end_cell() self.doc.end_cell()
self.doc.end_row() self.doc.end_row()
for handle in event_handles: for evt_handle in event_handles:
event = self.database.get_event_from_handle(handle) event = self.database.get_event_from_handle(evt_handle)
if event: if event:
date = DateHandler.get_date(event) date = DateHandler.get_date(event)
descr = event.get_description() descr = event.get_description()
event_type = str(event.get_type()) event_type = str(event.get_type())
event_details = [date, event_type, descr]
person_list = []
ref_handles = [x for x in
self.database.find_backlink_handles(evt_handle)]
for (ref_type, ref_handle) in ref_handles:
if ref_type == 'Person':
person_list.append(ref_handle)
else:
family = self.database.get_family_from_handle(ref_handle)
father = family.get_father_handle()
if father:
person_list.append(father)
mother = family.get_mother_handle()
if mother:
person_list.append(mother)
people = ""
person_list = list(set(person_list))
for p_handle in person_list:
person = self.database.get_person_from_handle(p_handle)
if person:
if people == "":
people = "%s (%s)" \
% (_nd.display(person),
person.get_gramps_id())
else:
people = _("%s and %s (%s)") \
% (people, _nd.display(person),
person.get_gramps_id())
event_details = [date, event_type, people, descr]
self.doc.start_row() self.doc.start_row()
for detail in event_details: for detail in event_details:
self.doc.start_cell("PLC-Cell") self.doc.start_cell("PLC-Cell")
@ -187,42 +244,91 @@ class PlaceReport(Report):
event_handles = [event_handle for (object_type, event_handle) in event_handles = [event_handle for (object_type, event_handle) in
self.database.find_backlink_handles(handle)] self.database.find_backlink_handles(handle)]
person_list = [] if event_handles:
for evt_handle in event_handles:
ref_handles = [x for x in
self.database.find_backlink_handles(evt_handle)]
print type(self.database.find_backlink_handles(evt_handle))
ref_handles == list(self.database.find_backlink_handles(evt_handle))
for (ref_type, ref_handle) in ref_handles:
if ref_type == 'Person':
person_list.append(ref_handle)
else:
family = self.database.get_family_from_handle(ref_handle)
father = family.get_father_handle()
if father:
person_list.append(father)
mother = family.get_mother_handle()
if mother:
person_list.append(mother)
# Weed out the duplicates where a person has multiple events at the
# place
person_list = list(set(person_list))
person_list.sort(self.sort.by_last_name)
if person_list:
self.doc.start_paragraph("PLC-Section") self.doc.start_paragraph("PLC-Section")
title = _("People associated with this place") title = _("People associated with this place")
self.doc.write_text(title) self.doc.write_text(title)
self.doc.end_paragraph() self.doc.end_paragraph()
self.doc.start_table("EventTable", "PLC-PersonTable")
column_titles = [_("Person"), _("Type of Event"), \
_("Description"), _("Date")]
self.doc.start_row()
for title in column_titles:
self.doc.start_cell("PLC-TableColumn")
self.doc.start_paragraph("PLC-ColumnTitle")
self.doc.write_text(title)
self.doc.end_paragraph()
self.doc.end_cell()
self.doc.end_row()
for handle in person_list: person_dict = {}
person = self.database.get_person_from_handle(handle) for evt_handle in event_handles:
if person: ref_handles = [x for x in
self.database.find_backlink_handles(evt_handle)]
for (ref_type, ref_handle) in ref_handles:
if ref_type == 'Person':
person = self.database.get_person_from_handle(ref_handle)
nameEntry = "%s (%s)" % (_nd.display(person),
person.get_gramps_id())
if person_dict.has_key(nameEntry):
person_dict[nameEntry].append(evt_handle)
else:
person_dict[nameEntry] = []
person_dict[nameEntry].append(evt_handle)
else:
family = self.database.get_family_from_handle(ref_handle)
f_handle = family.get_father_handle()
m_handle = family.get_mother_handle()
if f_handle and m_handle:
father = self.database.get_person_from_handle(f_handle)
mother = self.database.get_person_from_handle(m_handle)
nameEntry = "%s (%s) and %s (%s)" % \
(_nd.display(father),
father.get_gramps_id(),
_nd.display(mother),
mother.get_gramps_id())
else:
if f_handle:
p_handle = f_handle
else:
p_handle = m_handle
person = self.database.get_person_from_handle(p_handle)
nameEntry = "%s (%s)" % \
(_nd.display(person),
person.get_gramps_id())
if person_dict.has_key(nameEntry):
person_dict[nameEntry].append(evt_handle)
else:
person_dict[nameEntry] = []
person_dict[nameEntry].append(evt_handle)
keys = person_dict.keys()
keys.sort()
for entry in keys:
people = entry
person_dict[entry].sort(self.sort.by_date)
for evt_handle in person_dict[entry]:
event = self.database.get_event_from_handle(evt_handle)
if event:
date = DateHandler.get_date(event)
descr = event.get_description()
event_type = str(event.get_type())
event_details = [people, event_type, descr, date]
self.doc.start_row()
for detail in event_details:
self.doc.start_cell("PLC-Cell")
self.doc.start_paragraph("PLC-Details") self.doc.start_paragraph("PLC-Details")
self.doc.write_text("%s (%s)" % (_nd.display(person), self.doc.write_text("%s " % detail)
person.get_gramps_id()))
self.doc.end_paragraph() self.doc.end_paragraph()
self.doc.end_cell()
people = "" # do not repeat the name on the next event
self.doc.end_row()
if event_handles:
self.doc.end_table()
def __get_place_handles(self, places): def __get_place_handles(self, places):
""" """
@ -273,6 +379,17 @@ class PlaceOptions(MenuReportOptions):
places.set_help(_("List of places to report on")) places.set_help(_("List of places to report on"))
menu.add_option(category_name, "places", places) menu.add_option(category_name, "places", places)
center = EnumeratedListOption(_("Center on"), "Event")
center.set_items([
("Event", _("Event")),
("Person", _("Person"))])
center.set_help(_("If report is event or person centered"))
menu.add_option(category_name, "center", center)
incpriv = BooleanOption(_("Include private data"), True)
incpriv.set_help(_("Whether to include private data"))
menu.add_option(category_name, "incpriv", incpriv)
def make_default_style(self, default_style): def make_default_style(self, default_style):
""" """
Make the default output style for the Place report. Make the default output style for the Place report.
@ -360,12 +477,20 @@ class PlaceOptions(MenuReportOptions):
Define the style used for event table Define the style used for event table
""" """
table = TableStyle() table = TableStyle()
table.set_width(80) table.set_width(100)
table.set_columns(3) table.set_columns(4)
table.set_column_width(0, 20) table.set_column_width(0, 25)
table.set_column_width(1, 20) table.set_column_width(1, 15)
table.set_column_width(2, 40) table.set_column_width(2, 35)
table.set_column_width(3, 25)
self.default_style.add_table_style("PLC-EventTable", table) self.default_style.add_table_style("PLC-EventTable", table)
table.set_width(100)
table.set_columns(4)
table.set_column_width(0, 35)
table.set_column_width(1, 15)
table.set_column_width(2, 25)
table.set_column_width(3, 25)
self.default_style.add_table_style("PLC-PersonTable", table)
def __details_style(self): def __details_style(self):
""" """