Tidy up code

This commit is contained in:
Nick Hall 2016-12-03 17:54:55 +00:00
parent 9ae653986f
commit 9a6c074888

View File

@ -26,12 +26,10 @@
#------------------------------------------------------------------------ #------------------------------------------------------------------------
import random import random
import pickle import pickle
import base64
import time import time
import re import re
import os import os
import logging import logging
import shutil
import bisect import bisect
import ast import ast
import sys import sys
@ -43,19 +41,14 @@ import glob
# Gramps Modules # Gramps Modules
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
import gramps from gramps.gen.db import (DbReadBase, DbWriteBase, DbUndo, DBLOGNAME,
from gramps.gen.const import GRAMPS_LOCALE as glocale DBUNDOFN, KEY_TO_CLASS_MAP, REFERENCE_KEY,
_ = glocale.translation.gettext
from gramps.gen.db import (DbReadBase, DbWriteBase, DbTxn, DbUndo,
KEY_TO_NAME_MAP, KEY_TO_CLASS_MAP,
CLASS_TO_KEY_MAP, TXNADD, TXNUPD, TXNDEL,
PERSON_KEY, FAMILY_KEY, CITATION_KEY, PERSON_KEY, FAMILY_KEY, CITATION_KEY,
SOURCE_KEY, EVENT_KEY, MEDIA_KEY, SOURCE_KEY, EVENT_KEY, MEDIA_KEY,
PLACE_KEY, REPOSITORY_KEY, NOTE_KEY, TAG_KEY) PLACE_KEY, REPOSITORY_KEY, NOTE_KEY, TAG_KEY)
from gramps.gen.errors import HandleError from gramps.gen.errors import HandleError
from gramps.gen.utils.callback import Callback from gramps.gen.utils.callback import Callback
from gramps.gen.updatecallback import UpdateCallback from gramps.gen.updatecallback import UpdateCallback
from gramps.gen.db.dbconst import *
from gramps.gen.db.bookmarks import DbBookmarks from gramps.gen.db.bookmarks import DbBookmarks
from gramps.gen.db import exceptions from gramps.gen.db import exceptions
@ -65,6 +58,8 @@ from gramps.gen.lib import (Tag, Media, Person, Family, Source, Citation, Event,
Place, Repository, Note, NameOriginType) Place, Repository, Note, NameOriginType)
from gramps.gen.lib.genderstats import GenderStats from gramps.gen.lib.genderstats import GenderStats
from gramps.gen.config import config from gramps.gen.config import config
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
LOG = logging.getLogger(DBLOGNAME) LOG = logging.getLogger(DBLOGNAME)
@ -149,8 +144,7 @@ class DbGenericUndo(DbUndo):
if key == REFERENCE_KEY: if key == REFERENCE_KEY:
self.undo_reference(new_data, handle) self.undo_reference(new_data, handle)
else: else:
self.undo_data(new_data, handle, key, self.undo_data(new_data, handle, key, db.emit, SIGBASE[key])
db.emit, SIGBASE[key])
self.db.transaction_backend_commit() self.db.transaction_backend_commit()
except: except:
self.db.transaction_backend_abort() self.db.transaction_backend_abort()
@ -158,8 +152,7 @@ class DbGenericUndo(DbUndo):
# Notify listeners # Notify listeners
if db.undo_callback: if db.undo_callback:
db.undo_callback(_("_Undo %s") db.undo_callback(_("_Undo %s") % transaction.get_description())
% transaction.get_description())
if db.redo_callback: if db.redo_callback:
if self.redo_count > 1: if self.redo_count > 1:
@ -293,8 +286,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
""" """
__signals__ = dict((obj+'-'+op, signal) __signals__ = dict((obj+'-'+op, signal)
for obj in for obj in
['person', 'family', 'event', 'place', ['person', 'family', 'event', 'place', 'repository',
'source', 'citation', 'media', 'note', 'repository', 'tag'] 'source', 'citation', 'media', 'note', 'tag']
for op, signal in zip( for op, signal in zip(
['add', 'update', 'delete', 'rebuild'], ['add', 'update', 'delete', 'rebuild'],
[(list,), (list,), (list,), None] [(list,), (list,), (list,), None]
@ -548,6 +541,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if directory: if directory:
self.load(directory) self.load(directory)
def initialize_backend(self, directory):
"""
Initialize database backend.
"""
raise NotImplementedError
def load(self, directory, callback=None, mode=None, def load(self, directory, callback=None, mode=None,
force_schema_upgrade=False, force_schema_upgrade=False,
force_bsddb_upgrade=False, force_bsddb_upgrade=False,
@ -641,6 +640,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
""" """
self.load(self._directory) self.load(self._directory)
def close_backend(self):
"""
Close database backend.
"""
raise NotImplementedError
def close(self, update=True, user=None): def close(self, update=True, user=None):
""" """
Close the database. Close the database.
@ -650,10 +655,11 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if update: if update:
if config.get('database.autobackup'): if config.get('database.autobackup'):
self.autobackup(user) self.autobackup(user)
# This is just a dummy file to indicate last modified time of the # This is just a dummy file to indicate last modified time of
# database for gramps.cli.clidbman: # the database for gramps.cli.clidbman:
filename = os.path.join(self._directory, "meta_data.db") filename = os.path.join(self._directory, "meta_data.db")
touch(filename) touch(filename)
# Save metadata # Save metadata
self.transaction_backend_begin() self.transaction_backend_begin()
self.set_metadata('name_formats', self.name_formats) self.set_metadata('name_formats', self.name_formats)
@ -661,13 +667,16 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# Bookmarks # Bookmarks
self.set_metadata('bookmarks', self.bookmarks.get()) self.set_metadata('bookmarks', self.bookmarks.get())
self.set_metadata('family_bookmarks', self.family_bookmarks.get()) self.set_metadata('family_bookmarks',
self.family_bookmarks.get())
self.set_metadata('event_bookmarks', self.event_bookmarks.get()) self.set_metadata('event_bookmarks', self.event_bookmarks.get())
self.set_metadata('source_bookmarks', self.source_bookmarks.get())
self.set_metadata('citation_bookmarks', self.citation_bookmarks.get())
self.set_metadata('repo_bookmarks', self.repo_bookmarks.get())
self.set_metadata('media_bookmarks', self.media_bookmarks.get())
self.set_metadata('place_bookmarks', self.place_bookmarks.get()) self.set_metadata('place_bookmarks', self.place_bookmarks.get())
self.set_metadata('repo_bookmarks', self.repo_bookmarks.get())
self.set_metadata('source_bookmarks',
self.source_bookmarks.get())
self.set_metadata('citation_bookmarks',
self.citation_bookmarks.get())
self.set_metadata('media_bookmarks', self.media_bookmarks.get())
self.set_metadata('note_bookmarks', self.note_bookmarks.get()) self.set_metadata('note_bookmarks', self.note_bookmarks.get())
# Custom type values, sets # Custom type values, sets
@ -756,12 +765,26 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
with open(filepath, "r", encoding='utf-8') as name_file: with open(filepath, "r", encoding='utf-8') as name_file:
version = name_file.readline().strip() version = name_file.readline().strip()
except (OSError, IOError) as msg: except (OSError, IOError) as msg:
self.__log_error() LOG.error(str(msg))
version = "(0, 0, 0)" version = "(0, 0, 0)"
return ast.literal_eval(version) return ast.literal_eval(version)
else: else:
return (0, 0, 0) return (0, 0, 0)
def get_python_version(self, directory=None):
"""
Get the version of python that the database was created
under. Assumes 3, if not found.
"""
raise NotImplementedError
def get_schema_version(self, directory=None):
"""
Get the version of the schema that the database was created
under. Assumes 18, if not found.
"""
raise NotImplementedError
def get_table_func(self, table=None, func=None): def get_table_func(self, table=None, func=None):
""" """
Private implementation of get_table_func. Private implementation of get_table_func.
@ -813,6 +836,25 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
self.transaction = transaction self.transaction = transaction
return transaction return transaction
def get_metadata(self, key, default=[]):
"""
Get an item from the database.
Default is an empty list, which is a mutable and
thus a bad default (pylint will complain).
However, it is just used as a value, and not altered, so
its use here is ok.
"""
raise NotImplementedError
def set_metadata(self, key, value):
"""
key: string
value: item, will be serialized here
"""
raise NotImplementedError
################################################################ ################################################################
# #
# set_*_id_prefix methods # set_*_id_prefix methods
@ -843,7 +885,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
pattern_match = re.match(r"(.*)%[0 ](\d+)[diu]$", id_pattern) pattern_match = re.match(r"(.*)%[0 ](\d+)[diu]$", id_pattern)
if pattern_match: if pattern_match:
str_prefix = pattern_match.group(1) str_prefix = pattern_match.group(1)
nr_width = int(pattern_match.group(2)) #nr_width = int(pattern_match.group(2))
def closure_func(gramps_id): def closure_func(gramps_id):
if gramps_id and gramps_id.startswith(str_prefix): if gramps_id and gramps_id.startswith(str_prefix):
id_number = gramps_id[len(str_prefix):] id_number = gramps_id[len(str_prefix):]
@ -1089,6 +1131,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def get_number_of(self, obj_key):
"""
Return the number of objects currently in the database.
"""
raise NotImplementedError
def get_number_of_people(self): def get_number_of_people(self):
""" """
Return the number of people currently in the database. Return the number of people currently in the database.
@ -1155,31 +1203,74 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def get_gramps_ids(self, obj_key):
"""
Return a list of Gramps IDs, one ID for each object in the
database.
"""
raise NotImplementedError
def get_person_gramps_ids(self): def get_person_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Person in the
database.
"""
return self.get_gramps_ids(PERSON_KEY) return self.get_gramps_ids(PERSON_KEY)
def get_family_gramps_ids(self): def get_family_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Family in the
database.
"""
return self.get_gramps_ids(FAMILY_KEY) return self.get_gramps_ids(FAMILY_KEY)
def get_source_gramps_ids(self): def get_source_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Source in the
database.
"""
return self.get_gramps_ids(SOURCE_KEY) return self.get_gramps_ids(SOURCE_KEY)
def get_citation_gramps_ids(self): def get_citation_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Citation in the
database.
"""
return self.get_gramps_ids(CITATION_KEY) return self.get_gramps_ids(CITATION_KEY)
def get_event_gramps_ids(self): def get_event_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Event in the
database.
"""
return self.get_gramps_ids(EVENT_KEY) return self.get_gramps_ids(EVENT_KEY)
def get_media_gramps_ids(self): def get_media_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Media in the
database.
"""
return self.get_gramps_ids(MEDIA_KEY) return self.get_gramps_ids(MEDIA_KEY)
def get_place_gramps_ids(self): def get_place_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Place in the
database.
"""
return self.get_gramps_ids(PLACE_KEY) return self.get_gramps_ids(PLACE_KEY)
def get_repository_gramps_ids(self): def get_repository_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Repository in the
database.
"""
return self.get_gramps_ids(REPOSITORY_KEY) return self.get_gramps_ids(REPOSITORY_KEY)
def get_note_gramps_ids(self): def get_note_gramps_ids(self):
"""
Return a list of Gramps IDs, one ID for each Note in the
database.
"""
return self.get_gramps_ids(NOTE_KEY) return self.get_gramps_ids(NOTE_KEY)
################################################################ ################################################################
@ -1366,6 +1457,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def has_handle(self, obj_key, handle):
"""
Return True if the handle exists in the database.
"""
raise NotImplementedError
def has_person_handle(self, handle): def has_person_handle(self, handle):
return self.has_handle(PERSON_KEY, handle) return self.has_handle(PERSON_KEY, handle)
@ -1402,6 +1499,9 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def has_gramps_id(self, obj_key, gramps_id):
raise NotImplementedError
def has_person_gramps_id(self, gramps_id): def has_person_gramps_id(self, gramps_id):
return self.has_gramps_id(PERSON_KEY, gramps_id) return self.has_gramps_id(PERSON_KEY, gramps_id)
@ -1474,6 +1574,9 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def _iter_handles(self, obj_key):
raise NotImplementedError
def iter_person_handles(self): def iter_person_handles(self):
""" """
Return an iterator over handles for Persons in the database Return an iterator over handles for Persons in the database
@ -1585,6 +1688,9 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def _iter_raw_data(self, obj_key):
raise NotImplementedError
def _iter_raw_person_data(self): def _iter_raw_person_data(self):
""" """
Return an iterator over raw Person data. Return an iterator over raw Person data.
@ -1645,12 +1751,24 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
""" """
return self._iter_raw_data(TAG_KEY) return self._iter_raw_data(TAG_KEY)
def _iter_raw_place_tree_data(self):
"""
Return an iterator over raw data in the place hierarchy.
"""
raise NotImplementedError
################################################################ ################################################################
# #
# get_raw_*_data methods # get_raw_*_data methods
# #
################################################################ ################################################################
def get_raw_data(self, obj_key, handle):
"""
Return raw (serialized and pickled) object from handle.
"""
raise NotImplementedError
def get_raw_person_data(self, handle): def get_raw_person_data(self, handle):
return self.get_raw_data(PERSON_KEY, handle) return self.get_raw_data(PERSON_KEY, handle)
@ -1687,6 +1805,9 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def _get_raw_from_id_data(self, obj_key, gramps_id):
raise NotImplementedError
def _get_raw_person_from_id_data(self, gramps_id): def _get_raw_person_from_id_data(self, gramps_id):
return self._get_raw_from_id_data(PERSON_KEY, gramps_id) return self._get_raw_from_id_data(PERSON_KEY, gramps_id)
@ -1725,7 +1846,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
person.handle = create_id() person.handle = create_id()
if (not person.gramps_id) and set_gid: if (not person.gramps_id) and set_gid:
person.gramps_id = self.find_next_person_gramps_id() person.gramps_id = self.find_next_person_gramps_id()
if (not person.gramps_id): if not person.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
person.gramps_id = str(random.random()) person.gramps_id = str(random.random())
self.commit_person(person, trans) self.commit_person(person, trans)
@ -1736,7 +1857,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
family.handle = create_id() family.handle = create_id()
if (not family.gramps_id) and set_gid: if (not family.gramps_id) and set_gid:
family.gramps_id = self.find_next_family_gramps_id() family.gramps_id = self.find_next_family_gramps_id()
if (not family.gramps_id): if not family.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
family.gramps_id = str(random.random()) family.gramps_id = str(random.random())
self.commit_family(family, trans) self.commit_family(family, trans)
@ -1747,7 +1868,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
citation.handle = create_id() citation.handle = create_id()
if (not citation.gramps_id) and set_gid: if (not citation.gramps_id) and set_gid:
citation.gramps_id = self.find_next_citation_gramps_id() citation.gramps_id = self.find_next_citation_gramps_id()
if (not citation.gramps_id): if not citation.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
citation.gramps_id = str(random.random()) citation.gramps_id = str(random.random())
self.commit_citation(citation, trans) self.commit_citation(citation, trans)
@ -1758,7 +1879,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
source.handle = create_id() source.handle = create_id()
if (not source.gramps_id) and set_gid: if (not source.gramps_id) and set_gid:
source.gramps_id = self.find_next_source_gramps_id() source.gramps_id = self.find_next_source_gramps_id()
if (not source.gramps_id): if not source.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
source.gramps_id = str(random.random()) source.gramps_id = str(random.random())
self.commit_source(source, trans) self.commit_source(source, trans)
@ -1769,7 +1890,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
repository.handle = create_id() repository.handle = create_id()
if (not repository.gramps_id) and set_gid: if (not repository.gramps_id) and set_gid:
repository.gramps_id = self.find_next_repository_gramps_id() repository.gramps_id = self.find_next_repository_gramps_id()
if (not repository.gramps_id): if not repository.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
repository.gramps_id = str(random.random()) repository.gramps_id = str(random.random())
self.commit_repository(repository, trans) self.commit_repository(repository, trans)
@ -1780,7 +1901,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
note.handle = create_id() note.handle = create_id()
if (not note.gramps_id) and set_gid: if (not note.gramps_id) and set_gid:
note.gramps_id = self.find_next_note_gramps_id() note.gramps_id = self.find_next_note_gramps_id()
if (not note.gramps_id): if not note.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
note.gramps_id = str(random.random()) note.gramps_id = str(random.random())
self.commit_note(note, trans) self.commit_note(note, trans)
@ -1791,7 +1912,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
place.handle = create_id() place.handle = create_id()
if (not place.gramps_id) and set_gid: if (not place.gramps_id) and set_gid:
place.gramps_id = self.find_next_place_gramps_id() place.gramps_id = self.find_next_place_gramps_id()
if (not place.gramps_id): if not place.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
place.gramps_id = str(random.random()) place.gramps_id = str(random.random())
self.commit_place(place, trans) self.commit_place(place, trans)
@ -1802,7 +1923,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
event.handle = create_id() event.handle = create_id()
if (not event.gramps_id) and set_gid: if (not event.gramps_id) and set_gid:
event.gramps_id = self.find_next_event_gramps_id() event.gramps_id = self.find_next_event_gramps_id()
if (not event.gramps_id): if not event.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
event.gramps_id = str(random.random()) event.gramps_id = str(random.random())
self.commit_event(event, trans) self.commit_event(event, trans)
@ -1825,7 +1946,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
obj.handle = create_id() obj.handle = create_id()
if (not obj.gramps_id) and set_gid: if (not obj.gramps_id) and set_gid:
obj.gramps_id = self.find_next_media_gramps_id() obj.gramps_id = self.find_next_media_gramps_id()
if (not obj.gramps_id): if not obj.gramps_id:
# give it a random value for the moment: # give it a random value for the moment:
obj.gramps_id = str(random.random()) obj.gramps_id = str(random.random())
self.commit_media(obj, transaction) self.commit_media(obj, transaction)
@ -1837,6 +1958,13 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def _commit_base(self, obj, obj_key, trans, change_time):
"""
Commit the specified object to the database, storing the changes as
part of the transaction.
"""
raise NotImplementedError
def commit_person(self, person, trans, change_time=None): def commit_person(self, person, trans, change_time=None):
""" """
Commit the specified Person to the database, storing the changes as Commit the specified Person to the database, storing the changes as
@ -2065,6 +2193,9 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
# #
################################################################ ################################################################
def _do_remove(self, handle, transaction, obj_key):
raise NotImplementedError
def remove_person(self, handle, transaction): def remove_person(self, handle, transaction):
""" """
Remove the Person specified by the database handle from the Remove the Person specified by the database handle from the
@ -2369,6 +2500,16 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if name in self.surname_list: if name in self.surname_list:
self.surname_list.remove(name) self.surname_list.remove(name)
def get_gender_stats(self):
"""
Returns a dictionary of
{given_name: (male_count, female_count, unknown_count)}
"""
raise NotImplementedError
def save_gender_stats(self, gstats):
raise NotImplementedError
def get_researcher(self): def get_researcher(self):
return self.owner return self.owner
@ -2509,9 +2650,10 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
""" """
order_by = "" order_by = ""
if person.primary_name: if person.primary_name:
order_by_list = [surname.surname + " " + person.primary_name.first_name order_by_list = [surname.surname + " " +
person.primary_name.first_name
for surname in person.primary_name.surname_list for surname in person.primary_name.surname_list
if not (int(surname.origintype) in if (int(surname.origintype) not in
[NameOriginType.PATRONYMIC, [NameOriginType.PATRONYMIC,
NameOriginType.MATRONYMIC])] NameOriginType.MATRONYMIC])]
order_by = " ".join(order_by_list) order_by = " ".join(order_by_list)