GEPS008: Create new module for referent functions

svn: r19814
This commit is contained in:
Nick Hall 2012-06-10 00:10:28 +00:00
parent bd6478327c
commit d3fed5963f
12 changed files with 20 additions and 139 deletions

View File

@ -324,6 +324,7 @@ src/gen/simple/_simpleaccess.py
src/gen/simple/_simpletable.py src/gen/simple/_simpletable.py
# gen.utils # gen.utils
src/gen/utils/alive.py
src/gen/utils/place.py src/gen/utils/place.py
# gui - GUI code # gui - GUI code

View File

@ -217,6 +217,7 @@ src/gen/simple/_simpledoc.py
src/gen/utils/__init__.py src/gen/utils/__init__.py
src/gen/utils/callback.py src/gen/utils/callback.py
src/gen/utils/callman.py src/gen/utils/callman.py
src/gen/utils/referent.py
# gui - GUI code # gui - GUI code
src/gui/__init__.py src/gui/__init__.py

View File

@ -490,130 +490,6 @@ def create_uid(self, handle=None):
uid = uuid.uuid4() uid = uuid.uuid4()
return uid.hex.upper() return uid.hex.upper()
#-------------------------------------------------------------------------
#
# Other util functions
#
#-------------------------------------------------------------------------
def get_referents(handle, db, primary_objects):
""" Find objects that refer to an object.
This function is the base for other get_<object>_referents functions.
"""
# Use one pass through the reference map to grab all the references
object_list = list(db.find_backlink_handles(handle))
# Then form the object-specific lists
the_lists = ()
for primary in primary_objects:
primary_list = [item[1] for item in object_list if item[0] == primary]
the_lists = the_lists + (primary_list, )
return the_lists
def get_source_referents(source_handle, db):
""" Find objects that refer the source.
This function finds all primary objects that refer (directly or through
secondary child-objects) to a given source handle in a given database.
Only Citations can refer to sources, so that is all we need to check
"""
_primaries = ('Citation',)
return (get_referents(source_handle, db, _primaries))
def get_citation_referents(citation_handle, db):
""" Find objects that refer the citation.
This function finds all primary objects that refer (directly or through
secondary child-objects) to a given citation handle in a given database.
"""
_primaries = ('Person', 'Family', 'Event', 'Place',
'Source', 'MediaObject', 'Repository')
return (get_referents(citation_handle, db, _primaries))
def get_source_and_citation_referents(source_handle, db):
"""
Find all citations that refer to the sources, and recursively, all objects
that refer to the sources.
This function finds all primary objects that refer (directly or through
secondary child-objects) to a given source handle in a given database.
Objects -> Citations -> Source
e.g.
Media object M1 -> Citation C1 -> Source S1
Media object M2 -> Citation C1 -> Source S1
Person object P1 -> Citation C2 -> Source S1
The returned structure is rather ugly, but provides all the information in
a way that is consistent with the other Util functions.
(
tuple of objects that refer to the source - only first element is present
([C1, C2],),
list of citations with objects that refer to them
[
(C1,
tuple of reference lists
P, F, E, Pl, S, M, R
([], [], [], [], [], [M1, M2]. [])
)
(C2,
tuple of reference lists
P, F, E, Pl, S, M, R
([P1], [], [], [], [], []. [])
)
]
)
#47738: DEBUG: citationtreeview.py: line 428: source referents [(['bfe59e90dbb555d0d87'],)]
#47743: DEBUG: citationtreeview.py: line 432: citation bfe59e90dbb555d0d87
#47825: DEBUG: citationtreeview.py: line 435: citation_referents_list [[('bfe59e90dbb555d0d87', ([], [], ['ba77932bf0b2d59eccb'], [], [], [], []))]]
#47827: DEBUG: citationtreeview.py: line 440: the_lists [((['bfe59e90dbb555d0d87'],), [('bfe59e90dbb555d0d87', ([], [], ['ba77932bf0b2d59eccb'], [], [], [], []))])]
"""
the_lists = get_source_referents(source_handle, db)
LOG.debug('source referents %s' % [the_lists])
# now, for each citation, get the objects that refer to that citation
citation_referents_list = []
for citation in the_lists[0]:
LOG.debug('citation %s' % citation)
refs = get_citation_referents(citation, db)
citation_referents_list += [(citation, refs)]
LOG.debug('citation_referents_list %s' % [citation_referents_list])
(citation_list) = the_lists
the_lists = (citation_list, citation_referents_list)
LOG.debug('the_lists %s' % [the_lists])
return the_lists
def get_media_referents(media_handle, db):
""" Find objects that refer the media object.
This function finds all primary objects that refer
to a given media handle in a given database.
"""
_primaries = ('Person', 'Family', 'Event', 'Place', 'Source', 'Citation')
return (get_referents(media_handle, db, _primaries))
def get_note_referents(note_handle, db):
""" Find objects that refer a note object.
This function finds all primary objects that refer
to a given note handle in a given database.
"""
_primaries = ('Person', 'Family', 'Event', 'Place',
'Source', 'Citation', 'MediaObject', 'Repository')
return (get_referents(note_handle, db, _primaries))
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -35,7 +35,7 @@ LOG = logging.getLogger(".citationfilter")
# GRAMPS modules # GRAMPS modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from Utils import get_source_and_citation_referents from gen.utils.referent import get_source_and_citation_referents
from gen.filters.rules import Rule from gen.filters.rules import Rule
#------------------------------------------------------------------------- #-------------------------------------------------------------------------

