Update with latest trunk changes

svn: r20754
This commit is contained in:
Nick Hall 2012-12-02 23:53:41 +00:00
parent 3eb9594a98
commit c2092a71bd
30 changed files with 543 additions and 410 deletions

View File

@ -55,16 +55,21 @@ db.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
import cPickle as pickle import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# Gramps libs # Gramps libs
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
from exceptions import DbException from .exceptions import DbException
from write import FAMILY_TBL, PLACES_TBL, LOCATION_TBL, SOURCES_TBL, MEDIA_TBL,\ from .write import (FAMILY_TBL, PLACES_TBL, LOCATION_TBL, SOURCES_TBL,
EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL, TAG_TBL, META, CITATIONS_TBL MEDIA_TBL, EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL,
TAG_TBL, META, CITATIONS_TBL)
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
@ -87,7 +92,7 @@ def backup(database):
""" """
try: try:
__do_export(database) __do_export(database)
except (OSError, IOError), msg: except (OSError, IOError) as msg:
raise DbException(str(msg)) raise DbException(str(msg))
def __mk_backup_name(database, base): def __mk_backup_name(database, base):
@ -155,7 +160,7 @@ def restore(database):
""" """
try: try:
__do_restore(database) __do_restore(database)
except (OSError, IOError), msg: except (OSError, IOError) as msg:
raise DbException(str(msg)) raise DbException(str(msg))
def __do_restore(database): def __do_restore(database):

View File

@ -41,8 +41,8 @@ from ..ggettext import gettext as _
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from ..lib.childreftype import ChildRefType from ..lib.childreftype import ChildRefType
from ..lib.childref import ChildRef from ..lib.childref import ChildRef
from txn import DbTxn from .txn import DbTxn
from exceptions import DbTransactionCancel from .exceptions import DbTransactionCancel
class DbReadBase(object): class DbReadBase(object):
""" """

View File

@ -30,6 +30,7 @@ Declare constants used by database modules
# standard python modules # standard python modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import sys
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -60,14 +61,14 @@ DBLOGNAME = ".Db" # Name of logger
DBMODE_R = "r" # Read-only access DBMODE_R = "r" # Read-only access
DBMODE_W = "w" # Full Read/Write access DBMODE_W = "w" # Full Read/Write access
DBPAGE = 16384 # Size of the pages used to hold items in the database DBPAGE = 16384 # Size of the pages used to hold items in the database
DBMODE = 0666 # Unix mode for database creation DBMODE = 0o666 # Unix mode for database creation
DBCACHE = 0x4000000 # Size of the shared memory buffer pool DBCACHE = 0x4000000 # Size of the shared memory buffer pool
DBLOCKS = 100000 # Maximum number of locks supported DBLOCKS = 100000 # Maximum number of locks supported
DBOBJECTS = 100000 # Maximum number of simultaneously locked objects DBOBJECTS = 100000 # Maximum number of simultaneously locked objects
DBUNDO = 1000 # Maximum size of undo buffer DBUNDO = 1000 # Maximum size of undo buffer
from ..config import config from ..config import config
if config.get('preferences.use-bsddb3'): if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY from bsddb3.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY
else: else:
from bsddb.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY from bsddb.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY

View File

