6363 Person ,
6464 Family ,
6565 Attribute ,
66+ Source ,
6667)
6768from gramps .gen .db import DbTxn
6869from gramps .gen .display .name import displayer as name_displayer
@@ -380,6 +381,20 @@ def save(self, button):
380381 if not self .event .get_handle ():
381382 self .db .add_event (self .event , trans )
382383
384+ # Mantis 11054 (nick_h's narrow guard): if the source the
385+ # citation references was deleted while this form was open,
386+ # write a replacement source rather than committing a
387+ # dangling-reference citation. No behaviour change when the
388+ # reference is intact.
389+ source_handle = self .citation .get_reference_handle ()
390+ if source_handle and self .db .get_source_from_handle (source_handle ) is None :
391+ replacement = Source ()
392+ replacement .set_title (
393+ _ ("[Source recreated after deletion mid-form-edit]" )
394+ )
395+ self .db .add_source (replacement , trans )
396+ self .citation .set_reference_handle (replacement .get_handle ())
397+
383398 citation_handle = self .citation .get_handle ()
384399 if not self .citation .get_handle ():
385400 self .db .add_citation (self .citation , trans )
@@ -891,6 +906,12 @@ def save(self, trans):
891906 for order , row in enumerate (self .model ):
892907 all_people .append (row [0 ])
893908 person = self .db .get_person_from_handle (row [0 ])
909+ # Mantis 11054 (nick_h's narrow guard): if the person was
910+ # deleted while this form was open, drop the row rather than
911+ # commit a None-target reference. No behaviour change when
912+ # the reference is intact.
913+ if person is None :
914+ continue
894915 event_ref = get_event_ref (self .event , person , self .role )
895916
896917 # Write attributes
@@ -903,6 +924,10 @@ def save(self, trans):
903924 # Remove links to people no longer on form
904925 for handle in set (self .initial_people ) - set (all_people ):
905926 person = self .db .get_person_from_handle (handle )
927+ # Mantis 11054: same narrow guard — the person we tried to
928+ # detach is already gone, nothing to commit.
929+ if person is None :
930+ continue
906931 ref_list = [
907932 event_ref
908933 for event_ref in person .get_event_ref_list ()
@@ -1061,6 +1086,11 @@ def save(self, trans):
10611086 return
10621087
10631088 obj = self .dbstate .db .get_person_from_handle (self .handle )
1089+ # Mantis 11054 (nick_h's narrow guard): the person the form is
1090+ # attached to was deleted while the form was open — skip this
1091+ # section entirely rather than commit a None-target reference.
1092+ if obj is None :
1093+ return
10641094 event_ref = get_event_ref (self .event , obj , self .role )
10651095
10661096 row = []
@@ -1072,6 +1102,10 @@ def save(self, trans):
10721102 # Remove link to person no longer on form
10731103 if self .initial_handle and self .handle != self .initial_handle :
10741104 person = self .db .get_person_from_handle (self .initial_handle )
1105+ # Mantis 11054: the previously-attached person is already
1106+ # gone, nothing to detach.
1107+ if person is None :
1108+ return
10751109 ref_list = [
10761110 event_ref
10771111 for event_ref in obj .get_event_ref_list ()
@@ -1259,6 +1293,11 @@ def save(self, trans):
12591293 return
12601294
12611295 obj = self .dbstate .db .get_family_from_handle (self .handle )
1296+ # Mantis 11054 (nick_h's narrow guard): the family the form is
1297+ # attached to was deleted while the form was open — skip this
1298+ # section entirely rather than commit a None-target reference.
1299+ if obj is None :
1300+ return
12621301 event_ref = get_event_ref (self .event , obj , self .role )
12631302
12641303 row = []
@@ -1274,6 +1313,10 @@ def save(self, trans):
12741313 # Remove link to family no longer on form
12751314 if self .initial_handle and self .handle != self .initial_handle :
12761315 family = self .db .get_family_from_handle (self .initial_handle )
1316+ # Mantis 11054: the previously-attached family is already
1317+ # gone, nothing to detach.
1318+ if family is None :
1319+ return
12771320 ref_list = [
12781321 event_ref
12791322 for event_ref in obj .get_event_ref_list ()
0 commit comments