From 98a38cde57976cbecc14820284bfc77e0dc8fbd5 Mon Sep 17 00:00:00 2001 From: SNoiraud Date: Sat, 9 Mar 2019 13:56:06 +0100 Subject: [PATCH] Webcal: add death event Fixes #5025 add some cleanup use html_escape instead of _escape --- gramps/plugins/webreport/webcal.py | 97 ++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 33 deletions(-) diff --git a/gramps/plugins/webreport/webcal.py b/gramps/plugins/webreport/webcal.py index 564884ddd..9f4379639 100644 --- a/gramps/plugins/webreport/webcal.py +++ b/gramps/plugins/webreport/webcal.py @@ -50,6 +50,7 @@ from gramps.gen.const import GRAMPS_LOCALE as glocale _ = glocale.translation.sgettext from gramps.gen.lib import Date, Name, NameType, Person from gramps.gen.lib.date import Today +from gramps.plugins.webreport.common import html_escape from gramps.gen.const import PROGRAM_NAME, URL_HOMEPAGE from gramps.version import VERSION from gramps.gen.constfunc import win @@ -63,6 +64,7 @@ from gramps.gen.plug.menu import (BooleanOption, NumberOption, StringOption, PersonOption, DestinationOption, NoteOption) from gramps.gen.utils.config import get_researcher from gramps.gen.utils.alive import probably_alive +from gramps.gen.utils.db import get_death_or_fallback from gramps.gen.datehandler import displayer as _dd from gramps.gen.display.name import displayer as _nd @@ -93,18 +95,6 @@ _CALENDARPRINT = 'calendar-print.css' PLUGMAN = GuiPluginManager.get_instance() CSS = PLUGMAN.process_plugin_data('WEBSTUFF') -def _escape(string): - """ replace character in text that html shows correctly - special characters: & < and > - """ - string = string.replace('&', '&') # must be the first - string = string.replace('<', '<') - string = string.replace('>', '>') - return string - -# pylint: disable=unused-variable -# pylint: disable=unused-argument - #------------------------------------------------------------------------ # # WebCalReport @@ -157,6 +147,7 @@ class WebCalReport(Report): self.alive = mgobn('alive') self.birthday = mgobn('birthdays') self.anniv = mgobn('anniversaries') + self.death_anniv = mgobn('death_anniv') self.home_link = mgobn('home_link') self.event_list = [] @@ -290,7 +281,7 @@ class WebCalReport(Report): text -- line to be added year, month, day -- date to add the text to - event -- one of 'BirthDay', 'Anniversary', or 'Holiday' + event -- one of 'BirthDay', 'Anniversary', 'Death' or 'Holiday' age_at_death -- The age in text. ie : 68 years, 6 months dead_event_date -- The date of the event used to calculate the age_at_death @@ -302,7 +293,7 @@ class WebCalReport(Report): day = 1 # determine which dictionary to use??? - if event in ['Birthday', 'Anniversary']: + if event in ['Birthday', 'Anniversary', 'Death']: month_dict = self.calendar.get(month, {}) else: month_dict = self.holidays.get(month, {}) @@ -321,7 +312,7 @@ class WebCalReport(Report): month_dict[day] = day_list # determine which dictionary to add it to??? - if event in ['Birthday', 'Anniversary']: + if event in ['Birthday', 'Anniversary', 'Death']: self.calendar[month] = month_dict else: self.holidays[month] = month_dict @@ -729,42 +720,42 @@ class WebCalReport(Report): full_month_name = date_displayer.long_months[month-1] url = full_month_name.lower() + self.ext prevm = Date(int(year), int(month-1), 0) - my_title = Html("a", _escape("<"), href=url, + my_title = Html("a", html_escape("<"), href=url, title=date_displayer.display(prevm)) elif self.multiyear and year > self.start_year: full_month_name = date_displayer.long_months[12] url = full_month_name.lower() + self.ext dest = os.path.join("../", str(year-1), url) prevm = Date(int(year-1), 12, 0) - my_title = Html("a", _escape("<"), href=dest, + my_title = Html("a", html_escape("<"), href=dest, title=date_displayer.display(prevm)) else: full_month_name = date_displayer.long_months[12] url = full_month_name.lower() + self.ext dest = os.path.join("../", str(self.end_year), url) prevy = Date(self.end_year, 12, 0) - my_title = Html("a", _escape("<"), href=dest, + my_title = Html("a", html_escape("<"), href=dest, title=date_displayer.display(prevy)) my_title += Html(" ") if month < 12: full_month_name = date_displayer.long_months[month+1] url = full_month_name.lower() + self.ext nextd = Date(int(year), int(month+1), 0) - my_title += Html("a", _escape(">"), href=url, + my_title += Html("a", html_escape(">"), href=url, title=date_displayer.display(nextd)) elif self.multiyear and year < self.end_year: full_month_name = date_displayer.long_months[1] url = full_month_name.lower() + self.ext dest = os.path.join("../", str(year+1), url) nextd = Date(int(year+1), 1, 0) - my_title += Html("a", _escape(">"), href=dest, + my_title += Html("a", html_escape(">"), href=dest, title=date_displayer.display(nextd)) else: full_month_name = date_displayer.long_months[1] url = full_month_name.lower() + self.ext dest = os.path.join("../", str(self.start_year), url) nexty = Date(self.start_year, 1, 0) - my_title += Html("a", _escape(">"), href=dest, + my_title += Html("a", html_escape(">"), href=dest, title=date_displayer.display(nexty)) my_title += Html("") trow = Html("tr") + ( @@ -1006,7 +997,7 @@ class WebCalReport(Report): note = self.database.get_note_from_gramps_id(note) note = self.get_note_format(note) - # table foot section + # table foot section cal_foot = Html("tfoot") monthly_calendar += cal_foot @@ -1145,7 +1136,7 @@ class WebCalReport(Report): currentsection = _dd.long_months[month] body += self.month_navigation(nr_up, year, currentsection, True) - # set date display as in user prevferences + # set date display as in user preferences content = Html("div", class_="content", id="OneDay") body += content evt = fname_date[:8] @@ -1160,7 +1151,7 @@ class WebCalReport(Report): url = event[1] + self.ext prevd = Date(int(event[1][:4]), int(event[1][4:6]), int(event[1][6:])) - my_title = Html("a", _escape("<"), href=url, + my_title = Html("a", html_escape("<"), href=url, title=self.rlocale.get_date(prevd)) else: my_title = Html('  ') @@ -1169,7 +1160,7 @@ class WebCalReport(Report): url = event[2] + self.ext nextd = Date(int(event[2][:4]), int(event[2][4:6]), int(event[2][6:])) - my_title += Html("a", _escape(">"), href=url, + my_title += Html("a", html_escape(">"), href=url, title=self.rlocale.get_date(nextd)) else: my_title += Html('  ') @@ -1360,6 +1351,36 @@ class WebCalReport(Report): self.add_day_item(text, year, month, day, 'Birthday', age_at_death, person_death) + death_event = get_death_or_fallback(db, person) + if death_event: + death_date = death_event.get_date_object() + else: + death_date = None + primary_name = person.primary_name + name = Name(primary_name) + if self.death_anniv and death_date: + year = death_date.get_year() or this_year + month = death_date.get_month() + day = death_date.get_day() + + short_name = self.get_name(person) + prob_alive_date = Date(this_year, month, day) + alive = probably_alive(person, db, prob_alive_date) + if (self.alive and alive) or not self.alive: + # add link to NarrativeWeb + if self.link_to_narweb: + prfx = self.narweb_prefix + navpfx = self.build_url_fname_html(person.handle, + "ppl", + prefix=prfx) + text = str(Html("a", short_name, href=navpfx)) + else: + text = short_name + self.add_day_item(text, year, month, day, 'Death', + age_at_death, death_date) + #print('Death date for %s %s/%s/%s' % (short_name, day, + # month, year), + # age_at_death) # add anniversary if requested if self.anniv: @@ -1764,14 +1785,6 @@ class WebCalOptions(MenuReportOptions): "the main page of the web site")) menu.add_option(category_name, "home_link", home_link) - birthdays = BooleanOption(_("Include birthdays"), True) - birthdays.set_help(_("Include birthdays in the calendar")) - menu.add_option(category_name, "birthdays", birthdays) - - anniversaries = BooleanOption(_("Include anniversaries"), True) - anniversaries.set_help(_("Include anniversaries in the calendar")) - menu.add_option(category_name, "anniversaries", anniversaries) - def __add_notes_options(self, menu): """ Options on the "Months Notes" tabs. @@ -1847,6 +1860,18 @@ class WebCalOptions(MenuReportOptions): makeoneday.set_help(_('Whether to create one day pages or not')) menu.add_option(category_name, 'makeoneday', makeoneday) + birthdays = BooleanOption(_("Include birthdays"), True) + birthdays.set_help(_("Include birthdays in the calendar")) + menu.add_option(category_name, "birthdays", birthdays) + + anniversaries = BooleanOption(_("Include anniversaries"), True) + anniversaries.set_help(_("Include anniversaries in the calendar")) + menu.add_option(category_name, "anniversaries", anniversaries) + + anniversaries = BooleanOption(_('Include death dates'), False) + anniversaries.set_help(_('Include death anniversaries in the calendar')) + menu.add_option(category_name, 'death_anniv', anniversaries) + self.__links = BooleanOption(_('Link to Narrated Web Report'), False) self.__links.set_help(_('Whether to link data to web report or not')) menu.add_option(category_name, 'link_to_narweb', self.__links) @@ -2040,6 +2065,12 @@ def get_day_list(event_date, holiday_list, bday_anniv_list, rlocale=glocale): 'birth_date' : translated_date} txt_str = (text + age + '') + # a death + if event == 'Death': + txt_str = (text + ', ' + + (_('%s since death') % str(age_str) if nyears else _('death')) + + '') + # an anniversary elif event == "Anniversary":