Merge pull request #264 from prculley/bug9765

bug 9765; fix citation tree view for HandleError exceptions
This commit is contained in:
Sam Manzi 2016-11-12 10:13:26 +11:00 committed by GitHub
commit f38ce3f3f6

View File

@ -51,7 +51,7 @@ from gramps.gui.views.listview import ListView
from gramps.gen.utils.db import (get_source_and_citation_referents,
get_citation_referents)
from gramps.gui.views.bookmarks import CitationBookmarks
from gramps.gen.errors import WindowActiveError
from gramps.gen.errors import WindowActiveError, HandleError
from gramps.gui.ddtargets import DdTargets
from gramps.gui.dialog import ErrorDialog
from gramps.gui.editors import EditCitation, DeleteCitationQuery, EditSource, \
@ -157,9 +157,10 @@ class CitationTreeView(ListView):
# Override change_active from NavigationView, so that only Citations can be
# put in the history list for the CitationTreeView
def change_active(self, handle):
if self.dbstate.db.get_citation_from_handle(handle):
try:
self.dbstate.db.get_citation_from_handle(handle)
super(CitationTreeView, self).change_active(handle)
else:
except HandleError:
# FIXME: See http://www.gramps-project.org/bugs/view.php?id=6352 a
# more comprehensive solution is needed in the long term. See also
# add in Bookmarks.CitationBookmarks
@ -178,8 +179,7 @@ class CitationTreeView(ListView):
def _print_handles(self, text, handle_list):
for handle in handle_list:
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
source, citation = self.get_source_or_citation(handle, False)
_LOG.debug("\n\n\n")
if source:
_LOG.debug("---- %s -- source %s" %
@ -238,11 +238,13 @@ class CitationTreeView(ListView):
# to return SOURCE_LINK.
selection = self.selected_handles()
if len(selection) == 1 and \
self.dbstate.db.get_source_from_handle(selection[0]):
if len(selection) == 1:
try:
self.dbstate.db.get_source_from_handle(selection[0])
return DdTargets.SOURCE_LINK
else:
return DdTargets.CITATION_LINK
except HandleError:
pass
return DdTargets.CITATION_LINK
def get_stock(self):
return 'gramps-citation'
@ -416,12 +418,10 @@ class CitationTreeView(ListView):
"""
for handle in self.selected_handles():
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
source, citation = self.get_source_or_citation(handle)
if not source:
source = self.dbstate.db.get_source_from_handle(citation.get_reference_handle())
source = self.dbstate.db.get_source_from_handle(
citation.get_reference_handle())
try:
EditCitation(self.dbstate, self.uistate, [],
Citation(), source)
@ -436,27 +436,22 @@ class CitationTreeView(ListView):
def remove_object_from_handle(self, handle):
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
source, citation = self.get_source_or_citation(handle)
if citation:
the_lists = get_citation_referents(handle, self.dbstate.db)
object = self.dbstate.db.get_citation_from_handle(handle)
query = DeleteCitationQuery(self.dbstate, self.uistate, object,
query = DeleteCitationQuery(self.dbstate, self.uistate, citation,
the_lists)
is_used = any(the_lists)
return (query, is_used, object)
return (query, is_used, citation)
else:
the_lists = get_source_and_citation_referents(handle,
self.dbstate.db)
self.dbstate.db)
LOG.debug('the_lists %s' % [the_lists])
object = self.dbstate.db.get_source_from_handle(handle)
query = DeleteSrcQuery(self.dbstate, self.uistate, object,
query = DeleteSrcQuery(self.dbstate, self.uistate, source,
the_lists)
is_used = any(the_lists)
return (query, is_used, object)
return (query, is_used, source)
def edit(self, obj):
"""
@ -464,16 +459,13 @@ class CitationTreeView(ListView):
"""
for handle in self.selected_handles():
# The handle will either be a Source handle or a Citation handle
source = self.dbstate.db.get_source_from_handle(handle)
citation = self.dbstate.db.get_citation_from_handle(handle)
if (not source and not citation) or (source and citation):
raise ValueError("selection must be either source or citation")
source, citation = self.get_source_or_citation(handle)
if citation:
try:
EditCitation(self.dbstate, self.uistate, [], citation)
except WindowActiveError:
pass
else: # FIXME need try block here
else:
try:
EditSource(self.dbstate, self.uistate, [], source)
except WindowActiveError:
@ -516,15 +508,8 @@ class CitationTreeView(ListView):
"citation.")
ErrorDialog(msg, msg2, parent=self.uistate.window)
else:
source1 = self.dbstate.db.get_source_from_handle(mlist[0])
citation1 = self.dbstate.db.get_citation_from_handle(mlist[0])
if (not source1 and not citation1) or (source1 and citation1):
raise ValueError("selection must be either source or citation")
source2 = self.dbstate.db.get_source_from_handle(mlist[1])
citation2 = self.dbstate.db.get_citation_from_handle(mlist[1])
if (not source2 and not citation2) or (source2 and citation2):
raise ValueError("selection must be either source or citation")
source1, citation1 = self.get_source_or_citation(mlist[0])
source2, citation2 = self.get_source_or_citation(mlist[1])
if citation1 and citation2:
if not citation1.get_reference_handle() == \
@ -547,6 +532,7 @@ class CitationTreeView(ListView):
"both must be sources, or both must be "
"citations.")
ErrorDialog(msg, msg2, parent=self.uistate.window)
self.object_build()
def get_handle_from_gramps_id(self, gid):
obj = self.dbstate.db.get_citation_from_gramps_id(gid)
@ -555,6 +541,23 @@ class CitationTreeView(ListView):
else:
return None
def get_source_or_citation(self, handle, check=True):
"""
Get one of source or citation from the passed handle. There must be
exactly one, or we will rain an exception.
"""
try:
source = self.dbstate.db.get_source_from_handle(handle)
except HandleError:
source = None
try:
citation = self.dbstate.db.get_citation_from_handle(handle)
except HandleError:
citation = None
if check and ((not source and not citation) or (source and citation)):
raise ValueError("selection must be either source or citation")
return source, citation
def tag_updated(self, handle_list):
"""
Update tagged rows when a tag color changes.
@ -571,12 +574,11 @@ class CitationTreeView(ListView):
"""
Add the given tag to the given source or citation.
"""
citation = self.dbstate.db.get_citation_from_handle(handle)
source, citation = self.get_source_or_citation(handle)
if citation:
citation.add_tag(tag_handle)
self.dbstate.db.commit_citation(citation, transaction)
else:
source = self.dbstate.db.get_source_from_handle(handle)
source.add_tag(tag_handle)
self.dbstate.db.commit_source(source, transaction)