* src/RelLib.py (Family.get_handle_referents): Typo;

(Event.get_handle_referents): Work around possible None for
witness.
* src/plugins/Check.py (check_source_references): Add checking
routine to detect and remove dangling source references.


svn: r4896
This commit is contained in:
Alex Roitman 2005-07-02 20:16:26 +00:00
parent 6469396669
commit 5c9df14f97
3 changed files with 140 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2005-07-02 Alexander Roitman <shura@gramps-project.org>
* src/RelLib.py (Family.get_handle_referents): Typo;
(Event.get_handle_referents): Work around possible None for
witness.
* src/plugins/Check.py (check_source_references): Add checking
routine to detect and remove dangling source references.
2005-07-01 Alex Roitman <shura@gramps-project.org>
* src/plugins/WebPage.py (write_sibling): Apply patch from bug #
1230430 at sf.net with minor tweaks.

View File

@ -1823,7 +1823,7 @@ class Family(PrimaryObject,SourceNote,MediaBase,AttributeBase):
@return: Returns the list of objects refereincing primary objects.
@rtype: list
"""
return get_sourcref_child_list() + self.source_list
return self.get_sourcref_child_list() + self.source_list
def set_complete_flag(self,val):
"""
@ -2173,9 +2173,12 @@ class Event(PrimaryObject,PrivateSourceNote,MediaBase,DateBase,PlaceBase):
@return: Returns the list of objects refereincing primary objects.
@rtype: list
"""
return self.media_list + self.source_list + \
[witness for witness in self.witness
ret = self.media_list + self.source_list
if self.witness:
ret += [witness for witness in self.witness
if witness.type == Event.ID]
return ret
def get_witness_list(self):
"""
Returns the list of L{Witness} instances associated with the Event.

View File

@ -82,6 +82,7 @@ def runTool(database,active_person,callback,parent=None):
checker.check_events()
checker.check_place_references()
checker.check_source_references()
database.transaction_commit(trans, _("Check Integrity"))
database.enable_signals()
database.request_rebuild()
@ -115,6 +116,7 @@ class CheckIntegrity:
self.invalid_birth_events = []
self.invalid_death_events = []
self.invalid_place_references = []
self.invalid_source_references = []
def family_errors(self):
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family)
@ -429,6 +431,123 @@ class CheckIntegrity:
self.db.commit_event(event,self.trans)
self.invalid_place_references.append(key)
def check_source_references(self):
known_handles = self.db.get_source_handles()
cursor = self.db.get_person_cursor()
data = cursor.first()
while data:
handle,info = data
person = RelLib.Person()
person.unserialize(info)
handle_list = person.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
person.remove_source_references(bad_handles)
self.db.commit_person(person,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_family_cursor()
data = cursor.first()
while data:
handle,info = data
family = RelLib.Family()
family.unserialize(info)
handle_list = family.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
family.remove_source_references(bad_handles)
self.db.commit_family(family,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_place_cursor()
data = cursor.first()
while data:
handle,info = data
place = RelLib.Place()
place.unserialize(info)
handle_list = place.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
place.remove_source_references(bad_handles)
self.db.commit_family(place,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_source_cursor()
data = cursor.first()
while data:
handle,info = data
source = RelLib.Source()
source.unserialize(info)
handle_list = source.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
source.remove_source_references(bad_handles)
self.db.commit_source(source,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_media_cursor()
data = cursor.first()
while data:
handle,info = data
obj = RelLib.MediaObject()
obj.unserialize(info)
handle_list = obj.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
obj.remove_source_references(bad_handles)
self.db.commit_object(obj,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_event_cursor()
data = cursor.first()
while data:
handle,info = data
event = RelLib.Event()
event.unserialize(info)
handle_list = event.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
event.remove_source_references(bad_handles)
self.db.commit_event(event,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
def build_report(self,cl=0):
bad_photos = len(self.bad_photo)
replaced_photos = len(self.replaced_photo)
@ -443,8 +562,10 @@ class CheckIntegrity:
death_invalid = len(self.invalid_death_events)
person = birth_invalid + death_invalid
place_references = len(self.invalid_place_references)
source_references = len(self.invalid_source_references)
errors = blink + efam + photos + rel + person + event_invalid + place_references
errors = blink + efam + photos + rel + person \
+ event_invalid + place_references + source_references
if errors == 0:
if cl:
@ -534,6 +655,10 @@ class CheckIntegrity:
self.text.write(_("1 place was referenced but not found\n"))
elif place_references > 1:
self.text.write(_("%d places were referenced, but not found\n") % place_references)
if source_references == 1:
self.text.write(_("1 source was referenced but not found\n"))
elif source_references > 1:
self.text.write(_("%d sources were referenced, but not found\n") % source_references)
return errors