0006009: Media objects attached to Marriage events and Sources are not included in Narrative Web Site

* restructure the families index so families are indexed under both spouses, and the family name is normalised
* separate out Families section in individual and families pages so individual page links to the family page and family page links to both people
* normalise links to families so the link is only displayed if the family page is present, and the gid is included when appropriate
* remove highlighting of media subregions except in the media pages (it was confusing and not very well implemented)
* include people whose surname is absent in the individual, surname and families indexes
* html_escape names and surnames
* always display media thumbnails for first image in Gallery list (in some cases they were suppressed if they had been displayed at the top of the page)
* change partner and parent columns in families index to improve the layout of the HTML and put the comma between multiple partners in the right place
* use event description (where present) instead of just event type in back references
* fix bug in the way obj_dict and bkref_dict were initialised

svn: r20795
This commit is contained in:
Tim G L Lyons 2012-12-18 22:55:56 +00:00
parent eb52e2f3de
commit 55d9ef2dbf

View File

@ -390,6 +390,7 @@ TEMPLE = _("Temple")
VHEAD = _("Value")
ALT_LOCATIONS = _("Alternate Locations")
_UNKNOWN = _("Unknown")
_ABSENT = _("<absent>")
# Events that are usually a family event
_EVENTMAP = set(
@ -651,8 +652,6 @@ class BasePage(object):
@param: place_lat_long -- for use in Family Map Pages. This will be None
if called from Family pages, which do not create a Family Map
"""
birthorder = self.report.options["birthorder"]
family_list = individual.get_family_handle_list()
if not family_list:
return None
@ -669,68 +668,144 @@ class BasePage(object):
for family_handle in family_list:
family = self.dbase_.get_family_from_handle(family_handle)
if family:
self.display_spouse(family, table, place_lat_long)
link = self.family_link(
family_handle,
self.report.obj_dict[Family][family_handle][1],
gid=family.get_gramps_id(), uplink=True)
trow = Html("tr", class_ ="BeginFamily") + (
Html("td", "&nbsp", class_ ="ColumnType", inline =True),
Html("td", "&nbsp", class_ ="ColumnAttribute", inline =True),
Html("td", link, class_ ="ColumnValue", inline =True)
)
table += trow
# find the spouse of the principal individual and
# display that person
spouse_handle = ReportUtils.find_spouse(individual, family)
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(spouse_handle)
if spouse:
table += self.display_spouse(spouse, family,
place_lat_long)
childlist = family.get_child_ref_list()
if childlist:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", _("Children"), class_ = "ColumnAttribute", inline = True)
)
table += trow
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
ordered = Html("ol")
tcell += ordered
childlist = [child_ref.ref for child_ref in childlist]
# add individual's children event places to family map...
if self.familymappages:
for handle in childlist:
child = self.dbase_.get_person_from_handle(handle)
if child:
self._get_event_place(child, place_lat_long)
children = add_birthdate(self.dbase_, childlist)
if birthorder:
children = sorted(children)
ordered.extend(
(Html("li", inline=True) +
self.display_child_link(chandle))
for birth_date, chandle in children
)
# family LDS ordinance list
family_lds_ordinance_list = family.get_lds_ord_list()
if family_lds_ordinance_list:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", _("LDS Ordinance"), class_ = "ColumnAttribute", inline = True),
Html("td", self.dump_ordinance(family, "Family"), class_ = "ColumnValue")
)
table += trow
# Family Attribute list
family_attribute_list = family.get_attribute_list()
if family_attribute_list:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ ="ColumnType", inline =True),
Html("td", _("Attributes"), class_ ="ColumnAttribute", inline =True)
)
table += trow
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
# we do not need the section variable for this instance of Attributes...
dummy, attrtable = self.display_attribute_header()
tcell += attrtable
self.display_attr_list(family_attribute_list, attrtable)
details = self.display_family_details(family, place_lat_long)
if details is not None:
table += details
return section
def display_family_relationships(self, family, place_lat_long):
"""
Displays a family's relationships ...
@param: family -- the family to be displayed
@param: place_lat_long -- for use in Family Map Pages. This will be None
if called from Family pages, which do not create a Family Map
"""
with Html("div", class_ ="subsection", id ="families") as section:
section += Html("h4", _("Families"), inline =True)
table_class = "infolist"
with Html("table", class_ = table_class) as table:
section += table
for person_handle in [family.get_father_handle(), family.get_mother_handle()]:
person = self.dbase_.get_person_from_handle(person_handle)
if person:
table += self.display_spouse(person, family, place_lat_long)
details = self.display_family_details(family, place_lat_long)
if details is not None:
table += details
return section
def display_family_details(self, family, place_lat_long):
"""
Display details about one family: family events, children, family LDS
ordinances, family attributes
"""
table = None
birthorder = self.report.options["birthorder"]
# display family events; such as marriage and divorce...
family_events = family.get_event_ref_list()
if family_events:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", "&nbsp;", class_ = "ColumnAttribute", inline = True),
Html("td", self.format_family_events(family_events, place_lat_long), class_ = "ColumnValue")
)
table = trow
# If the families pages are not output, display family notes
if not self.inc_families:
notelist = family.get_note_list()
for notehandle in notelist:
note = self.dbase_.get_note_from_handle(notehandle)
if note:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", "Narrative", class_ = "ColumnAttribute", inline = True),
Html("td", self.get_note_format(note, True), class_ = "ColumnValue")
)
table = table + trow if table is not None else trow
childlist = family.get_child_ref_list()
if childlist:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", _("Children"), class_ = "ColumnAttribute", inline = True)
)
table = table + trow if table is not None else trow
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
ordered = Html("ol")
tcell += ordered
childlist = [child_ref.ref for child_ref in childlist]
# add individual's children event places to family map...
if self.familymappages:
for handle in childlist:
child = self.dbase_.get_person_from_handle(handle)
if child:
self._get_event_place(child, place_lat_long)
children = add_birthdate(self.dbase_, childlist)
if birthorder:
children = sorted(children)
ordered.extend(
(Html("li") +
self.display_child_link(chandle))
for birth_date, chandle in children
)
# family LDS ordinance list
family_lds_ordinance_list = family.get_lds_ord_list()
if family_lds_ordinance_list:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", _("LDS Ordinance"), class_ = "ColumnAttribute", inline = True),
Html("td", self.dump_ordinance(family, "Family"), class_ = "ColumnValue")
)
table = table + trow if table is not None else trow
# Family Attribute list
family_attribute_list = family.get_attribute_list()
if family_attribute_list:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ ="ColumnType", inline =True),
Html("td", _("Attributes"), class_ ="ColumnAttribute", inline =True)
)
table = table + trow if table is not None else trow
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
# we do not need the section variable for this instance of Attributes...
dummy, attrtable = self.display_attribute_header()
tcell += attrtable
self.display_attr_list(family_attribute_list, attrtable)
return table
def complete_people(self, tcell, first_person, handle_list, up =True):
"""
completes the person column for classes EventListPage and EventPage
@ -1035,12 +1110,19 @@ class BasePage(object):
create the url and link for FamilyPage
"""
name = html_escape(name)
url = self.report.build_url_fname_html(family_handle, "fam", up = uplink)
hyper = Html("a", name, href = url, title = name)
if not self.noid and gid:
hyper += Html("span", " [%s]" % gid, class_ = "grampsid", inline = True)
gid_html = Html("span", " [%s]" % gid, class_ = "grampsid", inline = True)
else:
gid_html = ""
result = self.report.obj_dict.get(Family).get(family_handle)
if result is None:
# the family is not included in the webreport
return name + str(gid_html)
url = self.report.build_url_fname(result[0], up = uplink)
hyper = Html("a", name, href = url, title = name)
hyper += gid_html
return hyper
def get_family_string(self, family):
@ -2026,6 +2108,14 @@ class BasePage(object):
real_path, newpath = self.report.prepare_copy_media(photo)
newpath = self.report.build_url_fname(newpath, up = True)
# FIXME: There doesn't seem to be any point in highlighting
# a sub-region in the thumbnail and linking back to the
# person or whatever. First it is confusing when the link
# probably has nothing to do with the page on which the
# thumbnail is displayed, and second on a thumbnail it is
# probably too small to see, and third, on the thumbnail,
# the link is shown above the image (which is pretty
# useless!)
_region_items = self.media_ref_rect_regions(photo_handle)
if len(_region_items):
with Html("div", id = "GalleryDisplay") as mediadisplay:
@ -2351,70 +2441,42 @@ class BasePage(object):
"""
return Html("a", _("Family Map"), href = url, title =_("Family Map"), class_ ="familymap", inline =True)
def display_spouse(self, family, table, place_lat_long):
def display_spouse(self, partner, family, place_lat_long):
"""
display an individual's partner
@param: place_lat_long -- for use in Family Map Pages. This will be None
if called from Family pages, which do not create a Family Map
"""
gender = self.person.get_gender()
gender = partner.get_gender()
reltype = family.get_relationship()
if reltype == FamilyRelType.MARRIED:
if gender == Person.FEMALE:
relstr = _("Husband")
elif gender == Person.MALE:
relstr = _("Wife")
elif gender == Person.MALE:
relstr = _("Husband")
else:
relstr = _("Partner")
else:
relstr = _("Partner")
spouse = False
spouse_handle = ReportUtils.find_spouse(self.person, family)
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(spouse_handle)
rtype = str(family.get_relationship())
# display family relationship status, and add spouse to FamilyMapPages
if spouse:
if self.familymappages:
self._get_event_place(spouse, place_lat_long)
trow = Html("tr", class_ ="BeginFamily") + (
Html("td", rtype, class_ ="ColumnType", inline =True),
Html("td", relstr, class_ ="ColumnAttribute", inline =True)
)
table += trow
tcell = Html("td", class_ ="ColumnValue", inline=True)
trow += tcell
tcell += self.new_person_link(spouse_handle, uplink=True,
person=spouse)
# display family events; such as marriage and divorce...
family_events = family.get_event_ref_list()
if family_events:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", "&nbsp;", class_ = "ColumnAttribute", inline = True),
Html("td", self.format_family_events(family_events, place_lat_long), class_ = "ColumnValue")
)
table += trow
if self.familymappages:
self._get_event_place(partner, place_lat_long)
# If the families pages are not output, display family notes
if not self.inc_families:
notelist = family.get_note_list()
for notehandle in notelist:
note = self.dbase_.get_note_from_handle(notehandle)
if note:
trow = Html("tr") + (
Html("td", "&nbsp;", class_ = "ColumnType", inline = True),
Html("td", "Narrative", class_ = "ColumnAttribute", inline = True),
Html("td", self.get_note_format(note, True), class_ = "ColumnValue")
)
table += trow
trow = Html("tr", class_ ="BeginFamily") + (
Html("td", rtype, class_ ="ColumnType", inline =True),
Html("td", relstr, class_ ="ColumnAttribute", inline =True)
)
tcell = Html("td", class_ ="ColumnValue")
trow += tcell
tcell += self.new_person_link(partner.get_handle(), uplink=True,
person=partner)
return trow
def display_child_link(self, chandle):
@ -2459,7 +2521,7 @@ class BasePage(object):
if name_style == _NAME_STYLE_FIRST and person:
name = _get_short_name(person.get_gender(), person.get_primary_name())
name = html_escape(name)
# construct the result
if (not self.noid and gid != ""):
gid_html = Html("span", " [%s]" % gid, class_ = "grampsid",
@ -2469,7 +2531,7 @@ class BasePage(object):
if link != "":
url = self.report.build_url_fname(link, up=uplink)
hyper = Html("a", href=url) + name + gid_html
hyper = Html("a", name, gid_html, href=url, inline=True)
else:
hyper = name + str(gid_html)
@ -2734,7 +2796,7 @@ class BasePage(object):
# Sort by the name of the object at the bkref_class, bkref_handle
for (bkref_class, bkref_handle) in sorted(
bkref_list, key=lambda x:self.report.obj_dict[x[0]][x[1]][1]):
list = Html("li", inline=True)
list = Html("li")
path = self.report.obj_dict[bkref_class][bkref_handle][0]
name = self.report.obj_dict[bkref_class][bkref_handle][1]
gid = self.report.obj_dict[bkref_class][bkref_handle][2]
@ -2803,6 +2865,9 @@ class SurnamePage(BasePage):
showpartner = report.options['showpartner']
showparents = report.options['showparents']
if surname == '':
surname = _ABSENT
of, sio = self.report.create_file(name_to_md5(surname), "srn")
self.up = True
surnamepage, head, body = self.write_header("%s - %s" % (_("Surname"), surname))
@ -2817,7 +2882,7 @@ class SurnamePage(BasePage):
# feature request 2356: avoid genitive form
msg = _("This page contains an index of all the individuals in the "
"database with the surname of %s. Selecting the person&#8217;s name "
"will take you to that person&#8217;s individual page.") % surname
"will take you to that person&#8217;s individual page.") % html_escape(surname)
surnamedetail += Html("p", msg, id = "description")
# begin surname table and thead
@ -2858,7 +2923,7 @@ class SurnamePage(BasePage):
link = self.new_person_link(person_handle, uplink=True,
person=person,
name_style=_NAME_STYLE_FIRST)
trow += Html("td", link, class_ = "ColumnName", inline=True)
trow += Html("td", link, class_ = "ColumnName")
# birth column
if showbirth:
@ -2890,7 +2955,7 @@ class SurnamePage(BasePage):
# partner column
if showpartner:
tcell = Html("td", class_ = "ColumnPartner", inline=True)
tcell = Html("td", class_ = "ColumnPartner")
trow += tcell
family_list = person.get_family_handle_list()
first_family = True
@ -2977,17 +3042,15 @@ class FamilyPages(BasePage):
self.report.user.begin_progress(_("Narrated Web Site Report"),
_("Creating family pages..."),
len(self.report.obj_dict[Family]) + 1)
# N.B. The parameter passed is the list of people, not the list of
# families
self.FamilyListPage(self.report, title,
self.report.obj_dict[Person].keys())
self.report.obj_dict[Family].keys())
for family_handle in self.report.obj_dict[Family]:
self.report.user.step_progress()
self.FamilyPage(self.report, title, family_handle)
self.report.user.end_progress()
def FamilyListPage(self, report, title, ind_list):
def FamilyListPage(self, report, title, fam_list):
self.dbase_ = report.database
BasePage.__init__(self, report, title)
@ -3004,8 +3067,24 @@ class FamilyPages(BasePage):
"name will take you to their family/ relationship&#8217;s page.")
relationlist += Html("p", msg, id = "description")
# go through all the families, and construct a dictionary of all the
# people and the families thay are involved in. Note that the people
# in the list may be involved in OTHER families, that are not listed
# because they are not in the original family list.
pers_fam_dict = defaultdict(list)
for family_handle in fam_list:
family = self.dbase_.get_family_from_handle(family_handle)
if family:
husband_handle = family.get_father_handle()
spouse_handle = family.get_mother_handle()
if husband_handle:
pers_fam_dict[husband_handle].append(family)
if spouse_handle:
pers_fam_dict[spouse_handle].append(family)
# add alphabet navigation
menu_set = get_first_letters(self.dbase_, ind_list, _KEYPERSON)
menu_set = get_first_letters(self.dbase_, pers_fam_dict.keys(),
_KEYPERSON)
alpha_nav, menu_set = alphabet_navigation(menu_set)
if alpha_nav:
relationlist += alpha_nav
@ -3026,8 +3105,8 @@ class FamilyPages(BasePage):
Html("th", trans, class_ =colclass, inline =True)
for trans, colclass in [
(_("Letter"), "ColumnRowLabel"),
(_("Partner 1"), "ColumnPartner"),
(_("Partner 2"), "ColumnPartner"),
(_("Person"), "ColumnPartner"),
(_("Family"), "ColumnPartner"),
(_("Marriage"), "ColumnDate"),
(_("Divorce"), "ColumnDate")
]
@ -3037,7 +3116,7 @@ class FamilyPages(BasePage):
table += tbody
# begin displaying index list
ppl_handle_list = sort_people(self.dbase_, ind_list)
ppl_handle_list = sort_people(self.dbase_, pers_fam_dict.keys())
for (surname, handle_list) in ppl_handle_list:
if surname:
@ -3049,80 +3128,70 @@ class FamilyPages(BasePage):
for person_handle in handle_list:
person = self.dbase_.get_person_from_handle(person_handle)
if person:
family_handle_list = person.get_family_handle_list()
if family_handle_list:
family_list = pers_fam_dict[person_handle]
first_family = True
for family in family_list:
trow = Html("tr")
tbody += trow
tcell = Html("td", class_="ColumnRowLabel")
trow += tcell
if letter not in ltrs_displayed:
trow.attr = 'class="BginLetter"'
tcell += Html("a", letter, name=letter,
title ="Families beginning with letter " + letter, inline =True)
ltrs_displayed[letter] = True
else:
tcell += '&nbsp;'
tcell = Html("td", class_="ColumnPartner")
trow += tcell
first_family = True
for family_handle in family_handle_list:
if first_family:
trow.attr = 'class ="BeginFamily"'
family = self.dbase_.get_family_from_handle(family_handle)
if family:
tcell += self.new_person_link(person_handle, uplink=self.up)
trow = Html("tr")
tbody += trow
first_family = False
else:
tcell += '&nbsp;'
tcell = Html("td", class_ ="ColumnRowLabel", inline=True)
trow += tcell
tcell = Html("td", class_ ="ColumnPartner")
trow += tcell
if letter not in ltrs_displayed:
trow.attr = 'class ="BeginLetter"'
tcell += Html("a", letter, name =letter,
title ="Families beginning with letter " + letter, inline =True)
tcell += self.family_link(
family.get_handle(),
self.report.get_family_name(family),
family.get_gramps_id(), self.up)
ltrs_displayed[letter] = True
else:
tcell += '&nbsp;'
# family events; such as marriage and divorce events
fam_evt_ref_list = family.get_event_ref_list()
tcell1 = Html("td", class_ ="ColumnDate", inline =True)
tcell2 = Html("td", class_ ="ColumnDate", inline =True)
trow += (tcell1, tcell2)
tcell = Html("td", class_ ="ColumnPartner", inline=True)
trow += tcell
if fam_evt_ref_list:
for evt_ref in fam_evt_ref_list:
event = self.dbase_.get_event_from_handle(evt_ref.ref)
if event:
evt_type = event.get_type()
if evt_type in [EventType.MARRIAGE,
EventType.DIVORCE]:
if first_family:
trow.attr = 'class ="BeginFamily"'
tcell += self.family_link(family_handle, self.get_name(person),
family.get_gramps_id(), self.up)
if evt_type == EventType.MARRIAGE:
tcell1 += _dd.display(event.get_date_object())
else:
tcell1 += '&nbsp;'
first_family = False
else:
tcell += '&nbsp;'
tcell = Html("td", class_ ="ColumnPartner", inline=True)
trow += tcell
# get partner if there is one listed?
partner_handle = ReportUtils.find_spouse(person, family)
if partner_handle:
tcell += self.new_person_link(partner_handle, uplink=self.up)
else:
tcell += '&nbsp;'
# family events; such as marriage and divorce events
fam_evt_ref_list = family.get_event_ref_list()
tcell1 = Html("td", class_ ="ColumnDate", inline =True)
tcell2 = Html("td", class_ ="ColumnDate", inline =True)
trow += (tcell1, tcell2)
if fam_evt_ref_list:
for evt_ref in fam_evt_ref_list:
event = self.dbase_.get_event_from_handle(evt_ref.ref)
if event:
evt_type = event.get_type()
if evt_type in [EventType.MARRIAGE,
EventType.DIVORCE]:
if evt_type == EventType.MARRIAGE:
tcell1 += _dd.display(event.get_date_object())
else:
tcell1 += '&nbsp;'
if evt_type == EventType.DIVORCE:
tcell2 += _dd.display(event.get_date_object())
else:
tcell2 += '&nbsp;'
else:
tcell1 += '&nbsp;'
tcell2 += '&nbsp;'
first_family = False
if evt_type == EventType.DIVORCE:
tcell2 += _dd.display(event.get_date_object())
else:
tcell2 += '&nbsp;'
else:
tcell1 += '&nbsp;'
tcell2 += '&nbsp;'
first_family = False
# add clearline for proper styling
# add footer section
@ -3142,21 +3211,19 @@ class FamilyPages(BasePage):
self.bibli = Bibliography()
self.up = True
# determine if husband and wife, husband only, or spouse only....
self.page_title = _("Family of ") + self.get_family_string(family)
family_name = self.report.get_family_name(family)
self.page_title = family_name
birthorder = report.options["birthorder"]
self.familymappages = report.options["familymappages"]
of, sio = self.report.create_file(family.get_handle(), "fam")
familydetailpage, head, body = self.write_header(self.report.get_family_name(family))
familydetailpage, head, body = self.write_header(family_name)
# begin FamilyDetaill division
with Html("div", class_ ="content", id ="RelationshipDetail") as relationshipdetail:
body += relationshipdetail
# family media list for initial thumbnail
# delete thumbnail so that it won't display again in the Gallery List later on...
if self.create_media:
media_list = family.get_media_list()
# If Event pages are not being created, then we need to display
@ -3168,32 +3235,18 @@ class FamilyPages(BasePage):
thumbnail = self.display_first_image_as_thumbnail(media_list, family)
if thumbnail:
relationshipdetail += thumbnail
media_list.remove(media_list[0])
husband, spouse = [None]*2
husband_handle = family.get_father_handle()
spouse_handle = family.get_mother_handle()
if husband_handle:
husband = self.dbase_.get_person_from_handle(husband_handle)
self.person = None # no longer used
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(spouse_handle)
self.person = None
if husband and spouse:
self.person = husband
elif husband:
self.person = husband
elif spouse_handle:
self.person = spouse
relationshipdetail += Html("h2", self.page_title, inline = True)
relationshipdetail += Html("h2", self.page_title, inline = True) +\
(Html('sup') +\
(Html('small') +
self.get_citation_links(family.get_citation_list())))
# display relationships
if self.person:
families = self.display_relationships(self.person, None)
if families is not None:
relationshipdetail += families
families = self.display_family_relationships(family, None)
if families is not None:
relationshipdetail += families
# display additional images as gallery
if (self.create_media and media_list):
@ -3789,22 +3842,6 @@ class EventPages(BasePage):
)
tbody += trow
# trow = Html("tr") + (
# Html("td", _("Person(s)"), class_ = "ColumnAttribute", inline = True)
# )
# tbody += trow
# tcell = Html("td", class_ = "ColumnPerson")
# trow += tcell
#
# # Person(s) field
# handle_list = set(self.dbase_.find_backlink_handles(event_handle,
# include_classes = ['Family', 'Person'] if int(event.type) in _EVENTMAP else ['Person']))
# first_person = True
#
# # get person(s) for ColumnPerson
# self.complete_people(tcell, first_person, handle_list)
# Narrative subsection
notelist = event.get_note_list()
notelist = self.display_note_list(notelist)
@ -3933,10 +3970,12 @@ class SurnameListPage(BasePage):
last_surname = ''
for (surname, data_list) in ppl_handle_list:
if len(surname) == 0:
continue
letter = first_letter(surname)
if letter == ' ':
# if surname is an empty string, then first_letter
# returns a space
letter = '&nbsp;'
surname = _ABSENT
trow = Html("tr")
tbody += trow
@ -3958,7 +3997,7 @@ class SurnameListPage(BasePage):
last_surname = surname
trow += Html("td", self.surname_link(name_to_md5(surname), surname),
trow += Html("td", self.surname_link(name_to_md5(surname), html_escape(surname)),
class_ = "ColumnSurname", inline = True)
trow += Html("td", len(data_list), class_ = "ColumnQuantity", inline = True)
@ -4217,9 +4256,6 @@ class SourcePages(BasePage):
if thumbnail is not None:
sourcedetail += thumbnail
# remove thumbnail from list of media...
media_list.remove(media_list[0])
# add section title
sourcedetail += Html("h3", html_escape(source.get_title()), inline = True)
@ -5193,6 +5229,11 @@ class PersonPages(BasePage):
first = True
prev_letter = letter
letter = first_letter(surname)
if letter == ' ':
# if surname is an empty string, then first_letter
# returns a space
letter = '&nbsp;'
surname = _ABSENT
for person_handle in handle_list:
person = self.dbase_.get_person_from_handle(person_handle)
@ -5205,11 +5246,11 @@ class PersonPages(BasePage):
trow.attr = 'class = "BeginSurname"'
if surname:
if letter != prev_letter:
tcell += Html("a", surname, name = letter,
tcell += Html("a", html_escape(surname), name = letter,
id_ = letter,
title = "Surname with letter " + letter)
else:
tcell += Html("a", surname,
tcell += Html("a", html_escape(surname),
title = "Surname with letter " + letter)
else:
tcell += "&nbsp;"
@ -5220,7 +5261,7 @@ class PersonPages(BasePage):
# firstname column
link = self.new_person_link(person_handle, person=person,
name_style=_NAME_STYLE_FIRST)
trow += Html("td", link, class_ = "ColumnName", inline=True)
trow += Html("td", link, class_ = "ColumnName")
# birth column
if showbirth:
@ -5252,23 +5293,34 @@ class PersonPages(BasePage):
# partner column
if showpartner:
tcell = Html("td", class_ = "ColumnPartner", inline=True)
trow += tcell
family_list = person.get_family_handle_list()
first_family = True
partner_name = None
tcell = ()
if family_list:
for family_handle in family_list:
family = self.dbase_.get_family_from_handle(family_handle)
partner_handle = ReportUtils.find_spouse(person, family)
if partner_handle:
if not first_family:
tcell += ", "
tcell += self.new_person_link(partner_handle)
# have to do this to get the comma on
# the same line as the link
if isinstance(tcell[-1], Html):
# tcell is an instance of Html (or
# of a subclass thereof)
tcell[-1].inside += ","
else:
tcell = tcell[:-1] +\
((tcell[-1] + ", "),)
# Have to manipulate as tuples so that
# subsequent people are not nested
# within the first link
tcell += (self.new_person_link(partner_handle),)
first_family = False
else:
tcell += "&nbsp;"
tcell = "&nbsp;"
trow += Html("td", class_ = "ColumnPartner") + tcell
# parents column
if showparents:
@ -5287,19 +5339,19 @@ class PersonPages(BasePage):
mother_name = self.get_name(mother)
samerow = False
if mother and father:
tcell = Html("span", father_name, class_ = "father fatherNmother")
tcell += Html("span", mother_name, class_ = "mother")
tcell = (Html("span", father_name, class_ = "father fatherNmother", inline=True),
Html("span", mother_name, class_ = "mother", inline=True))
elif mother:
tcell = Html("span", mother_name, class_ = "mother")
tcell = Html("span", mother_name, class_ = "mother", inline=True)
elif father:
tcell = Html("span", father_name, class_ = "father")
tcell = Html("span", father_name, class_ = "father", inline=True)
else:
tcell = "&nbsp;"
samerow = True
else:
tcell = "&nbsp;"
samerow = True
trow += Html("td", tcell, class_ = "ColumnParents", inline = samerow)
trow += Html("td", class_ = "ColumnParents", inline = samerow) + tcell
# create clear line for proper styling
# create footer section
@ -5976,7 +6028,7 @@ class PersonPages(BasePage):
child_ped(ol)
else:
child = self.dbase_.get_person_from_handle(handle)
ol += Html("li", inline=True) + self.pedigree_person(child)
ol += Html("li") + self.pedigree_person(child)
else:
child_ped(ol)
return ol
@ -6007,24 +6059,24 @@ class PersonPages(BasePage):
with Html("ol", class_ = "pedigreegen") as pedol:
ped += pedol
if father and mother:
pedfa = Html("li", inline=True) + self.pedigree_person(father)
pedfa = Html("li") + self.pedigree_person(father)
pedol += pedfa
with Html("ol") as pedma:
pedfa += pedma
pedma += (Html("li", class_ = "spouse", inline=True) +
pedma += (Html("li", class_ = "spouse") +
self.pedigree_person(mother) +
children_ped(Html("ol"))
)
elif father:
pedol += (Html("li", inline=True) + self.pedigree_person(father) +
pedol += (Html("li") + self.pedigree_person(father) +
children_ped(Html("ol"))
)
elif mother:
pedol += (Html("li", inline=True) + self.pedigree_person(mother) +
pedol += (Html("li") + self.pedigree_person(mother) +
children_ped(Html("ol"))
)
else:
pedol += (Html("li", inline=True) + children_ped(Html("ol")))
pedol += (Html("li") + children_ped(Html("ol")))
return ped
def display_ind_general(self):
@ -6033,7 +6085,7 @@ class PersonPages(BasePage):
"""
self.page_title = self.sort_name
thumbnail = self.display_first_image_as_thumbnail(self.person.get_media_list(), self.person)
section_title = Html("h3", self.page_title, inline =True) + \
section_title = Html("h3", html_escape(self.page_title), inline =True) + \
(Html('sup') +\
(Html('small') +
self.get_citation_links(self.person.get_citation_list())))
@ -6053,7 +6105,7 @@ class PersonPages(BasePage):
# Names [and their sources]
for name in all_names:
pname = _nd.display_name(name)
pname = html_escape(_nd.display_name(name))
# if name == primary_name:
# pname += self.get_citation_links(self.person.get_citation_list() )
pname += self.get_citation_links( name.get_citation_list() )
@ -6200,7 +6252,7 @@ class PersonPages(BasePage):
This will display a parent ...
"""
tcell1 = Html("td", title, class_ = "ColumnAttribute", inline = True)
tcell2 = Html("td", class_ = "ColumnValue", inline=True)
tcell2 = Html("td", class_ = "ColumnValue")
tcell2 += self.new_person_link(handle, uplink=True)
@ -6720,7 +6772,7 @@ class AddressBookPage(BasePage):
body += addressbookdetail
link = self.new_person_link(person_handle, uplink=True, person=person)
addressbookdetail += Html("h3", link, inline=True)
addressbookdetail += Html("h3", link)
# individual has an address
if has_add:
@ -7059,20 +7111,20 @@ class NavWebReport(Report):
# the handle for the object that refers to the 'key' object.
###########################################################################
_obj_class_list = (Person, Family, Event, Place, Source, Citation,
MediaObject, Repository, Note, Tag)
# setup a dictionary of the required structure
obj_dict = defaultdict(lambda: defaultdict(set))
bkref_dict = defaultdict(lambda: defaultdict(set))
# initialise the dictionary to empty in case no objects of any particular
# class are incuded in the web report
for obj_class in _obj_class_list:
obj_dict[obj_class] = defaultdict(set)
def _build_obj_dict(self):
_obj_class_list = (Person, Family, Event, Place, Source, Citation,
MediaObject, Repository, Note, Tag)
# setup a dictionary of the required structure
self.obj_dict = defaultdict(lambda: defaultdict(set))
self.bkref_dict = defaultdict(lambda: defaultdict(set))
# initialise the dictionary to empty in case no objects of any
# particular class are incuded in the web report
for obj_class in _obj_class_list:
self.obj_dict[obj_class] = defaultdict(set)
ind_list = self.database.iter_person_handles()
self.user.begin_progress(_("Narrated Web Site Report"),
_('Applying Person Filter...'),
@ -7306,10 +7358,15 @@ class NavWebReport(Report):
def _add_event(self, event_handle, bkref_class, bkref_handle):
event = self.database.get_event_from_handle(event_handle)
# I have no idea why all that is displayed for the back link is the
# event type, but this can be seen in a Media page, where the Media is
# linked from (for example) a birth event
event_name = str(event.get_type())
event_name = event.get_description()
# The event description can be Y on import from GEDCOM. See the
# following quote from the GEDCOM spec: "The occurrence of an event is
# asserted by the presence of either a DATE tag and value or a PLACe tag
# and value in the event structure. When neither the date value nor the
# place value are known then a Y(es) value on the parent event tag line
# is required to assert that the event happened.""
if event_name == "" or event_name is None or event_name =='Y':
event_name = str(event.get_type())
if self.inc_events:
event_fname = self.build_url_fname(event_handle, "evt",
False) + self.ext
@ -8493,8 +8550,8 @@ def first_letter(string):
second_letter = normalize('NFKC', cuni(string))[1].upper()
if second_letter == cuni('Z'):
letter += cuni('z')
elif second_letter == cuni('≈Ω'):
letter += cuni('ž')
elif second_letter == cuni('≈Ω'):
letter += cuni('ž')
return letter
def get_first_letters(dbase, menu_set, key):
@ -8575,6 +8632,8 @@ def alphabet_navigation(menu_set):
hyper = Html("a", "V,W", href = "#V,W", title = "V,W")
else:
# adding title to hyperlink menu for screen readers and braille writers
if menu_item == ' ':
menu_item = '&nbsp;'
title_str = _("Alphabet Menu: %s") % menu_item
hyper = Html("a", menu_item, title = title_str, href = "#%s" % menu_item)
unordered.extend(