Finished EventListPage. Now only need to work out the sorting protion of it... updated stylesheet to match.

svn: r13678
This commit is contained in:
Rob G. Healey 2009-11-27 09:28:39 +00:00
parent 288a20f62d
commit b90b6f769c
2 changed files with 281 additions and 215 deletions

View File

@ -647,11 +647,32 @@ div#EventList table.eventlist tbody tr.BeginName {
div#EventList table.eventlist tbody tr td { div#EventList table.eventlist tbody tr td {
padding: 4px 0px 4px 0px; padding: 4px 0px 4px 0px;
} }
div#EventList table.eventlist tbody tr td.ColumnEvent a, div#EventList table.alphaevent {
div#EventList table.eventlist tbody tr td.ColumnPerson a, padding: .3em 0 .3em 0;
div#EventList table.eventlist tbody tr td.ColumnPartner a { margin: 0;
display: block; }
padding: 4px 0px 4px 10px; div#EventList table.alphaevent tbody tr.BeginEvent {
border-top: solid 1px #5D835F;
}
div#EventList table.alphaevent tbody tr td {
background-color: #D8F3D6;
border-bottom: dashed 1px #5D835F;
}
div#EventList table.alphaevent tbody tr td:hover {
background: none;
}
div#EventList table.alphaevent tbody tr td.ColumnType {
width: 15%;
}
div#EventList table.alphaevent tbody tr td.ColumnGRAMPSID {
width: 15%;
}
div#EventList table.alphaevent tbody tr td.ColumnDate {
width: 15%;
}
div#EventList table.alphaevent tbody tr td.ColumnPerson {
background-color: #FFF;
width: 50%;
} }
div#EventDetail h3 { div#EventDetail h3 {
font-size: xxx-large; font-size: xxx-large;
@ -939,36 +960,6 @@ div#AddressBookList table.addressbook tbody tr td.ColumnWebLinks {
width: 8%; width: 8%;
} }
/* Gramps Event List by Alphabet
------------------------------------------------------ */
div#AlphabetEvent {
padding: 0;
margin: 0 auto;
}
div#AlphabetEvent table.alphaevent {
padding: 0;
margin: 0;
}
div#AlphabetEvent table.alphaevent tbody tr.BeginEvent {
border-top: solid 1px #5D835F;
}
div#AlphabetEvent table.alphaevent tbody tr td {
background-color: #D8F3D6;
border-bottom: dashed 1px #5D835F;
}
div#AlphabetEvent table.alphaevent tbody tr td.ColumnType {
width: 15%;
}
div#AlphabetEvent table.alphaevent tbody tr td.ColumnGRAMPSID {
width: 15%;
}
div#AlphabetEvent table.alphaevent tbody tr td.ColumnDate {
width: 15%;
}
div#AlphabetEvent table.alphaevent tbody tr td.ColumnPerson {
width: 50%;
}
/* Subsections /* Subsections
----------------------------------------------------- */ ----------------------------------------------------- */
#Home, #Introduction, #Contact { #Home, #Introduction, #Contact {

View File

