Merge pull request #160 from gramps-project/cacheproxydb

CacheProxyDb: adds LRU cache for handle lookups
This commit is contained in:
Doug Blank 2016-05-26 06:58:36 -04:00
commit 6454b87672
3 changed files with 345 additions and 178 deletions

View File

@ -26,3 +26,4 @@ from .filter import FilterProxyDb
from .living import LivingProxyDb
from .private import PrivateProxyDb
from .referencedbyselection import ReferencedBySelectionProxyDb
from .cache import CacheProxyDb

180
gramps/gen/proxy/cache.py Normal file
View File

@ -0,0 +1,180 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (c) 2016 Gramps Development Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
Proxy class for the Gramps databases. Caches lookups from handles.
"""
class CacheProxyDb:
"""
A Proxy for a database with cached lookups on handles.
Does not invalid caches. Should be used only in read-only
places, and not where caches are altered.
"""
def __init__(self, database):
"""
CacheProxy will cache items based on their handle.
Assumes all handles (regardless of type) are unique.
Database is called self.db for consistency with other
proxies.
"""
self.db = database
self.clear_cache()
def __getattr__(self, attr):
"""
If an attribute isn't found here, use the self.db
version.
"""
return self.db.__getattr__(attr)
def clear_cache(self, handle=None):
"""
Clears all caches if handle is None, or
specific entry.
"""
from gramps.gui.views.treemodels.lru import LRU
if handle:
del self.cache_handle[handle]
else:
self.cache_handle = LRU(100000)
def get_person_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_person_from_handle(handle)
return self.cache_handle[handle]
def get_event_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_event_from_handle(handle)
return self.cache_handle[handle]
def get_family_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_family_from_handle(handle)
return self.cache_handle[handle]
def get_repository_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_repository_from_handle(handle)
return self.cache_handle[handle]
def get_place_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_place_from_handle(handle)
return self.cache_handle[handle]
def get_place_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_place_from_handle(handle)
return self.cache_handle[handle]
def get_citation_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_citation_from_handle(handle)
return self.cache_handle[handle]
def get_source_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_source_from_handle(handle)
return self.cache_handle[handle]
def get_note_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_note_from_handle(handle)
return self.cache_handle[handle]
def get_media_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_media_from_handle(handle)
return self.cache_handle[handle]
def get_tag_from_handle(self, handle):
"""
Gets item from cache if it exists. Converts
handles to string, for uniformity.
"""
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if handle not in self.cache_handle:
self.cache_handle[handle] = self.db.get_tag_from_handle(handle)
return self.cache_handle[handle]

View File

@ -125,7 +125,7 @@ from gramps.gen.utils.image import image_size # , resize_to_jpeg_buffer
from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.place import displayer as _pd
from gramps.gen.datehandler import displayer as _dd
from gramps.gen.proxy import LivingProxyDb
from gramps.gen.proxy import CacheProxyDb
from gramps.plugins.lib.libhtmlconst import _CHARACTER_SETS, _CC, _COPY_OPTIONS
from gramps.gen.datehandler import get_date
@ -418,7 +418,6 @@ _KEYPERSON, _KEYPLACE, _KEYEVENT, _ALPHAEVENT = 0, 1, 2, 3
# Web page filename extensions
_WEB_EXT = ['.html', '.htm', '.shtml', '.php', '.php3', '.cgi']
_INCLUDE_LIVING_VALUE = LivingProxyDb.MODE_INCLUDE_ALL
_NAME_COL = 3
_DEFAULT_MAX_IMG_WIDTH = 800 # resize images that are wider than this
@ -536,37 +535,6 @@ def format_date(date):
return val
return ""
def sort_on_name_and_grampsid(obj, dbase):
""" Used to sort on name and gramps ID. """
person = dbase.get_person_from_handle(obj)
name = _nd.display(person)
return (name, person.get_gramps_id())
def copy_thumbnail(report, handle, photo, region=None):
"""
Given a handle (and optional region) make (if needed) an
up-to-date cache of a thumbnail, and call report.copy_file
to copy the cached thumbnail to the website.
Return the new path to the image.
"""
to_dir = report.build_path('thumb', handle)
to_path = os.path.join(to_dir, handle) + (
('%d,%d-%d,%d.png' % region) if region else '.png'
)
if photo.get_mime_type():
full_path = media_path_full(report.database, photo.get_path())
from_path = get_thumbnail_path(full_path,
photo.get_mime_type(),
region)
if not os.path.isfile(from_path):
from_path = CSS["Document"]["filename"]
else:
from_path = CSS["Document"]["filename"]
report.copy_file(from_path, to_path)
return to_path
# pylint: disable=unused-variable
# pylint: disable=unused-argument
@ -591,7 +559,6 @@ class BasePage:
self.title_str = title
self.gid = gid
self.bibli = Bibliography()
self.dbase_ = report.database
self.page_title = ""
@ -630,6 +597,44 @@ class BasePage:
"""
pass
def sort_on_name_and_grampsid(self, handle):
""" Used to sort on name and gramps ID. """
person = self.report.database.get_person_from_handle(handle)
name = _nd.display(person)
return (name, person.get_gramps_id())
def sort_on_grampsid(self, event_ref):
"""
Sort on gramps ID
"""
evt = self.report.database.get_event_from_handle(
event_ref.ref)
return evt.get_gramps_id()
def copy_thumbnail(self, handle, photo, region=None):
"""
Given a handle (and optional region) make (if needed) an
up-to-date cache of a thumbnail, and call report.copy_file
to copy the cached thumbnail to the website.
Return the new path to the image.
"""
to_dir = self.report.build_path('thumb', handle)
to_path = os.path.join(to_dir, handle) + (
('%d,%d-%d,%d.png' % region) if region else '.png'
)
if photo.get_mime_type():
full_path = media_path_full(self.report.database, photo.get_path())
from_path = get_thumbnail_path(full_path,
photo.get_mime_type(),
region)
if not os.path.isfile(from_path):
from_path = CSS["Document"]["filename"]
else:
from_path = CSS["Document"]["filename"]
self.report.copy_file(from_path, to_path)
return to_path
def get_nav_menu_hyperlink(self, url_fname, nav_text):
"""
Returns the navigation menu hyperlink
@ -699,7 +704,7 @@ class BasePage:
section += table
for family_handle in family_list:
family = self.dbase_.get_family_from_handle(family_handle)
family = self.report.database.get_family_from_handle(family_handle)
if family:
link = self.family_link(
family_handle,
@ -719,7 +724,7 @@ class BasePage:
spouse_handle = ReportUtils.find_spouse(individual,
family)
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(
spouse = self.report.database.get_person_from_handle(
spouse_handle)
if spouse:
table += self.display_spouse(spouse, family,
@ -749,7 +754,7 @@ class BasePage:
family.get_mother_handle()]:
person = None
if person_handle:
person = self.dbase_.get_person_from_handle(
person = self.report.database.get_person_from_handle(
person_handle)
if person:
table += self.display_spouse(person,
@ -783,7 +788,7 @@ class BasePage:
if not self.inc_families:
notelist = family.get_note_list()
for notehandle in notelist:
note = self.dbase_.get_note_from_handle(notehandle)
note = self.report.database.get_note_from_handle(notehandle)
if note:
trow = Html("tr") + (
Html("td", " ", class_="ColumnType", inline=True),
@ -812,11 +817,11 @@ class BasePage:
# add individual's children event places to family map...
if self.familymappages:
for handle in childlist:
child = self.dbase_.get_person_from_handle(handle)
child = self.report.database.get_person_from_handle(handle)
if child:
self._get_event_place(child, place_lat_long)
children = add_birthdate(self.dbase_, childlist)
children = add_birthdate(self.report.database, childlist)
if birthorder:
children = sorted(children)
@ -875,7 +880,7 @@ class BasePage:
# family event
else:
_obj = self.dbase_.get_family_from_handle(handle)
_obj = self.report.database.get_family_from_handle(handle)
if _obj:
# husband and spouse in this example,
@ -1064,7 +1069,7 @@ class BasePage:
place_handle = event.get_place_handle()
if place_handle:
place = self.dbase_.get_place_from_handle(place_handle)
place = self.report.database.get_place_from_handle(place_handle)
if place:
self.append_to_place_lat_long(place, event, place_lat_long)
@ -1138,7 +1143,7 @@ class BasePage:
# 3 = place handle, 4 = event date, 5 = event type
found = any(data[3] == place_handle for data in place_lat_long)
if not found:
placetitle = _pd.display(self.dbase_, place)
placetitle = _pd.display(self.report.database, place)
latitude = place.get_latitude()
longitude = place.get_longitude()
if latitude and longitude:
@ -1173,11 +1178,11 @@ class BasePage:
evt_ref_list = person.get_event_ref_list()
if evt_ref_list:
for evt_ref in evt_ref_list:
event = self.dbase_.get_event_from_handle(evt_ref.ref)
event = self.report.database.get_event_from_handle(evt_ref.ref)
if event:
place_handle = event.get_place_handle()
if place_handle:
place = self.dbase_.get_place_from_handle(
place = self.report.database.get_place_from_handle(
place_handle)
if place:
self.append_to_place_lat_long(place, event,
@ -1222,13 +1227,13 @@ class BasePage:
husband_handle = family.get_father_handle()
if husband_handle:
husband = self.dbase_.get_person_from_handle(husband_handle)
husband = self.report.database.get_person_from_handle(husband_handle)
else:
husband = None
spouse_handle = family.get_mother_handle()
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(spouse_handle)
spouse = self.report.database.get_person_from_handle(spouse_handle)
else:
spouse = None
@ -1291,7 +1296,7 @@ class BasePage:
table += tbody
for evt_ref in event_ref_list:
event = self.dbase_.get_event_from_handle(evt_ref.ref)
event = self.report.database.get_event_from_handle(evt_ref.ref)
# add event body row
tbody += self.display_event_row(event, evt_ref, place_lat_long,
@ -1312,11 +1317,11 @@ class BasePage:
place = None
place_handle = evt.get_place_handle()
if place_handle:
place = self.dbase_.get_place_from_handle(place_handle)
place = self.report.database.get_place_from_handle(place_handle)
place_hyper = None
if place:
place_name = _pd.display(self.dbase_, place, evt.get_date_object())
place_name = _pd.display(self.report.database, place, evt.get_date_object())
place_hyper = self.place_link(place_handle, place_name,
uplink=uplink)
@ -1372,9 +1377,9 @@ class BasePage:
place_hyper = " "
place_handle = ordobj.get_place_handle()
if place_handle:
place = self.dbase_.get_place_from_handle(place_handle)
place = self.report.database.get_place_from_handle(place_handle)
if place:
place_title = _pd.display(self.dbase_, place)
place_title = _pd.display(self.report.database, place)
place_hyper = self.place_link(place_handle, place_title,
place.get_gramps_id(), uplink=True)
@ -2145,7 +2150,7 @@ class BasePage:
# get all of the backlinks to this media object; meaning all of
# the people, events, places, etc..., that use this image
_region_items = set()
for (classname, newhandle) in self.dbase_.find_backlink_handles(handle,
for (classname, newhandle) in self.report.database.find_backlink_handles(handle,
include_classes=["Person", "Family", "Event", "Place"]):
# for each of the backlinks, get the relevant object from the db
@ -2158,7 +2163,7 @@ class BasePage:
# Is this a person for whom we have built a page:
if self.report.person_in_webreport(newhandle):
# If so, let's add a link to them:
_obj = self.dbase_.get_person_from_handle(newhandle)
_obj = self.report.database.get_person_from_handle(newhandle)
if _obj:
# What is the shortest possible name we could use
# for this person?
@ -2169,16 +2174,16 @@ class BasePage:
_linkurl = self.report.build_url_fname_html(_obj.handle,
"ppl", True)
elif classname == "Family":
_obj = self.dbase_.get_family_from_handle(newhandle)
_obj = self.report.database.get_family_from_handle(newhandle)
partner1_handle = _obj.get_father_handle()
partner2_handle = _obj.get_mother_handle()
partner1 = None
partner2 = None
if partner1_handle:
partner1 = self.dbase_.get_person_from_handle(
partner1 = self.report.database.get_person_from_handle(
partner1_handle)
if partner2_handle:
partner2 = self.dbase_.get_person_from_handle(
partner2 = self.report.database.get_person_from_handle(
partner2_handle)
if partner2 and partner1:
_name = partner1.get_primary_name().get_first_name()
@ -2195,15 +2200,15 @@ class BasePage:
if not _name:
_name = _UNKNOWN
elif classname == "Event":
_obj = self.dbase_.get_event_from_handle(newhandle)
_obj = self.report.database.get_event_from_handle(newhandle)
_name = _obj.get_description()
if not _name:
_name = _UNKNOWN
_linkurl = self.report.build_url_fname_html(_obj.handle,
"evt", True)
elif classname == "Place":
_obj = self.dbase_.get_place_from_handle(newhandle)
_name = _pd.display(self.dbase_, _obj)
_obj = self.report.database.get_place_from_handle(newhandle)
_name = _pd.display(self.report.database, _obj)
if not _name:
_name = _UNKNOWN
_linkurl = self.report.build_url_fname_html(newhandle,
@ -2290,8 +2295,7 @@ class BasePage:
if region:
# make a thumbnail of this region
newpath = copy_thumbnail(self.report, photo_handle,
photo, region)
newpath = self.copy_thumbnail(photo_handle, photo, region)
newpath = self.report.build_url_fname(newpath, uplink=True)
snapshot += self.media_link(photo_handle, newpath, descr,
@ -2578,7 +2582,7 @@ class BasePage:
for citation in citationlist:
cindex += 1
# Add this source and its references to the page
source = self.dbase_.get_source_from_handle(
source = self.report.database.get_source_from_handle(
citation.get_source_handle())
if source is not None:
if source.get_author():
@ -2611,7 +2615,7 @@ class BasePage:
if self.create_media:
for media_ref in sref.get_media_list():
media_handle = media_ref.get_reference_handle()
media = self.dbase_.get_media_from_handle(
media = self.report.database.get_media_from_handle(
media_handle)
if media:
mime_type = media.get_mime_type()
@ -2646,7 +2650,7 @@ class BasePage:
usedescr=False),
inline=True)
for handle in sref.get_note_list():
this_note = self.dbase_.get_note_from_handle(handle)
this_note = self.report.database.get_note_from_handle(handle)
if this_note is not None:
tmp += Html("li",
"%s: %s" % (
@ -2788,7 +2792,7 @@ class BasePage:
# The person is not included in the webreport
link = ""
if person is None:
person = self.dbase_.get_person_from_handle(person_handle)
person = self.report.database.get_person_from_handle(person_handle)
if person:
name = self.report.get_person_name(person)
gid = person.get_gramps_id()
@ -2938,7 +2942,7 @@ class BasePage:
)
tbody += trow
mlocation = get_main_location(self.dbase_, place)
mlocation = get_main_location(self.report.database, place)
for (label, data) in [
(STREET, mlocation.get(PlaceType.STREET, '')),
(LOCALITY, mlocation.get(PlaceType.LOCALITY, '')),
@ -2987,7 +2991,7 @@ class BasePage:
for placeref in place.get_placeref_list():
place_date = get_date(placeref)
if place_date != "":
parent_place = self.dbase_.get_place_from_handle(placeref.ref)
parent_place = self.report.database.get_place_from_handle(placeref.ref)
parent_name = parent_place.get_name().get_value()
trow = Html('tr') + (
Html("td", LOCATIONS, class_="ColumnAttribute",
@ -3054,7 +3058,7 @@ class BasePage:
index = 1
for repo_ref in repo_ref_list:
repository = self.dbase_.get_repository_from_handle(
repository = self.report.database.get_repository_from_handle(
repo_ref.ref)
if repository:
@ -3278,9 +3282,9 @@ class SurnamePage(BasePage):
table += tbody
for person_handle in sorted(ppl_handle_list,
key=lambda x: sort_on_name_and_grampsid(x, self.dbase_)):
key=self.sort_on_name_and_grampsid):
person = self.dbase_.get_person_from_handle(person_handle)
person = self.report.database.get_person_from_handle(person_handle)
if person.get_change_time() > ldatec:
ldatec = person.get_change_time()
trow = Html("tr")
@ -3297,7 +3301,7 @@ class SurnamePage(BasePage):
tcell = Html("td", class_="ColumnBirth", inline=True)
trow += tcell
birth_date = _find_birth_date(self.dbase_, person)
birth_date = _find_birth_date(self.report.database, person)
if birth_date is not None:
if birth_date.fallback:
tcell += Html('em', _dd.display(birth_date),
@ -3312,7 +3316,7 @@ class SurnamePage(BasePage):
tcell = Html("td", class_="ColumnDeath", inline=True)
trow += tcell
death_date = _find_death_date(self.dbase_, person)
death_date = _find_death_date(self.report.database, person)
if death_date is not None:
if death_date.fallback:
tcell += Html('em', _dd.display(death_date),
@ -3330,7 +3334,7 @@ class SurnamePage(BasePage):
first_family = True
if family_list:
for family_handle in family_list:
family = self.dbase_.get_family_from_handle(
family = self.report.database.get_family_from_handle(
family_handle)
partner_handle = ReportUtils.find_spouse(person,
family)
@ -3349,18 +3353,18 @@ class SurnamePage(BasePage):
parent_handle_list = person.get_parent_family_handle_list()
if parent_handle_list:
parent_handle = parent_handle_list[0]
family = self.dbase_.get_family_from_handle(
family = self.report.database.get_family_from_handle(
parent_handle)
father_id = family.get_father_handle()
mother_id = family.get_mother_handle()
mother = father = None
if father_id:
father = self.dbase_.get_person_from_handle(
father = self.report.database.get_person_from_handle(
father_id)
if father:
father_name = self.get_name(father)
if mother_id:
mother = self.dbase_.get_person_from_handle(
mother = self.report.database.get_person_from_handle(
mother_id)
if mother:
mother_name = self.get_name(mother)
@ -3474,7 +3478,7 @@ class FamilyPages(BasePage):
# 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)
family = self.report.database.get_family_from_handle(family_handle)
if family:
if family.get_change_time() > ldatec:
ldatec = family.get_change_time()
@ -3486,7 +3490,7 @@ class FamilyPages(BasePage):
pers_fam_dict[spouse_handle].append(family)
# add alphabet navigation
index_list = get_first_letters(self.dbase_, pers_fam_dict.keys(),
index_list = get_first_letters(self.report.database, pers_fam_dict.keys(),
_KEYPERSON)
alpha_nav = alphabet_navigation(index_list)
if alpha_nav:
@ -3518,7 +3522,7 @@ class FamilyPages(BasePage):
table += tbody
# begin displaying index list
ppl_handle_list = sort_people(self.dbase_, pers_fam_dict.keys())
ppl_handle_list = sort_people(self.report.database, pers_fam_dict.keys())
first = True
for (surname, handle_list) in ppl_handle_list:
@ -3530,9 +3534,8 @@ class FamilyPages(BasePage):
# get person from sorted database list
for person_handle in sorted(handle_list,
key=lambda x: sort_on_name_and_grampsid(x,
self.dbase_)):
person = self.dbase_.get_person_from_handle(
key=self.sort_on_name_and_grampsid):
person = self.report.database.get_person_from_handle(
person_handle)
if person:
family_list = sorted(pers_fam_dict[person_handle],
@ -3589,19 +3592,11 @@ class FamilyPages(BasePage):
trow += (tcell1, tcell2)
if fam_evt_ref_list:
def sort_on_grampsid(obj):
"""
Sort on gramps ID
"""
evt = self.dbase_.get_event_from_handle(
obj.ref)
return evt.get_gramps_id()
fam_evt_srt_ref_list = sorted(
fam_evt_ref_list,
key=lambda x: sort_on_grampsid(x))
key=self.sort_on_grampsid)
for evt_ref in fam_evt_srt_ref_list:
evt = self.dbase_.get_event_from_handle(
evt = self.report.database.get_event_from_handle(
evt_ref.ref)
if evt:
evt_type = evt.get_type()
@ -3672,7 +3667,7 @@ class FamilyPages(BasePage):
# the family event media here
if not self.inc_events:
for evt_ref in family.get_event_ref_list():
event = self.dbase_.get_event_from_handle(evt_ref.ref)
event = self.report.database.get_event_from_handle(evt_ref.ref)
media_list += event.get_media_list()
thumbnail = self.disp_first_img_as_thumbnail(media_list,
family)
@ -3806,7 +3801,7 @@ class PlacePages(BasePage):
placelist += Html("p", msg, id="description")
# begin alphabet navigation
index_list = get_first_letters(self.dbase_, place_handles,
index_list = get_first_letters(self.report.database, place_handles,
_KEYPLACE)
alpha_nav = alphabet_navigation(index_list)
if alpha_nav is not None:
@ -3837,7 +3832,7 @@ class PlacePages(BasePage):
handle_list = sorted(place_handles,
key=lambda x:
SORT_KEY(ReportUtils.place_name(self.dbase_, x)))
SORT_KEY(ReportUtils.place_name(self.report.database, x)))
first = True
# begin table body
@ -3845,13 +3840,13 @@ class PlacePages(BasePage):
table += tbody
for place_handle in handle_list:
place = self.dbase_.get_place_from_handle(place_handle)
place = self.report.database.get_place_from_handle(place_handle)
if place:
if place.get_change_time() > ldatec:
ldatec = place.get_change_time()
place_title = ReportUtils.place_name(self.dbase_,
place_title = ReportUtils.place_name(self.report.database,
place_handle)
main_location = get_main_location(self.dbase_, place)
main_location = get_main_location(self.report.database, place)
if place_title and not place_title.isspace():
letter = get_index_letter(first_letter(place_title),
@ -3934,7 +3929,7 @@ class PlacePages(BasePage):
output_file, sio = self.report.create_file(place_handle, "plc")
self.uplink = True
self.page_title = _pd.display(self.dbase_, place)
self.page_title = _pd.display(self.report.database, place)
placepage, head, body = self.write_header(_("Places"))
self.placemappages = self.report.options['placemappages']
@ -4136,7 +4131,7 @@ class EventPages(BasePage):
eventlist += Html("p", msg, id="description")
# get alphabet navigation...
index_list = get_first_letters(self.dbase_, event_types,
index_list = get_first_letters(self.report.database, event_types,
_ALPHAEVENT)
alpha_nav = alphabet_navigation(index_list)
if alpha_nav:
@ -4169,7 +4164,7 @@ class EventPages(BasePage):
# separate events by their type and then thier event handles
for (evt_type,
data_list) in sort_event_types(self.dbase_,
data_list) in sort_event_types(self.report.database,
event_types,
event_handle_list):
first = True
@ -4180,7 +4175,7 @@ class EventPages(BasePage):
first_event = True
for (sort_value, event_handle) in data_list:
event = self.dbase_.get_event_from_handle(event_handle)
event = self.report.database.get_event_from_handle(event_handle)
_type = event.get_type()
gid = event.get_gramps_id()
if event.get_change_time() > ldatec:
@ -4192,13 +4187,13 @@ class EventPages(BasePage):
# family event
if int(_type) in _EVENTMAP:
handle_list = set(
self.dbase_.find_backlink_handles(
self.report.database.find_backlink_handles(
event_handle,
include_classes=['Family',
'Person']))
else:
handle_list = set(
self.dbase_.find_backlink_handles(
self.report.database.find_backlink_handles(
event_handle,
include_classes=['Person']))
if handle_list:
@ -4478,7 +4473,7 @@ class SurnameListPage(BasePage):
# add alphabet navigation...
# only if surname list not surname count
if order_by == self.ORDER_BY_NAME:
index_list = get_first_letters(self.dbase_, ppl_handle_list,
index_list = get_first_letters(self.report.database, ppl_handle_list,
_KEYPERSON)
alpha_nav = alphabet_navigation(index_list)
if alpha_nav is not None:
@ -4522,7 +4517,7 @@ class SurnameListPage(BasePage):
with Html("tbody") as tbody:
table += tbody
ppl_handle_list = sort_people(self.dbase_, ppl_handle_list)
ppl_handle_list = sort_people(self.report.database, ppl_handle_list)
if order_by == self.ORDER_BY_COUNT:
temp_list = {}
for (surname, data_list) in ppl_handle_list:
@ -4632,7 +4627,7 @@ class IntroductionPage(BasePage):
note_id = report.options['intronote']
if note_id:
note = self.dbase_.get_note_from_gramps_id(note_id)
note = self.report.database.get_note_from_gramps_id(note_id)
note_text = self.get_note_format(note, False)
# attach note
@ -4676,7 +4671,7 @@ class HomePage(BasePage):
note_id = report.options['homenote']
if note_id:
note = self.dbase_.get_note_from_gramps_id(note_id)
note = self.report.database.get_note_from_gramps_id(note_id)
note_text = self.get_note_format(note, False)
# attach note
@ -4786,7 +4781,7 @@ class SourcePages(BasePage):
# Sort the sources
for handle in source_handles:
source = self.dbase_.get_source_from_handle(handle)
source = self.report.database.get_source_from_handle(handle)
if source is not None:
key = source.get_title() + source.get_author()
key += str(source.get_gramps_id())
@ -5074,7 +5069,7 @@ class MediaPages(BasePage):
index = 1
for media_handle in sorted_media_handles:
media = self.dbase_.get_media_from_handle(media_handle)
media = self.report.database.get_media_from_handle(media_handle)
if media:
if media.get_change_time() > ldatec:
ldatec = media.get_change_time()
@ -5106,7 +5101,7 @@ class MediaPages(BasePage):
unused_media_handles = []
if self.create_unused_media:
# add unused media
media_list = self.dbase_.get_media_handles()
media_list = self.report.database.get_media_handles()
for media_ref in media_list:
if isinstance(media_ref, bytes):
media_handle = media_ref.decode("utf-8")
@ -5133,7 +5128,7 @@ class MediaPages(BasePage):
Html("td", Html("h4", " "), inline=True)
)
for media_handle in unused_media_handles:
media = self.dbase_.get_media_from_handle(media_handle)
media = self.report.database.get_media_from_handle(media_handle)
gc.collect() # Reduce memory usage when many images.
next_ = None if indx == total else \
unused_media_handles[indx]
@ -5222,7 +5217,7 @@ class MediaPages(BasePage):
#note_only = True
target_exists = False
copy_thumbnail(self.report, media_handle, media)
self.copy_thumbnail(media_handle, media)
self.page_title = media.get_description()
(mediapage, head,
body) = self.write_header("%s - %s" % (_("Media"),
@ -5280,7 +5275,7 @@ class MediaPages(BasePage):
# the user to have to await a large download
# unnecessarily. Either way, set the display image
# size as requested.
orig_image_path = media_path_full(self.dbase_,
orig_image_path = media_path_full(self.report.database,
media.get_path())
#mtime = os.stat(orig_image_path).st_mtime
(width, height) = image_size(orig_image_path)
@ -5339,7 +5334,7 @@ class MediaPages(BasePage):
dirname = tempfile.mkdtemp()
thmb_path = os.path.join(dirname, "document.png")
if run_thumbnailer(mime_type,
media_path_full(self.dbase_,
media_path_full(self.report.database,
media.get_path()),
thmb_path, 320):
try:
@ -5492,7 +5487,7 @@ class MediaPages(BasePage):
to_dir = self.report.build_path('images', handle)
newpath = os.path.join(to_dir, handle) + ext
fullpath = media_path_full(self.dbase_, photo.get_path())
fullpath = media_path_full(self.report.database, photo.get_path())
if not os.path.isfile(fullpath):
_WRONGMEDIAPATH.append([photo.get_gramps_id(), fullpath])
return None
@ -5538,11 +5533,11 @@ class ThumbnailPreviewPage(BasePage):
self.photo_keys = sorted(self.report.obj_dict[Media],
key=lambda x: sort_by_desc_and_gid(
self.dbase_.get_media_from_handle(x)))
self.report.database.get_media_from_handle(x)))
if self.create_unused_media:
# add unused media
media_list = self.dbase_.get_media_handles()
media_list = self.report.database.get_media_handles()
unused_media_handles = []
for media_ref in media_list:
if isinstance(media_ref, bytes):
@ -5554,14 +5549,14 @@ class ThumbnailPreviewPage(BasePage):
media_list = []
for person_handle in self.photo_keys:
photo = self.dbase_.get_media_from_handle(person_handle)
photo = self.report.database.get_media_from_handle(person_handle)
if photo:
if photo.get_mime_type().startswith("image"):
media_list.append((photo.get_description(), person_handle,
photo))
if self.create_thumbs_only:
copy_thumbnail(self.report, person_handle, photo)
self.copy_thumbnail(person_handle, photo)
media_list.sort(key=lambda x: SORT_KEY(x[0]))
@ -5929,7 +5924,7 @@ class ContactPage(BasePage):
note_id = report.options['contactnote']
if note_id:
note = self.dbase_.get_note_from_gramps_id(note_id)
note = self.report.database.get_note_from_gramps_id(note_id)
note_text = self.get_note_format(note, False)
# attach note
@ -6039,7 +6034,7 @@ class PersonPages(BasePage):
individuallist += Html("p", msg, id="description")
# add alphabet navigation
index_list = get_first_letters(self.dbase_, ppl_handle_list,
index_list = get_first_letters(self.report.database, ppl_handle_list,
_KEYPERSON)
alpha_nav = alphabet_navigation(index_list)
if alpha_nav is not None:
@ -6080,7 +6075,7 @@ class PersonPages(BasePage):
tbody = Html("tbody")
table += tbody
ppl_handle_list = sort_people(self.dbase_, ppl_handle_list)
ppl_handle_list = sort_people(self.report.database, ppl_handle_list)
first = True
for (surname, handle_list) in ppl_handle_list:
@ -6092,8 +6087,8 @@ class PersonPages(BasePage):
first_surname = True
for person_handle in sorted(handle_list,
key=lambda x: sort_on_name_and_grampsid(x, self.dbase_)):
person = self.dbase_.get_person_from_handle(person_handle)
key=self.sort_on_name_and_grampsid):
person = self.report.database.get_person_from_handle(person_handle)
if person.get_change_time() > date:
date = person.get_change_time()
@ -6132,7 +6127,7 @@ class PersonPages(BasePage):
tcell = Html("td", class_="ColumnBirth", inline=True)
trow += tcell
birth_date = _find_birth_date(self.dbase_, person)
birth_date = _find_birth_date(self.report.database, person)
if birth_date is not None:
if birth_date.fallback:
tcell += Html('em', _dd.display(birth_date),
@ -6147,7 +6142,7 @@ class PersonPages(BasePage):
tcell = Html("td", class_="ColumnDeath", inline=True)
trow += tcell
death_date = _find_death_date(self.dbase_, person)
death_date = _find_death_date(self.report.database, person)
if death_date is not None:
if death_date.fallback:
tcell += Html('em', _dd.display(death_date),
@ -6166,7 +6161,7 @@ class PersonPages(BasePage):
tcell = ()
if family_list:
for family_handle in family_list:
family = self.dbase_.get_family_from_handle(
family = self.report.database.get_family_from_handle(
family_handle)
partner_handle = ReportUtils.find_spouse(person,
family)
@ -6197,17 +6192,17 @@ class PersonPages(BasePage):
parent_handle_list = person.get_parent_family_handle_list()
if parent_handle_list:
parent_handle = parent_handle_list[0]
family = self.dbase_.get_family_from_handle(
family = self.report.database.get_family_from_handle(
parent_handle)
father_handle = family.get_father_handle()
mother_handle = family.get_mother_handle()
if father_handle:
father = self.dbase_.get_person_from_handle(
father = self.report.database.get_person_from_handle(
father_handle)
else:
father = None
if mother_handle:
mother = self.dbase_.get_person_from_handle(
mother = self.report.database.get_person_from_handle(
mother_handle)
else:
mother = None
@ -6353,11 +6348,11 @@ class PersonPages(BasePage):
# Individual Pages...
if not self.inc_families:
for handle in self.person.get_family_handle_list():
family = self.dbase_.get_family_from_handle(handle)
family = self.report.database.get_family_from_handle(handle)
if family:
media_list += family.get_media_list()
for evt_ref in family.get_event_ref_list():
event = self.dbase_.get_event_from_handle(
event = self.report.database.get_event_from_handle(
evt_ref.ref)
media_list += event.get_media_list()
@ -6366,7 +6361,7 @@ class PersonPages(BasePage):
# Individual Pages...
if not self.inc_events:
for evt_ref in self.person.get_primary_event_ref_list():
event = self.dbase_.get_event_from_handle(evt_ref.ref)
event = self.report.database.get_event_from_handle(evt_ref.ref)
if event:
media_list += event.get_media_list()
@ -6784,15 +6779,14 @@ class PersonPages(BasePage):
photolist = person.get_media_list()
if photolist:
photo_handle = photolist[0].get_reference_handle()
photo = self.dbase_.get_media_from_handle(photo_handle)
photo = self.report.database.get_media_from_handle(photo_handle)
mime_type = photo.get_mime_type()
if mime_type:
region = self.media_ref_region_to_object(photo_handle,
person)
if region:
# make a thumbnail of this region
newpath = copy_thumbnail(self.report, photo_handle,
photo, region)
newpath = self.copy_thumbnail(photo_handle, photo, region)
# TODO. Check if build_url_fname can be used.
newpath = "/".join(['..']*3 + [newpath])
if win():
@ -6871,7 +6865,7 @@ class PersonPages(BasePage):
box = []
if not handle:
return box
person = self.dbase_.get_person_from_handle(handle)
person = self.report.database.get_person_from_handle(handle)
box = self.draw_box(center2, col, person)
box += self.connect_line(center1, center2, col)
return box
@ -6918,7 +6912,7 @@ class PersonPages(BasePage):
return tree
gen_offset = int(max_size / pow(2, gen_nr+1))
if person_handle:
person = self.dbase_.get_person_from_handle(person_handle)
person = self.report.database.get_person_from_handle(person_handle)
else:
person = None
if not person:
@ -6938,7 +6932,7 @@ class PersonPages(BasePage):
line_offset = _XOFFSET + gen_nr*_WIDTH + (gen_nr-1)*_HGAP
tree += self.extend_line(new_center, line_offset)
family = self.dbase_.get_family_from_handle(family_handle)
family = self.report.database.get_family_from_handle(family_handle)
f_center = new_center-gen_offset
f_handle = family.get_father_handle()
@ -7026,7 +7020,7 @@ class PersonPages(BasePage):
childlist = family.get_child_ref_list()
childlist = [child_ref.ref for child_ref in childlist]
children = add_birthdate(self.dbase_, childlist)
children = add_birthdate(self.report.database, childlist)
if birthorder:
children = sorted(children)
@ -7035,7 +7029,7 @@ class PersonPages(BasePage):
if handle == self.person.get_handle():
child_ped(ol_html)
elif handle:
child = self.dbase_.get_person_from_handle(handle)
child = self.report.database.get_person_from_handle(handle)
if child:
ol_html += Html("li") + self.pedigree_person(child)
else:
@ -7058,15 +7052,15 @@ class PersonPages(BasePage):
parent_handle_list = self.person.get_parent_family_handle_list()
if parent_handle_list:
parent_handle = parent_handle_list[0]
family = self.dbase_.get_family_from_handle(parent_handle)
family = self.report.database.get_family_from_handle(parent_handle)
father_handle = family.get_father_handle()
mother_handle = family.get_mother_handle()
if mother_handle:
mother = self.dbase_.get_person_from_handle(mother_handle)
mother = self.report.database.get_person_from_handle(mother_handle)
else:
mother = None
if father_handle:
father = self.dbase_.get_person_from_handle(father_handle)
father = self.report.database.get_person_from_handle(father_handle)
else:
father = None
else:
@ -7153,7 +7147,7 @@ class PersonPages(BasePage):
unordered = Html("ul")
for notehandle in notelist:
note = self.dbase_.get_note_from_handle(notehandle)
note = self.report.database.get_note_from_handle(notehandle)
if note:
note_text = self.get_note_format(note, True)
@ -7216,14 +7210,14 @@ class PersonPages(BasePage):
birth_date = Date.EMPTY
birth_ref = self.person.get_birth_ref()
if birth_ref:
birth = self.dbase_.get_event_from_handle(birth_ref.ref)
birth = self.report.database.get_event_from_handle(birth_ref.ref)
if birth:
birth_date = birth.get_date_object()
if birth_date and birth_date is not Date.EMPTY:
alive = probably_alive(self.person, self.dbase_, Today())
alive = probably_alive(self.person, self.report.database, Today())
death_date = _find_death_date(self.dbase_, self.person)
death_date = _find_death_date(self.report.database, self.person)
if not alive and death_date is not None:
nyears = death_date - birth_date
nyears.format(precision=3)
@ -7269,7 +7263,7 @@ class PersonPages(BasePage):
table += tbody
for evt_ref in event_ref_list:
event = self.dbase_.get_event_from_handle(evt_ref.ref)
event = self.report.database.get_event_from_handle(evt_ref.ref)
if event:
# display event row
@ -7359,7 +7353,7 @@ class PersonPages(BasePage):
for child_ref in family.get_child_ref_list():
child_handle = child_ref.ref
child = self.dbase_.get_person_from_handle(child_handle)
child = self.report.database.get_person_from_handle(child_handle)
if child:
if child == self.person:
reln = ""
@ -7370,7 +7364,7 @@ class PersonPages(BasePage):
# routines to work. Depending on your definition of
# sibling, we cannot necessarily guarantee that.
sibling_type = self.rel_class.get_sibling_type(
self.dbase_, self.person, child)
self.report.database, self.person, child)
reln = self.rel_class.get_sibling_relationship_string(
sibling_type, self.person.gender,
@ -7416,10 +7410,10 @@ class PersonPages(BasePage):
@param: table -- The html document to complete
"""
if parent_handle:
parent = self.dbase_.get_person_from_handle(parent_handle)
parent = self.report.database.get_person_from_handle(parent_handle)
for parent_family_handle in parent.get_family_handle_list():
if parent_family_handle not in all_family_handles:
parent_family = self.dbase_.get_family_from_handle(
parent_family = self.report.database.get_family_from_handle(
parent_family_handle)
self.display_ind_parent_family(birthmother, birthfather,
parent_family, table)
@ -7431,7 +7425,7 @@ class PersonPages(BasePage):
"""
center_person = self.report.database.get_person_from_gramps_id(
self.report.options['pid'])
relationship = self.rel_class.get_one_relationship(self.dbase_,
relationship = self.rel_class.get_one_relationship(self.report.database,
self.person,
center_person)
if relationship == "": # No relation to display
@ -7489,11 +7483,11 @@ class PersonPages(BasePage):
all_family_handles = list(parent_list)
(birthmother, birthfather) = self.rel_class.get_birth_parents(
self.dbase_, self.person)
self.report.database, self.person)
first = True
for family_handle in parent_list:
family = self.dbase_.get_family_from_handle(family_handle)
family = self.report.database.get_family_from_handle(family_handle)
if family:
# Display this family
self.display_ind_parent_family(
@ -7530,10 +7524,10 @@ class PersonPages(BasePage):
"""
ped = []
for family_handle in self.person.get_family_handle_list():
rel_family = self.dbase_.get_family_from_handle(family_handle)
rel_family = self.report.database.get_family_from_handle(family_handle)
spouse_handle = ReportUtils.find_spouse(self.person, rel_family)
if spouse_handle:
spouse = self.dbase_.get_person_from_handle(spouse_handle)
spouse = self.report.database.get_person_from_handle(spouse_handle)
pedsp = (Html("li", class_="spouse") +
self.pedigree_person(spouse)
)
@ -7545,7 +7539,7 @@ class PersonPages(BasePage):
with Html("ol") as childol:
pedsp += [childol]
for child_ref in childlist:
child = self.dbase_.get_person_from_handle(
child = self.report.database.get_person_from_handle(
child_ref.ref)
if child:
childol += (Html("li") +
@ -7979,16 +7973,8 @@ class NavWebReport(Report):
stdoptions.run_private_data_option(self, menu)
stdoptions.run_living_people_option(self, menu)
stdoptions.run_private_data_option(self, menu)
livinginfo = self.options['living_people']
yearsafterdeath = self.options['years_past_death']
if livinginfo != _INCLUDE_LIVING_VALUE:
self.database = LivingProxyDb(self.database,
livinginfo,
None,
yearsafterdeath)
self.database = CacheProxyDb(self.database)
filters_option = menu.get_option_by_name('filter')
self.filter = filters_option.get_filter()
@ -8342,6 +8328,7 @@ class NavWebReport(Report):
@param: bkref_handle -- The handle associated to this person
"""
person = self.database.get_person_from_handle(person_handle)
if person:
person_name = self.get_person_name(person)
person_fname = self.build_url_fname(person_handle, "ppl",
False) + self.ext
@ -8349,7 +8336,6 @@ class NavWebReport(Report):
person.gramps_id)
self.bkref_dict[Person][person_handle].add((bkref_class, bkref_handle))
if person:
############### Header section ##############
for citation_handle in person.get_citation_list():
self._add_citation(citation_handle, Person, person_handle)