View File

@ -13,7 +13,8 @@ pkgpython_PYTHON = \
callman.py \ callman.py \
configmanager.py \ configmanager.py \
fallback.py \ fallback.py \
place.py place.py \
referent.py
pkgpyexecdir = @pkgpyexecdir@/gen/utils pkgpyexecdir = @pkgpyexecdir@/gen/utils

View File

@ -52,7 +52,7 @@ import gtk
# GRAMPS modules # GRAMPS modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from Utils import get_source_referents from gen.utils.referent import get_source_referents
from gui.views.treemodels.treebasemodel import TreeBaseModel from gui.views.treemodels.treebasemodel import TreeBaseModel
from gui.views.treemodels.citationbasemodel import CitationBaseModel from gui.views.treemodels.citationbasemodel import CitationBaseModel

View File

@ -49,7 +49,7 @@ from gui.views.treemodels.citationlistmodel import CitationListModel
from gen.plug import CATEGORY_QR_CITATION from gen.plug import CATEGORY_QR_CITATION
import gen.lib import gen.lib
from gui.views.listview import ListView from gui.views.listview import ListView
import Utils from gen.utils.referent import get_citation_referents
from gui.views.bookmarks import CitationBookmarks from gui.views.bookmarks import CitationBookmarks
from gen.errors import WindowActiveError from gen.errors import WindowActiveError
from gui.ddtargets import DdTargets from gui.ddtargets import DdTargets
@ -284,7 +284,7 @@ class CitationListView(ListView):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
the_lists = Utils.get_citation_referents(handle, self.dbstate.db) the_lists = get_citation_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_citation_from_handle(handle) object = self.dbstate.db.get_citation_from_handle(handle)
query = DeleteCitationQuery(self.dbstate, self.uistate, object, query = DeleteCitationQuery(self.dbstate, self.uistate, object,
the_lists) the_lists)

View File

@ -50,7 +50,8 @@ from gui.views.treemodels.citationtreemodel import CitationTreeModel
from gen.plug import CATEGORY_QR_SOURCE_OR_CITATION from gen.plug import CATEGORY_QR_SOURCE_OR_CITATION
import gen.lib import gen.lib
from gui.views.listview import ListView from gui.views.listview import ListView
import Utils from gen.utils.referent import (get_source_and_citation_referents,
get_citation_referents)
from gui.views.bookmarks import CitationBookmarks from gui.views.bookmarks import CitationBookmarks
from gen.errors import WindowActiveError from gen.errors import WindowActiveError
from gui.ddtargets import DdTargets from gui.ddtargets import DdTargets
@ -458,14 +459,14 @@ class CitationTreeView(ListView):
if (not source and not citation) or (source and citation): if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation") raise ValueError("selection must be either source or citation")
if citation: if citation:
the_lists = Utils.get_citation_referents(handle, self.dbstate.db) the_lists = get_citation_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_citation_from_handle(handle) object = self.dbstate.db.get_citation_from_handle(handle)
query = DeleteCitationQuery(self.dbstate, self.uistate, object, query = DeleteCitationQuery(self.dbstate, self.uistate, object,
the_lists) the_lists)
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, object) return (query, is_used, object)
else: else:
the_lists = Utils.get_source_and_citation_referents(handle, the_lists = get_source_and_citation_referents(handle,
self.dbstate.db) self.dbstate.db)
LOG.debug('the_lists %s' % [the_lists]) LOG.debug('the_lists %s' % [the_lists])

