diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 1ee0b05f0..cf008d24c 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,21 @@ +2005-08-02 Don Allingham + * src/EditPerson.py: call new PersonEventEditor + * src/Marriage.py: call new FamilyEventEditor + * src/EditSource.py: call the correct EventEditor + * src/EventEdit.py: Add PersonEventEditor and FamilyEventEditor to + correctly manage event types + * src/GrampsBSDDB.py: use commit_event to handle personal vs. family + event types + * src/GrampsInMem.py: use commit_event to handle personal vs. family + event types + * src/GrampsDbBase.py: use commit_event to handle personal vs. family + event types + * src/ReadXML: use commit_event to handle personal vs. family + event types + * src/ReadGedcom: use commit_event to handle personal vs. family + event types + + 2005-08-02 Martin Hawlisch * src/Bookmarks.py (edit): Dont crash if bookmark list contains nonexisting person. diff --git a/gramps2/src/EditPerson.py b/gramps2/src/EditPerson.py index a6429ddfd..7af47b1f2 100644 --- a/gramps2/src/EditPerson.py +++ b/gramps2/src/EditPerson.py @@ -1203,11 +1203,8 @@ class EditPerson: """Brings up the EventEditor for a new event""" import EventEdit pname = self.nd.display(self.person) - EventEdit.EventEditor( - self,pname,const.personalEvents, - const.personal_events,None,None,0, - self.event_edit_callback, - noedit=self.db.readonly) + EventEdit.PersonEventEditor(self, pname, None, None, False, + self.event_edit_callback, noedit=self.db.readonly) def on_edit_birth_clicked(self,obj): """Brings up the EventEditor for the birth record, event @@ -1223,11 +1220,8 @@ class EditPerson: p = self.get_place(self.bplace) if p: event.set_place_handle(p) - EventEdit.EventEditor( - self,pname, const.personalEvents, - const.personal_events,event,def_placename,1, - self.event_edit_callback, - noedit=self.db.readonly) + EventEdit.PersonEventEditor(self,pname, event, def_placename, True, + self.event_edit_callback, noedit=self.db.readonly) def on_edit_death_clicked(self,obj): """Brings up the EventEditor for the death record, event @@ -1243,11 +1237,9 @@ class EditPerson: p = self.get_place(self.dplace) if p: event.set_place_handle(p) - EventEdit.EventEditor( - self,pname,const.personalEvents, - const.personal_events,event,def_placename,1, - self.event_edit_callback, - noedit=self.db.readonly) + EventEdit.PersonEventEditor(self, pname, event, def_placename, + True, self.event_edit_callback, + noedit=self.db.readonly) def on_aka_delete_clicked(self,obj): """Deletes the selected name from the name list""" @@ -1500,10 +1492,8 @@ class EditPerson: return pname = self.nd.display(self.person) event = self.etree.get_object(node) - EventEdit.EventEditor( - self,pname,const.personalEvents, - const.personal_events,event,None,0, - self.event_edit_callback,noedit=self.db.readonly) + EventEdit.PersonEventEditor(self, pname, event, None, False, + self.event_edit_callback, noedit=self.db.readonly) def on_event_select_row(self,obj): store,node = obj.get_selected() @@ -1786,7 +1776,7 @@ class EditPerson: if self.orig_birth.is_empty(): self.db.add_event(self.birth,trans) self.person.set_birth_handle(self.birth.get_handle()) - self.db.commit_event(self.birth,trans) + self.db.commit_personal_event(self.birth,trans) # Update each of the families child lists to reflect any # change in ordering due to the new birth date @@ -1807,7 +1797,7 @@ class EditPerson: if self.orig_death.is_empty(): self.db.add_event(self.death,trans) self.person.set_death_handle(self.death.get_handle()) - self.db.commit_event(self.death,trans) + self.db.commit_personal_event(self.death,trans) male = self.is_male.get_active() female = self.is_female.get_active() diff --git a/gramps2/src/EditSource.py b/gramps2/src/EditSource.py index d1e920fdf..0d4275290 100644 --- a/gramps2/src/EditSource.py +++ b/gramps2/src/EditSource.py @@ -278,17 +278,14 @@ class EditSource: event = self.db.get_event_from_handle(handle) event_name = event.get_name() if const.family_events.has_key(event_name): - EventEdit.EventEditor( - self,", ", const.marriageEvents, const.family_events, - event, None, 0, None, None, self.db.readonly) + EventEdit.FamilyEventEditor( + self,", ", event, None, 0, None, None, self.db.readonly) elif const.personal_events.has_key(event_name): - EventEdit.EventEditor( - self,", ", const.personalEvents, const.personal_events, - event, None, 0, None, None, self.db.readonly) + EventEdit.PersonEventEditor( + self,", ", event, None, 0, None, None, self.db.readonly) elif event_name in ["Birth","Death"]: - EventEdit.EventEditor( - self,", ", const.personalEvents, const.personal_events, - event, None, 1, None, None, self.db.readonly) + EventEdit.PersonEventEditor( + self,", ", event, None, 1, None, None, self.db.readonly) elif data_type == 3: import EditPlace place = self.db.get_place_from_handle(handle) diff --git a/gramps2/src/EventEdit.py b/gramps2/src/EventEdit.py index 24403bfe7..fb0471234 100644 --- a/gramps2/src/EventEdit.py +++ b/gramps2/src/EventEdit.py @@ -26,6 +26,7 @@ # #------------------------------------------------------------------------- from gettext import gettext as _ +import sets #------------------------------------------------------------------------- # @@ -83,15 +84,10 @@ class EventEditor: self.dp = DateHandler.parser self.dd = DateHandler.displayer - values = {} - for v in elist: - values[v] = 1 - for vv in self.db.get_person_event_type_list(): - if vv not in ("Birth","Death"): - v = _(vv) - values[v] = 1 - - self.elist = values.keys() + # build list for menu + values = sets.Set(elist) + values.union(self.get_event_names()) + self.elist = list(values) self.elist.sort() for key in self.parent.db.get_place_handles(): @@ -105,11 +101,6 @@ class EventEditor: self.witnesslist = [] self.date = Date.Date(self.event.get_date_object()) transname = const.display_event(event.get_name()) - # add the name to the list if it is not already there. This - # tends to occur in translated languages with the 'Death' - # event, which is a partial match to other events - #if not transname in elist: - # elist.append(transname) else: self.srcreflist = [] self.witnesslist = [] @@ -402,7 +393,7 @@ class EventEditor: if self.event.get_privacy() != priv: self.event.set_privacy(priv) self.parent.lists_changed = 1 - self.db.commit_event(self.event,trans) + self.commit(self.event,trans) def on_switch_page(self,obj,a,page): buf = self.note_field.get_buffer() @@ -411,3 +402,41 @@ class EventEditor: Utils.bold_label(self.notes_label) else: Utils.unbold_label(self.notes_label) + + def commit(self,event,trans): + self.db.commit_event(event,trans) + + def get_event_names(self): + data = sets.Set(self.db.get_family_event_types()) + data.union(self.db.get_person_event_types()) + return list(data) + +class FamilyEventEditor(EventEditor): + + def __init__(self,parent,name,event,def_placename, + read_only, cb, def_event=None, noedit=False): + + EventEditor.__init__(self, parent, name, const.marriageEvents, + const.family_events, event, def_placename, + read_only, cb, def_event, noedit) + + def commit(self,event,trans): + self.db.commit_family_event(event,trans) + + def get_event_names(self): + return self.db.get_family_event_types() + +class PersonEventEditor(EventEditor): + + def __init__(self,parent,name,event,def_placename, + read_only, cb, def_event=None, noedit=False): + + EventEditor.__init__(self, parent, name, const.personalEvents, + const.personal_events, event, def_placename, + read_only, cb, def_event, noedit) + + def commit(self,event,trans): + self.db.commit_personal_event(event,trans) + + def get_event_names(self): + return self.db.get_person_event_types() diff --git a/gramps2/src/GrampsBSDDB.py b/gramps2/src/GrampsBSDDB.py index 97b1472da..839e86f33 100644 --- a/gramps2/src/GrampsBSDDB.py +++ b/gramps2/src/GrampsBSDDB.py @@ -32,6 +32,7 @@ Provides the Berkeley DB (BSDDB) database backend for GRAMPS import os import time import locale +import sets from gettext import gettext as _ from bsddb import dbshelve, db @@ -43,7 +44,7 @@ from bsddb import dbshelve, db from RelLib import * from GrampsDbBase import * -_DBVERSION = 7 +_DBVERSION = 8 def find_surname(key,data): return str(data[3].get_surname()) @@ -54,9 +55,6 @@ def find_idmap(key,data): def find_fidmap(key,data): return str(data[1]) -def find_eventname(key,data): - return str(data[2]) - class GrampsBSDDBCursor(GrampsCursor): def __init__(self,source): @@ -174,10 +172,6 @@ class GrampsBSDDB(GrampsDbBase): self.oid_trans.set_flags(db.DB_DUP) self.oid_trans.open(name, "oidtrans", db.DB_HASH, flags=openflags) - self.eventnames = db.DB(self.env) - self.eventnames.set_flags(db.DB_DUP) - self.eventnames.open(name, "eventnames", db.DB_HASH, flags=openflags) - if not self.readonly: self.person_map.associate(self.surnames, find_surname, openflags) self.person_map.associate(self.id_trans, find_idmap, openflags) @@ -185,12 +179,13 @@ class GrampsBSDDB(GrampsDbBase): self.place_map.associate(self.pid_trans, find_idmap, openflags) self.media_map.associate(self.oid_trans, find_idmap, openflags) self.source_map.associate(self.sid_trans, find_idmap, openflags) - self.event_map.associate(self.eventnames, find_eventname, openflags) self.undodb = db.DB() self.undodb.open(self.undolog, db.DB_RECNO, db.DB_CREATE) self.metadata = self.dbopen(name, "meta") self.bookmarks = self.metadata.get('bookmarks') + self.family_event_names = sets.Set(self.metadata.get('fevent_names',[])) + self.individual_event_names = sets.Set(self.metadata.get('pevent_names',[])) gstats = self.metadata.get('gender_stats') @@ -289,20 +284,6 @@ class GrampsBSDDB(GrampsDbBase): self.source_map[key] = self.source_map[key] self.source_map.sync() - # Repair secondary indices related to event_map - - self.eventnames.close() - self.eventnames = db.DB(self.env) - self.eventnames.set_flags(db.DB_DUP) - self.eventnames.open(self.save_name, "eventnames", db.DB_HASH, - flags=db.DB_CREATE) - self.eventnames.truncate() - self.event_map.associate(self.eventnames, find_eventname, db.DB_CREATE) - - for key in self.event_map.keys(): - self.event_map[key] = self.event_map[key] - self.event_map.sync() - def abort_changes(self): while self.undo(): pass @@ -321,9 +302,10 @@ class GrampsBSDDB(GrampsDbBase): if not self.readonly: self.metadata['bookmarks'] = self.bookmarks self.metadata['gender_stats'] = self.genderStats.save_stats() + self.metadata['fevent_names'] = list(self.family_event_names) + self.metadata['pevent_names'] = list(self.individual_event_names) self.metadata.close() self.surnames.close() - self.eventnames.close() self.id_trans.close() self.fid_trans.close() self.oid_trans.close() @@ -366,16 +348,6 @@ class GrampsBSDDB(GrampsDbBase): vals.sort(locale.strcoll) return vals - def get_person_event_type_list(self): - names = self.eventnames.keys() - a = {} - for name in names: - - a[unicode(name)] = 1 - vals = a.keys() - vals.sort() - return vals - def remove_person(self,handle,transaction): if not self.readonly and handle and str(handle) in self.person_map: person = self.get_person_from_handle(handle) @@ -500,7 +472,6 @@ class GrampsBSDDB(GrampsDbBase): self.pid_trans.sync() self.sid_trans.sync() self.oid_trans.sync() - self.eventnames.sync() self.undodb.sync() def upgrade(self): @@ -522,6 +493,8 @@ class GrampsBSDDB(GrampsDbBase): self.upgrade_6() if version < 7: self.upgrade_7() + if version < 8: + self.upgrade_8() self.metadata['version'] = _DBVERSION print 'Successfully finished all upgrades' @@ -851,3 +824,29 @@ class GrampsBSDDB(GrampsDbBase): self.genderStats.count_person(p,self) data = cursor.next() cursor.close() + + def upgrade_8(self): + print "Upgrading to DB version 8" + + cursor = self.get_person_cursor() + data = cursor.first() + while data: + handle,val = data + handle_list = val[8] + for handle in handle_list: + event = self.get_event_from_handle(handle) + self.individual_event_names.add(event.name) + data = cursor.next() + cursor.close() + + cursor = self.get_family_cursor() + data = cursor.first() + while data: + handle,val = data + handle_list = val[6] + for handle in handle_list: + event = self.get_event_from_handle(handle) + self.family_event_names.add(event.name) + data = cursor.next() + cursor.close() + diff --git a/gramps2/src/GrampsDbBase.py b/gramps2/src/GrampsDbBase.py index 34d00a207..c7a3bc15a 100644 --- a/gramps2/src/GrampsDbBase.py +++ b/gramps2/src/GrampsDbBase.py @@ -35,6 +35,7 @@ import time import random import locale import re +import sets from gettext import gettext as _ #------------------------------------------------------------------------- @@ -152,6 +153,9 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): self.lmap_index = 0 self.omap_index = 0 + self.family_event_names = sets.Set() + self.individual_event_names = sets.Set() + self.set_person_id_prefix(GrampsKeys.get_person_id_prefix()) self.set_object_id_prefix(GrampsKeys.get_object_id_prefix()) self.set_family_id_prefix(GrampsKeys.get_family_id_prefix()) @@ -175,7 +179,6 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): self.source_map = None self.media_map = None self.event_map = None - self.eventnames = None self.metadata = None self.name_group = None self.undo_callback = None @@ -364,6 +367,15 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): else: self.emit('place-add',([handle],)) + def commit_personal_event(self,event,transaction,change_time=None): + self.individual_event_names.add(event.name) + self.commit_event(event,transaction,change_time) + + def commit_family_event(self,event,transaction,change_time=None): + self.family_event_names.add(event.name) + self.commit_event(event,transaction,change_time) + print self.family_event_names + def commit_event(self,event,transaction,change_time=None): """ Commits the specified Event to the database, storing the changes @@ -1044,7 +1056,8 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): Returns the list of personal event types contained within the database. The function must be overridden in the derived class. """ - assert False, "Needs to be overridden in the derived class" + print self.individual_event_names + return list(self.individual_event_names) def get_bookmarks(self): """returns the list of Person handles in the bookmarks""" @@ -1091,7 +1104,8 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): def get_person_event_types(self): """returns a list of all Event types assocated with Person instances in the database""" - return [] + print self.individual_event_names + return list(self.individual_event_names) def get_person_attribute_types(self): """returns a list of all Attribute types assocated with Person @@ -1106,7 +1120,8 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): def get_family_event_types(self): """returns a list of all Event types assocated with Family instances in the database""" - return [] + return list(self.family_event_names) + def get_media_attribute_types(self): """returns a list of all Attribute types assocated with Media diff --git a/gramps2/src/GrampsInMemDB.py b/gramps2/src/GrampsInMemDB.py index 8bf3ec6e4..004d13836 100644 --- a/gramps2/src/GrampsInMemDB.py +++ b/gramps2/src/GrampsInMemDB.py @@ -32,6 +32,7 @@ must hold all of their data in memory. #------------------------------------------------------------------------- from RelLib import * from GrampsDbBase import * +import sets class GrampsInMemCursor(GrampsCursor): """ @@ -83,7 +84,6 @@ class GrampsInMemDB(GrampsDbBase): self.fid_trans = {} self.sid_trans = {} self.oid_trans = {} - self.eventnames = {} self.undodb = [] def load(self,name,callback): @@ -128,15 +128,6 @@ class GrampsInMemDB(GrampsDbBase): vals.sort() return vals - def get_person_event_type_list(self): - names = self.eventnames.keys() - a = {} - for name in names: - a[unicode(name)] = 1 - vals = a.keys() - vals.sort() - return vals - def remove_person(self,handle,transaction): if self.readonly or not handle or str(handle) not in self.person_map: return diff --git a/gramps2/src/Marriage.py b/gramps2/src/Marriage.py index fbb8120fb..9f075bc76 100644 --- a/gramps2/src/Marriage.py +++ b/gramps2/src/Marriage.py @@ -729,9 +729,8 @@ class Marriage: def on_add_clicked(self,*obj): import EventEdit name = Utils.family_name(self.family,self.db) - EventEdit.EventEditor( - self,name, const.marriageEvents, const.family_events, - None, None, 0, self.event_edit_callback, + EventEdit.FamilyEventEditor( + self, name, None, None, False, self.event_edit_callback, const.defaultMarriageEvent, self.db.readonly) def on_event_update_clicked(self,obj): @@ -741,9 +740,9 @@ class Marriage: return event = self.etree.get_object(node) name = Utils.family_name(self.family,self.db) - EventEdit.EventEditor( - self, name, const.marriageEvents, const.family_events,event, - None, 0,self.event_edit_callback, None, self.db.readonly) + EventEdit.FamilyEventEditor( + self, name, event, None, False, self.event_edit_callback, + None, self.db.readonly) def on_delete_clicked(self,obj): if Utils.delete_selected(obj,self.elist): diff --git a/gramps2/src/ReadGedcom.py b/gramps2/src/ReadGedcom.py index 882a29cac..28ae82ff5 100644 --- a/gramps2/src/ReadGedcom.py +++ b/gramps2/src/ReadGedcom.py @@ -917,7 +917,7 @@ class GedcomParser: self.db.add_event(event,self.trans) self.family.add_event_handle(event.get_handle()) self.parse_family_event(event,2) - self.db.commit_event(event, self.trans) + self.db.commit_family_event(event, self.trans) del event def parse_note_base(self,matches,obj,level,old_note,task): @@ -1066,14 +1066,14 @@ class GedcomParser: event.set_name("Birth") self.person.set_birth_handle(event.get_handle()) self.parse_person_event(event,2) - self.db.commit_event(event, self.trans) + self.db.commit_personal_event(event, self.trans) elif matches[1] == "ADOP": event = RelLib.Event() self.db.add_event(event, self.trans) event.set_name("Adopted") self.person.add_event_handle(event.get_handle()) self.parse_adopt_event(event,2) - self.db.commit_event(event, self.trans) + self.db.commit_personal_event(event, self.trans) elif matches[1] == "DEAT": event = RelLib.Event() if matches[2]: @@ -1086,7 +1086,7 @@ class GedcomParser: event.set_name("Death") self.person.set_death_handle(event.get_handle()) self.parse_person_event(event,2) - self.db.commit_event(event, self.trans) + self.db.commit_peronal_event(event, self.trans) elif matches[1] == "EVEN": event = RelLib.Event() if matches[2]: diff --git a/gramps2/src/ReadXML.py b/gramps2/src/ReadXML.py index 6b84fb400..6fba5530b 100644 --- a/gramps2/src/ReadXML.py +++ b/gramps2/src/ReadXML.py @@ -596,7 +596,10 @@ class GrampsParser: def start_event(self,attrs): self.event = RelLib.Event() self.db.add_event(self.event,self.trans) - self.event_type = const.save_event(attrs["type"]) + if self.family: + self.event_type = const.display_pevent(attrs["type"]) + else: + self.event_type = const.display_fevent(attrs["type"]) if attrs.has_key("conf"): self.event.conf = int(attrs["conf"]) else: @@ -1107,6 +1110,7 @@ class GrampsParser: if self.family: self.family.add_event_handle(self.event.get_handle()) + self.db.commit_family_event(self.event,self.trans,self.change) else: if self.event_type == "Birth": self.person.set_birth_handle(self.event.get_handle()) @@ -1114,7 +1118,7 @@ class GrampsParser: self.person.set_death_handle(self.event.get_handle()) else: self.person.add_event_handle(self.event.get_handle()) - self.db.commit_event(self.event,self.trans,self.change) + self.db.commit_personal_event(self.event,self.trans,self.change) self.event = None def stop_name(self,tag):