diff --git a/src/plugins/EventNames.py b/src/plugins/EventNames.py new file mode 100644 index 000000000..e2d9c2e5b --- /dev/null +++ b/src/plugins/EventNames.py @@ -0,0 +1,170 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2007 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id: EventNames.py 8023 2007-02-01 17:26:51Z rshura $ + +"Database Processing/Fix capitalization of family names" + +#------------------------------------------------------------------------- +# +# python modules +# +#------------------------------------------------------------------------- +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# gnome/gtk +# +#------------------------------------------------------------------------- +import gtk +import gtk.glade + +#------------------------------------------------------------------------- +# +# gramps modules +# +#------------------------------------------------------------------------- +import ManagedWindow +import RelLib +import Utils + +from PluginUtils import Tool, register_tool +from BasicUtils import name_displayer + +#------------------------------------------------------------------------- +# +# EventNames +# +#------------------------------------------------------------------------- +class EventNames(Tool.BatchTool, ManagedWindow.ManagedWindow): + """ + Looks for events that do not have a description, and builds the + description from the item that contains it. Looks for a PRIMARY role + type for events attached to a persons, and a FAMILY role for an event + that is attached to a family. + """ + + def __init__(self, dbstate, uistate, options_class, name, callback=None): + self.label = _('Capitalization changes') + + ManagedWindow.ManagedWindow.__init__(self, uistate, [], self.__class__) + self.set_window(gtk.Window(), gtk.Label(), '') + + Tool.BatchTool.__init__(self, dbstate, options_class, name) + + if self.fail: + uistate.set_busy_cursor(True) + self.run() + uistate.set_busy_cursor(False) + + def run(self): + """ + Performs the actual extraction of information + """ + trans = self.db.transaction_begin("", batch=True) + self.db.disable_signals() + + for handle in self.db.get_person_handles(): + person = self.db.get_person_from_handle(handle) + for event_ref in person.get_event_ref_list(): + if event_ref.get_role() == RelLib.EventRoleType.PRIMARY: + event_handle = event_ref.ref + event = self.db.get_event_from_handle(event_handle) + if event.get_description() == "": + person_event_name(event, person) + self.db.commit_event(event, trans) + self.change = True + + for handle in self.db.get_family_handles(): + family = self.db.get_family_from_handle(handle) + for event_ref in family.get_event_ref_list(): + if event_ref.get_role() == RelLib.EventRoleType.FAMILY: + event_handle = event_ref.ref + event = self.db.get_event_from_handle(event_handle) + if event.get_description() == "": + family_event_name(event, family, self.db) + self.db.commit_event(event, trans) + + self.db.transaction_commit(trans, _("Event name changes")) + self.db.enable_signals() + self.db.request_rebuild() + +#------------------------------------------------------------------------- +# +# Support functions +# +#------------------------------------------------------------------------- + +EVENT_FAMILY_STR = _("%(event_name)s of %(family)s") +EVENT_PERSON_STR = _("%(event_name)s of %(person)s") + +def person_event_name(event, person): + """ + Builds a name for an event based on the primary person's information + """ + if not event.get_description(): + text = EVENT_PERSON_STR % { + 'event_name' : str(event.get_type()), + 'person' : name_displayer.display(person), + } + event.set_description(text) + +def family_event_name(event, family, dbase): + """ + Builds a name for an event based on the family's information + """ + if not event.get_description(): + text = EVENT_FAMILY_STR % { + 'event_name' : str(event.get_type()), + 'family' : Utils.family_name(family, dbase), + } + event.set_description(text) + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +class EventNamesOptions(Tool.ToolOptions): + """ + Defines options and provides handling interface. + """ + + def __init__(self, name, person_id=None): + Tool.ToolOptions.__init__(self, name, person_id) + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +register_tool( + name = 'chname', + category = Tool.TOOL_DBPROC, + tool_class = EventNames, + options_class = EventNamesOptions, + modes = Tool.MODE_GUI, + translated_name = _("Extract event names from data"), + status = _("Stable"), + author_name = "Donald N. Allingham", + author_email = "don@gramps-project.org", + description = _("Extracts event names from the event data") + ) diff --git a/src/plugins/ExtractCity.py b/src/plugins/ExtractCity.py new file mode 100644 index 000000000..0fff925d9 --- /dev/null +++ b/src/plugins/ExtractCity.py @@ -0,0 +1,138 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2007 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id: ExtractCity.py 8023 2007-02-01 17:26:51Z rshura $ + +"Database Processing/Fix capitalization of family names" + +#------------------------------------------------------------------------- +# +# python modules +# +#------------------------------------------------------------------------- +import re +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# gnome/gtk +# +#------------------------------------------------------------------------- +import gtk +import gtk.glade + +#------------------------------------------------------------------------- +# +# gramps modules +# +#------------------------------------------------------------------------- +import ManagedWindow + +from PluginUtils import Tool, register_tool + +CITY_STATE = re.compile("^(.+), \s*(\S\S)(\s+[\d-])?") + +#------------------------------------------------------------------------- +# +# ExtractCity +# +#------------------------------------------------------------------------- +class ExtractCity(Tool.BatchTool, ManagedWindow.ManagedWindow): + """ + Extracts city, state, and zip code information from an place description + if the title is empty and the description falls into the category of: + + New York, NY 10000 + + Sorry for those not in the US or Canada. I doubt this will work for any + other locales. + """ + + def __init__(self, dbstate, uistate, options_class, name, callback=None): + self.label = _('Capitalization changes') + + ManagedWindow.ManagedWindow.__init__(self, uistate, [], self.__class__) + self.set_window(gtk.Window(), gtk.Label(), '') + + Tool.BatchTool.__init__(self, dbstate, options_class, name) + if self.fail: + uistate.set_busy_cursor(True) + self.run() + uistate.set_busy_cursor(False) + + def run(self): + """ + Performs the actual extraction of information + """ + trans = self.db.transaction_begin("", batch=True) + self.db.disable_signals() + + for handle in self.db.get_place_handles(): + place = self.db.get_place_from_handle(handle) + descr = place.get_title() + loc = place.get_main_location() + + if loc.get_street() == "" and loc.get_city() == "" \ + and loc.get_state() == "" and \ + loc.get_postal_code() == "": + match = CITY_STATE.match(descr) + if match: + (city, state, postal) = match.groups() + if city: + loc.set_city(city) + if state: + loc.set_state(state) + if postal: + loc.set_postal_code(postal) + self.db.commit_place(place, trans) + self.db.transaction_commit(trans, _("Place changes")) + self.db.enable_signals() + self.db.request_rebuild() + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +class ExtractCityOptions(Tool.ToolOptions): + """ + Defines options and provides handling interface. + """ + def __init__(self, name, person_id=None): + Tool.ToolOptions.__init__(self, name, person_id) + +#------------------------------------------------------------------------ +# +# +# +#------------------------------------------------------------------------ +register_tool( + name = 'chname', + category = Tool.TOOL_DBPROC, + tool_class = ExtractCity, + options_class = ExtractCityOptions, + modes = Tool.MODE_GUI, + translated_name = _("Extract city and state information from a place"), + status = _("Stable"), + author_name = "Donald N. Allingham", + author_email = "don@gramps-project.org", + description = _("Attempts to extract city and state/province " + "from a place name") + )