View File

@ -56,6 +56,7 @@ import const
from gen.constfunc import win from gen.constfunc import win
from gen.config import config from gen.config import config
import Utils import Utils
from gen.utils.referent import get_media_referents
from gui.views.bookmarks import MediaBookmarks from gui.views.bookmarks import MediaBookmarks
import gen.mime import gen.mime
import gen.lib import gen.lib
@ -356,7 +357,7 @@ class MediaView(ListView):
Remove the selected objects from the database after getting Remove the selected objects from the database after getting
user verification. user verification.
""" """
the_lists = Utils.get_media_referents(handle, self.dbstate.db) the_lists = get_media_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_object_from_handle(handle) object = self.dbstate.db.get_object_from_handle(handle)
query = DeleteMediaQuery(self.dbstate, self.uistate, handle, the_lists) query = DeleteMediaQuery(self.dbstate, self.uistate, handle, the_lists)
is_used = any(the_lists) is_used = any(the_lists)

View File

@ -47,7 +47,7 @@ import gtk
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gui.views.listview import ListView from gui.views.listview import ListView
from gui.views.treemodels import NoteModel from gui.views.treemodels import NoteModel
import Utils from gen.utils.referent import get_note_referents
from gen.errors import WindowActiveError from gen.errors import WindowActiveError
from gui.views.bookmarks import NoteBookmarks from gui.views.bookmarks import NoteBookmarks
from gen.config import config from gen.config import config
@ -246,7 +246,7 @@ class NoteView(ListView):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
the_lists = Utils.get_note_referents(handle, self.dbstate.db) the_lists = get_note_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_note_from_handle(handle) object = self.dbstate.db.get_note_from_handle(handle)
query = DeleteNoteQuery(self.dbstate, self.uistate, object, the_lists) query = DeleteNoteQuery(self.dbstate, self.uistate, object, the_lists)
is_used = any(the_lists) is_used = any(the_lists)

View File

@ -43,7 +43,7 @@ import gen.lib
from gen.config import config from gen.config import config
from gui.views.listview import ListView from gui.views.listview import ListView
from gui.views.treemodels import SourceModel from gui.views.treemodels import SourceModel
import Utils from gen.utils.referent import get_source_and_citation_referents
from gui.views.bookmarks import SourceBookmarks from gui.views.bookmarks import SourceBookmarks
from gen.errors import WindowActiveError from gen.errors import WindowActiveError
from gui.ddtargets import DdTargets from gui.ddtargets import DdTargets
@ -214,8 +214,7 @@ class SourceView(ListView):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
the_lists = Utils.get_source_and_citation_referents(handle, the_lists = get_source_and_citation_referents(handle, self.dbstate.db)
self.dbstate.db)
LOG.debug('the_lists %s' % [the_lists]) LOG.debug('the_lists %s' % [the_lists])
object = self.dbstate.db.get_source_from_handle(handle) object = self.dbstate.db.get_source_from_handle(handle)

View File

@ -89,6 +89,7 @@ from gen.plug.report import utils as ReportUtils
from gen.plug.report import MenuReportOptions from gen.plug.report import MenuReportOptions
import Utils import Utils
from gen.utils.referent import get_source_and_citation_referents
from gen.constfunc import win from gen.constfunc import win
from gui.thumbnails import get_thumbnail_path, run_thumbnailer from gui.thumbnails import get_thumbnail_path, run_thumbnailer
import ImgManip import ImgManip
@ -4514,7 +4515,7 @@ class SourcePage(BasePage):
sourcedetail += repo_list sourcedetail += repo_list
# get the Source and its Citation Referents... # get the Source and its Citation Referents...
the_lists = Utils.get_source_and_citation_referents(src_handle, self.dbase_) the_lists = get_source_and_citation_referents(src_handle, self.dbase_)
if the_lists: if the_lists:
(citation_list, citation_referents_list) = the_lists (citation_list, citation_referents_list) = the_lists
if citation_referents_list: if citation_referents_list: