add "living people" option to Statistics Chart report

This commit is contained in:
Paul Franklin 2016-04-23 23:11:26 -07:00
parent f0e89ef9d3
commit 52d414587f
2 changed files with 44 additions and 22 deletions

View File

@ -194,9 +194,11 @@ def run_living_people_option(report, menu, llocale=glocale):
:param llocale: allow deferred translation of "[Living]"
:type llocale: a :class:`.GrampsLocale` instance
"""
living_people = menu.get_option_by_name('living_people').get_value()
option = menu.get_option_by_name('living_people')
living_value = option.get_value()
years_past_death = menu.get_option_by_name('years_past_death').get_value()
if living_people != LivingProxyDb.MODE_INCLUDE_ALL:
report.database = LivingProxyDb(report.database, living_people,
if living_value != LivingProxyDb.MODE_INCLUDE_ALL:
report.database = LivingProxyDb(report.database, living_value,
years_after_death=years_past_death,
llocale=llocale)
return option

View File

@ -730,31 +730,40 @@ class StatisticsChart(Report):
database - the GRAMPS database instance
options - instance of the Options class for this report
user - a gen.user.User() instance
incl_private - Whether to include private data
living_people - How to handle living people
years_past_death - Consider as living this many years after death
"""
Report.__init__(self, database, options, user)
menu = options.menu
self._user = user
stdoptions.run_private_data_option(self, menu)
get_option_by_name = menu.get_option_by_name
get_value = lambda name: get_option_by_name(name).get_value()
lang = menu.get_option_by_name('trans').get_value()
rlocale = self.set_locale(lang)
# override default gettext, or English output will have "person|Title"
self._ = rlocale.translation.sgettext
self.filter_option = get_option_by_name('filter')
self.filter = self.filter_option.get_filter()
filter_name = self.filter.get_name(rlocale)
stdoptions.run_private_data_option(self, menu)
living_opt = stdoptions.run_living_people_option(self, menu, rlocale)
get_option_by_name = menu.get_option_by_name
get_value = lambda name: get_option_by_name(name).get_value()
filter_opt = get_option_by_name('filter')
self.filter = filter_opt.get_filter()
self.fil_name = self.filter.get_name(rlocale)
self.bar_items = get_value('bar_items')
year_from = get_value('year_from')
year_to = get_value('year_to')
gender = get_value('gender')
living_value = get_value('living_people')
for (value, description) in living_opt.get_items():
if value == living_value:
self.living_desc = '(%s)' % self._(description)
break
# title needs both data extraction method name + gender name
if gender == Person.MALE:
genders = self._("Men")
@ -780,7 +789,7 @@ class StatisticsChart(Report):
# extract requested items from the database and count them
self._user.begin_progress(_('Statistics Charts'),
_('Collecting data...'),
database.get_number_of_people())
self.database.get_number_of_people())
tables = _Extract.collect_data(self.database, self.filter, menu,
gender, year_from, year_to,
get_value('no_years'),
@ -799,7 +808,7 @@ class StatisticsChart(Report):
# document heading
heading = "%(str1)s -- %(str2)s" % {'str1' : self._(table[0]),
'str2' : span_string}
self.data.append((heading, filter_name, table[0], table[1], lookup))
self.data.append((heading, table[0], table[1], lookup))
self._user.step_progress()
self._user.end_progress()
@ -831,15 +840,15 @@ class StatisticsChart(Report):
self.doc.draw_text('SC-title', '', 0, 0, mark) # put it in TOC
mark = None # crock, but we only want one of them
if len(data[3]) < self.bar_items:
self.output_piechart(*data[:5])
self.output_piechart(*data[:4])
else:
self.output_barchart(*data[:5])
self.output_barchart(*data[:4])
self.doc.end_page()
self._user.step_progress()
self._user.end_progress()
def output_piechart(self, title1, title2, typename, data, lookup):
def output_piechart(self, title1, typename, data, lookup):
# set layout variables
middle_w = self.doc.get_usable_width() / 2
@ -852,7 +861,9 @@ class StatisticsChart(Report):
mark = IndexMark(title1, INDEX_TYPE_TOC, 2)
self.doc.center_text('SC-title', title1, middle_w, 0, mark)
yoffset = ReportUtils.pt2cm(pstyle.get_font().get_size())
self.doc.center_text('SC-title', title2, middle_w, yoffset)
self.doc.center_text('SC-title', self.fil_name, middle_w, yoffset)
yoffset = 2 * ReportUtils.pt2cm(pstyle.get_font().get_size())
self.doc.center_text('SC-title', self.living_desc, middle_w, yoffset)
# collect data for output
color = 0
@ -880,7 +891,7 @@ class StatisticsChart(Report):
draw_legend(self.doc, legendx, yoffset, chart_data, text, 'SC-legend')
def output_barchart(self, title1, title2, typename, data, lookup):
def output_barchart(self, title1, typename, data, lookup):
pt2cm = ReportUtils.pt2cm
style_sheet = self.doc.get_style_sheet()
@ -907,8 +918,10 @@ class StatisticsChart(Report):
mark = IndexMark(title1, INDEX_TYPE_TOC, 2)
self.doc.center_text('SC-title', title1, middle, 0, mark)
yoffset = pt2cm(pstyle.get_font().get_size())
self.doc.center_text('SC-title', title2, middle, yoffset)
self.doc.center_text('SC-title', self.fil_name, middle, yoffset)
yoffset = 2 * pt2cm(pstyle.get_font().get_size())
self.doc.center_text('SC-title', self.living_desc, middle, yoffset)
yoffset = 3 * pt2cm(pstyle.get_font().get_size())
# header
yoffset += (row_h + pad)
@ -975,6 +988,15 @@ class StatisticsChartOptions(MenuReportOptions):
stdoptions.add_private_data_option(menu, category_name)
stdoptions.add_living_people_option(menu, category_name)
stdoptions.add_localization_option(menu, category_name)
################################
category_name = _("Report Details")
add_option = partial(menu.add_option, category_name)
################################
sortby = EnumeratedListOption(_('Sort chart items by'),
_options.SORT_VALUE)
for item_idx in range(len(_options.opt_sorts)):
@ -1018,8 +1040,6 @@ class StatisticsChartOptions(MenuReportOptions):
"used instead of a bar chart."))
add_option("bar_items", bar_items)
stdoptions.add_localization_option(menu, category_name)
# -------------------------------------------------
# List of available charts on separate option tabs
idx = 0