@ -122,18 +122,24 @@ from libhtmlbackend import HtmlBackend
# Translatable strings for variables within this plugin # Translatable strings for variables within this plugin
# gettext carries a huge footprint with it. # gettext carries a huge footprint with it.
AHEAD = _("Attributes") AHEAD = _("Attributes")
BIRTH = _("Birth")
CITY = _("City") CITY = _("City")
COUNTY = _("County") COUNTY = _("County")
COUNTRY = _("Country") COUNTRY = _("Country")
DEATH = _("Death")
DHEAD = _("Date") DHEAD = _("Date")
DESCRHEAD = _("Description") DESCRHEAD = _("Description")
_EVENT = _("Eent")
GRAMPSID = _("Gramps ID") GRAMPSID = _("Gramps ID")
LATITUDE = _("Latitude") LATITUDE = _("Latitude")
LOCATIONS = _("Alternate Locations") LOCATIONS = _("Alternate Locations")
LONGITUDE = _("Longitude") LONGITUDE = _("Longitude")
NHEAD = _("Notes") NHEAD = _("Notes")
PARENTS = _("Parents")
PARISH = _("Church Parish") PARISH = _("Church Parish")
_PARTNER = _("Partner")
PHEAD = _("Place") PHEAD = _("Place")
_PERSON = _("Person")
PHONE = _("Phone") PHONE = _("Phone")
POSTAL = _("Postal Code") POSTAL = _("Postal Code")
SHEAD = _("Sources") SHEAD = _("Sources")
@ -152,7 +158,7 @@ _NARRATIVESCREEN = "narrative-screen.css"
_NARRATIVEPRINT = "narrative-print.css" _NARRATIVEPRINT = "narrative-print.css"
# variables for alphabet_navigation() # variables for alphabet_navigation()
_PERSON, _PLACE = 0, 1 _KEYPERSON, _KEYPLACE, _KEYEVENT, _ALPHAEVENT = 0, 1, 2, 3
# Web page filename extensions # Web page filename extensions
_WEB_EXT = ['.html', '.htm', '.shtml', '.php', '.php3', '.cgi'] _WEB_EXT = ['.html', '.htm', '.shtml', '.php', '.php3', '.cgi']
@ -323,14 +329,11 @@ class BasePage(object):
if showsrc: if showsrc:
srcrefs = self.get_citation_links(attr.get_source_references()) or " " srcrefs = self.get_citation_links(attr.get_source_references()) or " "
source_row = ("Sources", srcrefs) attr_data_row.append(("Sources", srcrefs))
attr_data_row.append(source_row)
# get attribute note list # get attribute note list
notelist = attr.get_note_list() notelist = self.display_note_list(attr.get_note_list() ) or " "
notelist = self.display_note_list(notelist) or " " attr_data_row.append(("Notes", notelist))
note_row = ("Notes", notelist)
attr_data_row.append(note_row)
# display attribute list # display attribute list
trow.extend( trow.extend(
@ -535,7 +538,7 @@ class BasePage(object):
# position 0 = translatable label, position 1 = column class # position 0 = translatable label, position 1 = column class
# position 2 = data # position 2 = data
info = [ info = [
[_("Event"), "Event", evt_hyper], [_EVENT, "Event", evt_hyper],
[DHEAD, "Date", _dd.display(evt.get_date_object() )] ] [DHEAD, "Date", _dd.display(evt.get_date_object() )] ]
if showplc: if showplc:
@ -592,7 +595,7 @@ class BasePage(object):
] ]
# finish the label's missing piece # finish the label's missing piece
header_row[5][0] += _("Parents") if LDSSealedType == "Person" else _("Spouse") header_row[5][0] += PARENTS if LDSSealedType == "Person" else _("Spouse")
trow.extend( trow.extend(
Html("th", label, class_ = "Column" + colclass, inline = True) Html("th", label, class_ = "Column" + colclass, inline = True)
@ -935,7 +938,7 @@ class BasePage(object):
# return footer to its callers # return footer to its callers
return footer return footer
def write_header(self, title): def write_header(self, title, key):
""" """
Note. 'title' is used as currentsection in the navigation links and Note. 'title' is used as currentsection in the navigation links and
as part of the header title. as part of the header title.
@ -993,25 +996,28 @@ class BasePage(object):
head += meta head += meta
head += links head += links
# begin header section # alpha event pages do not need these things
headerdiv = (Html("div", id = 'header') + if key is not _ALPHAEVENT:
Html("h1", html_escape(self.title_str), id = "SiteTitle", inline = True)
)
body += headerdiv
header_note = self.report.options['headernote'] # begin header section
if header_note: headerdiv = (Html("div", id = 'header') +
note = db.get_note_from_gramps_id(header_note) Html("h1", html_escape(self.title_str), id = "SiteTitle", inline = True)
note_text = self.get_note_format(note) )
body += headerdiv
user_header = Html("div", id = 'user_header') header_note = self.report.options['headernote']
headerdiv += user_header if header_note:
note = db.get_note_from_gramps_id(header_note)
note_text = self.get_note_format(note)
user_header = Html("div", id = 'user_header')
headerdiv += user_header
# attach note # attach note
user_header += note_text user_header += note_text
# Begin Navigation Menu # Begin Navigation Menu
body += self.display_nav_links(title) body += self.display_nav_links(title)
# return to its caller, page and body # return to its caller, page and body
return page, body return page, body
@ -1340,9 +1346,10 @@ class BasePage(object):
confidence = None confidence = None
tmp.extend("%s: %s" % (label, data) tmp.extend("%s: %s" % (label, data)
for (label, data) in [(DHEAD, _dd.display(sref.date)), for (label, data) in [
(_PAGE, sref.page), [DHEAD, _dd.display(sref.date)],
(_CONFIDENCE, confidence)] [_PAGE, sref.page],
[_CONFIDENCE, confidence] ]
if data) if data)
tmp.extend("%s: %s" % tmp.extend("%s: %s" %
@ -1598,7 +1605,7 @@ class IndividualListPage(BasePage):
showparents = report.options['showparents'] showparents = report.options['showparents']
of = self.report.create_file("individuals") of = self.report.create_file("individuals")
indlistpage, body = self.write_header(_("Individuals")) indlistpage, body = self.write_header(_("Individuals"), _KEYPERSON)
# begin Individuals division # begin Individuals division
with Html("div", class_ = "content", id = "Individuals") as individuallist: with Html("div", class_ = "content", id = "Individuals") as individuallist:
@ -1611,8 +1618,8 @@ class IndividualListPage(BasePage):
individuallist += Html("p", msg, id = "description") individuallist += Html("p", msg, id = "description")
# add alphabet navigation # add alphabet navigation
menu_set = get_first_letters(db, person_handle_list, _PERSON) menu_set = get_first_letters(db, person_handle_list, _KEYPERSON)
alpha_nav = alphabet_navigation(menu_set) alpha_nav, menu_set = alphabet_navigation(menu_set, _KEYPERSON)
if alpha_nav is not None: if alpha_nav is not None:
individuallist += alpha_nav individuallist += alpha_nav
@ -1631,16 +1638,16 @@ class IndividualListPage(BasePage):
) )
if showbirth: if showbirth:
trow += Html("th", _("Birth"), class_ = "ColumnBirth", inline = True) trow += Html("th", BIRTH, class_ = "ColumnBirth", inline = True)
if showdeath: if showdeath:
trow += Html("th", _("Death"), class_ = "ColumnDeath", inline = True) trow += Html("th", DEATH, class_ = "ColumnDeath", inline = True)
if showpartner: if showpartner:
trow += Html("th", _("Partner"), class_ = "ColumnPartner", inline = True) trow += Html("th", _PARTNER, class_ = "ColumnPartner", inline = True)
if showparents: if showparents:
trow += Html("th", _("Parents"), class_ = "ColumnParents", inline = True) trow += Html("th", PARENTS, class_ = "ColumnParents", inline = True)
tbody = Html("tbody") tbody = Html("tbody")
table += tbody table += tbody
@ -1788,7 +1795,7 @@ class SurnamePage(BasePage):
of = self.report.create_file(name_to_md5(surname), "srn") of = self.report.create_file(name_to_md5(surname), "srn")
self.up = True self.up = True
surnamepage, body = self.write_header("%s - %s" % (_("Surname"), surname)) surnamepage, body = self.write_header("%s - %s" % (_("Surname"), surname), _KEYPERSON)
# begin SurnameDetail division # begin SurnameDetail division
with Html("div", class_ = "content", id = "SurnameDetail") as surnamedetail: with Html("div", class_ = "content", id = "SurnameDetail") as surnamedetail:
@ -1815,16 +1822,16 @@ class SurnamePage(BasePage):
trow += Html("th", _("Name"), class_ = "ColumnName", inline = True) trow += Html("th", _("Name"), class_ = "ColumnName", inline = True)
if showbirth: if showbirth:
trow += Html("th", _("Birth"), class_ = "ColumnBirth", inline = True) trow += Html("th", BIRTH, class_ = "ColumnBirth", inline = True)
if showdeath: if showdeath:
trow += Html("th", _("Death"), class_ = "ColumnDeath", inline = True) trow += Html("th", DEATH, class_ = "ColumnDeath", inline = True)
if showpartner: if showpartner:
trow += Html("th", _("Partner"), class_ = "ColumnPartner", inline = True) trow += Html("th", _PARTNER, class_ = "ColumnPartner", inline = True)
if showparents: if showparents:
trow += Html("th", _("Parents"), class_ = "ColumnParents", inline = True) trow += Html("th", PARENTS, class_ = "ColumnParents", inline = True)
# begin table body # begin table body
tbody = Html("tbody") tbody = Html("tbody")
@ -1942,7 +1949,7 @@ class PlaceListPage(BasePage):
db = report.database db = report.database
of = self.report.create_file("places") of = self.report.create_file("places")
placelistpage, body = self.write_header(_("Places")) placelistpage, body = self.write_header(_("Places"), _KEYPLACE)
# begin places division # begin places division
with Html("div", class_ = "content", id = "Places") as placelist: with Html("div", class_ = "content", id = "Places") as placelist:
@ -1955,8 +1962,8 @@ class PlaceListPage(BasePage):
placelist += Html("p", msg, id = "description") placelist += Html("p", msg, id = "description")
# begin alphabet navigation # begin alphabet navigation
menu_set = get_first_letters(db, place_handles, _PLACE) menu_set = get_first_letters(db, place_handles, _KEYPLACE)
alpha_nav = alphabet_navigation(menu_set) alpha_nav, menu_set = alphabet_navigation(menu_set, _KEYPLACE)
if alpha_nav is not None: if alpha_nav is not None:
placelist += alpha_nav placelist += alpha_nav
@ -2030,7 +2037,7 @@ class PlacePage(BasePage):
of = self.report.create_file(place.get_handle(), "plc") of = self.report.create_file(place.get_handle(), "plc")
self.up = True self.up = True
self.page_title = ReportUtils.place_name(db, place_handle) self.page_title = ReportUtils.place_name(db, place_handle)
placepage, body = self.write_header(_("Places")) placepage, body = self.write_header(_("Places"), _KEYPLACE)
# begin PlaceDetail Division # begin PlaceDetail Division
with Html("div", class_ = "content", id = "PlaceDetail") as placedetail: with Html("div", class_ = "content", id = "PlaceDetail") as placedetail:
@ -2090,13 +2097,19 @@ class PlacePage(BasePage):
self.XHTMLWriter(placepage, of) self.XHTMLWriter(placepage, of)
class EventListPage(BasePage): class EventListPage(BasePage):
def __init__(self, report, title, event_types, event_handle_list, ind_list):
"""
Will create the event list page
def __init__(self, report, title, event_dict): @param: event_types: a list of the type in the events database for this class
@param: event_handle_list -- a list of event handles
#psram: ind_list -- person handles for this database
"""
BasePage.__init__(self, report, title) BasePage.__init__(self, report, title)
db = report.database db = report.database
of = self.report.create_file("events") of = self.report.create_file("events")
eventslistpage, body = self.write_header(_("Events")) eventslistpage, body = self.write_header(_("Events"), _KEYEVENT)
# begin events list division # begin events list division
with Html("div", class_ = "content", id = "EventList") as eventlist: with Html("div", class_ = "content", id = "EventList") as eventlist:
@ -2104,49 +2117,103 @@ class EventListPage(BasePage):
msg = _("This page contains an index of all the events in the " msg = _("This page contains an index of all the events in the "
"database, sorted by their type, date (if one is present), " "database, sorted by their type, date (if one is present), "
"and person’s surname. Clicking on an event’s type " "Clicking on an event’s type will load a page of those type of events.")
"will take you to that event’s page. Clicking on a "
"person’s name will take you to that person’s page. "
"The person’s name will only be shown once for their events.")
eventlist += Html("p", msg, id = "description") eventlist += Html("p", msg, id = "description")
# begin event list table and table head # get alphabet navigation for class EventListPage
with Html("table", class_ = "infolist eventlist") as table: alpha_nav, event_types = alphabet_navigation(event_types, _ALPHAEVENT)
if alpha_nav is not None:
eventlist += alpha_nav
# begin alphabet event table
with Html("table", class_ = "infolist alphaevent") as table:
eventlist += table eventlist += table
thead = Html("thead") thead = Html("thead")
table += thead table += thead
# begin table header row
trow = Html("tr") trow = Html("tr")
thead += trow thead += trow
header_row = [
[_("Event"), "Event"],
[DHEAD, "Date"],
[_("Person"), "Person"],
[_("Partner"), "Partner"] ]
trow.extend( trow.extend(
Html("th", label, class_ = "Column" + colclass, inline = True) Html("th", label, class_ = "Column" + colclass, inline = True)
for (label, colclass) in header_row) for (label, colclass) in [
[THEAD, "Type"],
[GRAMPSID, "GRAMPSID"],
[DHEAD, "Date"],
[_PERSON, "Person"] ]
)
# begin table body
tbody = Html("tbody") tbody = Html("tbody")
table += tbody table += tbody
for (person, event_list) in event_dict: # separate events by their type and then thier event handles
for (evt_type, datalist) in sort_event_types(db, event_types, event_handle_list):
first_event = True
first = True for (gid, date, event_handle) in datalist:
for (evt_type, sort_date, sort_name, evt, evt_ref, partner) in event_list:
# write out event row event = db.get_event_from_handle(event_handle)
tbody += self.write_event_row(person, partner, evt_type, evt, evt_ref, first)
# show the individual's name only once for their events trow = Html("tr")
first = False tbody += trow
# and clearline for proper styling # display Event type if first in the list
# and footer section tcell = Html("td", class_ = "ColumnType", inline = True)
trow += tcell
if first_event:
trow.attr = 'class = "BeginEvent"'
tcell += Html("a", evt_type, name = "%s" % evt_type, inline = True)
else:
tcell += " "
# GRAMPS ID
tcell = Html("td", class_ = "ColumnGRAMPSID", inline = True)
trow += tcell
if not self.noid and gid:
tcell += gid
else:
tcell += " "
# event date
tcell = Html("td", class_ = "ColumnDate", inline = True)
trow += tcell
if date and date is not Date.EMPTY:
tcell += _dd.display(date)
else:
tcell += " "
# Person
if evt_type in ["Divorce", "Marriage"]:
handle_list = db.find_backlink_handles(event_handle,
include_classes = ['Person', 'Family'])
else:
handle_list = db.find_backlink_handles(event_handle, include_classes=['Person'])
first_person = True
tcell = Html("td", class_ = "ColumnPerson")
trow += tcell
for handle in handle_list:
person = db.get_person_from_handle(handle)
if person:
person_name = self.get_name(person)
if not first_person:
tcell += ", "
if handle in ind_list:
url = self.report.build_url_fname_html(handle, "ppl", True)
tcell += self.person_link(url, person, True)
else:
tcell += person_name
else:
tcell += " "
first_person = False
first_event = False
# add clearline for proper styling
# add footer section
footer = self.write_footer() footer = self.write_footer()
body += (fullclear, footer) body += (fullclear, footer)
@ -2154,62 +2221,6 @@ class EventListPage(BasePage):
# and close the file # and close the file
self.XHTMLWriter(eventslistpage, of) self.XHTMLWriter(eventslistpage, of)
def write_event_row(self, person, partner, evt_type, evt, evt_ref, first):
"""
display the event row for class EventListPage()
@param: person = person that the event is referenced to
@param: partner = only used when the event is either a Marriage or Divorce
@param: evt_type = the type of event
@param: evt = event
@param: evt_ref = event reference
@param: first = used for only showing the person once for list of events
"""
subdirs = False
# begin table row
trow = Html("tr")
if first:
trow.attr = 'class = "BeginName"'
# get person's hyperlink
url = self.report.build_url_fname_html(person.handle, "ppl", subdirs)
person_hyper = self.person_link(url, person, True, first, gid = person.gramps_id)
# get event data
"""
for more information: see get_event_data()
"""
event_data = self.get_event_data(evt, evt_ref, False, False, False, False, subdirs, True)
trow.extend(
Html("td", data or " ", class_ = "Column" + colclass,
inline = (not data or colclass == "Event" or colclass == "Date"))
for (label, colclass, data) in event_data)
# determine if same row or not?
samerow = (person_hyper == " ")
# display person hyperlink
trow += Html("td", person_hyper, class_ = "ColumnPerson", inline = samerow)
# get partner hyperlink
# display partner if event is either a Marriage or Divorce?
partner_hyper = " "
if partner is not None:
# get partner hyperlink
url = self.report.build_url_fname_html(partner.handle, "ppl", subdirs)
partner_hyper = self.person_link(url, partner, True, gid = partner.gramps_id)
# determine if same row or not?
samerow = (partner_hyper == " ")
trow += Html("td", partner_hyper, class_ = "ColumnPartner", inline = samerow)
# return EventList row to its caller
return trow
class EventPage(BasePage): class EventPage(BasePage):
def __init__(self, report, title, person, partner, evt_type, event, evt_ref): def __init__(self, report, title, person, partner, evt_type, event, evt_ref):
@ -2219,7 +2230,7 @@ class EventPage(BasePage):
subdirs = True subdirs = True
of = self.report.create_file(evt_ref.ref, "evt") of = self.report.create_file(evt_ref.ref, "evt")
eventpage, body = self.write_header(_("Events")) eventpage, body = self.write_header(_("Events"), _KEYEVENT)
# start event page division # start event page division
with Html("div", class_ = "content", id = "EventDetail") as eventdetail: with Html("div", class_ = "content", id = "EventDetail") as eventdetail:
@ -2270,7 +2281,7 @@ class EventPage(BasePage):
url = self.report.build_url_fname_html(person.handle, "ppl", self.up) url = self.report.build_url_fname_html(person.handle, "ppl", self.up)
person_hyper = self.person_link(url, person, True, gid = person.gramps_id) person_hyper = self.person_link(url, person, True, gid = person.gramps_id)
trow = Html("tr") + ( trow = Html("tr") + (
Html("td", _("Person"), class_ = "ColumnAttribute", inline = True), Html("td", _PERSON, class_ = "ColumnAttribute", inline = True),
Html("td", person_hyper, class_ = "ColumnPerson") Html("td", person_hyper, class_ = "ColumnPerson")
) )
tbody += trow tbody += trow
@ -2280,7 +2291,7 @@ class EventPage(BasePage):
url = self.report.build_url_fname_html(partner.handle, "ppl", self.up) url = self.report.build_url_fname_html(partner.handle, "ppl", self.up)
partner_hyper = self.person_link(url, partner, True, gid = partner.gramps_id) partner_hyper = self.person_link(url, partner, True, gid = partner.gramps_id)
trow = Html("tr") + ( trow = Html("tr") + (
Html("td", _("Partner"), class_ = "ColumnAttribute", inline = True), Html("td", _PARTNER, class_ = "ColumnAttribute", inline = True),
Html("td", partner_hyper, class_ = "ColumnPartner") Html("td", partner_hyper, class_ = "ColumnPartner")
) )
tbody += trow tbody += trow
@ -2396,7 +2407,7 @@ class MediaPage(BasePage):
self.copy_thumbnail(handle, media) self.copy_thumbnail(handle, media)
self.page_title = media.get_description() self.page_title = media.get_description()
mediapage, body = self.write_header("%s - %s" % (_("Media"), self.page_title)) mediapage, body = self.write_header("%s - %s" % (_("Media"), self.page_title), _KEYPERSON)
# begin MediaDetail division # begin MediaDetail division
with Html("div", class_ = "content", id = "GalleryDetail") as mediadetail: with Html("div", class_ = "content", id = "GalleryDetail") as mediadetail:
@ -2691,10 +2702,10 @@ class SurnameListPage(BasePage):
if order_by == self.ORDER_BY_NAME: if order_by == self.ORDER_BY_NAME:
of = self.report.create_file(filename) of = self.report.create_file(filename)
surnamelistpage, body = self.write_header(_('Surnames')) surnamelistpage, body = self.write_header(_('Surnames'), _KEYPERSON)
else: else:
of = self.report.create_file("surnames_count") of = self.report.create_file("surnames_count")
surnamelistpage, body = self.write_header(_('Surnames by person count')) surnamelistpage, body = self.write_header(_('Surnames by person count'), _KEYPERSON)
# begin surnames division # begin surnames division
with Html("div", class_ = "content", id = "surnames") as surnamelist: with Html("div", class_ = "content", id = "surnames") as surnamelist:
@ -2710,8 +2721,8 @@ class SurnameListPage(BasePage):
# add alphabet navigation... # add alphabet navigation...
# only if surname list not surname count # only if surname list not surname count
if order_by == self.ORDER_BY_NAME: if order_by == self.ORDER_BY_NAME:
menu_set = get_first_letters(db, person_handle_list, _PERSON) menu_set = get_first_letters(db, person_handle_list, _KEYPERSON)
alpha_nav = alphabet_navigation(menu_set) alpha_nav, menu_set = alphabet_navigation(menu_set, _KEYPERSON)
if alpha_nav is not None: if alpha_nav is not None:
surnamelist += alpha_nav surnamelist += alpha_nav
@ -2819,7 +2830,7 @@ class IntroductionPage(BasePage):
db = report.database db = report.database
of = self.report.create_file(report.intro_fname) of = self.report.create_file(report.intro_fname)
intropage, body = self.write_header(_('Introduction')) intropage, body = self.write_header(_('Introduction'), _KEYPERSON)
# begin Introduction division # begin Introduction division
with Html("div", class_ = "content", id = "Introduction") as section: with Html("div", class_ = "content", id = "Introduction") as section:
@ -2856,7 +2867,7 @@ class HomePage(BasePage):
db = report.database db = report.database
of = self.report.create_file("index") of = self.report.create_file("index")
homepage, body = self.write_header(_('html|Home')) homepage, body = self.write_header(_('Home'), _KEYPERSON)
# begin home division # begin home division
with Html("div", class_ = "content", id = "Home") as section: with Html("div", class_ = "content", id = "Home") as section:
@ -2893,7 +2904,7 @@ class SourceListPage(BasePage):
source_dict = {} source_dict = {}
of = self.report.create_file("sources") of = self.report.create_file("sources")
sourcelistpage, body = self.write_header(_("Sources")) sourcelistpage, body = self.write_header(_("Sources"), _KEYPERSON)
# begin source list division # begin source list division
with Html("div", class_ = "content", id = "Sources") as sourceslist: with Html("div", class_ = "content", id = "Sources") as sourceslist:
@ -2964,7 +2975,7 @@ class SourcePage(BasePage):
of = self.report.create_file(source.get_handle(), "src") of = self.report.create_file(source.get_handle(), "src")
self.up = True self.up = True
sourcepage, body = self.write_header(_('Sources')) sourcepage, body = self.write_header(_('Sources'), _KEYPERSON)
# begin source detail division # begin source detail division
with Html("div", class_ = "content", id = "SourceDetail") as section: with Html("div", class_ = "content", id = "SourceDetail") as section:
@ -3032,7 +3043,7 @@ class MediaListPage(BasePage):
db = report.database db = report.database
of = self.report.create_file("media") of = self.report.create_file("media")
medialistpage, body = self.write_header(_('Media')) medialistpage, body = self.write_header(_('Media'), _KEYPERSON)
# begin gallery division # begin gallery division
with Html("div", class_ = "content", id = "Gallery") as section: with Html("div", class_ = "content", id = "Gallery") as section:
@ -3140,7 +3151,7 @@ class DownloadPage(BasePage):
return return
of = self.report.create_file("download") of = self.report.create_file("download")
downloadpage, body = self.write_header(_('Download')) downloadpage, body = self.write_header(_('Download'), _KEYPERSON)
# begin download page and table # begin download page and table
with Html("div", class_ = "content", id = "Download") as download: with Html("div", class_ = "content", id = "Download") as download:
@ -3247,7 +3258,7 @@ class ContactPage(BasePage):
db = report.database db = report.database
of = self.report.create_file("contact") of = self.report.create_file("contact")
contactpage, body = self.write_header(_('Contact')) contactpage, body = self.write_header(_('Contact'), _KEYPERSON)
# begin contact division # begin contact division
with Html("div", class_ = "content", id = "Contact") as section: with Html("div", class_ = "content", id = "Contact") as section:
@ -3328,7 +3339,7 @@ class IndividualPage(BasePage):
of = self.report.create_file(person.handle, "ppl") of = self.report.create_file(person.handle, "ppl")
self.up = True self.up = True
indivdetpage, body = self.write_header(self.sort_name) indivdetpage, body = self.write_header(self.sort_name, _KEYPERSON)
# begin individualdetail division # begin individualdetail division
with Html("div", class_ = "content", id = 'IndividualDetail') as individualdetail: with Html("div", class_ = "content", id = 'IndividualDetail') as individualdetail:
@ -3969,7 +3980,7 @@ class IndividualPage(BasePage):
# begin parents division # begin parents division
with Html("div", class_ = "subsection", id = "parents") as section: with Html("div", class_ = "subsection", id = "parents") as section:
section += Html("h4", _("Parents"), inline = True) section += Html("h4", PARENTS, inline = True)
# begin parents table # begin parents table
with Html("table", class_ = "infolist") as table: with Html("table", class_ = "infolist") as table:
@ -4272,9 +4283,9 @@ class IndividualPage(BasePage):
elif gender == Person.MALE: elif gender == Person.MALE:
relstr = _("Wife") relstr = _("Wife")
else: else:
relstr = _("Partner") relstr = _PARTNER
else: else:
relstr = _("Partner") relstr = _PARTNER
partner_handle = ReportUtils.find_spouse(self.person, family) partner_handle = ReportUtils.find_spouse(self.person, family)
if partner_handle: if partner_handle:
@ -4373,7 +4384,7 @@ class IndividualPage(BasePage):
# position 0 = translatable label, position 1 = column class, and # position 0 = translatable label, position 1 = column class, and
# position 2 = data # position 2 = data
event_header_row = [ event_header_row = [
(_("Event"), "Event"), (_EVENT, "Event"),
(DHEAD, "Date") ] (DHEAD, "Date") ]
if showplc: if showplc:
@ -4449,7 +4460,7 @@ class RepositoryListPage(BasePage):
db = report.database db = report.database
of = self.report.create_file("repositories") of = self.report.create_file("repositories")
repolistpage, body = self.write_header(_("Repositories")) repolistpage, body = self.write_header(_("Repositories"), _KEYPERSON)
# begin RepositoryList division # begin RepositoryList division
with Html("div", class_ = "content", id = "RepositoryList") as repositorylist: with Html("div", class_ = "content", id = "RepositoryList") as repositorylist:
@ -4524,7 +4535,7 @@ class RepositoryPage(BasePage):
of = self.report.create_file(handle, 'repo') of = self.report.create_file(handle, 'repo')
self.up = True self.up = True
repositorypage, body = self.write_header(_('Repositories')) repositorypage, body = self.write_header(_('Repositories'), _KEYPERSON)
# begin RepositoryDetail division and page title # begin RepositoryDetail division and page title
with Html("div", class_ = "content", id = "RepositoryDetail") as repositorydetail: with Html("div", class_ = "content", id = "RepositoryDetail") as repositorydetail:
@ -4594,7 +4605,7 @@ class AddressBookListPage(BasePage):
of = self.report.create_file("addressbook") of = self.report.create_file("addressbook")
# Add xml, doctype, meta and stylesheets # Add xml, doctype, meta and stylesheets
addressbooklistpage, body = self.write_header("%s - %s" % (title, _("Address Book List"))) addressbooklistpage, body = self.write_header("%s - %s" % (title, _("Address Bookt")), _KEYPERSON)
# begin AddressBookList division # begin AddressBookList division
with Html("div", class_ = "content", id = "AddressBookList") as addressbooklist: with Html("div", class_ = "content", id = "AddressBookList") as addressbooklist:
@ -4715,7 +4726,7 @@ class AddressBookPage(BasePage):
# set the file name and open file # set the file name and open file
of = self.report.create_file(person_handle, "addr") of = self.report.create_file(person_handle, "addr")
addressbookpage, body = self.write_header("%s - %s" % (title, _("Address Book"))) addressbookpage, body = self.write_header("%s - %s" % (title, _("Address Book")), _KEYPERSON)
# begin address book page division and section title # begin address book page division and section title
with Html("div", class_ = "content", id = "AddressBookDetail") as addressbookdetail: with Html("div", class_ = "content", id = "AddressBookDetail") as addressbookdetail:
@ -4940,9 +4951,9 @@ class NavWebReport(Report):
# build classes EventListPage and EventPage # build classes EventListPage and EventPage
# build the events dictionary only if event pages are being created? # build the events dictionary only if event pages are being created?
if self.inc_events: if self.inc_events:
event_dict = [] event_dict, event_types, event_handle_list = [], [], []
self.build_events(ind_list, event_dict) self.build_events(ind_list, event_dict, event_types, event_handle_list)
self.event_pages(event_dict) self.event_pages(event_dict, event_types, event_handle_list, ind_list)
# build classes SourceListPage and SourcePage # build classes SourceListPage and SourcePage
self.source_pages(source_list) self.source_pages(source_list)
@ -5038,19 +5049,21 @@ class NavWebReport(Report):
from_path = os.path.join(const.IMAGE_DIR, fname) from_path = os.path.join(const.IMAGE_DIR, fname)
self.copy_file(from_path, fname, "images") self.copy_file(from_path, fname, "images")
def build_events(self, ind_list, event_dict): def build_events(self, ind_list, event_dict, event_types, event_handle_list):
""" """
build a list of events for classes EventListPage and EventPage build a list of events for classes EventListPage and EventPage
@param: ind_list = list of handles for persons in this database @param: ind_list = list of handles for persons in this database
@param: event_dict = a list of events from ind_list @param: event_dict = a list of events from ind_list
@param: event_types -- will hold the difrferent event types for this database
@param: event_handle_list -- a list of event handles to be sorted by type
""" """
db = self.database db = self.database
for person_handle in ind_list: for person_handle in ind_list:
person = db.get_person_from_handle(person_handle) person = db.get_person_from_handle(person_handle)
# begin events list for each person # begin events list for each new person
event_list = [] event_list = []
# get sort name for sorting later # get sort name for sorting later
@ -5073,6 +5086,18 @@ class NavWebReport(Report):
# get event type # get event type
evt_type = get_event_type(event, evt_ref) evt_type = get_event_type(event, evt_ref)
# get event types for class EventsListPage
etype = None
_type = event.type.xml_str()
for xtype in EventType._DATAMAP:
if xtype[2] == _type:
etype = xtype[1]
break
if etype is not None:
event_types.append(etype)
event_handle_list.append(evt_ref.ref)
# get sot date as year/month/day, 2009/09/09, # get sot date as year/month/day, 2009/09/09,
# or 0000/00/00 for non-existing date # or 0000/00/00 for non-existing date
event_date = event.get_date_object() event_date = event.get_date_object()
@ -5092,6 +5117,18 @@ class NavWebReport(Report):
# get event type # get event type
evt_type = get_event_type(event, evt_ref) evt_type = get_event_type(event, evt_ref)
# get event types for class EventsListPage
etype = None
_type = event.type.xml_str()
for xtype in EventType._DATAMAP:
if xtype[2] == _type:
etype = xtype[1]
break
if etype is not None:
event_types.append(etype)
event_handle_list.append(evt_ref.ref)
# get sot date as year/month/day, see above for further info # get sot date as year/month/day, see above for further info
event_date = event.get_date_object() event_date = event.get_date_object()
year = event_date.get_year() or 0 year = event_date.get_year() or 0
@ -5100,8 +5137,7 @@ class NavWebReport(Report):
sort_date = '%04d/%02d/%02d' % (year, month, day) sort_date = '%04d/%02d/%02d' % (year, month, day)
# add event data # add event data
event_list.append([evt_type, sort_date, sort_name, event, event_list.append([evt_type, sort_date, sort_name, event, evt_ref, partner])
evt_ref, partner])
# sort the event_list # sort the event_list
event_list.sort() event_list.sort()
@ -5109,8 +5145,11 @@ class NavWebReport(Report):
# combine person and their events together # combine person and their events together
event_dict.append([person, event_list]) event_dict.append([person, event_list])
# return the events for class EventListPage and EventPage # sort the types alphabetically
return event_dict event_types.sort()
# return the events for EventListPage and EventPage
return event_dict, event_types, event_handle_list
def build_attributes(self, person): def build_attributes(self, person):
""" build a list of attributes for each person """ """ build a list of attributes for each person """
@ -5226,20 +5265,26 @@ class NavWebReport(Report):
PlacePage(self, self.title, place, source_list, place_list) PlacePage(self, self.title, place, source_list, place_list)
self.progress.step() self.progress.step()
def event_pages(self, event_dict): def event_pages(self, event_dict, event_types, event_handle_list, ind_list):
""" """
a dump of all the events sorted by event type, date, and surname a dump of all the events sorted by event type, date, and surname
for classes EventListPage and EventPage for classes EventListPage and EventPage
"""
self.progress.set_pass(_('Creating event pages'), len(event_dict))
@param: event_dict -- all the data for class EventPage
@param: event_types -- a list of all the event types in this database
@param: event_handle_list -- a list of the event handles in the database to be used
"""
# send all data to the events list page # send all data to the events list page
EventListPage(self, self.title, event_dict) EventListPage(self, self.title, event_types, event_handle_list, ind_list)
# set up progress bar for event pages
self.progress.set_pass(_("Creating event pages"), len(event_dict))
for (person, event_list) in event_dict: for (person, event_list) in event_dict:
self.progress.step() self.progress.step()
for (evt_type, sort_date, sort_name, event, evt_ref, partner) in event_list: for (evt_type, sort_date, sort_name, event, evt_ref, partner) in event_list:
self.progress.step()
# create individual event page # create individual event page
EventPage(self, self.title, person, partner, evt_type, event, evt_ref) EventPage(self, self.title, person, partner, evt_type, event, evt_ref)
@ -5978,6 +6023,30 @@ def sort_people(db, handle_list):
return sorted_lists return sorted_lists
def sort_event_types(db, event_types, event_handle_list):
"""
sort a list of event types and group them by their type
@param: event_types -- a dict of event types
@param: event_handle_list -- all event handles in this database
"""
event_dict = dict( (evt_type, []) for evt_type in event_types)
for handle in event_handle_list:
event = db.get_event_from_handle(handle)
event_type = event.type.xml_str()
# add the stuff from this event
if event_type in event_dict:
event_dict[event_type].append(
(event.gramps_id, event.get_date_object(), handle)
)
# return a list of tuples, one per event
return ( (event_type, event_list) for (event_type, event_list) in event_dict.iteritems() )
# Modified _get_regular_surname from WebCal.py to get prefix, first name, and suffix # Modified _get_regular_surname from WebCal.py to get prefix, first name, and suffix
def _get_short_name(gender, name): def _get_short_name(gender, name):
""" Will get prefix and suffix for all people passed through it """ """ Will get prefix and suffix for all people passed through it """
@ -6021,7 +6090,7 @@ def get_first_letters(db, handle_list, key):
first_letters = [] first_letters = []
for handle in handle_list: for handle in handle_list:
if key == _PERSON: if key == _KEYPERSON:
keyname = __get_person_keyname(db, handle) keyname = __get_person_keyname(db, handle)
else: else:
keyname = __get_place_keyname(db, handle) keyname = __get_place_keyname(db, handle)
@ -6032,16 +6101,15 @@ def get_first_letters(db, handle_list, key):
return first_letters return first_letters
def alphabet_navigation(menu_set): def alphabet_navigation(menu_set, alphakey):
""" """
Will create the alphabet navigation bar for classes IndividualListPage, Will create the alphabet navigation bar for classes IndividualListPage,
SurnameListPage, PlaceListPage, and EventList SurnameListPage, PlaceListPage, and EventList
@param: menu_set -- a dictionary of either sorted letters or words @param: menu_set -- a dictionary of either letters or words
@param: alphakey -- either Person, Place, or AlphaEvent
""" """
sorted_set = {} sorted_set = {}
# The comment below from the glibc locale sv_SE in # The comment below from the glibc locale sv_SE in
# localedata/locales/sv_SE : # localedata/locales/sv_SE :
# #
@ -6056,6 +6124,7 @@ def alphabet_navigation(menu_set):
# #
(lang_country, modifier ) = locale.getlocale() (lang_country, modifier ) = locale.getlocale()
ltr = get_first_letters ltr = get_first_letters
for menu_item in menu_set: for menu_item in menu_set:
if menu_item in sorted_set: if menu_item in sorted_set:
sorted_set[menu_item] += 1 sorted_set[menu_item] += 1
@ -6069,40 +6138,46 @@ def alphabet_navigation(menu_set):
sorted_alpha_index = [(menu_item) for menu_item in sorted_alpha_index if menu_item != ","] sorted_alpha_index = [(menu_item) for menu_item in sorted_alpha_index if menu_item != ","]
# remove any single spaces from the letter set also # remove any single spaces from the letter set also
sorted_alpha_index = [(menu_item) for menu_item in sorted_alpha_index if menu_item != " "] # Event Types can and do have spaces, so leave them alone for now...
if alphakey is not _ALPHAEVENT:
sorted_alpha_index = [(ltr) for ltr in sorted_alpha_index if ltr != " "]
# if no letters, return None back to its callers # if no letters or words, return None to its callers
if not sorted_alpha_index: if not sorted_alpha_index:
return None return None
# begin alphabet division num_ltrs = len(sorted_alpha_index)
num_of_cols = 34 if alphakey is not _ALPHAEVENT else 9
num_of_rows = ((num_ltrs // num_of_cols) + 1)
# begin alphabet navigation division
with Html("div", id = "alphabet") as alphabetnavigation: with Html("div", id = "alphabet") as alphabetnavigation:
num_ltrs = len(sorted_alpha_index)
nrows = ((num_ltrs // 34) + 1)
index = 0 index = 0
for row in xrange(nrows): for row in xrange(num_of_rows):
unordered = Html("ul") unordered = Html("ul")
alphabetnavigation += unordered alphabetnavigation += unordered
cols = 0 cols = 0
while (cols <= 34 and index < num_ltrs): while (cols <= num_of_cols and index < num_ltrs):
list = Html("li", inline = True) list = Html("li", inline = True)
unordered += list unordered += list
menu_item = sorted_alpha_index[index] menu_item = sorted_alpha_index[index]
if lang_country == "sv_SE" and ltr == u'V': if lang_country == "sv_SE" and menu_item == u'V':
hyper = Html("a", "V,W", href = "#V,W", alt = "V,W") hyper = Html("a", "V,W", href = "#V,W", alt = "V,W")
else: else:
hyper = Html("a", menu_item, href = "#%s" % menu_item, alt = html_escape(menu_item)) hyper = Html("a", menu_item, href = "#%s" % menu_item, alt = html_escape(menu_item))
list += hyper list += hyper
cols += 1 # increase letter/ word in sorted_alpha_index
index += 1 index += 1
cols += 1
num_of_rows -= 1
# return alphabet navigation to its callers # return alphabet navigation, and menu_set to its callers
return alphabetnavigation # EventListPage will reuse sorted_alpha_index
return alphabetnavigation, sorted_alpha_index
def _has_webpage_extension(url): def _has_webpage_extension(url):
""" """