* src/plugins/Calendar.py: 0000858: Patch for calendar enhancements and new Birthday Report

svn: r7957
This commit is contained in:
Brian Matherly 2007-01-23 03:29:59 +00:00
parent 1a57769135
commit 8582d6b11e
2 changed files with 249 additions and 25 deletions

View File

@ -1,3 +1,7 @@
2007-01-22 Douglas Blank <dblank@cs.brynmawr.edu>
* src/plugins/Calendar.py: 0000858: Patch for calendar enhancements and new
Birthday Report
2007-01-22 Brian Matherly <brian@gramps-project.org>
* src/ReportBase/_ReportUtils.py: Add function "get_address_str"
* src/plugins/DetDescendantReport.py: Add addresses (0000791)

View File

@ -39,11 +39,12 @@ import locale
import BaseDoc
from PluginUtils import register_report
from ReportBase import Report, ReportUtils, ReportOptions, \
CATEGORY_DRAW, MODE_GUI, MODE_BKI, MODE_CLI
CATEGORY_DRAW, CATEGORY_TEXT, MODE_GUI, MODE_BKI, MODE_CLI
pt2cm = ReportUtils.pt2cm
from Filters import GenericFilter, ParamFilter, Rules
import GrampsLocale
import RelLib
from Utils import probably_alive
_language, _country = "en", "US"
(_language_country, _encoding) = locale.getlocale()
@ -271,16 +272,7 @@ class Calendar(Report):
if birth_ref:
birth_event = self.database.get_event_from_handle(birth_ref.ref)
birth_date = birth_event.get_date_object()
death_ref = person.get_death_ref()
death_date = None
if death_ref:
death_event = self.database.get_event_from_handle(death_ref.ref)
death_date = death_event.get_date_object()
if death_date == None:
alive = True # well, until we get probably_alive in here
else:
alive = False
alive = probably_alive(person, self.database, self["year"])
if self["birthdays"] and birth_date != None and ((self["alive"] and alive) or not self["alive"]):
year = birth_date.get_year()
month = birth_date.get_month()
@ -319,14 +311,8 @@ class Calendar(Report):
spouse_name = self.get_short_name(spouse)
short_name = self.get_short_name(person)
if self["alive"]:
spouse_death_ref = spouse.get_death_ref()
if spouse_death_ref:
# there is a death event, maybe empty though
spouse_death_event = self.database.get_event_from_handle(spouse_death_ref.ref)
if spouse_death_event != None:
spouse_death_date = spouse_death_event.get_date_object()
if spouse_death_date: # BUG: couldn't remove event
continue
if not probably_alive(spouse, self.database, self["year"]):
continue
for event_ref in fam.get_event_ref_list():
event = self.database.get_event_from_handle(event_ref.ref)
event_obj = event.get_date_object()
@ -341,6 +327,60 @@ class Calendar(Report):
}
self.add_day_item(text, year, month, day)
class CalendarReport(Calendar):
def write_report(self):
""" The short method that runs through each month and creates a page. """
# initialize the dict to fill:
self.calendar = {}
# get the information, first from holidays:
if self["holidays"]:
self.get_holidays(self["year"], _country) # currently global
# get data from database:
self.collect_data()
# generate the report:
self.doc.start_page()
self.doc.start_paragraph('title')
self.doc.write_text(str(self["titletext"]) + ": " + str(self["year"]))
self.doc.end_paragraph()
if self["text1"].strip() != "":
self.doc.start_paragraph('text1style')
self.doc.write_text(str(self["text1"]))
self.doc.end_paragraph()
if self["text2"].strip() != "":
self.doc.start_paragraph('text2style')
self.doc.write_text(str(self["text2"]))
self.doc.end_paragraph()
if self["text3"].strip() != "":
self.doc.start_paragraph('text3style')
self.doc.write_text(str(self["text3"]))
self.doc.end_paragraph()
for month in range(1, 13):
self.print_page(month)
self.doc.end_page()
def print_page(self, month):
year = self["year"]
self.doc.start_paragraph('monthstyle')
self.doc.write_text("%s %d" % (GrampsLocale.long_months[month], year))
self.doc.end_paragraph()
current_date = datetime.date(year, month, 1)
current_ord = current_date.toordinal()
started_day = {}
for i in range(31):
thisday = current_date.fromordinal(current_ord)
if thisday.month == month:
list = self.calendar.get(month, {}).get(thisday.day, [])
for p in list:
p = p.replace("\n", " ")
if thisday not in started_day:
self.doc.start_paragraph("daystyle")
self.doc.write_text("%s %s\n" % (GrampsLocale.long_months[month], str(thisday.day)))
self.doc.end_paragraph()
started_day[thisday] = 1
self.doc.start_paragraph("datastyle")
self.doc.write_text(p)
self.doc.end_paragraph()
current_ord += 1
###################################################################################
# These classes are a suggested of how to rework the graphics out of reports. It also
# makes these items abstractions, which makes it easy to change the report
@ -416,6 +456,38 @@ class SpinWidget(Widget):
keyword = self["name"]
self.option_object[keyword] = dict[keyword].get_value_as_int()
self[keyword] = dict[keyword].get_value_as_int()
class SelectionWidget(Widget):
""" A selection widget for GTK. """
defaults = {
"wtype" : "=0/1",
"help" : "Selection option",
"valid_text": "Any choice",
}
def add_gui(self, dialog):
keyword = self["name"]
obj = self.option_object.__dict__
obj[keyword] = gtk.ComboBox()
store = gtk.ListStore(str)
obj[keyword].set_model(store)
cell = gtk.CellRendererText()
obj[keyword].pack_start(cell,True)
obj[keyword].add_attribute(cell,'text',0)
#index = 0
for item in self["options"]:
store.append(row=[item[2]])
#if item[0] == default:
# obj[keyword].set_active(index)
#index = index + 1
obj[keyword].set_active(self.option_object[keyword])
if self["frame"] != None:
dialog.add_frame_option(self["frame"], self["label"], obj[keyword]) # 4th is help
else:
dialog.add_option(self["label"], obj[keyword])
def update(self):
dict = self.option_object.__dict__
keyword = self["name"]
self.option_object[keyword] = dict[keyword].get_active()
self[keyword] = dict[keyword].get_active()
class CheckWidget(Widget):
""" A check box widget for GTK. """
defaults = {
@ -477,8 +549,14 @@ class NumberWidget(EntryWidget):
def update(self):
dict = self.option_object.__dict__
keyword = self["name"]
self.option_object[keyword] = float(dict[keyword].get_text())
self[keyword] = float(dict[keyword].get_text())
text = dict[keyword].get_text()
# Is there a way to check that this won't fail?
try:
value = float(text)
except:
value = 0.0
self.option_object[keyword] = value
self[keyword] = value
class StyleWidget(Widget):
defaults = {
"size" : 8,
@ -635,10 +713,18 @@ class CalendarOptions(NewReportOptions):
help = "Year of calendar",
valid_text = "Any year",
),
CheckWidget(self, label = _("Use maiden names"),
SelectionWidget(self, label = _("Birthday surname"),
name = "maiden_name",
value = 1,
help = "Use married women's maiden name.",
options = [
("regular",
"Wives use husband's surname",
_("Wives use husband's surname")),
("maiden",
"Wives use their own surname",
_("Wives use their own surname")),
],
help = "Select married women's maiden name.",
valid_text = "Select to use married women's maiden name.",
),
CheckWidget(self, label = _("Only include living people"),
@ -718,6 +804,127 @@ class CalendarOptions(NewReportOptions):
),
]
class CalendarReportOptions(NewReportOptions):
def enable_options(self):
self.enable_dict = {}
self.widgets = [
FilterWidget(self, label = _("Filter"),
name = "filter",
filters = ["all filters"]),
EntryWidget(self, label = _("Title text"),
name = "titletext",
value = "Birthday and Anniversary Report",
help = "Title of report",
valid_text = "Any text",
frame = _("Text Options")
),
EntryWidget(self, label = _("Text 1"),
name = "text1",
value = "Created with GRAMPS",
help = "Extra text area, line 1",
valid_text = "Any text",
frame = _("Text Options")
),
EntryWidget(self, label = _("Text 2"),
name = "text2",
value = "Open source genealogy program",
help = "Extra text area, line 2",
valid_text = "Any text",
frame = _("Text Options")
),
EntryWidget(self, label = _("Text 3"),
name = "text3",
value = "http://gramps-project.org/",
help = "Extra text area, line 3",
valid_text = "Any text",
frame = _("Text Options")
),
SpinWidget(self, label = _("Year of report"),
name = "year",
value = time.localtime()[0], # the current year
help = "Year of report",
valid_text = "Any year",
),
SelectionWidget(self, label = _("Birthday surname"),
name = "maiden_name",
value = 1,
options = [
("regular",
"Wives use husband's surname",
_("Wives use husband's surname")),
("maiden",
"Wives use their own surname",
_("Wives use their own surname")),
],
help = "Select married women's maiden name.",
valid_text = "Select to use married women's maiden name.",
),
CheckWidget(self, label = _("Only include living people"),
name = "alive",
value = 1,
help = "Include only living people",
valid_text = "Select to only include living people",
),
CheckWidget(self, label = _("Include birthdays"),
name = "birthdays",
value = 1,
help = "Include birthdays",
valid_text = "Select to include birthdays",
),
CheckWidget(self, label = _("Include anniversaries"),
name = "anniversaries",
value = 1,
help = "Include anniversaries",
valid_text = "Select to include anniversaries",
),
CheckWidget(self, label = _("Include holidays"),
name = "holidays",
value = 1,
help = "Include holidays",
valid_text = "Select to include holidays",
),
StyleWidget(self, label = _('Title text style'),
name = "title",
size = 14,
bold = 1,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Data text style'),
name = "datastyle",
size = 12,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Month text style'),
name = "monthstyle",
size = 12,
bold = 1,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Day text style'),
name = "daystyle",
size = 12,
bold = 1,
italics = 1,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Extra text style, line 1.'),
name = "text1style",
size = 12,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Extra text style, line 2.'),
name = "text2style",
size = 12,
type_face = BaseDoc.FONT_SERIF,
),
StyleWidget(self, label = _('Extra text style, line 3.'),
name = "text3style",
size = 12,
type_face = BaseDoc.FONT_SERIF,
),
]
class Element:
""" A parsed XML element """
def __init__(self,name,attributes):
@ -931,8 +1138,21 @@ register_report(
options_class = CalendarOptions,
modes = MODE_GUI | MODE_BKI | MODE_CLI,
translated_name = _("Calendar"),
status = _("Experimental"),
status = _("Stable"),
author_name = "Douglas S. Blank",
author_email = "Doug.Blank@gmail.com",
author_email = "dblank@cs.brynmawr.edu",
description = _("Produces a graphical calendar"),
)
register_report(
name = 'birthday_report',
category = CATEGORY_TEXT,
report_class = CalendarReport,
options_class = CalendarReportOptions,
modes = MODE_GUI | MODE_BKI | MODE_CLI,
translated_name = _("Birthday and Anniversary Report"),
status = _("Stable"),
author_name = "Douglas S. Blank",
author_email = "dblank@cs.brynmawr.edu",
description = _("Produces a report of birthdays and anniversaries"),
unsupported = True,
)