4590: Error on access of LDS editor when sealed to family has been removed.
svn: r16592
This commit is contained in:
parent
38143d7ac4
commit
1231b1cac8
@ -340,5 +340,11 @@ class MergeFamilyQuery(object):
|
|||||||
if phoenix_mother:
|
if phoenix_mother:
|
||||||
phoenix_mother.remove_family_handle(old_handle)
|
phoenix_mother.remove_family_handle(old_handle)
|
||||||
self.database.commit_person(phoenix_mother, trans)
|
self.database.commit_person(phoenix_mother, trans)
|
||||||
|
# replace the family in lds ordinances
|
||||||
|
for (dummy, person_handle) in self.database.find_backlink_handles(
|
||||||
|
old_handle, ['Person']):
|
||||||
|
person = self.database.get_person_from_handle(person_handle)
|
||||||
|
person.replace_handle_reference('Family', old_handle,new_handle)
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
self.database.remove_family(old_handle, trans)
|
self.database.remove_family(old_handle, trans)
|
||||||
self.database.commit_family(self.phoenix, trans)
|
self.database.commit_family(self.phoenix, trans)
|
||||||
|
@ -366,6 +366,7 @@ class MergePersonQuery(object):
|
|||||||
Merge content of family into the family with handle main_family_handle.
|
Merge content of family into the family with handle main_family_handle.
|
||||||
"""
|
"""
|
||||||
new_handle = self.phoenix.get_handle() if self.phoenix else None
|
new_handle = self.phoenix.get_handle() if self.phoenix else None
|
||||||
|
old_handle = self.titanic.get_handle() if self.titanic else None
|
||||||
family_handle = family.get_handle()
|
family_handle = family.get_handle()
|
||||||
main_family = self.database.get_family_from_handle(main_family_handle)
|
main_family = self.database.get_family_from_handle(main_family_handle)
|
||||||
main_family.merge(family)
|
main_family.merge(family)
|
||||||
@ -387,6 +388,16 @@ class MergePersonQuery(object):
|
|||||||
if spouse:
|
if spouse:
|
||||||
spouse.remove_family_handle(family_handle)
|
spouse.remove_family_handle(family_handle)
|
||||||
self.database.commit_person(spouse, trans)
|
self.database.commit_person(spouse, trans)
|
||||||
|
# replace the family in lds ordinances
|
||||||
|
for (dummy, person_handle) in self.database.find_backlink_handles(
|
||||||
|
family_handle, ['Person']):
|
||||||
|
if person_handle == old_handle:
|
||||||
|
continue
|
||||||
|
person = self.database.get_person_from_handle(person_handle)
|
||||||
|
person.replace_handle_reference('Family', family_handle,
|
||||||
|
main_family_handle)
|
||||||
|
if person_handle != new_handle and person_handle != old_handle:
|
||||||
|
self.database.commit_person(person, trans)
|
||||||
self.database.remove_family(family_handle, trans)
|
self.database.remove_family(family_handle, trans)
|
||||||
self.database.commit_family(main_family, trans)
|
self.database.commit_family(main_family, trans)
|
||||||
|
|
||||||
|
@ -1556,14 +1556,9 @@ class DbWriteBase(object):
|
|||||||
person.remove_parent_family_handle(family_handle)
|
person.remove_parent_family_handle(family_handle)
|
||||||
family.remove_child_handle(person_handle)
|
family.remove_child_handle(person_handle)
|
||||||
|
|
||||||
child_list = family.get_child_ref_list()
|
if (not family.get_father_handle() and not family.get_mother_handle()
|
||||||
if (not family.get_father_handle() and not family.get_mother_handle() and
|
and not family.get_child_ref_list()):
|
||||||
len(child_list) <= 1):
|
self.remove_family_relationships(family_handle, trans)
|
||||||
self.remove_family(family_handle, trans)
|
|
||||||
if child_list:
|
|
||||||
child = self.get_person_from_handle(child_list[0].ref)
|
|
||||||
child.remove_parent_family_handle(family_handle)
|
|
||||||
self.commit_person(child, trans)
|
|
||||||
else:
|
else:
|
||||||
self.commit_family(family, trans)
|
self.commit_family(family, trans)
|
||||||
self.commit_person(person, trans)
|
self.commit_person(person, trans)
|
||||||
@ -1590,7 +1585,7 @@ class DbWriteBase(object):
|
|||||||
|
|
||||||
if not family.get_father_handle() and not family.get_mother_handle() and \
|
if not family.get_father_handle() and not family.get_mother_handle() and \
|
||||||
not family.get_child_ref_list():
|
not family.get_child_ref_list():
|
||||||
self.remove_family(family_handle, trans)
|
self.remove_family_relationships(family_handle, trans)
|
||||||
else:
|
else:
|
||||||
self.commit_family(family, trans)
|
self.commit_family(family, trans)
|
||||||
|
|
||||||
@ -1598,7 +1593,12 @@ class DbWriteBase(object):
|
|||||||
if family_handle:
|
if family_handle:
|
||||||
family = self.get_family_from_handle(family_handle)
|
family = self.get_family_from_handle(family_handle)
|
||||||
family.remove_child_handle(person.get_handle())
|
family.remove_child_handle(person.get_handle())
|
||||||
self.commit_family(family, trans)
|
if not family.get_father_handle() and \
|
||||||
|
not family.get_mother_handle() and \
|
||||||
|
not family.get_child_ref_list():
|
||||||
|
self.remove_family_relationships(family_handle, trans)
|
||||||
|
else:
|
||||||
|
self.commit_family(family, trans)
|
||||||
|
|
||||||
handle = person.get_handle()
|
handle = person.get_handle()
|
||||||
|
|
||||||
@ -1625,23 +1625,14 @@ class DbWriteBase(object):
|
|||||||
|
|
||||||
def __remove_family_relationships(self, family_handle, trans):
|
def __remove_family_relationships(self, family_handle, trans):
|
||||||
"""
|
"""
|
||||||
Remove a family and its relationships; trans is compulsory.
|
Remove a family and all that references it; trans is compulsory.
|
||||||
"""
|
"""
|
||||||
family = self.get_family_from_handle(family_handle)
|
person_list = [item[1] for item in
|
||||||
|
self.find_backlink_handles(family_handle, ['Person'])]
|
||||||
for phandle in [ family.get_father_handle(),
|
for phandle in person_list:
|
||||||
family.get_mother_handle()]:
|
|
||||||
if phandle:
|
|
||||||
person = self.get_person_from_handle(phandle)
|
|
||||||
person.remove_family_handle(family_handle)
|
|
||||||
self.commit_person(person, trans)
|
|
||||||
|
|
||||||
for ref in family.get_child_ref_list():
|
|
||||||
phandle = ref.ref
|
|
||||||
person = self.get_person_from_handle(phandle)
|
person = self.get_person_from_handle(phandle)
|
||||||
person.remove_parent_family_handle(family_handle)
|
person.remove_handle_references('Family', [family_handle])
|
||||||
self.commit_person(person, trans)
|
self.commit_person(person, trans)
|
||||||
|
|
||||||
self.remove_family(family_handle, trans)
|
self.remove_family(family_handle, trans)
|
||||||
|
|
||||||
def remove_parent_from_family(self, person_handle, family_handle,
|
def remove_parent_from_family(self, person_handle, family_handle,
|
||||||
@ -1676,14 +1667,9 @@ class DbWriteBase(object):
|
|||||||
msg = _("Remove mother from family")
|
msg = _("Remove mother from family")
|
||||||
family.set_mother_handle(None)
|
family.set_mother_handle(None)
|
||||||
|
|
||||||
child_list = family.get_child_ref_list()
|
if (not family.get_father_handle() and not family.get_mother_handle()
|
||||||
if (not family.get_father_handle() and not family.get_mother_handle() and
|
and not family.get_child_ref_list()):
|
||||||
len(child_list) <= 1):
|
self.remove_family_relationships(family_handle, trans)
|
||||||
self.remove_family(family_handle, trans)
|
|
||||||
if child_list:
|
|
||||||
child = self.get_person_from_handle(child_list[0].ref)
|
|
||||||
child.remove_parent_family_handle(family_handle)
|
|
||||||
self.commit_person(child, trans)
|
|
||||||
else:
|
else:
|
||||||
self.commit_family(family, trans)
|
self.commit_family(family, trans)
|
||||||
self.commit_person(person, trans)
|
self.commit_person(person, trans)
|
||||||
|
@ -726,6 +726,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
|||||||
result_list = list(find_backlink_handles(handle))
|
result_list = list(find_backlink_handles(handle))
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
handle = str(handle)
|
||||||
# Use the secondary index to locate all the reference_map entries
|
# Use the secondary index to locate all the reference_map entries
|
||||||
# that include a reference to the object we are looking for.
|
# that include a reference to the object we are looking for.
|
||||||
referenced_cur = self.get_reference_map_referenced_cursor()
|
referenced_cur = self.get_reference_map_referenced_cursor()
|
||||||
|
@ -194,6 +194,8 @@ class LdsOrd(SecondaryObject, SourceBase, NoteBase,
|
|||||||
ret = self.get_referenced_note_handles()
|
ret = self.get_referenced_note_handles()
|
||||||
if self.place:
|
if self.place:
|
||||||
ret += [('Place', self.place)]
|
ret += [('Place', self.place)]
|
||||||
|
if self.famc:
|
||||||
|
ret += [('Family', self.famc)]
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def get_handle_referents(self):
|
def get_handle_referents(self):
|
||||||
|
@ -226,7 +226,8 @@ class Person(SourceBase, NoteBase, AttributeBase, MediaBase,
|
|||||||
return any(ref.ref == handle for ref in self.person_ref_list)
|
return any(ref.ref == handle for ref in self.person_ref_list)
|
||||||
elif classname == 'Family':
|
elif classname == 'Family':
|
||||||
return any(ref == handle
|
return any(ref == handle
|
||||||
for ref in self.family_list + self.parent_family_list)
|
for ref in self.family_list + self.parent_family_list +
|
||||||
|
[ordinance.famc for ordinance in self.lds_ord_list])
|
||||||
elif classname == 'Place':
|
elif classname == 'Place':
|
||||||
return any(ordinance.place == handle
|
return any(ordinance.place == handle
|
||||||
for ordinance in self.lds_ord_list)
|
for ordinance in self.lds_ord_list)
|
||||||
@ -268,6 +269,9 @@ class Person(SourceBase, NoteBase, AttributeBase, MediaBase,
|
|||||||
new_list = [handle for handle in self.parent_family_list
|
new_list = [handle for handle in self.parent_family_list
|
||||||
if handle not in handle_list]
|
if handle not in handle_list]
|
||||||
self.parent_family_list = new_list
|
self.parent_family_list = new_list
|
||||||
|
for ordinance in self.lds_ord_list:
|
||||||
|
if ordinance.famc in handle_list:
|
||||||
|
ordinance.famc = None
|
||||||
elif classname == 'Place':
|
elif classname == 'Place':
|
||||||
for ordinance in self.lds_ord_list:
|
for ordinance in self.lds_ord_list:
|
||||||
if ordinance.place in handle_list:
|
if ordinance.place in handle_list:
|
||||||
@ -326,10 +330,14 @@ class Person(SourceBase, NoteBase, AttributeBase, MediaBase,
|
|||||||
while old_handle in self.family_list:
|
while old_handle in self.family_list:
|
||||||
ix = self.family_list.index(old_handle)
|
ix = self.family_list.index(old_handle)
|
||||||
self.family_list[ix] = new_handle
|
self.family_list[ix] = new_handle
|
||||||
|
|
||||||
while old_handle in self.parent_family_list:
|
while old_handle in self.parent_family_list:
|
||||||
ix = self.parent_family_list.index(old_handle)
|
ix = self.parent_family_list.index(old_handle)
|
||||||
self.parent_family_list[ix] = new_handle
|
self.parent_family_list[ix] = new_handle
|
||||||
|
handle_list = [ordinance.famc for ordinance in self.lds_ord_list]
|
||||||
|
while old_handle in handle_list:
|
||||||
|
ix = handle_list.index(old_handle)
|
||||||
|
self.lds_ord_list[ix].famc = new_handle
|
||||||
|
handle_list[ix] = ''
|
||||||
elif classname == "Place":
|
elif classname == "Place":
|
||||||
handle_list = [ordinance.place for ordinance in self.lds_ord_list]
|
handle_list = [ordinance.place for ordinance in self.lds_ord_list]
|
||||||
while old_handle in handle_list:
|
while old_handle in handle_list:
|
||||||
|
@ -1109,7 +1109,7 @@ class EditFamily(EditPrimary):
|
|||||||
self.db.commit_person(person, trans)
|
self.db.commit_person(person, trans)
|
||||||
|
|
||||||
if self.object_is_empty():
|
if self.object_is_empty():
|
||||||
self.db.remove_family(self.obj.handle, trans)
|
self.db.remove_family_relationships(self.obj.handle, trans)
|
||||||
else:
|
else:
|
||||||
if not self.obj.get_gramps_id():
|
if not self.obj.get_gramps_id():
|
||||||
self.obj.set_gramps_id(
|
self.obj.set_gramps_id(
|
||||||
|
@ -200,6 +200,7 @@ class Check(tool.BatchTool):
|
|||||||
|
|
||||||
checker.check_events()
|
checker.check_events()
|
||||||
checker.check_person_references()
|
checker.check_person_references()
|
||||||
|
checker.check_family_references()
|
||||||
checker.check_place_references()
|
checker.check_place_references()
|
||||||
checker.check_source_references()
|
checker.check_source_references()
|
||||||
checker.check_media_references()
|
checker.check_media_references()
|
||||||
@ -234,6 +235,7 @@ class CheckIntegrity(object):
|
|||||||
self.invalid_birth_events = []
|
self.invalid_birth_events = []
|
||||||
self.invalid_death_events = []
|
self.invalid_death_events = []
|
||||||
self.invalid_person_references = []
|
self.invalid_person_references = []
|
||||||
|
self.invalid_family_references = []
|
||||||
self.invalid_place_references = []
|
self.invalid_place_references = []
|
||||||
self.invalid_source_references = []
|
self.invalid_source_references = []
|
||||||
self.invalid_repo_references = []
|
self.invalid_repo_references = []
|
||||||
@ -871,6 +873,24 @@ class CheckIntegrity(object):
|
|||||||
self.db.commit_person(person, self.trans)
|
self.db.commit_person(person, self.trans)
|
||||||
self.invalid_person_references.append(key)
|
self.invalid_person_references.append(key)
|
||||||
|
|
||||||
|
def check_family_references(self):
|
||||||
|
plist = self.db.get_person_handles()
|
||||||
|
|
||||||
|
self.progress.set_pass(_('Looking for family reference problems'),
|
||||||
|
len(plist))
|
||||||
|
|
||||||
|
for key in plist:
|
||||||
|
person = self.db.get_person_from_handle(key)
|
||||||
|
for ordinance in person.get_lds_ord_list():
|
||||||
|
family_handle = ordinance.get_family_handle()
|
||||||
|
if family_handle:
|
||||||
|
family = self.db.get_family_from_handle(family_handle)
|
||||||
|
if not family:
|
||||||
|
# The referenced family does not exist in the database
|
||||||
|
ordinance.set_family_handle(None)
|
||||||
|
self.db.commit_person(person, self.trans)
|
||||||
|
self.invalid_family_references.append(key)
|
||||||
|
|
||||||
def check_repo_references(self):
|
def check_repo_references(self):
|
||||||
slist = self.db.get_source_handles()
|
slist = self.db.get_source_handles()
|
||||||
|
|
||||||
@ -1298,6 +1318,7 @@ class CheckIntegrity(object):
|
|||||||
death_invalid = len(self.invalid_death_events)
|
death_invalid = len(self.invalid_death_events)
|
||||||
person = birth_invalid + death_invalid
|
person = birth_invalid + death_invalid
|
||||||
person_references = len(self.invalid_person_references)
|
person_references = len(self.invalid_person_references)
|
||||||
|
family_references = len(self.invalid_family_references)
|
||||||
invalid_dates = len(self.invalid_dates)
|
invalid_dates = len(self.invalid_dates)
|
||||||
place_references = len(self.invalid_place_references)
|
place_references = len(self.invalid_place_references)
|
||||||
source_references = len(self.invalid_source_references)
|
source_references = len(self.invalid_source_references)
|
||||||
@ -1318,9 +1339,9 @@ class CheckIntegrity(object):
|
|||||||
|
|
||||||
errors = (photos + efam + blink + plink + slink + rel +
|
errors = (photos + efam + blink + plink + slink + rel +
|
||||||
event_invalid + person +
|
event_invalid + person +
|
||||||
person_references + place_references + source_references +
|
person_references + family_references + place_references +
|
||||||
repo_references + media_references + note_references +
|
source_references + repo_references + media_references +
|
||||||
name_format + empty_objs + invalid_dates
|
note_references + name_format + empty_objs + invalid_dates
|
||||||
)
|
)
|
||||||
|
|
||||||
if errors == 0:
|
if errors == 0:
|
||||||
@ -1427,6 +1448,13 @@ class CheckIntegrity(object):
|
|||||||
person_references) % person_references
|
person_references) % person_references
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if family_references:
|
||||||
|
self.text.write(
|
||||||
|
ngettext("%d family was referenced but not found\n",
|
||||||
|
"%d families were referenced, but not found\n",
|
||||||
|
family_references) % family_references
|
||||||
|
)
|
||||||
|
|
||||||
if invalid_dates:
|
if invalid_dates:
|
||||||
self.text.write(ngettext("%d date was corrected\n",
|
self.text.write(ngettext("%d date was corrected\n",
|
||||||
"%d dates were corrected\n",
|
"%d dates were corrected\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user