@ -25,21 +25,27 @@
""" """
Read classes for the GRAMPS databases. Read classes for the GRAMPS databases.
""" """
from __future__ import with_statement
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# libraries # libraries
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import cPickle from __future__ import print_function, with_statement
import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
import time import time
import random import random
import locale import locale
import os import os
from sys import maxint from sys import maxsize
from ..config import config from ..config import config
if config.get('preferences.use-bsddb3'): if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import db from bsddb3 import db
else: else:
from bsddb import db from bsddb import db
@ -68,12 +74,13 @@ from ..lib.genderstats import GenderStats
from ..lib.researcher import Researcher from ..lib.researcher import Researcher
from ..lib.nameorigintype import NameOriginType from ..lib.nameorigintype import NameOriginType
from dbconst import * from .dbconst import *
from ..utils.callback import Callback from ..utils.callback import Callback
from ..utils.cast import conv_dbstr_to_unicode from ..utils.cast import conv_dbstr_to_unicode
from . import (BsddbBaseCursor, DbReadBase) from . import (BsddbBaseCursor, DbReadBase)
from ..utils.id import create_id from ..utils.id import create_id
from ..errors import DbError from ..errors import DbError
from ..constfunc import UNITYPE, STRTYPE, cuni
LOG = logging.getLogger(DBLOGNAME) LOG = logging.getLogger(DBLOGNAME)
LOG = logging.getLogger(".citation") LOG = logging.getLogger(".citation")
@ -82,7 +89,7 @@ LOG = logging.getLogger(".citation")
# constants # constants
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from dbconst import * from .dbconst import *
_SIGBASE = ('person', 'family', 'source', 'citation', _SIGBASE = ('person', 'family', 'source', 'citation',
'event', 'media', 'place', 'location', 'repository', 'event', 'media', 'place', 'location', 'repository',
@ -99,12 +106,14 @@ DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
def find_surname(key, data): def find_surname(key, data):
""" """
Creating a surname from raw data of a person, to use for sort and index Creating a surname from raw data of a person, to use for sort and index
returns a byte string
""" """
return __index_surname(data[3][5]) return __index_surname(data[3][5])
def find_surname_name(key, data): def find_surname_name(key, data):
""" """
Creating a surname from raw name, to use for sort and index Creating a surname from raw name, to use for sort and index
returns a byte string
""" """
return __index_surname(data[5]) return __index_surname(data[5])
@ -112,12 +121,13 @@ def __index_surname(surn_list):
""" """
All non pa/matronymic surnames are used in indexing. All non pa/matronymic surnames are used in indexing.
pa/matronymic not as they change for every generation! pa/matronymic not as they change for every generation!
returns a byte string
""" """
if surn_list: if surn_list:
surn = u" ".join([x[0] for x in surn_list if not (x[3][0] in [ surn = " ".join([x[0] for x in surn_list if not (x[3][0] in [
NameOriginType.PATRONYMIC, NameOriginType.MATRONYMIC]) ]) NameOriginType.PATRONYMIC, NameOriginType.MATRONYMIC]) ])
else: else:
surn = u"" surn = ""
return surn.encode('utf-8') return surn.encode('utf-8')
@ -187,7 +197,7 @@ class DbBsddbTreeCursor(BsddbBaseCursor):
data = self.set(str(to_do.pop())) data = self.set(str(to_do.pop()))
_n = self.next_dup _n = self.next_dup
while data: while data:
payload = cPickle.loads(data[1]) payload = pickle.loads(data[1])
yield (payload[0], payload) yield (payload[0], payload)
to_do.append(payload[0]) to_do.append(payload[0])
data = _n() data = _n()
@ -461,7 +471,7 @@ class DbBsddbRead(DbReadBase, Callback):
def get_table_names(self): def get_table_names(self):
"""Return a list of valid table names.""" """Return a list of valid table names."""
return self._tables.keys() return list(self._tables.keys())
def get_table_metadata(self, table_name): def get_table_metadata(self, table_name):
"""Return the metadata for a valid table name.""" """Return the metadata for a valid table name."""
@ -472,7 +482,7 @@ class DbBsddbRead(DbReadBase, Callback):
def get_cursor(self, table, *args, **kwargs): def get_cursor(self, table, *args, **kwargs):
try: try:
return DbReadCursor(table, self.txn) return DbReadCursor(table, self.txn)
except DBERRS, msg: except DBERRS as msg:
self.__log_error() self.__log_error()
raise DbError(msg) raise DbError(msg)
@ -564,9 +574,12 @@ class DbBsddbRead(DbReadBase, Callback):
Helper function for find_next_<object>_gramps_id methods Helper function for find_next_<object>_gramps_id methods
""" """
index = prefix % map_index index = prefix % map_index
while trans.get(str(index), txn=self.txn) is not None: #in bytes
bindex = index.encode('utf-8')
while trans.get(bindex, txn=self.txn) is not None:
map_index += 1 map_index += 1
index = prefix % map_index index = prefix % map_index
bindex = index.encode('utf-8')
map_index += 1 map_index += 1
return (map_index, index) return (map_index, index)
@ -652,7 +665,9 @@ class DbBsddbRead(DbReadBase, Callback):
return gid return gid
def get_from_handle(self, handle, class_type, data_map): def get_from_handle(self, handle, class_type, data_map):
data = data_map.get(str(handle)) if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
data = data_map.get(handle)
if data: if data:
newobj = class_type() newobj = class_type()
newobj.unserialize(data) newobj.unserialize(data)
@ -777,8 +792,10 @@ class DbBsddbRead(DbReadBase, Callback):
return self.get_from_handle(handle, Location, self.location_map) return self.get_from_handle(handle, Location, self.location_map)
def __get_obj_from_gramps_id(self, val, tbl, class_, prim_tbl): def __get_obj_from_gramps_id(self, val, tbl, class_, prim_tbl):
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
try: try:
data = tbl.get(str(val), txn=self.txn) data = tbl.get(val, txn=self.txn)
if data is not None: if data is not None:
obj = class_() obj = class_()
### FIXME: this is a dirty hack that works without no ### FIXME: this is a dirty hack that works without no
@ -788,12 +805,12 @@ class DbBsddbRead(DbReadBase, Callback):
if self.readonly: if self.readonly:
tuple_data = prim_tbl.get(data, txn=self.txn) tuple_data = prim_tbl.get(data, txn=self.txn)
else: else:
tuple_data = cPickle.loads(data) tuple_data = pickle.loads(data)
obj.unserialize(tuple_data) obj.unserialize(tuple_data)
return obj return obj
else: else:
return None return None
except DBERRS, msg: except DBERRS as msg:
self.__log_error() self.__log_error()
raise DbError(msg) raise DbError(msg)
@ -892,17 +909,15 @@ class DbBsddbRead(DbReadBase, Callback):
Return the default grouping name for a surname. Return the default grouping name for a surname.
Return type is a unicode object Return type is a unicode object
""" """
if isinstance(surname, unicode): if isinstance(surname, UNITYPE):
ssurname = surname.encode('utf-8') surname = surname.encode('utf-8')
return conv_dbstr_to_unicode(self.name_group.get(ssurname, ssurname)) return conv_dbstr_to_unicode(self.name_group.get(surname, surname))
else:
return conv_dbstr_to_unicode(self.name_group.get(surname, surname))
def get_name_group_keys(self): def get_name_group_keys(self):
""" """
Return the defined names that have been assigned to a default grouping. Return the defined names that have been assigned to a default grouping.
""" """
return map(conv_dbstr_to_unicode, self.name_group.keys()) return list(map(conv_dbstr_to_unicode, list(self.name_group.keys())))
def has_name_group_key(self, name): def has_name_group_key(self, name):
""" """
@ -910,10 +925,9 @@ class DbBsddbRead(DbReadBase, Callback):
""" """
# The use of has_key seems allright because there is no write lock # The use of has_key seems allright because there is no write lock
# on the name_group table when this is called. # on the name_group table when this is called.
if isinstance(name, unicode): if isinstance(name, UNITYPE):
return self.name_group.has_key(name.encode('utf-8')) name = name.encode('utf-8')
else: return name in self.name_group
return self.name_group.has_key(name)
def get_number_of_records(self, table): def get_number_of_records(self, table):
if not self.db_is_open: if not self.db_is_open:
@ -1188,7 +1202,7 @@ class DbBsddbRead(DbReadBase, Callback):
} }
table = key2table[obj_key] table = key2table[obj_key]
return table.keys() return list(table.keys())
def has_gramps_id(self, obj_key, gramps_id): def has_gramps_id(self, obj_key, gramps_id):
key2table = { key2table = {
@ -1204,8 +1218,9 @@ class DbBsddbRead(DbReadBase, Callback):
} }
table = key2table[obj_key] table = key2table[obj_key]
#return str(gramps_id) in table if isinstance(gramps_id, UNITYPE):
return table.get(str(gramps_id), txn=self.txn) is not None gramps_id = gramps_id.encode('utf-8')
return table.get(gramps_id, txn=self.txn) is not None
def find_initial_person(self): def find_initial_person(self):
person = self.get_default_person() person = self.get_default_person()
@ -1217,7 +1232,7 @@ class DbBsddbRead(DbReadBase, Callback):
@staticmethod @staticmethod
def _validated_id_prefix(val, default): def _validated_id_prefix(val, default):
if isinstance(val, basestring) and val: if isinstance(val, STRTYPE) and val:
try: try:
str_ = val % 1 str_ = val % 1
except TypeError: # missing conversion specifier except TypeError: # missing conversion specifier
@ -1239,23 +1254,24 @@ class DbBsddbRead(DbReadBase, 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 = pattern_match.group(2) ##nr_width = 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):]
if id_number.isdigit(): if id_number.isdigit():
id_value = int(id_number, 10) id_value = int(id_number, 10)
if len(str(id_value)) > nr_width: ## this code never ran, as an int compared to str with > is False!
# The ID to be imported is too large to fit in the ## if len(cuni(id_value)) > nr_width:
# users format. For now just create a new ID, ## # The ID to be imported is too large to fit in the
# because that is also what happens with IDs that ## # users format. For now just create a new ID,
# are identical to IDs already in the database. If ## # because that is also what happens with IDs that
# the problem of colliding import and already ## # are identical to IDs already in the database. If
# present IDs is solved the code here also needs ## # the problem of colliding import and already
# some solution. ## # present IDs is solved the code here also needs
gramps_id = id_pattern % 1 ## # some solution.
else: ## gramps_id = id_pattern % 1
gramps_id = id_pattern % id_value ## else:
gramps_id = id_pattern % id_value
return gramps_id return gramps_id
else: else:
def closure_func(gramps_id): def closure_func(gramps_id):
@ -1439,13 +1455,13 @@ class DbBsddbRead(DbReadBase, Callback):
if person: if person:
return person return person
elif (self.metadata is not None) and (not self.readonly): elif (self.metadata is not None) and (not self.readonly):
self.metadata['default'] = None self.metadata[b'default'] = None
return None return None
def get_default_handle(self): def get_default_handle(self):
"""Return the default Person of the database.""" """Return the default Person of the database."""
if self.metadata is not None: if self.metadata is not None:
return self.metadata.get('default') return self.metadata.get(b'default')
return None return None
def get_save_path(self): def get_save_path(self):
@ -1561,9 +1577,11 @@ class DbBsddbRead(DbReadBase, Callback):
""" """
Helper method for get_raw_<object>_data methods Helper method for get_raw_<object>_data methods
""" """
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
try: try:
return table.get(str(handle), txn=self.txn) return table.get(handle, txn=self.txn)
except DBERRS, msg: except DBERRS as msg:
self.__log_error() self.__log_error()
raise DbError(msg) raise DbError(msg)
@ -1604,9 +1622,11 @@ class DbBsddbRead(DbReadBase, Callback):
""" """
Helper function for has_<object>_handle methods Helper function for has_<object>_handle methods
""" """
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
try: try:
return table.get(str(handle), txn=self.txn) is not None return table.get(handle, txn=self.txn) is not None
except DBERRS, msg: except DBERRS as msg:
self.__log_error() self.__log_error()
raise DbError(msg) raise DbError(msg)
@ -1676,62 +1696,94 @@ class DbBsddbRead(DbReadBase, Callback):
""" """
return self.__has_handle(self.location_map, handle) return self.__has_handle(self.location_map, handle)
def __sortbyperson_key(self, person): def __sortbyperson_key(self, handle):
return locale.strxfrm(find_surname(str(person), if isinstance(handle, UNITYPE):
self.person_map.get(str(person)))) handle = handle.encode('utf-8')
return locale.strxfrm(find_surname(handle,
self.person_map.get(handle)))
def __sortbyplace(self, first, second): def __sortbyplace(self, first, second):
return locale.strcoll(self.place_map.get(str(first))[2], if isinstance(first, UNITYPE):
self.place_map.get(str(second))[2]) first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
return locale.strcoll(self.place_map.get(first)[2],
self.place_map.get(second)[2])
def __sortbyplace_key(self, place): def __sortbyplace_key(self, place):
return locale.strxfrm(self.place_map.get(str(place))[2]) if isinstance(place, UNITYPE):
place = place.encode('utf-8')
return locale.strxfrm(self.place_map.get(place)[2])
def __sortbysource(self, first, second): def __sortbysource(self, first, second):
source1 = unicode(self.source_map[str(first)][2]) if isinstance(first, UNITYPE):
source2 = unicode(self.source_map[str(second)][2]) first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
source1 = cuni(self.source_map[first][2])
source2 = cuni(self.source_map[second][2])
return locale.strcoll(source1, source2) return locale.strcoll(source1, source2)
def __sortbysource_key(self, key): def __sortbysource_key(self, key):
source = unicode(self.source_map[str(key)][2]) if isinstance(key, UNITYPE):
key = key.encode('utf-8')
source = cuni(self.source_map[key][2])
return locale.strxfrm(source) return locale.strxfrm(source)
def __sortbycitation(self, first, second): def __sortbycitation(self, first, second):
citation1 = unicode(self.citation_map[str(first)][3]) if isinstance(first, UNITYPE):
citation2 = unicode(self.citation_map[str(second)][3]) first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
citation1 = cuni(self.citation_map[first][3])
citation2 = cuni(self.citation_map[second][3])
return locale.strcoll(citation1, citation2) return locale.strcoll(citation1, citation2)
def __sortbycitation_key(self, key): def __sortbycitation_key(self, key):
citation = unicode(self.citation_map[str(key)][3]) if isinstance(key, UNITYPE):
key = key.encode('utf-8')
citation = cuni(self.citation_map[key][3])
return locale.strxfrm(citation) return locale.strxfrm(citation)
def __sortbymedia(self, first, second): def __sortbymedia(self, first, second):
media1 = self.media_map[str(first)][4] if isinstance(first, UNITYPE):
media2 = self.media_map[str(second)][4] first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
media1 = self.media_map[first][4]
media2 = self.media_map[second][4]
return locale.strcoll(media1, media2) return locale.strcoll(media1, media2)
def __sortbymedia_key(self, key): def __sortbymedia_key(self, key):
media = self.media_map[str(key)][4] if isinstance(key, UNITYPE):
key = key.encode('utf-8')
media = self.media_map[key][4]
return locale.strxfrm(media) return locale.strxfrm(media)
def __sortbytag(self, first, second): def __sortbytag(self, first, second):
tag1 = self.tag_map[str(first)][1] if isinstance(first, UNITYPE):
tag2 = self.tag_map[str(second)][1] first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
tag1 = self.tag_map[first][1]
tag2 = self.tag_map[second][1]
return locale.strcoll(tag1, tag2) return locale.strcoll(tag1, tag2)
def __sortbytag_key(self, key): def __sortbytag_key(self, key):
tag = self.tag_map[str(key)][1] if isinstance(key, UNITYPE):
key = key.encode('utf-8')
tag = self.tag_map[key][1]
return locale.strxfrm(tag) return locale.strxfrm(tag)
def set_mediapath(self, path): def set_mediapath(self, path):
"""Set the default media path for database, path should be utf-8.""" """Set the default media path for database, path should be utf-8."""
if (self.metadata is not None) and (not self.readonly): if (self.metadata is not None) and (not self.readonly):
self.metadata['mediapath'] = path self.metadata[b'mediapath'] = path
def get_mediapath(self): def get_mediapath(self):
"""Return the default media path of the database.""" """Return the default media path of the database."""
if self.metadata is not None: if self.metadata is not None:
return self.metadata.get('mediapath', None) return self.metadata.get(b'mediapath', None)
return None return None
def find_backlink_handles(self, handle, include_classes=None): def find_backlink_handles(self, handle, include_classes=None):
@ -1808,13 +1860,13 @@ class DbBsddbRead(DbReadBase, Callback):
# Find which tables to iterate over # Find which tables to iterate over
if (include_classes is None): if (include_classes is None):
the_tables = primary_tables.keys() the_tables = list(primary_tables.keys())
else: else:
the_tables = include_classes the_tables = include_classes
# Now we use the functions and classes defined above to loop through # Now we use the functions and classes defined above to loop through
# each of the existing primary object tables # each of the existing primary object tables
for primary_table_name, funcs in the_tables.iteritems(): for primary_table_name, funcs in the_tables.items():
with funcs['cursor_func']() as cursor: with funcs['cursor_func']() as cursor:
# Grab the real object class here so that the lookup does # Grab the real object class here so that the lookup does
@ -1859,7 +1911,7 @@ class DbBsddbRead(DbReadBase, Callback):
name_file = open(filepath, "r") name_file = open(filepath, "r")
name = name_file.read() name = name_file.read()
name_file.close() name_file.close()
except (OSError, IOError), msg: except (OSError, IOError) as msg:
self.__log_error() self.__log_error()
name = None name = None
return name return name

View File

@ -31,13 +31,18 @@ undos and redos.
# Standard python modules # Standard python modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from __future__ import with_statement from __future__ import print_function, with_statement
import time, os import time, os
import cPickle as pickle import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
from collections import deque from collections import deque
from ..config import config from ..config import config
if config.get('preferences.use-bsddb3'): if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import db from bsddb3 import db
else: else:
from bsddb import db from bsddb import db
@ -48,7 +53,7 @@ from ..ggettext import gettext as _
# Gramps modules # Gramps modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from dbconst import * from .dbconst import *
from . import BSDDBTxn from . import BSDDBTxn
from ..errors import DbError from ..errors import DbError
@ -208,7 +213,7 @@ class DbUndo(object):
self.db.txn = None self.db.txn = None
return status return status
except DBERRS, msg: except DBERRS as msg:
self.db._log_error() self.db._log_error()
raise DbError(msg) raise DbError(msg)
@ -301,7 +306,7 @@ class DbUndo(object):
else: else:
db_map.put(handle, data, txn=self.txn) db_map.put(handle, data, txn=self.txn)
except DBERRS, msg: except DBERRS as msg:
self.db._log_error() self.db._log_error()
raise DbError(msg) raise DbError(msg)
@ -322,7 +327,7 @@ class DbUndo(object):
db_map.put(handle, data, txn=self.txn) db_map.put(handle, data, txn=self.txn)
emit(signal, ([handle],)) emit(signal, ([handle],))
except DBERRS, msg: except DBERRS as msg:
self.db._log_error() self.db._log_error()
raise DbError(msg) raise DbError(msg)
@ -455,7 +460,7 @@ class DbUndoBSDDB(DbUndo):
data = cursor.first() data = cursor.first()
while data: while data:
yield data yield data
data = cursor.next() data = next(cursor)
def testundo(): def testundo():
class T: class T:
@ -479,32 +484,32 @@ def testundo():
self.repository_map = {} self.repository_map = {}
self.reference_map = {} self.reference_map = {}
print "list tests" print("list tests")
undo = DbUndoList(D()) undo = DbUndoList(D())
print undo.append('foo') print(undo.append('foo'))
print undo.append('bar') print(undo.append('bar'))
print undo[0] print(undo[0])
undo[0] = 'foobar' undo[0] = 'foobar'
print undo[0] print(undo[0])
print "len", len(undo) print("len", len(undo))
print "iter" print("iter")
for data in undo: for data in undo:
print data print(data)
print print()
print "bsddb tests" print("bsddb tests")
undo = DbUndoBSDDB(D(), '/tmp/testundo') undo = DbUndoBSDDB(D(), '/tmp/testundo')
undo.open() undo.open()
print undo.append('foo') print(undo.append('foo'))
print undo.append('fo2') print(undo.append('fo2'))
print undo.append('fo3') print(undo.append('fo3'))
print undo[1] print(undo[1])
undo[1] = 'bar' undo[1] = 'bar'
print undo[1] print(undo[1])
for data in undo: for data in undo:
print data print(data)
print "len", len(undo) print("len", len(undo))
print "test commit" print("test commit")
undo.commit(T(), msg="test commit") undo.commit(T(), msg="test commit")
undo.close() undo.close()

View File

@ -21,8 +21,9 @@
# $Id$ # $Id$
from __future__ import with_statement from __future__ import with_statement, unicode_literals
import sys
from ..lib.markertype import MarkerType from ..lib.markertype import MarkerType
from ..lib.tag import Tag from ..lib.tag import Tag
import time import time
@ -30,20 +31,21 @@ import logging
LOG = logging.getLogger(".citation") LOG = logging.getLogger(".citation")
from ..ggettext import gettext as _ from ..ggettext import gettext as _
from ..constfunc import cuni
""" """
methods to upgrade a database from version 13 to current version methods to upgrade a database from version 13 to current version
""" """
from ..config import config from ..config import config
if config.get('preferences.use-bsddb3'): if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import db from bsddb3 import db
else: else:
from bsddb import db from bsddb import db
from . import BSDDBTxn from . import BSDDBTxn
from ..lib.nameorigintype import NameOriginType from ..lib.nameorigintype import NameOriginType
from write import _mkname, SURNAMES from .write import _mkname, SURNAMES
from dbconst import (PERSON_KEY, FAMILY_KEY, EVENT_KEY, from .dbconst import (PERSON_KEY, FAMILY_KEY, EVENT_KEY, MEDIA_KEY, PLACE_KEY,
MEDIA_KEY, PLACE_KEY, LOCATION_KEY, REPOSITORY_KEY) LOCATION_KEY, REPOSITORY_KEY)
from gramps.gui.dialog import (InfoDialog) from gramps.gui.dialog import (InfoDialog)
def gramps_upgrade_17(self): def gramps_upgrade_17(self):
@ -70,7 +72,7 @@ def gramps_upgrade_17(self):
self.update() self.update()
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('version', 17) txn.put(b'version', 17)
def add_reference(self, pri_handle, ref_handle): def add_reference(self, pri_handle, ref_handle):
key = (PLACE_KEY, pri_handle) key = (PLACE_KEY, pri_handle)
@ -101,7 +103,7 @@ def match_location(self, parent, item, lat_long):
self.children[handle] = [] self.children[handle] = []
self.children[parent].append(handle) self.children[parent].append(handle)
new_location = (handle, new_location = (handle,
parent, str(parent),
item[1], # Name item[1], # Name
item[0]+1, # Type item[0]+1, # Type
lat_long[0], lat_long[0],
@ -211,10 +213,10 @@ def gramps_upgrade_16(self):
self.update() self.update()
LOG.debug("%d persons upgraded with %d citations in %d seconds. " % LOG.debug("%d persons upgraded with %d citations in %d seconds. " %
(len(self.person_map.keys()), (len(list(self.person_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time)) time.time() - start_time))
data_upgradeobject[key2data[PERSON_KEY]] = (len(self.person_map.keys()), data_upgradeobject[key2data[PERSON_KEY]] = (len(list(self.person_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
@ -247,7 +249,7 @@ def gramps_upgrade_16(self):
LOG.debug("Media upgrade %d citations upgraded in %d seconds" % LOG.debug("Media upgrade %d citations upgraded in %d seconds" %
(self.cmap_index - start_num_citations, (self.cmap_index - start_num_citations,
int(time.time() - start_time))) int(time.time() - start_time)))
data_upgradeobject[key2data[MEDIA_KEY]] = (len(self.media_map.keys()), data_upgradeobject[key2data[MEDIA_KEY]] = (len(list(self.media_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
@ -258,7 +260,7 @@ def gramps_upgrade_16(self):
start_time = time.time() start_time = time.time()
for place_handle in self.place_map.keys(): for place_handle in self.place_map.keys():
place = self.place_map[place_handle] place = self.place_map[place_handle]
(handle, gramps_id, title, long, lat, (handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, media_list, source_list, note_list, main_loc, alt_loc, urls, media_list, source_list, note_list,
change, private) = place change, private) = place
if source_list: if source_list:
@ -271,7 +273,7 @@ def gramps_upgrade_16(self):
self, media_list) self, media_list)
if source_list or media_list: if source_list or media_list:
new_place = (handle, gramps_id, title, new_place = (handle, gramps_id, title,
long, lat, main_loc, alt_loc, urls, int, lat, main_loc, alt_loc, urls,
media_list, new_citation_list, note_list, media_list, new_citation_list, note_list,
change, private) change, private)
with BSDDBTxn(self.env, self.place_map) as txn: with BSDDBTxn(self.env, self.place_map) as txn:
@ -279,10 +281,10 @@ def gramps_upgrade_16(self):
self.update() self.update()
LOG.debug("%d places upgraded with %d citations in %d seconds. " % LOG.debug("%d places upgraded with %d citations in %d seconds. " %
(len(self.place_map.keys()), (len(list(self.place_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time)) time.time() - start_time))
data_upgradeobject[key2data[PLACE_KEY]] = (len(self.place_map.keys()), data_upgradeobject[key2data[PLACE_KEY]] = (len(list(self.place_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
@ -327,10 +329,10 @@ def gramps_upgrade_16(self):
self.update() self.update()
LOG.debug("%d familys upgraded with %d citations in %d seconds. " % LOG.debug("%d familys upgraded with %d citations in %d seconds. " %
(len(self.family_map.keys()), (len(list(self.family_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time)) time.time() - start_time))
data_upgradeobject[key2data[FAMILY_KEY]] = (len(self.family_map.keys()), data_upgradeobject[key2data[FAMILY_KEY]] = (len(list(self.family_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
# --------------------------------- # ---------------------------------
@ -372,10 +374,10 @@ def gramps_upgrade_16(self):
LOG.debug("%d events upgraded with %d citations in %d seconds. " LOG.debug("%d events upgraded with %d citations in %d seconds. "
"Backlinks took %d seconds" % "Backlinks took %d seconds" %
(len(self.event_map.keys()), (len(list(self.event_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
int(upgrade_time), int(backlink_time))) int(upgrade_time), int(backlink_time)))
data_upgradeobject[key2data[EVENT_KEY]] = (len(self.event_map.keys()), data_upgradeobject[key2data[EVENT_KEY]] = (len(list(self.event_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
@ -399,10 +401,10 @@ def gramps_upgrade_16(self):
self.update() self.update()
LOG.debug("%d repositorys upgraded with %d citations in %d seconds. " % LOG.debug("%d repositorys upgraded with %d citations in %d seconds. " %
(len(self.repository_map.keys()), (len(list(self.repository_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time)) time.time() - start_time))
data_upgradeobject[key2data[REPOSITORY_KEY]] = (len(self.repository_map.keys()), data_upgradeobject[key2data[REPOSITORY_KEY]] = (len(list(self.repository_map.keys())),
self.cmap_index - start_num_citations, self.cmap_index - start_num_citations,
time.time() - start_time) time.time() - start_time)
# --------------------------------- # ---------------------------------
@ -475,7 +477,7 @@ def gramps_upgrade_16(self):
# Bump up database version. Separate transaction to save metadata. # Bump up database version. Separate transaction to save metadata.
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('version', 16) txn.put(b'version', 16)
LOG.debug([data_upgradeobject]) LOG.debug([data_upgradeobject])
txt = _("Number of new objects upgraded:\n") txt = _("Number of new objects upgraded:\n")
@ -657,9 +659,9 @@ def gramps_upgrade_15(self):
tags = [tag_handle] tags = [tag_handle]
else: else:
tags = [] tags = []
address_list = map(convert_address, address_list) address_list = list(map(convert_address, address_list))
new_primary_name = convert_name_15(primary_name) new_primary_name = convert_name_15(primary_name)
new_alternate_names = map(convert_name_15, alternate_names) new_alternate_names = list(map(convert_name_15, alternate_names))
new_person = (junk_handle, # 0 new_person = (junk_handle, # 0
gramps_id, # 1 gramps_id, # 1
gender, # 2 gender, # 2
@ -763,7 +765,7 @@ def gramps_upgrade_15(self):
new_place = list(place) new_place = list(place)
if new_place[5] is not None: if new_place[5] is not None:
new_place[5] = convert_location(new_place[5]) new_place[5] = convert_location(new_place[5])
new_place[6] = map(convert_location, new_place[6]) new_place[6] = list(map(convert_location, new_place[6]))
new_place = new_place[:12] + new_place[13:] new_place = new_place[:12] + new_place[13:]
new_place = tuple(new_place) new_place = tuple(new_place)
with BSDDBTxn(self.env, self.place_map) as txn: with BSDDBTxn(self.env, self.place_map) as txn:
@ -791,7 +793,7 @@ def gramps_upgrade_15(self):
repository = self.repository_map[handle] repository = self.repository_map[handle]
new_repository = list(repository) new_repository = list(repository)
new_repository = new_repository[:8] + new_repository[9:] new_repository = new_repository[:8] + new_repository[9:]
new_repository[5] = map(convert_address, new_repository[5]) new_repository[5] = list(map(convert_address, new_repository[5]))
new_repository = tuple(new_repository) new_repository = tuple(new_repository)
with BSDDBTxn(self.env, self.repository_map) as txn: with BSDDBTxn(self.env, self.repository_map) as txn:
txn.put(str(handle), new_repository) txn.put(str(handle), new_repository)
@ -799,13 +801,13 @@ def gramps_upgrade_15(self):
# Bump up database version. Separate transaction to save metadata. # Bump up database version. Separate transaction to save metadata.
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('version', 15) txn.put(b'version', 15)
def convert_marker(self, marker_field): def convert_marker(self, marker_field):
"""Convert a marker into a tag.""" """Convert a marker into a tag."""
marker = MarkerType() marker = MarkerType()
marker.unserialize(marker_field) marker.unserialize(marker_field)
tag_name = unicode(marker) tag_name = cuni(marker)
if tag_name != '': if tag_name != '':
if tag_name not in self.tags: if tag_name not in self.tags:
@ -824,7 +826,7 @@ def convert_marker(self, marker_field):
def convert_locbase(loc): def convert_locbase(loc):
"""Convert location base to include an empty locality field.""" """Convert location base to include an empty locality field."""
return tuple([loc[0], u''] + list(loc[1:])) return tuple([loc[0], ''] + list(loc[1:]))
def convert_location(loc): def convert_location(loc):
"""Convert a location into the new format.""" """Convert a location into the new format."""
@ -840,26 +842,26 @@ def convert_name_15(name):
name_type, prefix, patronymic, name_type, prefix, patronymic,
group_as, sort_as, display_as, call) = name group_as, sort_as, display_as, call) = name
connector = u"" connector = ""
origintype = (NameOriginType.NONE, u"") origintype = (NameOriginType.NONE, "")
patorigintype = (NameOriginType.PATRONYMIC, u"") patorigintype = (NameOriginType.PATRONYMIC, "")
if patronymic.strip() == u"": if patronymic.strip() == "":
#no patronymic, create a single surname #no patronymic, create a single surname
surname_list = [(surname, prefix, True, origintype, connector)] surname_list = [(surname, prefix, True, origintype, connector)]
else: else:
#a patronymic, if no surname or equal as patronymic, a single surname #a patronymic, if no surname or equal as patronymic, a single surname
if (surname.strip() == u"") or (surname == patronymic and prefix == u""): if (surname.strip() == "") or (surname == patronymic and prefix == ""):
surname_list = [(patronymic, prefix, True, patorigintype, connector)] surname_list = [(patronymic, prefix, True, patorigintype, connector)]
else: else:
#two surnames, first patronymic, then surname which is primary #two surnames, first patronymic, then surname which is primary
surname_list = [(patronymic, u"", False, patorigintype, u""), surname_list = [(patronymic, "", False, patorigintype, ""),
(surname, prefix, True, origintype, connector)] (surname, prefix, True, origintype, connector)]
#return new value, add two empty strings for nick and family nick #return new value, add two empty strings for nick and family nick
return (privacy, source_list, note_list, date, return (privacy, source_list, note_list, date,
first_name, surname_list, suffix, title, name_type, first_name, surname_list, suffix, title, name_type,
group_as, sort_as, display_as, call, u"", u"") group_as, sort_as, display_as, call, "", "")
def gramps_upgrade_14(self): def gramps_upgrade_14(self):
"""Upgrade database from version 13 to 14.""" """Upgrade database from version 13 to 14."""
@ -1067,12 +1069,12 @@ def gramps_upgrade_14(self):
# --------------------------------- # ---------------------------------
for place_handle in self.place_map.keys(): for place_handle in self.place_map.keys():
place = self.place_map[place_handle] place = self.place_map[place_handle]
(handle, gramps_id, title, long, lat, (handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, media_list, source_list, note_list, main_loc, alt_loc, urls, media_list, source_list, note_list,
change, marker, private) = place change, marker, private) = place
new_media_list = new_media_list_14(media_list) new_media_list = new_media_list_14(media_list)
new_source_list = new_source_list_14(source_list) new_source_list = new_source_list_14(source_list)
new_place = (handle, gramps_id, title, long, lat, new_place = (handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, new_media_list, main_loc, alt_loc, urls, new_media_list,
new_source_list, note_list, change, marker, private) new_source_list, note_list, change, marker, private)
@ -1101,7 +1103,7 @@ def gramps_upgrade_14(self):
# Bump up database version. Separate transaction to save metadata. # Bump up database version. Separate transaction to save metadata.
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('version', 14) txn.put(b'version', 14)
def new_source_list_14(source_list): def new_source_list_14(source_list):
new_source_list = [] new_source_list = []

View File

@ -32,19 +32,23 @@ This is used since GRAMPS version 3.0
# Standard python modules # Standard python modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from __future__ import with_statement from __future__ import print_function, with_statement
import cPickle as pickle import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
import os import os
import time import time
import locale import locale
import bisect import bisect
from functools import wraps from functools import wraps
import logging import logging
from sys import maxint from sys import maxsize
from ..ggettext import gettext as _ from ..ggettext import gettext as _
from ..config import config from ..config import config
if config.get('preferences.use-bsddb3'): if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import dbshelve, db from bsddb3 import dbshelve, db
else: else:
from bsddb import dbshelve, db from bsddb import dbshelve, db
@ -72,12 +76,12 @@ from . import (DbBsddbRead, DbWriteBase, BSDDBTxn,
DbTxn, BsddbBaseCursor, BsddbDowngradeError, DbVersionError, DbTxn, BsddbBaseCursor, BsddbDowngradeError, DbVersionError,
DbEnvironmentError, DbUpgradeRequiredError, find_surname, DbEnvironmentError, DbUpgradeRequiredError, find_surname,
find_surname_name, DbUndoBSDDB as DbUndo) find_surname_name, DbUndoBSDDB as DbUndo)
from dbconst import * from .dbconst import *
from ..utils.callback import Callback from ..utils.callback import Callback
from ..utils.cast import (conv_unicode_tosrtkey, conv_dbstr_to_unicode) from ..utils.cast import (conv_unicode_tosrtkey, conv_dbstr_to_unicode)
from ..updatecallback import UpdateCallback from ..updatecallback import UpdateCallback
from ..errors import DbError from ..errors import DbError
from ..constfunc import win from ..constfunc import win, conv_to_unicode, cuni, UNITYPE
_LOG = logging.getLogger(DBLOGNAME) _LOG = logging.getLogger(DBLOGNAME)
LOG = logging.getLogger(".citation") LOG = logging.getLogger(".citation")
@ -168,13 +172,27 @@ KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def find_idmap(key, data): def find_idmap(key, data):
return str(data[1]) """ return id for association of secondary index.
returns a byte string
"""
val = data[1]
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
def find_parent(key, data): def find_parent(key, data):
return str(data[1]) return str(data[1])
val = data[1]
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
def find_name(key, data): def find_name(key, data):
return str(data[2]).upper() return str(data[2]).upper()
val = data[2].upper()
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
# Secondary database key lookups for reference_map table # Secondary database key lookups for reference_map table
# reference_map data values are of the form: # reference_map data values are of the form:
@ -182,10 +200,22 @@ def find_name(key, data):
# (referenced_object_class_name, referenced_object_handle)) # (referenced_object_class_name, referenced_object_handle))
def find_primary_handle(key, data): def find_primary_handle(key, data):
return str((data)[0][1]) """ return handle for association of indexes
returns byte string
"""
val = (data)[0][1]
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
def find_referenced_handle(key, data): def find_referenced_handle(key, data):
return str((data)[1][1]) """ return handle for association of indexes
returns byte string
"""
val = (data)[1][1]
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
return val
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -210,7 +240,7 @@ class DbBsddbAssocCursor(BsddbBaseCursor):
BsddbBaseCursor.__init__(self, txn=txn, **kwargs) BsddbBaseCursor.__init__(self, txn=txn, **kwargs)
self.cursor = source.cursor(txn) self.cursor = source.cursor(txn)
self.source = source self.source = source
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# DbBsddb # DbBsddb
@ -243,8 +273,11 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# 3. Special signal for change in home person # 3. Special signal for change in home person
__signals__['home-person-changed'] = None __signals__['home-person-changed'] = None
# 4. Signal for change in person group name, parameters are # 4. Signal for change in person group name, parameters are
__signals__['person-groupname-rebuild'] = (unicode, unicode) if sys.version_info[0] < 3:
__signals__['person-groupname-rebuild'] = (unicode, unicode)
else:
__signals__['person-groupname-rebuild'] = (str, str)
def __init__(self): def __init__(self):
"""Create a new GrampsDB.""" """Create a new GrampsDB."""
@ -268,7 +301,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def try_(self, *args, **kwargs): def try_(self, *args, **kwargs):
try: try:
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
except DBERRS, msg: except DBERRS as msg:
self.__log_error() self.__log_error()
raise DbError(msg) raise DbError(msg)
return try_ return try_
@ -371,10 +404,13 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
@catch_db_error @catch_db_error
def set_default_person_handle(self, handle): def set_default_person_handle(self, handle):
"""Set the default Person to the passed instance.""" """Set the default Person to the passed instance."""
#we store a byte string!
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
if not self.readonly: if not self.readonly:
# Start transaction # Start transaction
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('default', str(handle)) txn.put(b'default', handle)
self.emit('home-person-changed') self.emit('home-person-changed')
@catch_db_error @catch_db_error
@ -386,7 +422,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
elif (self.metadata) and (not self.readonly): elif (self.metadata) and (not self.readonly):
# Start transaction # Start transaction
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('default', None) txn.put(b'default', None)
return None return None
def set_mediapath(self, path): def set_mediapath(self, path):
@ -394,7 +430,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if self.metadata and not self.readonly: if self.metadata and not self.readonly:
# Start transaction # Start transaction
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('mediapath', path) txn.put(b'mediapath', path)
def __check_bdb_version(self, name): def __check_bdb_version(self, name):
"""Older version of Berkeley DB can't read data created by a newer """Older version of Berkeley DB can't read data created by a newer
@ -409,6 +445,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
except: except:
# Just assume that the Berkeley DB version is OK. # Just assume that the Berkeley DB version is OK.
pass pass
if not env_version:
#empty file, assume it is ok to open
env_version = (0, 0, 0)
if (env_version[0] > bdb_version[0]) or \ if (env_version[0] > bdb_version[0]) or \
(env_version[0] == bdb_version[0] and (env_version[0] == bdb_version[0] and
env_version[1] > bdb_version[1]): env_version[1] > bdb_version[1]):
@ -419,12 +458,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
@catch_db_error @catch_db_error
def version_supported(self): def version_supported(self):
dbversion = self.metadata.get('version', default=0) dbversion = self.metadata.get(b'version', default=0)
return ((dbversion <= _DBVERSION) and (dbversion >= _MINVERSION)) return ((dbversion <= _DBVERSION) and (dbversion >= _MINVERSION))
@catch_db_error @catch_db_error
def need_upgrade(self): def need_upgrade(self):
dbversion = self.metadata.get('version', default=0) dbversion = self.metadata.get(b'version', default=0)
return not self.readonly and dbversion < _DBVERSION return not self.readonly and dbversion < _DBVERSION
def __check_readonly(self, name): def __check_readonly(self, name):
@ -502,7 +541,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
try: try:
self.env.open(env_name, env_flags) self.env.open(env_name, env_flags)
except Exception, msg: except Exception as msg:
_LOG.warning("Error opening db environment: " + str(msg)) _LOG.warning("Error opening db environment: " + str(msg))
try: try:
self.__close_early() self.__close_early()
@ -525,7 +564,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
raise DbVersionError() raise DbVersionError()
self.__load_metadata() self.__load_metadata()
gstats = self.metadata.get('gender_stats', default=None) gstats = self.metadata.get(b'gender_stats', default=None)
# Ensure version info in metadata # Ensure version info in metadata
if not self.readonly: if not self.readonly:
@ -533,12 +572,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
if gstats is None: if gstats is None:
# New database. Set up the current version. # New database. Set up the current version.
#self.metadata.put('version', _DBVERSION, txn=the_txn) #self.metadata.put(b'version', _DBVERSION, txn=the_txn)
txn.put('version', _DBVERSION) txn.put(b'version', _DBVERSION)
elif 'version' not in self.metadata: elif b'version' not in self.metadata:
# Not new database, but the version is missing. # Not new database, but the version is missing.
# Use 0, but it is likely to fail anyway. # Use 0, but it is likely to fail anyway.
txn.put('version', 0) txn.put(b'version', 0)
self.genderStats = GenderStats(gstats) self.genderStats = GenderStats(gstats)
@ -626,7 +665,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def __load_metadata(self): def __load_metadata(self):
# name display formats # name display formats
self.name_formats = self.metadata.get('name_formats', default=[]) self.name_formats = self.metadata.get(b'name_formats', default=[])
# upgrade formats if they were saved in the old way # upgrade formats if they were saved in the old way
for format_ix in range(len(self.name_formats)): for format_ix in range(len(self.name_formats)):
format = self.name_formats[format_ix] format = self.name_formats[format_ix]
@ -636,7 +675,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# database owner # database owner
try: try:
owner_data = self.metadata.get('researcher') owner_data = self.metadata.get(b'researcher')
if owner_data: if owner_data:
if len(owner_data[0]) == 7: # Pre-3.3 format if len(owner_data[0]) == 7: # Pre-3.3 format
owner_data = upgrade_researcher(owner_data) owner_data = upgrade_researcher(owner_data)
@ -647,35 +686,35 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# bookmarks # bookmarks
meta = lambda meta: self.metadata.get(meta, default=[]) meta = lambda meta: self.metadata.get(meta, default=[])
self.bookmarks.set(meta('bookmarks')) self.bookmarks.set(meta(b'bookmarks'))
self.family_bookmarks.set(meta('family_bookmarks')) self.family_bookmarks.set(meta(b'family_bookmarks'))
self.event_bookmarks.set(meta('event_bookmarks')) self.event_bookmarks.set(meta(b'event_bookmarks'))
self.source_bookmarks.set(meta('source_bookmarks')) self.source_bookmarks.set(meta(b'source_bookmarks'))
self.citation_bookmarks.set(meta('citation_bookmarks')) self.citation_bookmarks.set(meta(b'citation_bookmarks'))
self.repo_bookmarks.set(meta('repo_bookmarks')) self.repo_bookmarks.set(meta(b'repo_bookmarks'))
self.media_bookmarks.set(meta('media_bookmarks')) self.media_bookmarks.set(meta(b'media_bookmarks'))
self.place_bookmarks.set(meta('place_bookmarks')) self.place_bookmarks.set(meta(b'place_bookmarks'))
self.note_bookmarks.set(meta('note_bookmarks')) self.note_bookmarks.set(meta(b'note_bookmarks'))
# Custom type values # Custom type values
self.family_event_names = set(meta('fevent_names')) self.family_event_names = set(meta(b'fevent_names'))
self.individual_event_names = set(meta('pevent_names')) self.individual_event_names = set(meta(b'pevent_names'))
self.family_attributes = set(meta('fattr_names')) self.family_attributes = set(meta(b'fattr_names'))
self.individual_attributes = set(meta('pattr_names')) self.individual_attributes = set(meta(b'pattr_names'))
self.marker_names = set(meta('marker_names')) self.marker_names = set(meta(b'marker_names'))
self.child_ref_types = set(meta('child_refs')) self.child_ref_types = set(meta(b'child_refs'))
self.family_rel_types = set(meta('family_rels')) self.family_rel_types = set(meta(b'family_rels'))
self.event_role_names = set(meta('event_roles')) self.event_role_names = set(meta(b'event_roles'))
self.name_types = set(meta('name_types')) self.name_types = set(meta(b'name_types'))
self.origin_types = set(meta('origin_types')) self.origin_types = set(meta(b'origin_types'))
self.repository_types = set(meta('repo_types')) self.repository_types = set(meta(b'repo_types'))
self.note_types = set(meta('note_types')) self.note_types = set(meta(b'note_types'))
self.source_media_types = set(meta('sm_types')) self.source_media_types = set(meta(b'sm_types'))
self.url_types = set(meta('url_types')) self.url_types = set(meta(b'url_types'))
self.media_attributes = set(meta('mattr_names')) self.media_attributes = set(meta(b'mattr_names'))
# surname list # surname list
self.surname_list = meta('surname_list') self.surname_list = meta(b'surname_list')
def __connect_secondary(self): def __connect_secondary(self):
""" """
@ -871,8 +910,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
result_list = list(find_backlink_handles(handle)) result_list = list(find_backlink_handles(handle))
""" """
if isinstance(handle, UNITYPE):
handle = str(handle) handle = handle.encode('utf-8')
# 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()
@ -1006,25 +1045,34 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
Remove the reference specified by the key, preserving the change in Remove the reference specified by the key, preserving the change in
the passed transaction. the passed transaction.
""" """
if isinstance(key, tuple):
#create a string key
key = str(key)
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
if not self.readonly: if not self.readonly:
if not transaction.batch: if not transaction.batch:
old_data = self.reference_map.get(str(key), txn=txn) old_data = self.reference_map.get(key, txn=txn)
transaction.add(REFERENCE_KEY, TXNDEL, str(key), old_data, None) transaction.add(REFERENCE_KEY, TXNDEL, key, old_data, None)
#transaction.reference_del.append(str(key)) #transaction.reference_del.append(str(key))
self.reference_map.delete(str(key), txn=txn) self.reference_map.delete(key, txn=txn)
def __add_reference(self, key, data, transaction, txn): def __add_reference(self, key, data, transaction, txn):
""" """
Add the reference specified by the key and the data, preserving the Add the reference specified by the key and the data, preserving the
change in the passed transaction. change in the passed transaction.
""" """
if isinstance(key, tuple):
#create a string key
key = str(key)
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
if self.readonly or not key: if self.readonly or not key:
return return
self.reference_map.put(str(key), data, txn=txn) self.reference_map.put(key, data, txn=txn)
if not transaction.batch: if not transaction.batch:
transaction.add(REFERENCE_KEY, TXNADD, str(key), None, data) transaction.add(REFERENCE_KEY, TXNADD, key, None, data)
#transaction.reference_add.append((str(key), data)) #transaction.reference_add.append((str(key), data))
@catch_db_error @catch_db_error
@ -1111,45 +1159,45 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
# name display formats # name display formats
txn.put('name_formats', self.name_formats) txn.put(b'name_formats', self.name_formats)
# database owner # database owner
owner_data = self.owner.serialize() owner_data = self.owner.serialize()
txn.put('researcher', owner_data) txn.put(b'researcher', owner_data)
# bookmarks # bookmarks
txn.put('bookmarks', self.bookmarks.get()) txn.put(b'bookmarks', self.bookmarks.get())
txn.put('family_bookmarks', self.family_bookmarks.get()) txn.put(b'family_bookmarks', self.family_bookmarks.get())
txn.put('event_bookmarks', self.event_bookmarks.get()) txn.put(b'event_bookmarks', self.event_bookmarks.get())
txn.put('source_bookmarks', self.source_bookmarks.get()) txn.put(b'source_bookmarks', self.source_bookmarks.get())
txn.put('citation_bookmarks', self.citation_bookmarks.get()) txn.put(b'citation_bookmarks', self.citation_bookmarks.get())
txn.put('place_bookmarks', self.place_bookmarks.get()) txn.put(b'place_bookmarks', self.place_bookmarks.get())
txn.put('repo_bookmarks', self.repo_bookmarks.get()) txn.put(b'repo_bookmarks', self.repo_bookmarks.get())
txn.put('media_bookmarks', self.media_bookmarks.get()) txn.put(b'media_bookmarks', self.media_bookmarks.get())
txn.put('note_bookmarks', self.note_bookmarks.get()) txn.put(b'note_bookmarks', self.note_bookmarks.get())
# gender stats # gender stats
txn.put('gender_stats', self.genderStats.save_stats()) txn.put(b'gender_stats', self.genderStats.save_stats())
# Custom type values # Custom type values
txn.put('fevent_names', list(self.family_event_names)) txn.put(b'fevent_names', list(self.family_event_names))
txn.put('pevent_names', list(self.individual_event_names)) txn.put(b'pevent_names', list(self.individual_event_names))
txn.put('fattr_names', list(self.family_attributes)) txn.put(b'fattr_names', list(self.family_attributes))
txn.put('pattr_names', list(self.individual_attributes)) txn.put(b'pattr_names', list(self.individual_attributes))
txn.put('marker_names', list(self.marker_names)) txn.put(b'marker_names', list(self.marker_names))
txn.put('child_refs', list(self.child_ref_types)) txn.put(b'child_refs', list(self.child_ref_types))
txn.put('family_rels', list(self.family_rel_types)) txn.put(b'family_rels', list(self.family_rel_types))
txn.put('event_roles', list(self.event_role_names)) txn.put(b'event_roles', list(self.event_role_names))
txn.put('name_types', list(self.name_types)) txn.put(b'name_types', list(self.name_types))
txn.put('origin_types', list(self.origin_types)) txn.put(b'origin_types', list(self.origin_types))
txn.put('repo_types', list(self.repository_types)) txn.put(b'repo_types', list(self.repository_types))
txn.put('note_types', list(self.note_types)) txn.put(b'note_types', list(self.note_types))
txn.put('sm_types', list(self.source_media_types)) txn.put(b'sm_types', list(self.source_media_types))
txn.put('url_types', list(self.url_types)) txn.put(b'url_types', list(self.url_types))
txn.put('mattr_names', list(self.media_attributes)) txn.put(b'mattr_names', list(self.media_attributes))
# name display formats # name display formats
txn.put('surname_list', self.surname_list) txn.put(b'surname_list', self.surname_list)
self.metadata.close() self.metadata.close()
@ -1256,9 +1304,14 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
versionpath = os.path.join(self.path, BDBVERSFN) versionpath = os.path.join(self.path, BDBVERSFN)
try: try:
with open(versionpath, "w") as version_file: with open(versionpath, "w") as version_file:
version_file.write(str(db.version())) version = str(db.version())
if sys.version_info[0] < 3:
if isinstance(version, UNITYPE):
version = version.encode('utf-8')
version_file.write(version)
except: except:
# Storing the version of Berkeley Db is not really vital. # Storing the version of Berkeley Db is not really vital.
print ("Error storing berkeley db version")
pass pass
try: try:
@ -1268,7 +1321,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def create_id(self): def create_id(self):
return "%08x%08x" % ( int(time.time()*10000), return "%08x%08x" % ( int(time.time()*10000),
self.rand.randint(0, maxint)) self.rand.randint(0, maxsize))
def __add_object(self, obj, transaction, find_next_func, commit_func): def __add_object(self, obj, transaction, find_next_func, commit_func):
if find_next_func and not obj.gramps_id: if find_next_func and not obj.gramps_id:
@ -1415,7 +1468,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if self.readonly or not handle: if self.readonly or not handle:
return return
handle = str(handle) if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
if transaction.batch: if transaction.batch:
with BSDDBTxn(self.env, data_map) as txn: with BSDDBTxn(self.env, data_map) as txn:
self.delete_primary_from_reference_map(handle, transaction, self.delete_primary_from_reference_map(handle, transaction,
@ -1439,6 +1493,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
person = self.get_person_from_handle(handle) person = self.get_person_from_handle(handle)
self.genderStats.uncount_person (person) self.genderStats.uncount_person (person)
self.remove_from_surname_list(person) self.remove_from_surname_list(person)
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
if transaction.batch: if transaction.batch:
with BSDDBTxn(self.env, self.person_map) as txn: with BSDDBTxn(self.env, self.person_map) as txn:
self.delete_primary_from_reference_map(handle, transaction, self.delete_primary_from_reference_map(handle, transaction,
@ -1447,7 +1503,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
else: else:
self.delete_primary_from_reference_map(handle, transaction, self.delete_primary_from_reference_map(handle, transaction,
txn=self.txn) txn=self.txn)
self.person_map.delete(str(handle), txn=self.txn) self.person_map.delete(handle, txn=self.txn)
transaction.add(PERSON_KEY, TXNDEL, handle, person.serialize(), None) transaction.add(PERSON_KEY, TXNDEL, handle, person.serialize(), None)
def remove_source(self, handle, transaction): def remove_source(self, handle, transaction):
@ -1542,7 +1598,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if group is not None: if group is not None:
txn.put(sname, group) txn.put(sname, group)
if group == None: if group == None:
grouppar = u'' grouppar = ''
else: else:
grouppar = group grouppar = group
self.emit('person-groupname-rebuild', (name, grouppar)) self.emit('person-groupname-rebuild', (name, grouppar))
@ -1568,7 +1624,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
""" """
if batch_transaction: if batch_transaction:
return return
name = unicode(find_surname_name(person.handle, name = conv_to_unicode(find_surname_name(person.handle,
person.get_primary_name().serialize()), 'utf-8') person.get_primary_name().serialize()), 'utf-8')
i = bisect.bisect(self.surname_list, name) i = bisect.bisect(self.surname_list, name)
if 0 < i <= len(self.surname_list): if 0 < i <= len(self.surname_list):
@ -1588,11 +1644,18 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
""" """
name = find_surname_name(person.handle, name = find_surname_name(person.handle,
person.get_primary_name().serialize()) person.get_primary_name().serialize())
if isinstance(name, unicode): if sys.version_info[0] < 3:
uname = name if isinstance(name, unicode):
name = str(name) uname = name
name = str(name)
else:
uname = unicode(name, 'utf-8')
else: else:
uname = unicode(name, 'utf-8') if isinstance(name, str):
uname = name
name = name.encode('utf-8')
else:
uname = str(name)
try: try:
cursor = self.surnames.cursor(txn=self.txn) cursor = self.surnames.cursor(txn=self.txn)
cursor_position = cursor.set(name) cursor_position = cursor.set(name)
@ -1601,7 +1664,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
i = bisect.bisect(self.surname_list, uname) i = bisect.bisect(self.surname_list, uname)
if 0 <= i-1 < len(self.surname_list): if 0 <= i-1 < len(self.surname_list):
del self.surname_list[i-1] del self.surname_list[i-1]
except db.DBError, err: except db.DBError as err:
if str(err) == "(0, 'DB object has been closed')": if str(err) == "(0, 'DB object has been closed')":
pass # A batch transaction closes the surnames db table. pass # A batch transaction closes the surnames db table.
else: else:
@ -1619,7 +1682,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
return return
obj.change = int(change_time or time.time()) obj.change = int(change_time or time.time())
handle = str(obj.handle) handle = obj.handle
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
self.update_reference_map(obj, transaction, self.txn) self.update_reference_map(obj, transaction, self.txn)
@ -1850,8 +1915,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
transaction, change_time) transaction, change_time)
def get_from_handle(self, handle, class_type, data_map): def get_from_handle(self, handle, class_type, data_map):
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
try: try:
data = data_map.get(str(handle), txn=self.txn) data = data_map.get(handle, txn=self.txn)
except: except:
data = None data = None
# under certain circumstances during a database reload, # under certain circumstances during a database reload,
@ -1936,7 +2003,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.env.log_flush() self.env.log_flush()
if not transaction.batch: if not transaction.batch:
emit = self.__emit emit = self.__emit
for obj_type, obj_name in KEY_TO_NAME_MAP.iteritems(): for obj_type, obj_name in KEY_TO_NAME_MAP.items():
emit(transaction, obj_type, TXNADD, obj_name, '-add') emit(transaction, obj_type, TXNADD, obj_name, '-add')
emit(transaction, obj_type, TXNUPD, obj_name, '-update') emit(transaction, obj_type, TXNUPD, obj_name, '-update')
emit(transaction, obj_type, TXNDEL, obj_name, '-delete') emit(transaction, obj_type, TXNDEL, obj_name, '-delete')
@ -1983,7 +2050,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# "while Gtk.events_pending(): Gtk.main_iteration() loop" # "while Gtk.events_pending(): Gtk.main_iteration() loop"
# (typically used in a progress bar), so emit rebuild signals # (typically used in a progress bar), so emit rebuild signals
# to correct that. # to correct that.
object_types = set([x[0] for x in transaction.keys()]) object_types = set([x[0] for x in list(transaction.keys())])
for object_type in object_types: for object_type in object_types:
if object_type == REFERENCE_KEY: if object_type == REFERENCE_KEY:
continue continue
@ -2040,17 +2107,19 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
def gramps_upgrade(self, callback=None): def gramps_upgrade(self, callback=None):
UpdateCallback.__init__(self, callback) UpdateCallback.__init__(self, callback)
version = self.metadata.get('version', default=_MINVERSION) version = self.metadata.get(b'version', default=_MINVERSION)
t = time.time() t = time.time()
import upgrade from . import upgrade
if version < 14: if version < 14:
upgrade.gramps_upgrade_14(self) upgrade.gramps_upgrade_14(self)
if version < 15: if version < 15:
upgrade.gramps_upgrade_15(self) upgrade.gramps_upgrade_15(self)
if version < 16: if version < 16:
upgrade.gramps_upgrade_16(self) upgrade.gramps_upgrade_16(self)
if version < 17:
upgrade.gramps_upgrade_17(self)
self.reset() self.reset()
self.set_total(6) self.set_total(6)
@ -2064,9 +2133,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__close_undodb() self.__close_undodb()
self.db_is_open = False self.db_is_open = False
if version < 17:
self.__connect_secondary()
upgrade.gramps_upgrade_17(self)
_LOG.debug("Upgrade time: %d seconds" % int(time.time()-t)) _LOG.debug("Upgrade time: %d seconds" % int(time.time()-t))
@ -2120,7 +2186,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.metadata = self.__open_shelf(full_name, META) self.metadata = self.__open_shelf(full_name, META)
with BSDDBTxn(self.env, self.metadata) as txn: with BSDDBTxn(self.env, self.metadata) as txn:
txn.put('version', _DBVERSION) txn.put(b'version', _DBVERSION)
self.metadata.close() self.metadata.close()
self.env.close() self.env.close()
@ -2193,13 +2259,14 @@ if __name__ == "__main__":
db_name = f.read() db_name = f.read()
if db_name == 'Small Example': if db_name == 'Small Example':
break break
print "loading", db_path print("loading", db_path)
d.load(db_path, lambda x: x) d.load(db_path, lambda x: x)
print d.get_default_person() print(d.get_default_person())
out = ''
with d.get_person_cursor() as c: with d.get_person_cursor() as c:
for key, data in c: for key, data in c:
person = Person(data) person = Person(data)
print key, person.get_primary_name().get_name(), out += key + person.get_primary_name().get_name()
print d.surnames.keys() print(out, list(d.surnames.keys()))

View File

@ -25,25 +25,25 @@
Package providing filter rules for GRAMPS. Package providing filter rules for GRAMPS.
""" """
from _allplaces import AllPlaces from ._allplaces import AllPlaces
from _hascitation import HasCitation from ._hascitation import HasCitation
from _hasgallery import HasGallery from ._hasgallery import HasGallery
from _hasidof import HasIdOf from ._hasidof import HasIdOf
from _regexpidof import RegExpIdOf from ._regexpidof import RegExpIdOf
from _hasnote import HasNote from ._hasnote import HasNote
from _hasnoteregexp import HasNoteRegexp from ._hasnoteregexp import HasNoteRegexp
from _hasnotematchingsubstringof import HasNoteMatchingSubstringOf from ._hasnotematchingsubstringof import HasNoteMatchingSubstringOf
from _hasreferencecountof import HasReferenceCountOf from ._hasreferencecountof import HasReferenceCountOf
from _hassourcecount import HasSourceCount from ._hassourcecount import HasSourceCount
from _hassourceof import HasSourceOf from ._hassourceof import HasSourceOf
from _placeprivate import PlacePrivate from ._placeprivate import PlacePrivate
from _matchesfilter import MatchesFilter from ._matchesfilter import MatchesFilter
from _haslocation import HasLocation from ._haslocation import HasLocation
from _hasnolatorlon import HasNoLatOrLon from ._hasnolatorlon import HasNoLatOrLon
from _inlatlonneighborhood import InLatLonNeighborhood from ._inlatlonneighborhood import InLatLonNeighborhood
from _matcheseventfilter import MatchesEventFilter from ._matcheseventfilter import MatchesEventFilter
from _matchessourceconfidence import MatchesSourceConfidence from ._matchessourceconfidence import MatchesSourceConfidence
from _changedsince import ChangedSince from ._changedsince import ChangedSince
editor_rule_list = [ editor_rule_list = [
AllPlaces, AllPlaces,

View File

@ -25,18 +25,19 @@
""" """
Place object for GRAMPS. Place object for GRAMPS.
""" """
from __future__ import unicode_literals
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# GRAMPS modules # GRAMPS modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from primaryobj import PrimaryObject from .primaryobj import PrimaryObject
from citationbase import CitationBase from .citationbase import CitationBase
from notebase import NoteBase from .notebase import NoteBase
from mediabase import MediaBase from .mediabase import MediaBase
from urlbase import UrlBase from .urlbase import UrlBase
from location import Location from .location import Location
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -61,6 +61,7 @@ from gramps.gen.db.exceptions import (DbUpgradeRequiredError,
BsddbDowngradeError, BsddbDowngradeError,
DbVersionError, DbVersionError,
DbEnvironmentError) DbEnvironmentError)
from gramps.gen.constfunc import STRTYPE
from gramps.gen.utils.file import get_unicode_path_from_file_chooser from gramps.gen.utils.file import get_unicode_path_from_file_chooser
from .pluginmanager import GuiPluginManager from .pluginmanager import GuiPluginManager
from .dialog import (DBErrorDialog, ErrorDialog, QuestionDialog2, from .dialog import (DBErrorDialog, ErrorDialog, QuestionDialog2,
@ -132,11 +133,13 @@ class DbLoader(CLIDbLoader):
pmgr = GuiPluginManager.get_instance() pmgr = GuiPluginManager.get_instance()
import_dialog = Gtk.FileChooserDialog(_('Gramps: Import database'), import_dialog = Gtk.FileChooserDialog(_('Gramps: Import Family Tree'),
self.uistate.window, self.uistate.window,
Gtk.FileChooserAction.OPEN, Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, (Gtk.STOCK_CANCEL,
'gramps-import', Gtk.ResponseType.OK)) Gtk.ResponseType.CANCEL,
_('Import'),
Gtk.ResponseType.OK))
import_dialog.set_local_only(False) import_dialog.set_local_only(False)
# Always add automatic (match all files) filter # Always add automatic (match all files) filter
@ -205,8 +208,7 @@ class DbLoader(CLIDbLoader):
In this process, a warning dialog can pop up. In this process, a warning dialog can pop up.
""" """
if not isinstance(filename, STRTYPE):
if not isinstance(filename, basestring):
return True return True
filename = os.path.normpath(os.path.abspath(filename)) filename = os.path.normpath(os.path.abspath(filename))
@ -249,7 +251,7 @@ class DbLoader(CLIDbLoader):
User(callback=self._pulse_progress)) User(callback=self._pulse_progress))
dirname = os.path.dirname(filename) + os.path.sep dirname = os.path.dirname(filename) + os.path.sep
config.set('paths.recent-import-dir', dirname) config.set('paths.recent-import-dir', dirname)
except UnicodeError, msg: except UnicodeError as msg:
ErrorDialog( ErrorDialog(
_("Could not import file: %s") % filename, _("Could not import file: %s") % filename,
_("This file incorrectly identifies its character " _("This file incorrectly identifies its character "
@ -266,7 +268,7 @@ class DbLoader(CLIDbLoader):
is returned is returned
""" """
if self.import_info is None: if self.import_info is None:
return u"" return ""
return self.import_info.info_text() return self.import_info.info_text()
def read_file(self, filename): def read_file(self, filename):
@ -306,7 +308,7 @@ class DbLoader(CLIDbLoader):
db.load(filename, self._pulse_progress, db.load(filename, self._pulse_progress,
mode, upgrade=False) mode, upgrade=False)
self.dbstate.change_database(db) self.dbstate.change_database(db)
except DbUpgradeRequiredError, msg: except DbUpgradeRequiredError as msg:
if QuestionDialog2(_("Need to upgrade database!"), if QuestionDialog2(_("Need to upgrade database!"),
str(msg), str(msg),
_("Upgrade now"), _("Upgrade now"),
@ -319,20 +321,20 @@ class DbLoader(CLIDbLoader):
self.dbstate.change_database(db) self.dbstate.change_database(db)
else: else:
self.dbstate.no_database() self.dbstate.no_database()
except BsddbDowngradeError, msg: except BsddbDowngradeError as msg:
self.dbstate.no_database() self.dbstate.no_database()
self._errordialog( _("Cannot open database"), str(msg)) self._errordialog( _("Cannot open database"), str(msg))
except DbVersionError, msg: except DbVersionError as msg:
self.dbstate.no_database() self.dbstate.no_database()
self._errordialog( _("Cannot open database"), str(msg)) self._errordialog( _("Cannot open database"), str(msg))
except DbEnvironmentError, msg: except DbEnvironmentError as msg:
self.dbstate.no_database() self.dbstate.no_database()
self._errordialog( _("Cannot open database"), str(msg)) self._errordialog( _("Cannot open database"), str(msg))
except OSError, msg: except OSError as msg:
self.dbstate.no_database() self.dbstate.no_database()
self._errordialog( self._errordialog(
_("Could not open file: %s") % filename, str(msg)) _("Could not open file: %s") % filename, str(msg))
except DbError, msg: except DbError as msg:
self.dbstate.no_database() self.dbstate.no_database()
self._dberrordialog(msg) self._dberrordialog(msg)
except Exception as newerror: except Exception as newerror:

View File

@ -36,8 +36,8 @@ from gi.repository import GObject
from gramps.gen.lib import Location from gramps.gen.lib import Location
from gramps.gen.errors import WindowActiveError from gramps.gen.errors import WindowActiveError
from ...ddtargets import DdTargets from ...ddtargets import DdTargets
from locationmodel import LocationModel from .locationmodel import LocationModel
from embeddedlist import EmbeddedList from .embeddedlist import EmbeddedList
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -28,7 +28,7 @@
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.db import DbTxn from gramps.gen.db import DbTxn
from editsecondary import EditSecondary from .editsecondary import EditSecondary
from ..glade import Glade from ..glade import Glade
from gramps.gen.errors import ValidationError from gramps.gen.errors import ValidationError
from gramps.gen.utils.place import conv_lat_lon from gramps.gen.utils.place import conv_lat_lon

View File

@ -44,11 +44,11 @@ from gi.repository import Gtk
# gramps modules # gramps modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.lib import NoteType, Place from gramps.gen.lib import NoteType, Place, Location
from gramps.gen.db import DbTxn from gramps.gen.db import DbTxn
from editprimary import EditPrimary from .editprimary import EditPrimary
from displaytabs import (GrampsTab, LocationEmbedList, CitationEmbedList, from .displaytabs import (GrampsTab, LocationEmbedList, CitationEmbedList,
GalleryTab, NoteTab, WebEmbedList, PlaceBackRefList) GalleryTab, NoteTab, WebEmbedList, PlaceBackRefList)
from ..widgets import MonitoredEntry, PrivacyButton, LocationEntry from ..widgets import MonitoredEntry, PrivacyButton, LocationEntry
from ..dialog import ErrorDialog from ..dialog import ErrorDialog
from ..glade import Glade from ..glade import Glade
@ -252,7 +252,7 @@ class EditPlace(EditPrimary):
handle, new_locations = self.lentry.get_result() handle, new_locations = self.lentry.get_result()
with DbTxn(_('Add location'), self.dbstate.db) as trans: with DbTxn(_('Add location'), self.dbstate.db) as trans:
for loc_type, name in new_locations: for loc_type, name in new_locations:
new_location = gen.lib.Location() new_location = Location()
new_location.parent = handle new_location.parent = handle
new_location.name = name new_location.name = name
new_location.set_type(loc_type) new_location.set_type(loc_type)

View File

@ -71,6 +71,7 @@ from ..selectors import SelectorFactory
from gramps.gen.display.name import displayer as _nd from gramps.gen.display.name import displayer as _nd
from gramps.gen.utils.db import family_name from gramps.gen.utils.db import family_name
from gramps.gen.utils.string import confidence from gramps.gen.utils.string import confidence
from gramps.gen.constfunc import cuni
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -106,14 +107,6 @@ _name2typeclass = {
_('Surname origin type:'): NameOriginType, _('Surname origin type:'): NameOriginType,
} }
#-------------------------------------------------------------------------
#
# Sorting function for the filter rules
#
#-------------------------------------------------------------------------
def by_rule_name(f, s):
return cmp(f.name, s.name)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# MyBoolean - check button with standard interface # MyBoolean - check button with standard interface
@ -337,7 +330,7 @@ class MyID(Gtk.Box):
self.set_text(val.get_gramps_id()) self.set_text(val.get_gramps_id())
def get_text(self): def get_text(self):
return unicode(self.entry.get_text()) return cuni(self.entry.get_text())
def name_from_gramps_id(self, gramps_id): def name_from_gramps_id(self, gramps_id):
if self.namespace == 'Person': if self.namespace == 'Person':
@ -428,7 +421,7 @@ class MyEntry(Gtk.Entry):
def __init__(self): def __init__(self):
GObject.GObject.__init__(self) GObject.GObject.__init__(self)
self.show() self.show()
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# MyLocation # MyLocation
@ -447,7 +440,7 @@ class MyLocation(Gtk.HBox):
def set_text(self, handle): def set_text(self, handle):
self.location.set_handle(handle) self.location.set_handle(handle)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# EditRule # EditRule
@ -576,7 +569,7 @@ class EditRule(ManagedWindow):
taglist = taglist + [tag.get_name() for tag in dbstate.db.iter_tags()] taglist = taglist + [tag.get_name() for tag in dbstate.db.iter_tags()]
t = MyList(taglist, taglist) t = MyList(taglist, taglist)
elif v == _('Confidence level:'): elif v == _('Confidence level:'):
t = MyList(map(str, range(5)), t = MyList(list(map(str, list(range(5)))),
[confidence[i] for i in range(5)]) [confidence[i] for i in range(5)])
elif v == _('Location:'): elif v == _('Location:'):
t = MyLocation(dbstate) t = MyLocation(dbstate)
@ -617,7 +610,7 @@ class EditRule(ManagedWindow):
else: else:
self.sel_class = None self.sel_class = None
keys = sorted(the_map, by_rule_name, reverse=True) keys = sorted(the_map, key=lambda x: x.name, reverse=True)
catlist = sorted(set(class_obj.category for class_obj in keys)) catlist = sorted(set(class_obj.category for class_obj in keys))
for category in catlist: for category in catlist:
@ -642,7 +635,7 @@ class EditRule(ManagedWindow):
self.notebook.set_current_page(page) self.notebook.set_current_page(page)
self.display_values(self.active_rule.__class__) self.display_values(self.active_rule.__class__)
(class_obj, vallist, tlist) = self.page[page] (class_obj, vallist, tlist) = self.page[page]
r = self.active_rule.values() r = list(self.active_rule.values())
for i in range(0, min(len(tlist), len(r))): for i in range(0, min(len(tlist), len(r))):
tlist[i].set_text(r[i]) tlist[i].set_text(r[i])
@ -729,7 +722,7 @@ class EditRule(ManagedWindow):
try: try:
page = self.notebook.get_current_page() page = self.notebook.get_current_page()
(class_obj, vallist, tlist) = self.page[page] (class_obj, vallist, tlist) = self.page[page]
value_list = [unicode(sclass.get_text()) for sclass in tlist] value_list = [cuni(sclass.get_text()) for sclass in tlist]
new_rule = class_obj(value_list) new_rule = class_obj(value_list)
self.update_rule(self.active_rule, new_rule) self.update_rule(self.active_rule, new_rule)
@ -811,7 +804,7 @@ class EditFilter(ManagedWindow):
self.close() self.close()
def filter_name_changed(self, obj): def filter_name_changed(self, obj):
name = unicode(self.fname.get_text()) name = cuni(self.fname.get_text())
# Make sure that the name is not empty # Make sure that the name is not empty
# and not in the list of existing filters (excluding this one) # and not in the list of existing filters (excluding this one)
names = [filt.get_name() names = [filt.get_name()
@ -834,14 +827,14 @@ class EditFilter(ManagedWindow):
self.rlist.add([r.name,r.display_values()],r) self.rlist.add([r.name,r.display_values()],r)
def on_ok_clicked(self, obj): def on_ok_clicked(self, obj):
n = unicode(self.fname.get_text()).strip() n = cuni(self.fname.get_text()).strip()
if n == '': if n == '':
return return
if n != self.filter.get_name(): if n != self.filter.get_name():
self.uistate.emit('filter-name-changed', self.uistate.emit('filter-name-changed',
(self.namespace,unicode(self.filter.get_name()), n)) (self.namespace, cuni(self.filter.get_name()), n))
self.filter.set_name(n) self.filter.set_name(n)
self.filter.set_comment(unicode(self.comment.get_text()).strip()) self.filter.set_comment(cuni(self.comment.get_text()).strip())
for f in self.filterdb.get_filters(self.namespace)[:]: for f in self.filterdb.get_filters(self.namespace)[:]:
if n == f.get_name(): if n == f.get_name():
self.filterdb.get_filters(self.namespace).remove(f) self.filterdb.get_filters(self.namespace).remove(f)
@ -974,7 +967,7 @@ class ShowResults(ManagedWindow):
gid = repo.get_gramps_id() gid = repo.get_gramps_id()
elif self.namespace == 'Note': elif self.namespace == 'Note':
note = self.db.get_note_from_handle(handle) note = self.db.get_note_from_handle(handle)
name = note.get().replace(u'\n', u' ') name = note.get().replace('\n', ' ')
if len(name) > 80: if len(name) > 80:
name = name[:80]+"..." name = name[:80]+"..."
gid = note.get_gramps_id() gid = note.get_gramps_id()
@ -1149,7 +1142,7 @@ class FilterEditor(ManagedWindow):
# Remove what we found # Remove what we found
filters = self.filterdb.get_filters(space) filters = self.filterdb.get_filters(space)
map(filters.remove, filter_set) list(map(filters.remove, filter_set))
def _find_dependent_filters(self, space, gfilter, filter_set): def _find_dependent_filters(self, space, gfilter, filter_set):
""" """
@ -1165,7 +1158,7 @@ class FilterEditor(ManagedWindow):
if the_filter.get_name() == name: if the_filter.get_name() == name:
continue continue
for rule in the_filter.get_rules(): for rule in the_filter.get_rules():
values = rule.values() values = list(rule.values())
if issubclass(rule.__class__, MatchesFilterBase) \ if issubclass(rule.__class__, MatchesFilterBase) \
and (name in values): and (name in values):
self._find_dependent_filters(space, the_filter, filter_set) self._find_dependent_filters(space, the_filter, filter_set)
@ -1203,7 +1196,7 @@ class FilterEditor(ManagedWindow):
for the_filter in self.filterdb.get_filters(space): for the_filter in self.filterdb.get_filters(space):
for rule in the_filter.get_rules(): for rule in the_filter.get_rules():
values = rule.values() values = list(rule.values())
if issubclass(rule.__class__, MatchesFilterBase) \ if issubclass(rule.__class__, MatchesFilterBase) \
and (old_name in values): and (old_name in values):
ind = values.index(old_name) ind = values.index(old_name)
@ -1212,7 +1205,7 @@ class FilterEditor(ManagedWindow):
def check_recursive_filters(self, space, name): def check_recursive_filters(self, space, name):
for the_filter in self.filterdb.get_filters(space): for the_filter in self.filterdb.get_filters(space):
for rule in the_filter.get_rules(): for rule in the_filter.get_rules():
values = rule.values() values = list(rule.values())
if issubclass(rule.__class__, MatchesFilterBase) \ if issubclass(rule.__class__, MatchesFilterBase) \
and (name in values): and (name in values):
return True return True

View File

@ -44,6 +44,7 @@ from gi.repository import Gtk
from ... import widgets from ... import widgets
from .. import build_filter_model from .. import build_filter_model
from . import SidebarFilter from . import SidebarFilter
from gramps.gen.constfunc import cuni
from gramps.gen.filters import GenericFilterFactory, rules from gramps.gen.filters import GenericFilterFactory, rules
from gramps.gen.filters.rules.place import (RegExpIdOf, HasIdOf, HasLocation, from gramps.gen.filters.rules.place import (RegExpIdOf, HasIdOf, HasLocation,
HasNoteRegexp, HasNoteMatchingSubstringOf, HasNoteRegexp, HasNoteMatchingSubstringOf,
@ -94,10 +95,10 @@ class PlaceSidebarFilter(SidebarFilter):
self.generic.set_active(0) self.generic.set_active(0)
def get_filter(self): def get_filter(self):
gid = unicode(self.filter_id.get_text()).strip() gid = cuni(self.filter_id.get_text()).strip()
title = unicode(self.filter_title.get_text()).strip() title = cuni(self.filter_title.get_text()).strip()
location = self.filter_location.get_handle() location = self.filter_location.get_handle()
note = unicode(self.filter_note.get_text()).strip() note = cuni(self.filter_note.get_text()).strip()
regex = self.filter_regex.get_active() regex = self.filter_regex.get_active()
gen = self.generic.get_active() > 0 gen = self.generic.get_active() > 0
@ -127,7 +128,7 @@ class PlaceSidebarFilter(SidebarFilter):
if self.generic.get_active() != 0: if self.generic.get_active() != 0:
model = self.generic.get_model() model = self.generic.get_model()
node = self.generic.get_active_iter() node = self.generic.get_active_iter()
obj = unicode(model.get_value(node, 0)) obj = cuni(model.get_value(node, 0))
rule = MatchesFilter([obj]) rule = MatchesFilter([obj])
generic_filter.add_rule(rule) generic_filter.add_rule(rule)

View File

@ -21,38 +21,38 @@
# $Id$ # $Id$
from selectorexceptions import SelectorException from .selectorexceptions import SelectorException
def SelectorFactory(classname): def SelectorFactory(classname):
if classname == 'Person': if classname == 'Person':
from selectperson import SelectPerson from .selectperson import SelectPerson
cls = SelectPerson cls = SelectPerson
elif classname == 'Family': elif classname == 'Family':
from selectfamily import SelectFamily from .selectfamily import SelectFamily
cls = SelectFamily cls = SelectFamily
elif classname == 'Event': elif classname == 'Event':
from selectevent import SelectEvent from .selectevent import SelectEvent
cls = SelectEvent cls = SelectEvent
elif classname == 'Place': elif classname == 'Place':
from selectplace import SelectPlace from .selectplace import SelectPlace
cls = SelectPlace cls = SelectPlace
elif classname == 'Location': elif classname == 'Location':
from selectlocation import SelectLocation from .selectlocation import SelectLocation
cls = SelectLocation cls = SelectLocation
elif classname == 'Source': elif classname == 'Source':
from selectsource import SelectSource from .selectsource import SelectSource
cls = SelectSource cls = SelectSource
elif classname == 'Citation': elif classname == 'Citation':
from selectcitation import SelectCitation from .selectcitation import SelectCitation
cls = SelectCitation cls = SelectCitation
elif classname in ['MediaObject', 'Media']: elif classname in ['MediaObject', 'Media']:
from selectobject import SelectObject from .selectobject import SelectObject
cls = SelectObject cls = SelectObject
elif classname == 'Repository': elif classname == 'Repository':
from selectrepository import SelectRepository from .selectrepository import SelectRepository
cls = SelectRepository cls = SelectRepository
elif classname == 'Note': elif classname == 'Note':
from selectnote import SelectNote from .selectnote import SelectNote
cls = SelectNote cls = SelectNote
else: else:
raise SelectorException("Attempt to create unknown " raise SelectorException("Attempt to create unknown "

View File

@ -35,7 +35,7 @@ from gramps.gen.ggettext import gettext as _
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from ..views.treemodels.placemodel import PlaceListModel from ..views.treemodels.placemodel import PlaceListModel
from baseselector import BaseSelector from .baseselector import BaseSelector
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -24,15 +24,15 @@
Package init for the treemodels package. Package init for the treemodels package.
""" """
from peoplemodel import PeopleBaseModel, PersonListModel, PersonTreeModel from .peoplemodel import PeopleBaseModel, PersonListModel, PersonTreeModel
from familymodel import FamilyModel from .familymodel import FamilyModel
from eventmodel import EventModel from .eventmodel import EventModel
from sourcemodel import SourceModel from .sourcemodel import SourceModel
from placemodel import PlaceBaseModel, PlaceListModel, PlaceTreeModel from .placemodel import PlaceBaseModel, PlaceListModel, PlaceTreeModel
from locationmodel import LocationTreeModel from .locationmodel import LocationTreeModel
from mediamodel import MediaModel from .mediamodel import MediaModel
from repomodel import RepositoryModel from .repomodel import RepositoryModel
from notemodel import NoteModel from .notemodel import NoteModel
from citationbasemodel import CitationBaseModel from .citationbasemodel import CitationBaseModel
from citationlistmodel import CitationListModel from .citationlistmodel import CitationListModel
from citationtreemodel import CitationTreeModel from .citationtreemodel import CitationTreeModel

View File

@ -48,6 +48,7 @@ from gi.repository import Gtk
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.datehandler import format_time from gramps.gen.datehandler import format_time
from gramps.gen.utils.place import conv_lat_lon from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.constfunc import cuni
from .flatbasemodel import FlatBaseModel from .flatbasemodel import FlatBaseModel
from .treebasemodel import TreeBaseModel from .treebasemodel import TreeBaseModel
@ -112,19 +113,19 @@ class PlaceBaseModel(object):
return len(self.fmap)+1 return len(self.fmap)+1
def column_handle(self, data): def column_handle(self, data):
return unicode(data[0]) return cuni(data[0])
def column_place_name(self, data): def column_place_name(self, data):
return unicode(data[2]) return cuni(data[2])
def column_id(self, data): def column_id(self, data):
return unicode(data[1]) return cuni(data[1])
def column_location(self, data): def column_location(self, data):
try: try:
loc = self.db.get_location_from_handle(data[3]) loc = self.db.get_location_from_handle(data[3])
lines = [loc.name] lines = [loc.name]
while loc.parent is not None: while loc.parent != str(None):
loc = self.db.get_location_from_handle(loc.parent) loc = self.db.get_location_from_handle(loc.parent)
lines.append(loc.name) lines.append(loc.name)
return ', '.join(lines) return ', '.join(lines)
@ -164,7 +165,7 @@ class PlaceListModel(PlaceBaseModel, FlatBaseModel):
FlatBaseModel.destroy(self) FlatBaseModel.destroy(self)
def column_name(self, data): def column_name(self, data):
return unicode(data[2]) return cuni(data[2])
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -254,16 +255,16 @@ class PlaceTreeModel(PlaceBaseModel, TreeBaseModel):
if data[5] is not None: if data[5] is not None:
level = [data[5][0][i] for i in range(5,-1,-1)] level = [data[5][0][i] for i in range(5,-1,-1)]
if not (level[3] or level[4] or level[5]): if not (level[3] or level[4] or level[5]):
name = unicode(level[2] or level[1] or level[0]) name = cuni(level[2] or level[1] or level[0])
else: else:
name = ', '.join([item for item in level[3:] if item]) name = ', '.join([item for item in level[3:] if item])
if not name: if not name:
name = unicode(data[2]) name = cuni(data[2])
if name: if name:
return cgi.escape(name) return cgi.escape(name)
else: else:
return u"<i>%s<i>" % cgi.escape(_("<no name>")) return "<i>%s<i>" % cgi.escape(_("<no name>"))
def column_header(self, node): def column_header(self, node):
""" """

View File

@ -965,7 +965,7 @@ class TreeBaseModel(GObject.Object, Gtk.TreeModel):
pathlist.append(index) pathlist.append(index)
node = parent node = parent
if pathlist is not None: if pathlist:
pathlist.reverse() pathlist.reverse()
return Gtk.TreePath(tuple(pathlist)) return Gtk.TreePath(tuple(pathlist))
else: else:

View File

@ -23,25 +23,25 @@
"""Custom widgets.""" """Custom widgets."""
from basicentry import * from .basicentry import *
from buttons import * from .buttons import *
from expandcollapsearrow import * from .expandcollapsearrow import *
from labels import * from .labels import *
from locationentry import * from .locationentry import *
from locationentry2 import * from .locationentry2 import *
from linkbox import * from .linkbox import *
from photo import * from .photo import *
from monitoredwidgets import * from .monitoredwidgets import *
from shortlistcomboentry import * from .shortlistcomboentry import *
from springseparator import * from .springseparator import *
from statusbar import Statusbar from .statusbar import Statusbar
from styledtextbuffer import * from .styledtextbuffer import *
from styledtexteditor import * from .styledtexteditor import *
from toolcomboentry import * from .toolcomboentry import *
from undoablebuffer import * from .undoablebuffer import *
from undoableentry import * from .undoableentry import *
from undoablestyledbuffer import * from .undoablestyledbuffer import *
from validatedcomboentry import * from .validatedcomboentry import *
from validatedmaskedentry import * from .validatedmaskedentry import *
from valueaction import * from .valueaction import *
from valuetoolitem import * from .valuetoolitem import *

View File

@ -69,7 +69,7 @@ class LocationEntry(object):
if handle: if handle:
locs = [] locs = []
loc = db.get_location_from_handle(handle) loc = db.get_location_from_handle(handle)
while loc.parent is not None: while loc.parent != str(None):
locs.append(loc) locs.append(loc)
loc = db.get_location_from_handle(loc.parent) loc = db.get_location_from_handle(loc.parent)
locs.append(loc) locs.append(loc)

View File

@ -132,7 +132,7 @@ class LocationEntry2(Gtk.Entry):
def get_location_text(self, handle): def get_location_text(self, handle):
loc = self.dbstate.db.get_location_from_handle(handle) loc = self.dbstate.db.get_location_from_handle(handle)
lines = [loc.name] lines = [loc.name]
while loc.parent is not None: while loc.parent != str(None):
loc = self.dbstate.db.get_location_from_handle(loc.parent) loc = self.dbstate.db.get_location_from_handle(loc.parent)
lines.append(loc.name) lines.append(loc.name)
return ', '.join(lines) return ', '.join(lines)

View File

@ -125,7 +125,7 @@ class PlaceDetails(Gramplet):
""" """
loc = self.dbstate.db.get_location_from_handle(handle) loc = self.dbstate.db.get_location_from_handle(handle)
lines = [loc.name] lines = [loc.name]
while loc.parent is not None: while loc.parent != str(None):
loc = self.dbstate.db.get_location_from_handle(loc.parent) loc = self.dbstate.db.get_location_from_handle(loc.parent)
lines.append(loc.name) lines.append(loc.name)
self.add_row(_('Location'), '\n'.join(lines)) self.add_row(_('Location'), '\n'.join(lines))

View File

@ -33,7 +33,6 @@ Geography for events
from gramps.gen.ggettext import gettext as _ from gramps.gen.ggettext import gettext as _
import os import os
import sys import sys
import urlparse
import operator import operator
import locale import locale
from gi.repository import Gdk from gi.repository import Gdk

View File

@ -33,7 +33,6 @@ Geography for one family
from gramps.gen.ggettext import gettext as _ from gramps.gen.ggettext import gettext as _
import os import os
import sys import sys
import urlparse
import operator import operator
import locale import locale
from gi.repository import Gdk from gi.repository import Gdk

View File

@ -33,7 +33,6 @@ Geography for one person
from gramps.gen.ggettext import gettext as _ from gramps.gen.ggettext import gettext as _
import os import os
import sys import sys
import urlparse
import operator import operator
import locale import locale
from gi.repository import Gdk from gi.repository import Gdk

View File

@ -34,7 +34,6 @@ from gramps.gen.ggettext import gettext as _
import os import os
import sys import sys
import time import time
import urlparse
import operator import operator
import locale import locale
from gi.repository import Gdk from gi.repository import Gdk

View File

@ -49,6 +49,7 @@ from gramps.gui.ddtargets import DdTargets
from gramps.gui.dialog import ErrorDialog from gramps.gui.dialog import ErrorDialog
from gramps.gui.editors import EditLocation from gramps.gui.editors import EditLocation
from gramps.gen.plug import CATEGORY_QR_PLACE from gramps.gen.plug import CATEGORY_QR_PLACE
from gramps.gui.views.listview import LISTTREE
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -114,6 +115,12 @@ class LocationView(ListView):
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui())
def type_list(self):
"""
set the listtype, this governs eg keybinding
"""
return LISTTREE
def navigation_type(self): def navigation_type(self):
return 'Place' return 'Place'

View File

@ -38,7 +38,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'eventview.py', fname = 'eventview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Events", _("Events")), category = ("Events", _("Events")),
viewclass = 'EventView', viewclass = 'EventView',
@ -53,7 +53,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'familyview.py', fname = 'familyview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Families", _("Families")), category = ("Families", _("Families")),
viewclass = 'FamilyView', viewclass = 'FamilyView',
@ -68,7 +68,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'grampletview.py', fname = 'grampletview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Gramplets", _("Gramplets")), category = ("Gramplets", _("Gramplets")),
viewclass = 'GrampletView', viewclass = 'GrampletView',
@ -83,7 +83,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'mediaview.py', fname = 'mediaview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Media", _("Media")), category = ("Media", _("Media")),
viewclass = 'MediaView', viewclass = 'MediaView',
@ -98,7 +98,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'noteview.py', fname = 'noteview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Notes", _("Notes")), category = ("Notes", _("Notes")),
viewclass = 'NoteView', viewclass = 'NoteView',
@ -113,7 +113,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'relview.py', fname = 'relview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Relationships", _("Relationships")), category = ("Relationships", _("Relationships")),
viewclass = 'RelationshipView', viewclass = 'RelationshipView',
@ -128,7 +128,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'pedigreeview.py', fname = 'pedigreeview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Ancestry", _("Charts")), category = ("Ancestry", _("Charts")),
viewclass = 'PedigreeView', viewclass = 'PedigreeView',
@ -145,7 +145,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'fanchartview.py', fname = 'fanchartview.py',
authors = [u"Douglas S. Blank", u"B. Malengier"], authors = ["Douglas S. Blank", "B. Malengier"],
authors_email = ["doug.blank@gmail.com", "benny.malengier@gmail.com"], authors_email = ["doug.blank@gmail.com", "benny.malengier@gmail.com"],
viewclass = 'FanChartView', viewclass = 'FanChartView',
stock_icon = 'gramps-fanchart', stock_icon = 'gramps-fanchart',
@ -160,7 +160,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'fanchartdescview.py', fname = 'fanchartdescview.py',
authors = [u"B. Malengier"], authors = ["B. Malengier"],
authors_email = ["benny.malengier@gmail.com"], authors_email = ["benny.malengier@gmail.com"],
viewclass = 'FanChartDescView', viewclass = 'FanChartDescView',
stock_icon = 'gramps-fanchartdesc', stock_icon = 'gramps-fanchartdesc',
@ -175,7 +175,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'persontreeview.py', fname = 'persontreeview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("People", _("People")), category = ("People", _("People")),
viewclass = 'PersonTreeView', viewclass = 'PersonTreeView',
@ -192,7 +192,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'personlistview.py', fname = 'personlistview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("People", _("People")), category = ("People", _("People")),
viewclass = 'PersonListView', viewclass = 'PersonListView',
@ -208,7 +208,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'placelistview.py', fname = 'placelistview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Places", _("Places")), category = ("Places", _("Places")),
viewclass = 'PlaceListView', viewclass = 'PlaceListView',
@ -224,7 +224,7 @@ stock_icon = 'gramps-tree-list',
#gramps_target_version = '4.0', #gramps_target_version = '4.0',
#status = STABLE, #status = STABLE,
#fname = 'placetreeview.py', #fname = 'placetreeview.py',
#authors = [u"Donald N. Allingham", u"Gary Burton", u"Nick Hall"], #authors = ["Donald N. Allingham", "Gary Burton", "Nick Hall"],
#authors_email = [""], #authors_email = [""],
#category = ("Places", _("Places")), #category = ("Places", _("Places")),
#viewclass = 'PlaceTreeView', #viewclass = 'PlaceTreeView',
@ -239,7 +239,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'repoview.py', fname = 'repoview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Repositories", _("Repositories")), category = ("Repositories", _("Repositories")),
viewclass = 'RepositoryView', viewclass = 'RepositoryView',
@ -254,7 +254,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'sourceview.py', fname = 'sourceview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Sources", _("Sources")), category = ("Sources", _("Sources")),
viewclass = 'SourceView', viewclass = 'SourceView',
@ -270,7 +270,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'citationlistview.py', fname = 'citationlistview.py',
authors = [u"The Gramps project"], authors = ["The Gramps project"],
authors_email = ["http://gramps-project.org"], authors_email = ["http://gramps-project.org"],
category = ("Citations", _("Citations")), category = ("Citations", _("Citations")),
viewclass = 'CitationListView', viewclass = 'CitationListView',
@ -285,7 +285,7 @@ version = '1.0',
gramps_target_version = '4.0', gramps_target_version = '4.0',
status = STABLE, status = STABLE,
fname = 'citationtreeview.py', fname = 'citationtreeview.py',
authors = [u"Tim G L Lyons", u"Nick Hall"], authors = ["Tim G L Lyons", "Nick Hall"],
authors_email = [""], authors_email = [""],
category = ("Sources", _("Sources")), category = ("Sources", _("Sources")),
viewclass = 'CitationTreeView', viewclass = 'CitationTreeView',