Compare commits
152 Commits
master
...
geps/gep-0
Author | SHA1 | Date | |
---|---|---|---|
|
04638a9dcb | ||
|
0ffc0cdd12 | ||
|
e424e5cdbb | ||
|
9c2e0ca760 | ||
|
abeda15fa7 | ||
|
18e1150010 | ||
|
8108adbef8 | ||
|
8453ac9119 | ||
|
da9106834a | ||
|
9c7a058ef4 | ||
|
8066052641 | ||
|
8bbcc2c341 | ||
|
b287b13b9a | ||
|
d48148ed65 | ||
|
9e48884a5b | ||
|
79e2ab25af | ||
|
3659944f4d | ||
|
40fce3c091 | ||
|
ffa4ac4eeb | ||
|
f5f7445692 | ||
|
463549b179 | ||
|
2587bfe73e | ||
|
94a16c85c2 | ||
|
859293f74b | ||
|
7ae88f69aa | ||
|
f1dc4c891f | ||
|
1e864415f1 | ||
|
ae8bd2d4e0 | ||
|
ec40418f5d | ||
|
ccffe86db1 | ||
|
81a702e9af | ||
|
5596d0c47e | ||
|
ffdb23230d | ||
|
4d24c4cf66 | ||
|
1a7ad93476 | ||
|
5a54d1ecd5 | ||
|
cc564061f9 | ||
|
e62596bf2c | ||
|
29873cc9d4 | ||
|
f644717309 | ||
|
ee7e69a616 | ||
|
2ceeb7143b | ||
|
a50e83fa5f | ||
|
b34eea702b | ||
|
e6a43370bd | ||
|
11df6b2b29 | ||
|
578c7345fa | ||
|
681ae03901 | ||
|
adb94b1974 | ||
|
ef9464006e | ||
|
9b48321f9f | ||
|
773443aec0 | ||
|
5afe501e94 | ||
|
deaba77b3b | ||
|
e7281fcde2 | ||
|
24b337ec5d | ||
|
c8bfe1db3b | ||
|
a65dbaddcb | ||
|
b67df8930d | ||
|
9285b289b4 | ||
|
8c820e1ce2 | ||
|
1e7b512c7c | ||
|
5557ae2643 | ||
|
33fa3c2fea | ||
|
8a6da23737 | ||
|
3795974c6f | ||
|
8c73137ffd | ||
|
77c0645acf | ||
|
88f3176f91 | ||
|
672fd4e8f0 | ||
|
46ded3e7db | ||
|
bc202fb9ac | ||
|
1cc9e43cfe | ||
|
af7c0e5e5f | ||
|
8f71da6ec4 | ||
|
1dcdc52b1d | ||
|
60729859f2 | ||
|
20289c20a3 | ||
|
fecf9e4e19 | ||
|
fe775c19bd | ||
|
f479a876e3 | ||
|
99c54b5e2e | ||
|
32b30ccc09 | ||
|
5f4665b3a8 | ||
|
64671663dd | ||
|
6c90a89612 | ||
|
f8f250ad71 | ||
|
774ceff34b | ||
|
0cf2bc0032 | ||
|
fe09b8342b | ||
|
f16db81075 | ||
|
3b9890d9c4 | ||
|
296e2f4f86 | ||
|
c7f9b52003 | ||
|
90e07c8cfc | ||
|
87c5b6632a | ||
|
fba8cdddd1 | ||
|
9e8b2af5c1 | ||
|
fc609ef3d5 | ||
|
9a515bfde6 | ||
|
08d8d4c775 | ||
|
5781e8ac72 | ||
|
4b6afc33fe | ||
|
c6e51d841d | ||
|
69d2b09ed6 | ||
|
4dd31fc7aa | ||
|
42610bdb97 | ||
|
b2ba4c3a6d | ||
|
bd6b4ce012 | ||
|
38b9ae0e6a | ||
|
cb268dac1f | ||
|
b6136261aa | ||
|
a2acb593ec | ||
|
7860fa5221 | ||
|
6fa7b75550 | ||
|
f17f4cc0ac | ||
|
011f40ad75 | ||
|
b46640039d | ||
|
ffc935599d | ||
|
d23aca2481 | ||
|
ccc0b540da | ||
|
cf1456319f | ||
|
c3edd2c359 | ||
|
a030be6100 | ||
|
d84df82c55 | ||
|
7b6abfeb03 | ||
|
1e7d0f847e | ||
|
6a559ad827 | ||
|
d4e85e7336 | ||
|
7a5e277b38 | ||
|
f85a78a50d | ||
|
49766e00a7 | ||
|
7704bd435a | ||
|
ba25ce0b97 | ||
|
6cfffee22d | ||
|
ce373e3036 | ||
|
6400f61b29 | ||
|
864f9c667a | ||
|
065d11647d | ||
|
d8d345772c | ||
|
9c9cb508ed | ||
|
d6f66f3856 | ||
|
f0da385b33 | ||
|
fb930c4560 | ||
|
3dbd69ad31 | ||
|
d9c1a330f3 | ||
|
976dd620a2 | ||
|
64f67aa204 | ||
|
c2092a71bd | ||
|
3eb9594a98 | ||
|
0758e411fd | ||
|
e2c48ddb54 |
7
README
7
README
@ -24,7 +24,7 @@ to your language:
|
||||
The following packages are *STRONGLY RECOMMENDED* to be installed:
|
||||
osmgpsmap Used to show maps in the geography view.
|
||||
Without this the GeoView will not be active, see
|
||||
http://gramps-project.org/wiki/index.php?title=Gramps_3.3_Wiki_Manual_-_Main_Window#Geography_Category
|
||||
http://gramps-project.org/wiki/index.php?title=Gramps_4.0_Wiki_Manual_-_Main_Window#Geography_Category
|
||||
The package is named osmgpsmap, osm-gps-map
|
||||
or python-osmgpsmap. Or obtain it from: http://nzjrs.github.com/osm-gps-map/
|
||||
GraphViz Enable creation of graphs using GraphViz engine.
|
||||
@ -39,6 +39,11 @@ The following packages are optional
|
||||
enchant. A version of gtkspell with gobject introspection
|
||||
is needed, so minimally version 3.0.0
|
||||
|
||||
rcs The GNU Revision Control System (RCS) can be used to manage
|
||||
multiple revisions of your family trees. See info at
|
||||
http://www.gramps-project.org/wiki/index.php?title=Gramps_4.0_Wiki_Manual_-_Manage_Family_Trees#Archiving_a_Family_Tree
|
||||
Only rcs is needed, NO python bindings are required
|
||||
|
||||
PIL Python Image Library is needed to convert non jpg images to
|
||||
jpg so as to include them in LaTeX output
|
||||
|
||||
|
@ -25,15 +25,15 @@
|
||||
-->
|
||||
|
||||
<!--
|
||||
This is the Document Type Definition file for v1.5.0
|
||||
This is the Document Type Definition file for v1.6.0
|
||||
of the GRAMPS XML genealogy data format.
|
||||
Please use the following formal public identifier to identify it:
|
||||
|
||||
"-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
|
||||
"-//GRAMPS//DTD GRAMPS XML V1.6.0//EN"
|
||||
|
||||
For example:
|
||||
<!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
|
||||
"http://gramps-project.org/xml/1.5.0/grampsxml.dtd"
|
||||
<!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.6.0//EN"
|
||||
"http://gramps-project.org/xml/1.6.0/grampsxml.dtd"
|
||||
[...]>
|
||||
-->
|
||||
|
||||
@ -215,7 +215,8 @@ EVENT
|
||||
<!ELEMENT events (event)*>
|
||||
|
||||
<!ELEMENT event (type?, (daterange|datespan|dateval|datestr)?, place?, cause?,
|
||||
description?, attribute*, noteref*, citationref*, objref*)>
|
||||
description?, attribute*, noteref*, citationref*, objref*,
|
||||
tagref*)>
|
||||
<!ATTLIST event
|
||||
id CDATA #IMPLIED
|
||||
handle ID #REQUIRED
|
||||
@ -229,7 +230,7 @@ SOURCES
|
||||
|
||||
<!ELEMENT sources (source)*>
|
||||
<!ELEMENT source (stitle?, sauthor?, spubinfo?, sabbrev?,
|
||||
noteref*, objref*, data_item*, reporef*)>
|
||||
noteref*, objref*, data_item*, reporef*, tagref*)>
|
||||
<!ATTLIST source
|
||||
id CDATA #IMPLIED
|
||||
handle ID #REQUIRED
|
||||
@ -248,7 +249,7 @@ PLACES
|
||||
<!ELEMENT places (placeobj)*>
|
||||
|
||||
<!ELEMENT placeobj (ptitle?, coord?, location*, objref*, url*, noteref*,
|
||||
citationref*)>
|
||||
citationref*, tagref*)>
|
||||
<!ATTLIST placeobj
|
||||
id CDATA #IMPLIED
|
||||
handle ID #REQUIRED
|
||||
@ -305,7 +306,7 @@ REPOSITORIES
|
||||
|
||||
<!ELEMENT repositories (repository)*>
|
||||
|
||||
<!ELEMENT repository (rname, type, address*, url*, noteref*)>
|
||||
<!ELEMENT repository (rname, type, address*, url*, noteref*, tagref*)>
|
||||
<!ATTLIST repository
|
||||
id CDATA #IMPLIED
|
||||
handle ID #REQUIRED
|
||||
@ -368,7 +369,7 @@ CITATIONS
|
||||
<!ELEMENT citations (citation)*>
|
||||
|
||||
<!ELEMENT citation ((daterange|datespan|dateval|datestr)?, page?, confidence?,
|
||||
noteref*, objref*, data_item*, sourceref)>
|
||||
noteref*, objref*, data_item*, sourceref, tagref*)>
|
||||
<!ATTLIST citation
|
||||
id CDATA #IMPLIED
|
||||
handle ID #REQUIRED
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
<grammar
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
ns="http://gramps-project.org/xml/1.5.0/"
|
||||
ns="http://gramps-project.org/xml/1.6.0/"
|
||||
xmlns="http://relaxng.org/ns/structure/1.0">
|
||||
|
||||
<start><element name="database">
|
||||
@ -160,6 +160,9 @@
|
||||
<value>0</value>
|
||||
<value>1</value>
|
||||
</choice></attribute></optional>
|
||||
<zeroOrMore><element name="tagref">
|
||||
<ref name="tagref-content"/>
|
||||
</element></zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name="person-content">
|
||||
@ -205,9 +208,6 @@
|
||||
<zeroOrMore><element name="citationref">
|
||||
<ref name="citationref-content"/>
|
||||
</element></zeroOrMore>
|
||||
<zeroOrMore><element name="tagref">
|
||||
<ref name="tagref-content"/>
|
||||
</element></zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name="child-rel">
|
||||
@ -403,9 +403,6 @@
|
||||
<zeroOrMore><element name="citationref">
|
||||
<ref name="citationref-content"/>
|
||||
</element></zeroOrMore>
|
||||
<zeroOrMore><element name="tagref">
|
||||
<ref name="tagref-content"/>
|
||||
</element></zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name="event-content">
|
||||
@ -520,9 +517,6 @@
|
||||
<zeroOrMore><element name="citationref">
|
||||
<ref name="citationref-content"/>
|
||||
</element></zeroOrMore>
|
||||
<zeroOrMore><element name="tagref">
|
||||
<ref name="tagref-content"/>
|
||||
</element></zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name="repository-content">
|
||||
@ -581,9 +575,6 @@
|
||||
</choice></attribute></optional>
|
||||
<attribute name="type"><text/></attribute>
|
||||
<ref name="styledtext"/>
|
||||
<zeroOrMore><element name="tagref">
|
||||
<ref name="tagref-content"/>
|
||||
</element></zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name="styledtext">
|
||||
|
@ -52,11 +52,11 @@ SPHINXBUILD = 'sphinx-build'
|
||||
if sys.platform == 'win32':
|
||||
pythonCmd = os.path.join(sys.prefix, 'bin', 'python.exe')
|
||||
sphinxCmd = os.path.join(sys.prefix, 'bin', 'sphinx-build.exe')
|
||||
elif sys.platform == 'linux2' or os.name == 'darwin':
|
||||
elif sys.platform in ['linux2', 'darwin', 'cygwin']:
|
||||
pythonCmd = os.path.join(sys.prefix, 'bin', 'python')
|
||||
sphinxCmd = SPHINXBUILD
|
||||
else:
|
||||
print ("ERROR: unknown system, don't know sphinx, ... commands")
|
||||
print ("Update Man ERROR: unknown system, don't know sphinx, ... commands")
|
||||
sys.exit(0)
|
||||
|
||||
def tests():
|
||||
|
@ -42,11 +42,11 @@ SPHINXBUILD = 'sphinx-build'
|
||||
if sys.platform == 'win32':
|
||||
pythonCmd = os.path.join(sys.prefix, 'bin', 'python.exe')
|
||||
sphinxCmd = os.path.join(sys.prefix, 'bin', 'sphinx-build.exe')
|
||||
elif sys.platform == 'linux2' or os.name == 'darwin':
|
||||
elif sys.platform in ['linux2', 'darwin', 'cygwin']:
|
||||
pythonCmd = os.path.join(sys.prefix, 'bin', 'python')
|
||||
sphinxCmd = SPHINXBUILD
|
||||
else:
|
||||
print ("ERROR: unknown system, don't know sphinx, ... commands")
|
||||
print ("Update Docs ERROR: unknown system, don't know sphinx, ... commands")
|
||||
sys.exit(0)
|
||||
|
||||
def tests():
|
||||
|
Binary file not shown.
@ -39,7 +39,8 @@ Module responsible for handling the command line arguments for GRAMPS.
|
||||
from __future__ import print_function
|
||||
import os
|
||||
import sys
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -185,9 +186,9 @@ class ArgHandler(object):
|
||||
else:
|
||||
# Need to convert to system file encoding before printing
|
||||
# For non latin characters in path/file/user names
|
||||
print(msg1.encode(sys.getfilesystemencoding()), file=sys.stderr)
|
||||
print(msg1.encode(sys.stdout.encoding, 'backslashreplace'), file=sys.stderr)
|
||||
if msg2 is not None:
|
||||
print(msg2.encode(sys.getfilesystemencoding()), file=sys.stderr)
|
||||
print(msg2.encode(sys.stdout.encoding, 'backslashreplace'), file=sys.stderr)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Argument parser: sorts out given arguments
|
||||
@ -294,7 +295,7 @@ class ArgHandler(object):
|
||||
else:
|
||||
ask = input
|
||||
ans = ask(_('OK to overwrite? (yes/no) ') \
|
||||
.encode(sys.getfilesystemencoding()))
|
||||
.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
except EOFError:
|
||||
print()
|
||||
sys.exit(0)
|
||||
@ -408,26 +409,26 @@ class ArgHandler(object):
|
||||
|
||||
if self.list:
|
||||
print(_('List of known family trees in your database path\n').\
|
||||
encode(sys.getfilesystemencoding()))
|
||||
encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
for name, dirname in sorted(self.dbman.family_tree_list(),
|
||||
key=lambda pair: pair[0].lower()):
|
||||
|
||||
print((_("%(full_DB_path)s with name \"%(f_t_name)s\"") % \
|
||||
{'full_DB_path' : dirname,
|
||||
'f_t_name' : name}).encode(sys.getfilesystemencoding()))
|
||||
'f_t_name' : name}).encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
sys.exit(0)
|
||||
|
||||
if self.list_more:
|
||||
print(_('Gramps Family Trees:').encode(sys.getfilesystemencoding()))
|
||||
print(_('Gramps Family Trees:').encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
summary_list = self.dbman.family_tree_summary()
|
||||
for summary in sorted(summary_list,
|
||||
key=lambda sum: sum["Family tree"].lower()):
|
||||
print(_("Family Tree \"%s\":").\
|
||||
encode(sys.getfilesystemencoding()) % summary["Family tree"])
|
||||
encode(sys.stdout.encoding, 'backslashreplace') % summary["Family tree"])
|
||||
for item in sorted(summary):
|
||||
if item != "Family tree":
|
||||
print((" %s: %s" % (item, summary[item])).\
|
||||
encode(sys.getfilesystemencoding()))
|
||||
encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
sys.exit(0)
|
||||
|
||||
self.__open_action()
|
||||
@ -442,7 +443,7 @@ class ArgHandler(object):
|
||||
for expt in self.exports:
|
||||
# Need to convert path/filename to str before printing
|
||||
# For non latin characters in Windows path/file/user names
|
||||
fn = expt[0].encode(sys.getfilesystemencoding())
|
||||
fn = expt[0].encode(sys.stdout.encoding, 'backslashreplace')
|
||||
fmt = str(expt[1])
|
||||
print(_("Exporting: file %(filename)s, "
|
||||
"format %(format)s.") % \
|
||||
@ -480,7 +481,7 @@ class ArgHandler(object):
|
||||
self.imp_db_path, title = self.dbman.create_new_db_cli()
|
||||
else:
|
||||
self.imp_db_path = get_empty_tempdir("import_dbdir") \
|
||||
.encode(sys.getfilesystemencoding())
|
||||
.encode(sys.stdout.encoding, 'backslashreplace')
|
||||
newdb = DbBsddb()
|
||||
newdb.write_version(self.imp_db_path)
|
||||
|
||||
@ -494,7 +495,7 @@ class ArgHandler(object):
|
||||
sys.exit(0)
|
||||
|
||||
for imp in self.imports:
|
||||
fn = imp[0].encode(sys.getfilesystemencoding())
|
||||
fn = imp[0].encode(sys.stdout.encoding, 'backslashreplace')
|
||||
fmt = str(imp[1])
|
||||
msg = _("Importing: file %(filename)s, format %(format)s.") % \
|
||||
{'filename' : fn, 'format' : fmt}
|
||||
@ -623,10 +624,10 @@ class ArgHandler(object):
|
||||
# Print cli report name ([item[0]), GUI report name (item[4])
|
||||
if len(pdata.id) <= 25:
|
||||
print(" %s%s- %s" % ( pdata.id, " " * (26 - len(pdata.id)),
|
||||
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
|
||||
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
|
||||
else:
|
||||
print(" %s\t- %s" % (pdata.id,
|
||||
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
|
||||
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
|
||||
|
||||
elif action == "tool":
|
||||
from gramps.gui.plug import tool
|
||||
@ -664,10 +665,10 @@ class ArgHandler(object):
|
||||
# Print cli report name ([item[0]), GUI report name (item[4])
|
||||
if len(pdata.id) <= 25:
|
||||
print(" %s%s- %s" % ( pdata.id, " " * (26 - len(pdata.id)),
|
||||
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
|
||||
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
|
||||
else:
|
||||
print(" %s\t- %s" % (pdata.id,
|
||||
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
|
||||
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
|
||||
|
||||
elif action == "book":
|
||||
try:
|
||||
|
@ -39,7 +39,8 @@ Module responsible for handling the command line arguments for GRAMPS.
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
import getopt
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import logging
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -292,7 +293,7 @@ class ArgParser(object):
|
||||
self.list_more = True
|
||||
elif option in ('-s','--show'):
|
||||
print ("Gramps config settings from %s:" % \
|
||||
config.filename.encode(sys.getfilesystemencoding()))
|
||||
config.filename.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
for section in config.data:
|
||||
for setting in config.data[section]:
|
||||
print ("%s.%s=%s" % (
|
||||
@ -402,7 +403,7 @@ class ArgParser(object):
|
||||
"""
|
||||
if self.help:
|
||||
# Convert Help messages to file system encoding before printing
|
||||
print (_HELP.encode(sys.getfilesystemencoding()))
|
||||
print (_HELP.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
sys.exit(0)
|
||||
|
||||
def print_usage(self):
|
||||
@ -411,5 +412,5 @@ class ArgParser(object):
|
||||
"""
|
||||
if self.usage:
|
||||
# Convert Help messages to file system encoding before printing
|
||||
print (_USAGE.encode(sys.getfilesystemencoding()))
|
||||
print (_USAGE.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
sys.exit(0)
|
||||
|
@ -44,7 +44,6 @@ else:
|
||||
from urllib.parse import urlparse
|
||||
from urllib.request import urlopen, url2pathname
|
||||
import tempfile
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# set up logging
|
||||
@ -58,6 +57,8 @@ LOG = logging.getLogger(".clidbman")
|
||||
# gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
from gramps.gen.db import DbBsddb
|
||||
from gramps.gen.plug import BasePluginManager
|
||||
from gramps.gen.config import config
|
||||
@ -158,6 +159,7 @@ class CLIDbManager(object):
|
||||
try:
|
||||
dbmap1.open(fname, META, db.DB_HASH, db.DB_RDONLY)
|
||||
except:
|
||||
env.close()
|
||||
return "Unknown", "Unknown"
|
||||
version = dbmap1.get('version', default=None)
|
||||
dbmap1.close()
|
||||
@ -191,7 +193,7 @@ class CLIDbManager(object):
|
||||
retval["Locked?"] = "no"
|
||||
retval["DB version"] = version
|
||||
if sys.version_info[0] < 3:
|
||||
retval["Family tree"] = name.encode(sys.getfilesystemencoding())
|
||||
retval["Family tree"] = name.encode(glocale.getfilesystemencoding())
|
||||
else:
|
||||
retval["Family tree"] = name
|
||||
retval["Path"] = dirpath
|
||||
@ -206,7 +208,7 @@ class CLIDbManager(object):
|
||||
# make the default directory if it does not exist
|
||||
dbdir = os.path.expanduser(config.get('behavior.database-path'))
|
||||
if sys.version_info[0] < 3:
|
||||
dbdir = dbdir.encode(sys.getfilesystemencoding())
|
||||
dbdir = dbdir.encode(glocale.getfilesystemencoding())
|
||||
db_ok = make_dbdir(dbdir)
|
||||
|
||||
self.current_names = []
|
||||
@ -217,6 +219,7 @@ class CLIDbManager(object):
|
||||
if os.path.isfile(path_name):
|
||||
file = open(path_name)
|
||||
name = file.readline().strip()
|
||||
file.close()
|
||||
|
||||
(tval, last) = time_val(dirpath)
|
||||
(enable, stock_id) = self.icon_values(dirpath, self.active,
|
||||
@ -413,7 +416,7 @@ def make_dbdir(dbdir):
|
||||
if not os.path.isdir(dbdir):
|
||||
os.makedirs(dbdir)
|
||||
except (IOError, OSError) as msg:
|
||||
msg = conv_to_unicode(str(msg), sys.getfilesystemencoding())
|
||||
msg = conv_to_unicode(str(msg), glocale.getfilesystemencoding())
|
||||
LOG.error(_("\nERROR: Wrong database path in Edit Menu->Preferences.\n"
|
||||
"Open preferences and set correct database path.\n\n"
|
||||
"Details: Could not make database directory:\n %s\n\n") % msg)
|
||||
@ -442,7 +445,7 @@ def find_next_db_dir():
|
||||
base = "%x" % int(time.time())
|
||||
dbdir = os.path.expanduser(config.get('behavior.database-path'))
|
||||
if sys.version_info[0] < 3:
|
||||
dbdir = dbdir.encode(sys.getfilesystemencoding())
|
||||
dbdir = dbdir.encode(glocale.getfilesystemencoding())
|
||||
new_path = os.path.join(dbdir, base)
|
||||
if not os.path.isdir(new_path):
|
||||
break
|
||||
@ -485,7 +488,7 @@ def find_locker_name(dirpath):
|
||||
# Convert username to unicode according to system encoding
|
||||
# Otherwise problems with non ASCII characters in
|
||||
# username in Windows
|
||||
username = conv_to_unicode(username, sys.getfilesystemencoding())
|
||||
username = conv_to_unicode(username, glocale.getfilesystemencoding())
|
||||
# feature request 2356: avoid genitive form
|
||||
last = _("Locked by %s") % username
|
||||
ifile.close()
|
||||
|
@ -35,7 +35,8 @@ Provides also two small base classes: CLIDbLoader, CLIManager
|
||||
#-------------------------------------------------------------------------
|
||||
from __future__ import print_function
|
||||
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import os
|
||||
import sys
|
||||
|
||||
@ -296,10 +297,10 @@ def startcli(errors, argparser):
|
||||
#already errors encountered. Show first one on terminal and exit
|
||||
# Convert error message to file system encoding before print
|
||||
errmsg = _('Error encountered: %s') % errors[0][0]
|
||||
errmsg = errmsg.encode(sys.getfilesystemencoding())
|
||||
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
|
||||
print(errmsg)
|
||||
errmsg = _(' Details: %s') % errors[0][1]
|
||||
errmsg = errmsg.encode(sys.getfilesystemencoding())
|
||||
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
|
||||
print(errmsg)
|
||||
sys.exit(1)
|
||||
|
||||
@ -307,10 +308,10 @@ def startcli(errors, argparser):
|
||||
# Convert error message to file system encoding before print
|
||||
errmsg = _('Error encountered in argument parsing: %s') \
|
||||
% argparser.errors[0][0]
|
||||
errmsg = errmsg.encode(sys.getfilesystemencoding())
|
||||
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
|
||||
print(errmsg)
|
||||
errmsg = _(' Details: %s') % argparser.errors[0][1]
|
||||
errmsg = errmsg.encode(sys.getfilesystemencoding())
|
||||
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
|
||||
print(errmsg)
|
||||
sys.exit(1)
|
||||
|
||||
|
@ -35,7 +35,8 @@
|
||||
#-------------------------------------------------------------------------
|
||||
from __future__ import print_function
|
||||
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import traceback
|
||||
import os
|
||||
import sys
|
||||
@ -570,11 +571,11 @@ class CommandLineReport(object):
|
||||
# Make the output nicer to read, assume a tab has 8 spaces
|
||||
tabs = '\t\t' if len(key) < 10 else '\t'
|
||||
optmsg = " %s%s%s (%s)" % (key, tabs, opt[1], opt[0])
|
||||
print(optmsg.encode(sys.getfilesystemencoding()))
|
||||
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
else:
|
||||
optmsg = " %s%s%s" % (key, tabs,
|
||||
_('(no help available)'))
|
||||
print(optmsg.encode(sys.getfilesystemencoding()))
|
||||
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
print((_(" Use '%(donottranslate)s' to see description "
|
||||
"and acceptable values") %
|
||||
{'donottranslate' : "show=option"}))
|
||||
@ -587,10 +588,10 @@ class CommandLineReport(object):
|
||||
if isinstance(vals, (list, tuple)):
|
||||
for val in vals:
|
||||
optmsg = " %s" % val
|
||||
print(optmsg.encode(sys.getfilesystemencoding()))
|
||||
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
else:
|
||||
optmsg = " %s" % opt[2]
|
||||
print(optmsg.encode(sys.getfilesystemencoding()))
|
||||
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
|
||||
|
||||
else:
|
||||
#there was a show option given, but the option is invalid
|
||||
@ -726,6 +727,7 @@ def cl_book(database, name, book, options_str_dict):
|
||||
clr.marginr, clr.margint, clr.marginb))
|
||||
user = User()
|
||||
rptlist = []
|
||||
global_style = None
|
||||
for item in book.get_item_list():
|
||||
|
||||
# The option values were loaded magically by the book parser.
|
||||
@ -743,6 +745,12 @@ def cl_book(database, name, book, options_str_dict):
|
||||
report_class, item.option_class, user)
|
||||
style_sheet = create_style_sheet(item)
|
||||
rptlist.append((obj, style_sheet))
|
||||
if ( item.name == 'table_of_contents' or
|
||||
item.name == 'alphabetical_index' ): # ugly hack: FIXME
|
||||
if global_style is None:
|
||||
global_style = style_sheet
|
||||
else:
|
||||
global_style = create_style_sheet(item, global_style)
|
||||
|
||||
doc.open(clr.option_class.get_output())
|
||||
doc.init()
|
||||
@ -754,6 +762,8 @@ def cl_book(database, name, book, options_str_dict):
|
||||
newpage = 1
|
||||
rpt.begin_report()
|
||||
rpt.write_report()
|
||||
if global_style:
|
||||
doc.set_style_sheet(global_style)
|
||||
doc.close()
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
|
@ -38,7 +38,8 @@ import sys
|
||||
# Gramps Modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
from gramps.gen.user import User
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
|
@ -41,7 +41,8 @@ import logging
|
||||
# Gramps imports
|
||||
#
|
||||
#---------------------------------------------------------------
|
||||
from .ggettext import gettext as _
|
||||
from .const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
from .const import HOME_DIR, USER_HOME, VERSION_DIR
|
||||
from .utils.configmanager import ConfigManager
|
||||
|
||||
@ -209,6 +210,7 @@ register('interface.filter', False)
|
||||
register('interface.filter-editor-width', 400)
|
||||
register('interface.filter-editor-height', 350)
|
||||
register('interface.fullscreen', False)
|
||||
register('interface.grampletbar-close', False)
|
||||
register('interface.height', 500)
|
||||
register('interface.lds-height', 450)
|
||||
register('interface.lds-width', 600)
|
||||
|
@ -42,7 +42,6 @@ import uuid
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from .ggettext import sgettext as _
|
||||
from .svn_revision import get_svn_revision
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -65,7 +64,6 @@ def get_version_tuple(v):
|
||||
return tuple(map(int, retval.split(".")))
|
||||
VERSION_TUPLE = get_version_tuple(VERSION)
|
||||
major_version = "%s.%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1])
|
||||
VERSION += get_svn_revision()
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -171,6 +169,8 @@ if sys.version_info[0] < 3:
|
||||
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
|
||||
unicode(__file__, sys.getfilesystemencoding())), os.pardir))
|
||||
|
||||
VERSION += get_svn_revision(ROOT_DIR)
|
||||
|
||||
#
|
||||
# Glade files
|
||||
#
|
||||
@ -212,6 +212,14 @@ LOGO = os.path.join(IMAGE_DIR, "logo.png")
|
||||
SPLASH = os.path.join(IMAGE_DIR, "splash.jpg")
|
||||
|
||||
LICENSE_FILE = os.path.join(DOC_DIR, 'COPYING')
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Init Localization
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from .utils.grampslocale import GrampsLocale
|
||||
GRAMPS_LOCALE = GrampsLocale()
|
||||
_ = GRAMPS_LOCALE.get_translation().sgettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -64,6 +64,13 @@ else:
|
||||
STRTYPE = str
|
||||
UNITYPE = str
|
||||
cuni = conv_to_unicode_direct
|
||||
|
||||
# handle in database is bytes, while internally Gramps wants unicode for py3
|
||||
if sys.version_info[0] < 3:
|
||||
handle2internal = lambda x: x
|
||||
else:
|
||||
handle2internal = lambda x: conv_to_unicode(x, 'utf-8')
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Platform determination functions
|
||||
|
@ -25,6 +25,8 @@ import locale
|
||||
import sys
|
||||
from ..constfunc import mac, win, conv_to_unicode
|
||||
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
|
||||
"""
|
||||
Some OS environments do not support the locale.nl_langinfo() method
|
||||
of determing month names and other date related information.
|
||||
@ -41,7 +43,11 @@ else:
|
||||
#locale returns unicode in python 3
|
||||
to_uni = lambda x, y: x
|
||||
try:
|
||||
codeset = locale.nl_langinfo(locale.CODESET)
|
||||
codeset = glocale.get_translation().info()["charset"]
|
||||
except KeyError:
|
||||
codeset = "UTF-8"
|
||||
|
||||
try:
|
||||
|
||||
month_to_int = {
|
||||
to_uni(locale.nl_langinfo(locale.MON_1), codeset).lower() : 1,
|
||||
@ -137,69 +143,64 @@ try:
|
||||
|
||||
except:
|
||||
import time
|
||||
codeset = None
|
||||
if win() or mac():
|
||||
codeset = locale.getlocale()[1]
|
||||
if codeset is None:
|
||||
codeset = locale.getpreferredencoding()
|
||||
|
||||
month_to_int = {
|
||||
to_uni(time.strftime('%B',(0,1,1,1,1,1,1,1,1)), codeset).lower() : 1,
|
||||
to_uni(time.strftime('%b',(0,1,1,1,1,1,1,1,1)), codeset).lower() : 1,
|
||||
to_uni(time.strftime('%B',(0,2,1,1,1,1,1,1,1)), codeset).lower() : 2,
|
||||
to_uni(time.strftime('%b',(0,2,1,1,1,1,1,1,1)), codeset).lower() : 2,
|
||||
to_uni(time.strftime('%B',(0,3,1,1,1,1,1,1,1)), codeset).lower() : 3,
|
||||
to_uni(time.strftime('%b',(0,3,1,1,1,1,1,1,1)), codeset).lower() : 3,
|
||||
to_uni(time.strftime('%B',(0,4,1,1,1,1,1,1,1)), codeset).lower() : 4,
|
||||
to_uni(time.strftime('%b',(0,4,1,1,1,1,1,1,1)), codeset).lower() : 4,
|
||||
to_uni(time.strftime('%B',(0,5,1,1,1,1,1,1,1)), codeset).lower() : 5,
|
||||
to_uni(time.strftime('%b',(0,5,1,1,1,1,1,1,1)), codeset).lower() : 5,
|
||||
to_uni(time.strftime('%B',(0,6,1,1,1,1,1,1,1)), codeset).lower() : 6,
|
||||
to_uni(time.strftime('%b',(0,6,1,1,1,1,1,1,1)), codeset).lower() : 6,
|
||||
to_uni(time.strftime('%B',(0,7,1,1,1,1,1,1,1)), codeset).lower() : 7,
|
||||
to_uni(time.strftime('%b',(0,7,1,1,1,1,1,1,1)), codeset).lower() : 7,
|
||||
to_uni(time.strftime('%B',(0,8,1,1,1,1,1,1,1)), codeset).lower() : 8,
|
||||
to_uni(time.strftime('%b',(0,8,1,1,1,1,1,1,1)), codeset).lower() : 8,
|
||||
to_uni(time.strftime('%B',(0,9,1,1,1,1,1,1,1)), codeset).lower() : 9,
|
||||
to_uni(time.strftime('%b',(0,9,1,1,1,1,1,1,1)), codeset).lower() : 9,
|
||||
to_uni(time.strftime('%B',(0,10,1,1,1,1,1,1,1)), codeset).lower() : 10,
|
||||
to_uni(time.strftime('%b',(0,10,1,1,1,1,1,1,1)), codeset).lower() : 10,
|
||||
to_uni(time.strftime('%B',(0,11,1,1,1,1,1,1,1)), codeset).lower() : 11,
|
||||
to_uni(time.strftime('%b',(0,11,1,1,1,1,1,1,1)), codeset).lower() : 11,
|
||||
to_uni(time.strftime('%B',(0,12,1,1,1,1,1,1,1)), codeset).lower() : 12,
|
||||
to_uni(time.strftime('%b',(0,12,1,1,1,1,1,1,1)), codeset).lower() : 12,
|
||||
to_uni(time.strftime('%B',(1,1,1,1,1,1,1,1,1)), codeset).lower() : 1,
|
||||
to_uni(time.strftime('%b',(1,1,1,1,1,1,1,1,1)), codeset).lower() : 1,
|
||||
to_uni(time.strftime('%B',(1,2,1,1,1,1,1,1,1)), codeset).lower() : 2,
|
||||
to_uni(time.strftime('%b',(1,2,1,1,1,1,1,1,1)), codeset).lower() : 2,
|
||||
to_uni(time.strftime('%B',(1,3,1,1,1,1,1,1,1)), codeset).lower() : 3,
|
||||
to_uni(time.strftime('%b',(1,3,1,1,1,1,1,1,1)), codeset).lower() : 3,
|
||||
to_uni(time.strftime('%B',(1,4,1,1,1,1,1,1,1)), codeset).lower() : 4,
|
||||
to_uni(time.strftime('%b',(1,4,1,1,1,1,1,1,1)), codeset).lower() : 4,
|
||||
to_uni(time.strftime('%B',(1,5,1,1,1,1,1,1,1)), codeset).lower() : 5,
|
||||
to_uni(time.strftime('%b',(1,5,1,1,1,1,1,1,1)), codeset).lower() : 5,
|
||||
to_uni(time.strftime('%B',(1,6,1,1,1,1,1,1,1)), codeset).lower() : 6,
|
||||
to_uni(time.strftime('%b',(1,6,1,1,1,1,1,1,1)), codeset).lower() : 6,
|
||||
to_uni(time.strftime('%B',(1,7,1,1,1,1,1,1,1)), codeset).lower() : 7,
|
||||
to_uni(time.strftime('%b',(1,7,1,1,1,1,1,1,1)), codeset).lower() : 7,
|
||||
to_uni(time.strftime('%B',(1,8,1,1,1,1,1,1,1)), codeset).lower() : 8,
|
||||
to_uni(time.strftime('%b',(1,8,1,1,1,1,1,1,1)), codeset).lower() : 8,
|
||||
to_uni(time.strftime('%B',(1,9,1,1,1,1,1,1,1)), codeset).lower() : 9,
|
||||
to_uni(time.strftime('%b',(1,9,1,1,1,1,1,1,1)), codeset).lower() : 9,
|
||||
to_uni(time.strftime('%B',(1,10,1,1,1,1,1,1,1)), codeset).lower() : 10,
|
||||
to_uni(time.strftime('%b',(1,10,1,1,1,1,1,1,1)), codeset).lower() : 10,
|
||||
to_uni(time.strftime('%B',(1,11,1,1,1,1,1,1,1)), codeset).lower() : 11,
|
||||
to_uni(time.strftime('%b',(1,11,1,1,1,1,1,1,1)), codeset).lower() : 11,
|
||||
to_uni(time.strftime('%B',(1,12,1,1,1,1,1,1,1)), codeset).lower() : 12,
|
||||
to_uni(time.strftime('%b',(1,12,1,1,1,1,1,1,1)), codeset).lower() : 12,
|
||||
}
|
||||
|
||||
long_months = (
|
||||
"",
|
||||
to_uni(time.strftime('%B',(0,1,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,2,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,3,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,4,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,5,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,6,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,7,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,8,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,9,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,10,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,11,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(0,12,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,1,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,2,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,3,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,4,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,5,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,6,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,7,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,8,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,9,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,10,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,11,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%B',(1,12,1,1,1,1,1,1,1)), codeset),
|
||||
)
|
||||
|
||||
short_months = (
|
||||
"",
|
||||
to_uni(time.strftime('%b',(0,1,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,2,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,3,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,4,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,5,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,6,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,7,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,8,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,9,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,10,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,11,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(0,12,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,1,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,2,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,3,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,4,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,5,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,6,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,7,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,8,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,9,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,10,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,11,1,1,1,1,1,1,1)), codeset),
|
||||
to_uni(time.strftime('%b',(1,12,1,1,1,1,1,1,1)), codeset),
|
||||
)
|
||||
|
||||
# Gramps day number: Sunday => 1, Monday => 2, etc
|
||||
@ -213,24 +214,24 @@ except:
|
||||
# just a dummy.
|
||||
long_days = (
|
||||
"",
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,6,1,1)), codeset), # Sunday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,0,1,1)), codeset), # Monday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,1,1,1)), codeset), # Tuesday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,2,1,1)), codeset), # Wednesday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,3,1,1)), codeset), # Thursday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,4,1,1)), codeset), # Friday
|
||||
to_uni(time.strftime('%A',(0,1,1,1,1,1,5,1,1)), codeset), # Saturday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,6,1,1)), codeset), # Sunday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,0,1,1)), codeset), # Monday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,1,1,1)), codeset), # Tuesday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,2,1,1)), codeset), # Wednesday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,3,1,1)), codeset), # Thursday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,4,1,1)), codeset), # Friday
|
||||
to_uni(time.strftime('%A',(1,1,1,1,1,1,5,1,1)), codeset), # Saturday
|
||||
)
|
||||
|
||||
short_days = (
|
||||
"",
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,6,1,1)), codeset), # Sunday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,0,1,1)), codeset), # Monday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,1,1,1)), codeset), # Tuesday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,2,1,1)), codeset), # Wednesday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,3,1,1)), codeset), # Thursday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,4,1,1)), codeset), # Friday
|
||||
to_uni(time.strftime('%a',(0,1,1,1,1,1,5,1,1)), codeset), # Saturday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,6,1,1)), codeset), # Sunday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,0,1,1)), codeset), # Monday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,1,1,1)), codeset), # Tuesday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,2,1,1)), codeset), # Wednesday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,3,1,1)), codeset), # Thursday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,4,1,1)), codeset), # Friday
|
||||
to_uni(time.strftime('%a',(1,1,1,1,1,1,5,1,1)), codeset), # Saturday
|
||||
)
|
||||
|
||||
# depending on the locale, the value returned for 20th Feb 2009 could be
|
||||
|
@ -67,8 +67,9 @@ else:
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from .exceptions import DbException
|
||||
from .write import FAMILY_TBL, PLACES_TBL, SOURCES_TBL, MEDIA_TBL, \
|
||||
EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL, TAG_TBL, META, CITATIONS_TBL
|
||||
from .write import (FAMILY_TBL, PLACES_TBL, LOCATION_TBL, SOURCES_TBL,
|
||||
MEDIA_TBL, EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL,
|
||||
TAG_TBL, META, CITATIONS_TBL)
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -215,5 +216,6 @@ def __build_tbl_map(database):
|
||||
( MEDIA_TBL, database.media_map.db),
|
||||
( EVENTS_TBL, database.event_map.db),
|
||||
( TAG_TBL, database.tag_map.db),
|
||||
( LOCATION_TBL, database.location_map.db),
|
||||
( META, database.metadata.db),
|
||||
]
|
||||
|
@ -32,7 +32,8 @@ from this class.
|
||||
# Python libraries
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..ggettext import gettext as _
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -321,6 +322,27 @@ class DbReadBase(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_location_cursor(self):
|
||||
"""
|
||||
Return a reference to a cursor over Location objects
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_location_from_handle(self, handle):
|
||||
"""
|
||||
Find a Location in the database from the passed handle.
|
||||
|
||||
If no such Location exists, None is returned.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_location_handles(self):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Location in
|
||||
the database.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_media_attribute_types(self):
|
||||
"""
|
||||
Return a list of all Attribute types associated with Media and MediaRef
|
||||
@ -436,6 +458,12 @@ class DbReadBase(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_number_of_locations(self):
|
||||
"""
|
||||
Return the number of locations currently in the database.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_number_of_media_objects(self):
|
||||
"""
|
||||
Return the number of media objects currently in the database.
|
||||
@ -591,6 +619,12 @@ class DbReadBase(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_raw_location_data(self, handle):
|
||||
"""
|
||||
Return raw (serialized and pickled) Location object from handle
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_raw_note_data(self, handle):
|
||||
"""
|
||||
Return raw (serialized and pickled) Note object from handle
|
||||
@ -867,6 +901,12 @@ class DbReadBase(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def has_location_handle(self, handle):
|
||||
"""
|
||||
Return True if the handle exists in the current Location database.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def has_name_group_key(self, name):
|
||||
"""
|
||||
Return if a key exists in the name_group table.
|
||||
@ -945,6 +985,18 @@ class DbReadBase(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def iter_location_handles(self):
|
||||
"""
|
||||
Return an iterator over handles for Locations in the database
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def iter_locations(self):
|
||||
"""
|
||||
Return an iterator over objects for Locations in the database
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def iter_media_object_handles(self):
|
||||
"""
|
||||
Return an iterator over handles for Media in the database
|
||||
@ -1235,6 +1287,13 @@ class DbWriteBase(DbReadBase):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def add_location(self, location, transaction):
|
||||
"""
|
||||
Add a Location to the database, assigning a handle if it has not already
|
||||
been defined.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def add_note(self, obj, transaction, set_gid=True):
|
||||
"""
|
||||
Add a Note to the database, assigning internal IDs if they have
|
||||
@ -1343,6 +1402,13 @@ class DbWriteBase(DbReadBase):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def commit_location(self, location, transaction, change_time=None):
|
||||
"""
|
||||
Commit the specified Location to the database, storing the changes as
|
||||
part of the transaction.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def commit_media_object(self, obj, transaction, change_time=None):
|
||||
"""
|
||||
Commit the specified MediaObject to the database, storing the changes
|
||||
@ -1460,6 +1526,15 @@ class DbWriteBase(DbReadBase):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def remove_location(self, handle, transaction):
|
||||
"""
|
||||
Remove the Location specified by the database handle from the
|
||||
database, preserving the change in the passed transaction.
|
||||
|
||||
This method must be overridden in the derived class.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def remove_note(self, handle, transaction):
|
||||
"""
|
||||
Remove the Note specified by the database handle from the
|
||||
|
@ -45,8 +45,8 @@ __all__ = (
|
||||
) +
|
||||
|
||||
('PERSON_KEY', 'FAMILY_KEY', 'SOURCE_KEY', 'CITATION_KEY',
|
||||
'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'REPOSITORY_KEY',
|
||||
'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY'
|
||||
'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'LOCATION_KEY',
|
||||
'REPOSITORY_KEY', 'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY'
|
||||
) +
|
||||
|
||||
('TXNADD', 'TXNUPD', 'TXNDEL')
|
||||
@ -87,5 +87,6 @@ REFERENCE_KEY = 7
|
||||
NOTE_KEY = 8
|
||||
TAG_KEY = 9
|
||||
CITATION_KEY = 10
|
||||
LOCATION_KEY = 11
|
||||
|
||||
TXNADD, TXNUPD, TXNDEL = 0, 1, 2
|
||||
|
@ -195,6 +195,7 @@ class DictionaryDb(DbWriteBase, DbReadBase):
|
||||
}
|
||||
# skip GEDCOM cross-ref check for now:
|
||||
self.set_feature("skip-check-xref", True)
|
||||
self.set_feature("skip-import-additions", True)
|
||||
self.readonly = False
|
||||
self.db_is_open = True
|
||||
self.name_formats = []
|
||||
@ -255,6 +256,20 @@ class DictionaryDb(DbWriteBase, DbReadBase):
|
||||
self.txn = DictionaryTxn("DbDictionary Transaction", self)
|
||||
self.transaction = None
|
||||
|
||||
def version_supported(self):
|
||||
"""Return True when the file has a supported version."""
|
||||
return True
|
||||
|
||||
def get_table_names(self):
|
||||
"""Return a list of valid table names."""
|
||||
return list(self._tables.keys())
|
||||
|
||||
def get_table_metadata(self, table_name):
|
||||
"""Return the metadata for a valid table name."""
|
||||
if table_name in self._tables:
|
||||
return self._tables[table_name]
|
||||
return None
|
||||
|
||||
def transaction_commit(self, txn):
|
||||
pass
|
||||
|
||||
|
@ -27,7 +27,8 @@
|
||||
# Standard python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..ggettext import gettext as _
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
|
||||
class DbException(Exception):
|
||||
|
@ -40,7 +40,6 @@ else:
|
||||
import pickle
|
||||
import time
|
||||
import random
|
||||
import locale
|
||||
import os
|
||||
from sys import maxsize
|
||||
|
||||
@ -49,7 +48,8 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
|
||||
from bsddb3 import db
|
||||
else:
|
||||
from bsddb import db
|
||||
from ..ggettext import gettext as _
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import re
|
||||
|
||||
import logging
|
||||
@ -66,6 +66,7 @@ from ..lib.src import Source
|
||||
from ..lib.citation import Citation
|
||||
from ..lib.event import Event
|
||||
from ..lib.place import Place
|
||||
from ..lib.location import Location
|
||||
from ..lib.repo import Repository
|
||||
from ..lib.note import Note
|
||||
from ..lib.tag import Tag
|
||||
@ -80,6 +81,7 @@ from . import (BsddbBaseCursor, DbReadBase)
|
||||
from ..utils.id import create_id
|
||||
from ..errors import DbError
|
||||
from ..constfunc import UNITYPE, STRTYPE, cuni
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
|
||||
LOG = logging.getLogger(DBLOGNAME)
|
||||
LOG = logging.getLogger(".citation")
|
||||
@ -91,7 +93,7 @@ LOG = logging.getLogger(".citation")
|
||||
from .dbconst import *
|
||||
|
||||
_SIGBASE = ('person', 'family', 'source', 'citation',
|
||||
'event', 'media', 'place', 'repository',
|
||||
'event', 'media', 'place', 'location', 'repository',
|
||||
'reference', 'note', 'tag')
|
||||
|
||||
DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
|
||||
@ -102,6 +104,17 @@ DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
|
||||
# Helper functions
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
def find_byte_surname(key, data):
|
||||
"""
|
||||
Creating a surname from raw data of a person, to use for sort and index
|
||||
returns a byte string
|
||||
"""
|
||||
surn = __index_surname(data[3][5])
|
||||
# in python 3 we work with unicode internally, but need byte function sometimes
|
||||
if isinstance(surn, UNITYPE):
|
||||
return surn.encode('utf-8')
|
||||
return surn
|
||||
|
||||
def find_surname(key, data):
|
||||
"""
|
||||
Creating a surname from raw data of a person, to use for sort and index
|
||||
@ -178,6 +191,32 @@ class DbReadCursor(BsddbBaseCursor):
|
||||
self.cursor = source.db.cursor(txn)
|
||||
self.source = source
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# DbBsddbTreeCursor
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class DbBsddbTreeCursor(BsddbBaseCursor):
|
||||
|
||||
def __init__(self, source, txn=None, **kwargs):
|
||||
BsddbBaseCursor.__init__(self, txn=txn, **kwargs)
|
||||
self.cursor = source.cursor(txn)
|
||||
self.source = source
|
||||
|
||||
def __iter__(self):
|
||||
"""
|
||||
Iterator
|
||||
"""
|
||||
to_do = [None]
|
||||
while to_do:
|
||||
data = self.set(str(to_do.pop()))
|
||||
_n = self.next_dup
|
||||
while data:
|
||||
payload = pickle.loads(data[1])
|
||||
yield (payload[0], payload)
|
||||
to_do.append(payload[0])
|
||||
data = _n()
|
||||
|
||||
class DbBsddbRead(DbReadBase, Callback):
|
||||
"""
|
||||
Read class for the GRAMPS databases. Implements methods necessary to read
|
||||
@ -327,6 +366,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
"cursor_func": self.get_tag_cursor,
|
||||
"handles_func": self.get_tag_handles,
|
||||
},
|
||||
'Location':
|
||||
{
|
||||
"handle_func": self.get_location_from_handle,
|
||||
"gramps_id_func": None,
|
||||
"class_func": Location,
|
||||
"cursor_func": self.get_location_cursor,
|
||||
},
|
||||
}
|
||||
|
||||
self.set_person_id_prefix('I%04d')
|
||||
@ -381,6 +427,7 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
self.nid_trans = {}
|
||||
self.eid_trans = {}
|
||||
self.tag_trans = {}
|
||||
self.loc_trans = {}
|
||||
self.env = None
|
||||
self.person_map = {}
|
||||
self.family_map = {}
|
||||
@ -484,6 +531,9 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
def get_tag_cursor(self, *args, **kwargs):
|
||||
return self.get_cursor(self.tag_map, *args, **kwargs)
|
||||
|
||||
def get_location_cursor(self, *args, **kwargs):
|
||||
return DbBsddbTreeCursor(self.parents, self.txn)
|
||||
|
||||
def close(self):
|
||||
"""
|
||||
Close the specified database.
|
||||
@ -532,6 +582,7 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
self.emit('repository-rebuild')
|
||||
self.emit('note-rebuild')
|
||||
self.emit('tag-rebuild')
|
||||
self.emit('location-rebuild')
|
||||
|
||||
def __find_next_gramps_id(self, prefix, map_index, trans):
|
||||
"""
|
||||
@ -747,6 +798,14 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
"""
|
||||
return self.get_from_handle(handle, Tag, self.tag_map)
|
||||
|
||||
def get_location_from_handle(self, handle):
|
||||
"""
|
||||
Find a Location in the database from the passed handle.
|
||||
|
||||
If no such Location exists, None is returned.
|
||||
"""
|
||||
return self.get_from_handle(handle, Location, self.location_map)
|
||||
|
||||
def __get_obj_from_gramps_id(self, val, tbl, class_, prim_tbl):
|
||||
if isinstance(tbl, dict):
|
||||
return None ## trying to get object too early
|
||||
@ -955,6 +1014,12 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
"""
|
||||
return self.get_number_of_records(self.tag_map)
|
||||
|
||||
def get_number_of_locations(self):
|
||||
"""
|
||||
Return the number of locations currently in the database.
|
||||
"""
|
||||
return self.get_number_of_records(self.location_map)
|
||||
|
||||
def all_handles(self, table):
|
||||
return table.keys(txn=self.txn)
|
||||
|
||||
@ -1079,6 +1144,15 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
return handle_list
|
||||
return []
|
||||
|
||||
def get_location_handles(self):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Location in the
|
||||
database.
|
||||
"""
|
||||
if self.db_is_open:
|
||||
return self.all_handles(self.location_map)
|
||||
return []
|
||||
|
||||
def _f(curs_):
|
||||
"""
|
||||
Closure that returns an iterator over handles in the database.
|
||||
@ -1101,6 +1175,7 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
iter_repository_handles = _f(get_repository_cursor)
|
||||
iter_note_handles = _f(get_note_cursor)
|
||||
iter_tag_handles = _f(get_tag_cursor)
|
||||
iter_location_handles = _f(get_location_cursor)
|
||||
del _f
|
||||
|
||||
def _f(curs_, obj_):
|
||||
@ -1127,6 +1202,7 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
iter_repositories = _f(get_repository_cursor, Repository)
|
||||
iter_notes = _f(get_note_cursor, Note)
|
||||
iter_tags = _f(get_tag_cursor, Tag)
|
||||
iter_locations = _f(get_location_cursor, Location)
|
||||
del _f
|
||||
|
||||
def get_gramps_ids(self, obj_key):
|
||||
@ -1558,6 +1634,9 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
def get_raw_tag_data(self, handle):
|
||||
return self.__get_raw_data(self.tag_map, handle)
|
||||
|
||||
def get_raw_location_data(self, handle):
|
||||
return self.__get_raw_data(self.location_map, handle)
|
||||
|
||||
def __has_handle(self, table, handle):
|
||||
"""
|
||||
Helper function for has_<object>_handle methods
|
||||
@ -1630,10 +1709,16 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
"""
|
||||
return self.__has_handle(self.tag_map, handle)
|
||||
|
||||
def has_location_handle(self, handle):
|
||||
"""
|
||||
Return True if the handle exists in the current Location database.
|
||||
"""
|
||||
return self.__has_handle(self.location_map, handle)
|
||||
|
||||
def __sortbyperson_key(self, handle):
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
return locale.strxfrm(find_surname(handle,
|
||||
return glocale.sort_key(find_surname(handle,
|
||||
self.person_map.get(handle)))
|
||||
|
||||
def __sortbyplace(self, first, second):
|
||||
@ -1641,13 +1726,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
first = first.encode('utf-8')
|
||||
if isinstance(second, UNITYPE):
|
||||
second = second.encode('utf-8')
|
||||
return locale.strcoll(self.place_map.get(first)[2],
|
||||
return glocale.strcoll(self.place_map.get(first)[2],
|
||||
self.place_map.get(second)[2])
|
||||
|
||||
def __sortbyplace_key(self, place):
|
||||
if isinstance(place, UNITYPE):
|
||||
place = place.encode('utf-8')
|
||||
return locale.strxfrm(self.place_map.get(place)[2])
|
||||
return glocale.sort_key(self.place_map.get(place)[2])
|
||||
|
||||
def __sortbysource(self, first, second):
|
||||
if isinstance(first, UNITYPE):
|
||||
@ -1656,13 +1741,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
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 glocale.strcoll(source1, source2)
|
||||
|
||||
def __sortbysource_key(self, key):
|
||||
if isinstance(key, UNITYPE):
|
||||
key = key.encode('utf-8')
|
||||
source = cuni(self.source_map[key][2])
|
||||
return locale.strxfrm(source)
|
||||
return glocale.sort_key(source)
|
||||
|
||||
def __sortbycitation(self, first, second):
|
||||
if isinstance(first, UNITYPE):
|
||||
@ -1671,13 +1756,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
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 glocale.strcoll(citation1, citation2)
|
||||
|
||||
def __sortbycitation_key(self, key):
|
||||
if isinstance(key, UNITYPE):
|
||||
key = key.encode('utf-8')
|
||||
citation = cuni(self.citation_map[key][3])
|
||||
return locale.strxfrm(citation)
|
||||
return glocale.sort_key(citation)
|
||||
|
||||
def __sortbymedia(self, first, second):
|
||||
if isinstance(first, UNITYPE):
|
||||
@ -1686,13 +1771,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
second = second.encode('utf-8')
|
||||
media1 = self.media_map[first][4]
|
||||
media2 = self.media_map[second][4]
|
||||
return locale.strcoll(media1, media2)
|
||||
return glocale.strcoll(media1, media2)
|
||||
|
||||
def __sortbymedia_key(self, key):
|
||||
if isinstance(key, UNITYPE):
|
||||
key = key.encode('utf-8')
|
||||
media = self.media_map[key][4]
|
||||
return locale.strxfrm(media)
|
||||
return glocale.sort_key(media)
|
||||
|
||||
def __sortbytag(self, first, second):
|
||||
if isinstance(first, UNITYPE):
|
||||
@ -1701,13 +1786,13 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
second = second.encode('utf-8')
|
||||
tag1 = self.tag_map[first][1]
|
||||
tag2 = self.tag_map[second][1]
|
||||
return locale.strcoll(tag1, tag2)
|
||||
return glocale.strcoll(tag1, tag2)
|
||||
|
||||
def __sortbytag_key(self, key):
|
||||
if isinstance(key, UNITYPE):
|
||||
key = key.encode('utf-8')
|
||||
tag = self.tag_map[key][1]
|
||||
return locale.strxfrm(tag)
|
||||
return glocale.sort_key(tag)
|
||||
|
||||
def set_mediapath(self, path):
|
||||
"""Set the default media path for database, path should be utf-8."""
|
||||
@ -1786,6 +1871,10 @@ class DbBsddbRead(DbReadBase, Callback):
|
||||
'cursor_func': self.get_tag_cursor,
|
||||
'class_func': Tag,
|
||||
},
|
||||
'Location': {
|
||||
'cursor_func': self.get_location_cursor,
|
||||
'class_func': Location,
|
||||
},
|
||||
}
|
||||
|
||||
# Find which tables to iterate over
|
||||
|
@ -46,13 +46,15 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
|
||||
from bsddb3 import db
|
||||
else:
|
||||
from bsddb import db
|
||||
from ..ggettext import gettext as _
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..constfunc import conv_to_unicode, handle2internal
|
||||
from .dbconst import *
|
||||
from . import BSDDBTxn
|
||||
from ..errors import DbError
|
||||
@ -65,8 +67,9 @@ from ..errors import DbError
|
||||
DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
|
||||
db.DBPageNotFoundError, db.DBInvalidArgError)
|
||||
|
||||
_SIGBASE = ('person', 'family', 'source', 'event', 'media',
|
||||
'place', 'repository', 'reference', 'note', 'tag', 'citation')
|
||||
_SIGBASE = ('person', 'family', 'source', 'event', 'media', 'place',
|
||||
'location', 'repository', 'reference', 'note', 'tag', 'citation')
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# DbUndo class
|
||||
@ -104,6 +107,7 @@ class DbUndo(object):
|
||||
self.db.note_map,
|
||||
self.db.tag_map,
|
||||
self.db.citation_map,
|
||||
self.db.location_map,
|
||||
)
|
||||
|
||||
def clear(self):
|
||||
@ -315,7 +319,7 @@ class DbUndo(object):
|
||||
"""
|
||||
try:
|
||||
if data is None:
|
||||
emit(signal_root + '-delete', ([handle],))
|
||||
emit(signal_root + '-delete', ([handle2internal(handle)],))
|
||||
db_map.delete(handle, txn=self.txn)
|
||||
else:
|
||||
ex_data = db_map.get(handle, txn=self.txn)
|
||||
@ -324,7 +328,7 @@ class DbUndo(object):
|
||||
else:
|
||||
signal = signal_root + '-add'
|
||||
db_map.put(handle, data, txn=self.txn)
|
||||
emit(signal, ([handle],))
|
||||
emit(signal, ([handle2internal(handle)],))
|
||||
|
||||
except DBERRS as msg:
|
||||
self.db._log_error()
|
||||
@ -479,6 +483,7 @@ def testundo():
|
||||
self.place_map = {}
|
||||
self.note_map = {}
|
||||
self.tag_map = {}
|
||||
self.location_map = {}
|
||||
self.repository_map = {}
|
||||
self.reference_map = {}
|
||||
|
||||
|
@ -30,8 +30,9 @@ import time
|
||||
import logging
|
||||
LOG = logging.getLogger(".citation")
|
||||
|
||||
from ..ggettext import gettext as _
|
||||
from ..constfunc import cuni, UNITYPE
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
from ..constfunc import cuni
|
||||
|
||||
"""
|
||||
methods to upgrade a database from version 13 to current version
|
||||
@ -42,12 +43,166 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
|
||||
else:
|
||||
from bsddb import db
|
||||
from . import BSDDBTxn
|
||||
from ..constfunc import UNITYPE
|
||||
from ..lib.nameorigintype import NameOriginType
|
||||
from .write import _mkname, SURNAMES
|
||||
from .dbconst import (PERSON_KEY, FAMILY_KEY, EVENT_KEY,
|
||||
MEDIA_KEY, PLACE_KEY, REPOSITORY_KEY)
|
||||
from .dbconst import (PERSON_KEY, FAMILY_KEY, EVENT_KEY, MEDIA_KEY, PLACE_KEY,
|
||||
LOCATION_KEY, REPOSITORY_KEY)
|
||||
from gramps.gui.dialog import (InfoDialog)
|
||||
|
||||
def gramps_upgrade_18(self):
|
||||
self.set_total(len(self.place_map))
|
||||
self.children = {None: []}
|
||||
for handle in self.place_map.keys():
|
||||
place = self.place_map[handle]
|
||||
new_place = list(place)
|
||||
lat_long = (new_place[4], new_place[3])
|
||||
if new_place[5] is not None:
|
||||
new_place[5] = process_location(self, new_place[5], lat_long)
|
||||
else:
|
||||
new_place[5] = process_location(self, None, lat_long)
|
||||
add_reference(self, handle, new_place[5])
|
||||
alt_locs = []
|
||||
for alt_loc in new_place[6]:
|
||||
ref_handle = process_location(self, alt_loc, lat_long)
|
||||
add_reference(self, handle, ref_handle)
|
||||
alt_locs.append(ref_handle)
|
||||
new_place[6] = alt_locs
|
||||
new_place = tuple(new_place[:3] + new_place[5:])
|
||||
with BSDDBTxn(self.env, self.place_map) as txn:
|
||||
txn.put(str(handle), new_place)
|
||||
self.update()
|
||||
|
||||
with BSDDBTxn(self.env, self.metadata) as txn:
|
||||
txn.put(b'version', 18)
|
||||
|
||||
def add_reference(self, pri_handle, ref_handle):
|
||||
key = (PLACE_KEY, pri_handle)
|
||||
data = ((PLACE_KEY, pri_handle), (LOCATION_KEY, ref_handle))
|
||||
with BSDDBTxn(self.env, self.reference_map) as txn:
|
||||
txn.put(str(key), data)
|
||||
|
||||
def process_location(self, loc, lat_long):
|
||||
if loc is None:
|
||||
location = ['Unknown']
|
||||
else:
|
||||
# (street, locality, parish, city, county, state, country)
|
||||
# We need to think about where to put ZIP code and Phone number
|
||||
location = loc[0][:2] + (loc[1],) + loc[0][2:6]
|
||||
location = list(location)
|
||||
location.reverse()
|
||||
items = [x for x in enumerate(location) if x[1]]
|
||||
parent = None
|
||||
for item in items:
|
||||
parent = match_location(self, parent, item, lat_long)
|
||||
return parent
|
||||
|
||||
def match_location(self, parent, item, lat_long):
|
||||
for handle in self.children[parent]:
|
||||
if self.location_map[handle][2] == item[1]:
|
||||
return handle
|
||||
handle = self.create_id()
|
||||
self.children[handle] = []
|
||||
self.children[parent].append(handle)
|
||||
new_location = (handle,
|
||||
str(parent),
|
||||
item[1], # Name
|
||||
item[0]+1, # Type
|
||||
lat_long[0],
|
||||
lat_long[1],
|
||||
int(time.time()))
|
||||
with BSDDBTxn(self.env, self.location_map) as txn:
|
||||
txn.put(str(handle), new_location)
|
||||
return handle
|
||||
|
||||
def gramps_upgrade_17(self):
|
||||
"""Upgrade database from version 16 to 17. This upgrade adds tags to
|
||||
event, place, repository, source and citation objects.
|
||||
"""
|
||||
length = (len(self.event_map) + len(self.place_map) +
|
||||
len(self.repository_map) + len(self.source_map) +
|
||||
len(self.citation_map))
|
||||
self.set_total(length)
|
||||
|
||||
# ---------------------------------
|
||||
# Modify Event
|
||||
# ---------------------------------
|
||||
# Add new tag_list field.
|
||||
for handle in self.event_map.keys():
|
||||
event = self.event_map[handle]
|
||||
new_event = list(event)
|
||||
new_event = new_event[:11] + [[]] + new_event[11:]
|
||||
new_event = tuple(new_event)
|
||||
with BSDDBTxn(self.env, self.event_map) as txn:
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
txn.put(handle, new_event)
|
||||
self.update()
|
||||
|
||||
# ---------------------------------
|
||||
# Modify Place
|
||||
# ---------------------------------
|
||||
# Add new tag_list field.
|
||||
for handle in self.place_map.keys():
|
||||
place = self.place_map[handle]
|
||||
new_place = list(place)
|
||||
new_place = new_place[:12] + [[]] + new_place[12:]
|
||||
new_place = tuple(new_place)
|
||||
with BSDDBTxn(self.env, self.place_map) as txn:
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
txn.put(handle, new_place)
|
||||
self.update()
|
||||
|
||||
# ---------------------------------
|
||||
# Modify Repository
|
||||
# ---------------------------------
|
||||
# Add new tag_list field.
|
||||
for handle in self.repository_map.keys():
|
||||
repository = self.repository_map[handle]
|
||||
new_repository = list(repository)
|
||||
new_repository = new_repository[:8] + [[]] + new_repository[8:]
|
||||
new_repository = tuple(new_repository)
|
||||
with BSDDBTxn(self.env, self.repository_map) as txn:
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
txn.put(handle, new_repository)
|
||||
self.update()
|
||||
|
||||
# ---------------------------------
|
||||
# Modify Source
|
||||
# ---------------------------------
|
||||
# Add new tag_list field.
|
||||
for handle in self.source_map.keys():
|
||||
source = self.source_map[handle]
|
||||
new_source = list(source)
|
||||
new_source = new_source[:11] + [[]] + new_source[11:]
|
||||
new_source = tuple(new_source)
|
||||
with BSDDBTxn(self.env, self.source_map) as txn:
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
txn.put(handle, new_source)
|
||||
self.update()
|
||||
|
||||
# ---------------------------------
|
||||
# Modify Citation
|
||||
# ---------------------------------
|
||||
# Add new tag_list field.
|
||||
for handle in self.citation_map.keys():
|
||||
citation = self.citation_map[handle]
|
||||
new_citation = list(citation)
|
||||
new_citation = new_citation[:10] + [[]] + new_citation[10:]
|
||||
new_citation = tuple(new_citation)
|
||||
with BSDDBTxn(self.env, self.citation_map) as txn:
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
txn.put(handle, new_citation)
|
||||
self.update()
|
||||
|
||||
# Bump up database version. Separate transaction to save metadata.
|
||||
with BSDDBTxn(self.env, self.metadata) as txn:
|
||||
txn.put(b'version', 17)
|
||||
|
||||
def gramps_upgrade_16(self):
|
||||
"""Upgrade database from version 15 to 16. This upgrade converts all
|
||||
SourceRef child objects to Citation Primary objects.
|
||||
|
@ -40,13 +40,11 @@ else:
|
||||
import pickle
|
||||
import os
|
||||
import time
|
||||
import locale
|
||||
import bisect
|
||||
from functools import wraps
|
||||
import logging
|
||||
from sys import maxsize
|
||||
|
||||
from ..ggettext import gettext as _
|
||||
from ..config import config
|
||||
if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
|
||||
from bsddb3 import dbshelve, db
|
||||
@ -64,6 +62,7 @@ from ..lib.src import Source
|
||||
from ..lib.citation import Citation
|
||||
from ..lib.event import Event
|
||||
from ..lib.place import Place
|
||||
from ..lib.location import Location
|
||||
from ..lib.repo import Repository
|
||||
from ..lib.mediaobj import MediaObject
|
||||
from ..lib.note import Note
|
||||
@ -74,18 +73,20 @@ from ..lib.researcher import Researcher
|
||||
from . import (DbBsddbRead, DbWriteBase, BSDDBTxn,
|
||||
DbTxn, BsddbBaseCursor, BsddbDowngradeError, DbVersionError,
|
||||
DbEnvironmentError, DbUpgradeRequiredError, find_surname,
|
||||
find_surname_name, DbUndoBSDDB as DbUndo)
|
||||
find_byte_surname, find_surname_name, DbUndoBSDDB as DbUndo)
|
||||
from .dbconst import *
|
||||
from ..utils.callback import Callback
|
||||
from ..utils.cast import (conv_unicode_tosrtkey, conv_dbstr_to_unicode)
|
||||
from ..utils.cast import conv_dbstr_to_unicode
|
||||
from ..updatecallback import UpdateCallback
|
||||
from ..errors import DbError
|
||||
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE
|
||||
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE, handle2internal
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
_LOG = logging.getLogger(DBLOGNAME)
|
||||
LOG = logging.getLogger(".citation")
|
||||
_MINVERSION = 9
|
||||
_DBVERSION = 16
|
||||
_DBVERSION = 18
|
||||
|
||||
IDTRANS = "person_id"
|
||||
FIDTRANS = "family_id"
|
||||
@ -97,6 +98,8 @@ NIDTRANS = "note_id"
|
||||
SIDTRANS = "source_id"
|
||||
CIDTRANS = "citation_id"
|
||||
TAGTRANS = "tag_name"
|
||||
LPARENTS = "location_parent"
|
||||
LNAMES = "location_name"
|
||||
SURNAMES = "surnames"
|
||||
NAME_GROUP = "name_group"
|
||||
META = "meta_data"
|
||||
@ -111,6 +114,7 @@ PERSON_TBL = "person"
|
||||
REPO_TBL = "repo"
|
||||
NOTE_TBL = "note"
|
||||
TAG_TBL = "tag"
|
||||
LOCATION_TBL = "location"
|
||||
|
||||
REF_MAP = "reference_map"
|
||||
REF_PRI = "primary_map"
|
||||
@ -134,7 +138,8 @@ CLASS_TO_KEY_MAP = {Person.__name__: PERSON_KEY,
|
||||
Place.__name__: PLACE_KEY,
|
||||
Repository.__name__:REPOSITORY_KEY,
|
||||
Note.__name__: NOTE_KEY,
|
||||
Tag.__name__: TAG_KEY}
|
||||
Tag.__name__: TAG_KEY,
|
||||
Location.__name__: LOCATION_KEY}
|
||||
|
||||
KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__,
|
||||
FAMILY_KEY: Family.__name__,
|
||||
@ -145,7 +150,8 @@ KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__,
|
||||
PLACE_KEY: Place.__name__,
|
||||
REPOSITORY_KEY: Repository.__name__,
|
||||
NOTE_KEY: Note.__name__,
|
||||
TAG_KEY: Tag.__name__}
|
||||
TAG_KEY: Tag.__name__,
|
||||
LOCATION_KEY: Location.__name__}
|
||||
|
||||
KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
|
||||
FAMILY_KEY: 'family',
|
||||
@ -157,7 +163,8 @@ KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
|
||||
REPOSITORY_KEY: 'repository',
|
||||
#REFERENCE_KEY: 'reference',
|
||||
NOTE_KEY: 'note',
|
||||
TAG_KEY: 'tag'}
|
||||
TAG_KEY: 'tag',
|
||||
LOCATION_KEY: 'location'}
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Helper functions
|
||||
@ -173,6 +180,20 @@ def find_idmap(key, data):
|
||||
val = val.encode('utf-8')
|
||||
return val
|
||||
|
||||
def find_parent(key, data):
|
||||
return str(data[1])
|
||||
val = data[1]
|
||||
if isinstance(val, UNITYPE):
|
||||
val = val.encode('utf-8')
|
||||
return val
|
||||
|
||||
def find_name(key, data):
|
||||
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
|
||||
# reference_map data values are of the form:
|
||||
# ((primary_object_class_name, primary_object_handle),
|
||||
@ -235,7 +256,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
# 1. Signals for primary objects
|
||||
__signals__ = dict((obj+'-'+op, signal)
|
||||
for obj in
|
||||
['person', 'family', 'event', 'place',
|
||||
['person', 'family', 'event', 'place', 'location',
|
||||
'source', 'citation', 'media', 'note', 'repository', 'tag']
|
||||
for op, signal in zip(
|
||||
['add', 'update', 'delete', 'rebuild'],
|
||||
@ -363,6 +384,20 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
return DbBsddbAssocCursor(self.reference_map_referenced_map,
|
||||
self.txn)
|
||||
|
||||
@catch_db_error
|
||||
def get_location_parent_cursor(self):
|
||||
"""
|
||||
Returns a reference to a cursor over the location parents
|
||||
"""
|
||||
return DbBsddbAssocCursor(self.parents, self.txn)
|
||||
|
||||
@catch_db_error
|
||||
def get_location_name_cursor(self):
|
||||
"""
|
||||
Returns a reference to a cursor over the location names
|
||||
"""
|
||||
return DbBsddbAssocCursor(self.names, self.txn)
|
||||
|
||||
# These are overriding the DbBsddbRead's methods of saving metadata
|
||||
# because we now have txn-capable metadata table
|
||||
|
||||
@ -444,7 +479,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
# See if we lack write access to any files in the directory
|
||||
for base in [FAMILY_TBL, PLACES_TBL, SOURCES_TBL, CITATIONS_TBL,
|
||||
MEDIA_TBL, EVENTS_TBL, PERSON_TBL, REPO_TBL,
|
||||
NOTE_TBL, REF_MAP, META]:
|
||||
NOTE_TBL, TAG_TBL, LOCATION_TBL, REF_MAP, META]:
|
||||
path = os.path.join(name, base + DBEXT)
|
||||
if os.path.isfile(path) and not os.access(path, os.W_OK):
|
||||
return True
|
||||
@ -558,6 +593,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
("repository_map", REPO_TBL, db.DB_HASH),
|
||||
("note_map", NOTE_TBL, db.DB_HASH),
|
||||
("tag_map", TAG_TBL, db.DB_HASH),
|
||||
("location_map", LOCATION_TBL, db.DB_HASH),
|
||||
("reference_map", REF_MAP, db.DB_BTREE),
|
||||
]
|
||||
|
||||
@ -706,6 +742,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
("rid_trans", RIDTRANS, db.DB_HASH, 0),
|
||||
("nid_trans", NIDTRANS, db.DB_HASH, 0),
|
||||
("tag_trans", TAGTRANS, db.DB_HASH, 0),
|
||||
("parents", LPARENTS, db.DB_HASH, 0),
|
||||
("names", LNAMES, db.DB_BTREE, db.DB_DUPSORT),
|
||||
("reference_map_primary_map", REF_PRI, db.DB_BTREE, 0),
|
||||
("reference_map_referenced_map", REF_REF, db.DB_BTREE, db.DB_DUPSORT),
|
||||
]
|
||||
@ -718,7 +756,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
if not self.readonly:
|
||||
|
||||
assoc = [
|
||||
(self.person_map, self.surnames, find_surname),
|
||||
(self.person_map, self.surnames, find_byte_surname),
|
||||
(self.person_map, self.id_trans, find_idmap),
|
||||
(self.family_map, self.fid_trans, find_idmap),
|
||||
(self.event_map, self.eid_trans, find_idmap),
|
||||
@ -729,6 +767,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
(self.repository_map, self.rid_trans, find_idmap),
|
||||
(self.note_map, self.nid_trans, find_idmap),
|
||||
(self.tag_map, self.tag_trans, find_idmap),
|
||||
(self.location_map, self.parents, find_parent),
|
||||
(self.location_map, self.names, find_name),
|
||||
(self.reference_map, self.reference_map_primary_map,
|
||||
find_primary_handle),
|
||||
(self.reference_map, self.reference_map_referenced_map,
|
||||
@ -770,6 +810,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
( self.nid_trans, NIDTRANS ),
|
||||
( self.cid_trans, CIDTRANS ),
|
||||
( self.tag_trans, TAGTRANS ),
|
||||
( self.parents, LPARENTS ),
|
||||
( self.names, LNAMES ),
|
||||
( self.reference_map_primary_map, REF_PRI),
|
||||
( self.reference_map_referenced_map, REF_REF),
|
||||
]
|
||||
@ -796,6 +838,60 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
if callback:
|
||||
callback(12)
|
||||
|
||||
@catch_db_error
|
||||
def find_location_child_handles(self, handle):
|
||||
"""
|
||||
"""
|
||||
handle = str(handle)
|
||||
parent_cur = self.get_location_parent_cursor()
|
||||
|
||||
try:
|
||||
ret = parent_cur.set(handle)
|
||||
except:
|
||||
ret = None
|
||||
|
||||
while (ret is not None):
|
||||
(key, data) = ret
|
||||
|
||||
### FIXME: this is a dirty hack that works without no
|
||||
### sensible explanation. For some reason, for a readonly
|
||||
### database, secondary index returns a primary table key
|
||||
### corresponding to the data, not the data.
|
||||
if self.readonly:
|
||||
data = self.location_map.get(data)
|
||||
else:
|
||||
data = pickle.loads(data)
|
||||
|
||||
yield data[0]
|
||||
ret = parent_cur.next_dup()
|
||||
|
||||
parent_cur.close()
|
||||
|
||||
@catch_db_error
|
||||
def find_location_from_name(self, name):
|
||||
"""
|
||||
"""
|
||||
name = str(name).upper()
|
||||
size = len(name)
|
||||
name_cur = self.get_location_name_cursor()
|
||||
|
||||
try:
|
||||
ret = name_cur.set_range(name)
|
||||
ret = name_cur.current()
|
||||
except:
|
||||
ret = None
|
||||
|
||||
while (ret is not None):
|
||||
(key, data) = ret
|
||||
|
||||
if key[:size] != name:
|
||||
break
|
||||
|
||||
yield data[0]
|
||||
ret = name_cur.next()
|
||||
|
||||
name_cur.close()
|
||||
|
||||
@catch_db_error
|
||||
def find_backlink_handles(self, handle, include_classes=None):
|
||||
"""
|
||||
@ -857,6 +953,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
def delete_primary_from_reference_map(self, handle, transaction, txn=None):
|
||||
"""
|
||||
Remove all references to the primary object from the reference_map.
|
||||
handle should be utf-8
|
||||
"""
|
||||
primary_cur = self.get_reference_map_primary_cursor()
|
||||
|
||||
@ -875,8 +972,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
|
||||
# so we need the second tuple give us a reference that we can
|
||||
# combine with the primary_handle to get the main key.
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
#handle should be in python 2 str
|
||||
main_key = (handle, pickle.loads(data)[1][1])
|
||||
else:
|
||||
#python 3 work internally with unicode
|
||||
main_key = (handle.decode('utf-8'), pickle.loads(data)[1][1])
|
||||
|
||||
# The trick is not to remove while inside the cursor,
|
||||
# but collect them all and remove after the cursor is closed
|
||||
@ -950,7 +1051,12 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
the passed transaction.
|
||||
"""
|
||||
if isinstance(key, tuple):
|
||||
#create a string key
|
||||
#create a byte string key, first validity check in python 3!
|
||||
for val in key:
|
||||
if sys.version_info[0] >= 3 and isinstance(val, bytes):
|
||||
raise DbError(_('An attempt is made to safe a reference key '
|
||||
'which is partly bytecode, this is not allowed.\n'
|
||||
'Key is %s') % str(key))
|
||||
key = str(key)
|
||||
if isinstance(key, UNITYPE):
|
||||
key = key.encode('utf-8')
|
||||
@ -1143,6 +1249,8 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.cid_trans.close()
|
||||
self.pid_trans.close()
|
||||
self.tag_trans.close()
|
||||
self.parents.close()
|
||||
self.names.close()
|
||||
self.reference_map_primary_map.close()
|
||||
self.reference_map_referenced_map.close()
|
||||
self.reference_map.close()
|
||||
@ -1160,6 +1268,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.media_map.close()
|
||||
self.event_map.close()
|
||||
self.tag_map.close()
|
||||
self.location_map.close()
|
||||
self.env.close()
|
||||
self.__close_undodb()
|
||||
|
||||
@ -1173,6 +1282,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.media_map = None
|
||||
self.event_map = None
|
||||
self.tag_map = None
|
||||
self.location_map = None
|
||||
self.surnames = None
|
||||
self.env = None
|
||||
self.metadata = None
|
||||
@ -1191,6 +1301,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.media_map = None
|
||||
self.event_map = None
|
||||
self.tag_map = None
|
||||
self.location_map = None
|
||||
self.reference_map_primary_map = None
|
||||
self.reference_map_referenced_map = None
|
||||
self.reference_map = None
|
||||
@ -1356,6 +1467,13 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
"""
|
||||
return self.__add_object(obj, transaction, None, self.commit_tag)
|
||||
|
||||
def add_location(self, obj, transaction):
|
||||
"""
|
||||
Add a Location to the database, assigning a handle if it has not already
|
||||
been defined.
|
||||
"""
|
||||
return self.__add_object(obj, transaction, None, self.commit_location)
|
||||
|
||||
def __do_remove(self, handle, transaction, data_map, key):
|
||||
if self.readonly or not handle:
|
||||
return
|
||||
@ -1470,6 +1588,14 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.__do_remove(handle, transaction, self.tag_map,
|
||||
TAG_KEY)
|
||||
|
||||
def remove_location(self, handle, transaction):
|
||||
"""
|
||||
Remove the Location specified by the database handle from the
|
||||
database, preserving the change in the passed transaction.
|
||||
"""
|
||||
self.__do_remove(handle, transaction, self.location_map,
|
||||
LOCATION_KEY)
|
||||
|
||||
@catch_db_error
|
||||
def set_name_group_mapping(self, name, group):
|
||||
if not self.readonly:
|
||||
@ -1488,7 +1614,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.emit('person-groupname-rebuild', (name, grouppar))
|
||||
|
||||
def sort_surname_list(self):
|
||||
self.surname_list.sort(key=conv_unicode_tosrtkey)
|
||||
self.surname_list.sort(key=glocale.sort_key)
|
||||
|
||||
@catch_db_error
|
||||
def build_surname_list(self):
|
||||
@ -1500,7 +1626,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
#TODO GTK3: Why double conversion? Convert to a list of str objects!
|
||||
self.surname_list = sorted(
|
||||
map(conv_dbstr_to_unicode, set(self.surnames.keys())),
|
||||
key=conv_unicode_tosrtkey)
|
||||
key=glocale.sort_key)
|
||||
|
||||
def add_to_surname_list(self, person, batch_transaction):
|
||||
"""
|
||||
@ -1790,6 +1916,14 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
self.commit_base(tag, self.tag_map, TAG_KEY,
|
||||
transaction, change_time)
|
||||
|
||||
def commit_location(self, location, transaction, change_time=None):
|
||||
"""
|
||||
Commit the specified Location to the database, storing the changes as
|
||||
part of the transaction.
|
||||
"""
|
||||
self.commit_base(location, self.location_map, LOCATION_KEY,
|
||||
transaction, change_time)
|
||||
|
||||
def get_from_handle(self, handle, class_type, data_map):
|
||||
if isinstance(handle, UNITYPE):
|
||||
handle = handle.encode('utf-8')
|
||||
@ -1895,10 +2029,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
"""
|
||||
if (obj_type, trans_type) in transaction:
|
||||
if trans_type == TXNDEL:
|
||||
handles = [handle for handle, data in
|
||||
handles = [handle2internal(handle) for handle, data in
|
||||
transaction[(obj_type, trans_type)]]
|
||||
else:
|
||||
handles = [handle for handle, data in
|
||||
handles = [handle2internal(handle) for handle, data in
|
||||
transaction[(obj_type, trans_type)]
|
||||
if (handle, None) not in transaction[(obj_type,
|
||||
TXNDEL)]]
|
||||
@ -1994,6 +2128,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
upgrade.gramps_upgrade_15(self)
|
||||
if version < 16:
|
||||
upgrade.gramps_upgrade_16(self)
|
||||
if version < 17:
|
||||
upgrade.gramps_upgrade_17(self)
|
||||
if version < 18:
|
||||
upgrade.gramps_upgrade_18(self)
|
||||
|
||||
self.reset()
|
||||
self.set_total(6)
|
||||
|
@ -53,8 +53,8 @@ Specific symbols for parts of a name are defined:
|
||||
# Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..ggettext import sgettext as _
|
||||
import sys
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().sgettext
|
||||
import re
|
||||
import logging
|
||||
LOG = logging.getLogger(".gramps.gen")
|
||||
|
@ -40,6 +40,7 @@ import collections
|
||||
from ._filterparser import FilterParser
|
||||
from ..plug import BasePluginManager
|
||||
from ..constfunc import STRTYPE
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
|
||||
PLUGMAN = BasePluginManager.get_instance()
|
||||
#-------------------------------------------------------------------------
|
||||
@ -111,6 +112,7 @@ class FilterList(object):
|
||||
parser.parse(the_file)
|
||||
the_file.close()
|
||||
except (IOError, OSError):
|
||||
print("IO/OSError in _filterlist.py")
|
||||
pass
|
||||
except SAXParseException:
|
||||
print("Parser error")
|
||||
@ -123,7 +125,7 @@ class FilterList(object):
|
||||
return l.replace('"', '"')
|
||||
|
||||
def save(self):
|
||||
f = open(self.file.encode(sys.getfilesystemencoding()), 'w')
|
||||
f = open(self.file.encode(glocale.getfilesystemencoding()), 'w')
|
||||
f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
|
||||
f.write('<filters>\n')
|
||||
for namespace in self.filter_namespaces:
|
||||
|
@ -28,7 +28,8 @@
|
||||
from __future__ import print_function, unicode_literals
|
||||
|
||||
from xml.sax import handler
|
||||
from ..ggettext import gettext as _
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import re
|
||||
import time
|
||||
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -29,7 +29,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import re
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -27,7 +27,8 @@ Rule that checks for an object with a particular tag.
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -23,7 +23,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gramps.gen.ggettext import gettext as _
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
from . import Rule
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,14 +25,19 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
import logging
|
||||
LOG = logging.getLogger(".filter")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from .. import CustomFilters
|
||||
# we need global variableCustomFilters, so we need to query gramps.gen.filters
|
||||
# when we need this variable, not import it at the start!
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import gramps.gen.filters
|
||||
from . import Rule
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@ -48,31 +53,36 @@ class MatchesFilterBase(Rule):
|
||||
Subclasses need to define the namespace class attribute.
|
||||
|
||||
"""
|
||||
|
||||
labels = [_('Filter name:')]
|
||||
name = 'Objects matching the <filter>'
|
||||
description = "Matches objects matched by the specified filter name"
|
||||
category = _('General filters')
|
||||
|
||||
def prepare(self, db):
|
||||
if CustomFilters:
|
||||
filters = CustomFilters.get_filters_dict(self.namespace)
|
||||
if gramps.gen.filters.CustomFilters:
|
||||
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
|
||||
if self.list[0] in filters:
|
||||
filt = filters[self.list[0]]
|
||||
for rule in filt.flist:
|
||||
rule.requestprepare(db)
|
||||
else:
|
||||
LOG.warning(_("Can't find filter %s in the defined custom filters")
|
||||
% self.list[0])
|
||||
else:
|
||||
LOG.warning(_("Can't find filter %s in the defined custom filters")
|
||||
% self.list[0])
|
||||
|
||||
def reset(self):
|
||||
if CustomFilters:
|
||||
filters = CustomFilters.get_filters_dict(self.namespace)
|
||||
if gramps.gen.filters.CustomFilters:
|
||||
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
|
||||
if self.list[0] in filters:
|
||||
filt = filters[self.list[0]]
|
||||
for rule in filt.flist:
|
||||
rule.requestreset()
|
||||
|
||||
def apply(self, db, obj):
|
||||
if CustomFilters:
|
||||
filters = CustomFilters.get_filters_dict(self.namespace)
|
||||
if gramps.gen.filters.CustomFilters:
|
||||
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
|
||||
if self.list[0] in filters:
|
||||
filt = filters[self.list[0]]
|
||||
return filt.check(db, obj.handle)
|
||||
@ -82,8 +92,8 @@ class MatchesFilterBase(Rule):
|
||||
"""
|
||||
Return the selected filter or None.
|
||||
"""
|
||||
if CustomFilters:
|
||||
filters = CustomFilters.get_filters_dict(self.namespace)
|
||||
if gramps.gen.filters.CustomFilters:
|
||||
filters = gramps.gen.filters.CustomFilters.get_filters_dict(self.namespace)
|
||||
if self.list[0] in filters:
|
||||
return filters[self.list[0]]
|
||||
return None
|
||||
|
@ -29,7 +29,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import re
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -30,7 +30,8 @@ Base class for filter rules.
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...ggettext import gettext as _
|
||||
from ...const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
import re
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
@ -42,6 +42,7 @@ from ._matchespagesubstringof import MatchesPageSubstringOf
|
||||
from ._matchesrepositoryfilter import MatchesRepositoryFilter
|
||||
from ._matchessourcefilter import MatchesSourceFilter
|
||||
from ._regexpidof import RegExpIdOf
|
||||
from ._hastag import HasTag
|
||||
|
||||
editor_rule_list = [
|
||||
HasCitation,
|
||||
@ -59,5 +60,6 @@ editor_rule_list = [
|
||||
MatchesPageSubstringOf,
|
||||
MatchesRepositoryFilter,
|
||||
MatchesSourceFilter,
|
||||
RegExpIdOf
|
||||
RegExpIdOf,
|
||||
HasTag
|
||||
]
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@ Filter rule to match citation data.
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -29,7 +29,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -29,7 +29,8 @@ Filter rule to match citation with a particular source.
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
51
gramps/gen/filters/rules/citation/_hastag.py
Normal file
51
gramps/gen/filters/rules/citation/_hastag.py
Normal file
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2010 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
"""
|
||||
Rule that checks for a citation with a particular tag.
|
||||
"""
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from .._hastagbase import HasTagBase
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# HasTag
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class HasTag(HasTagBase):
|
||||
"""
|
||||
Rule that checks for a citation with a particular tag.
|
||||
"""
|
||||
labels = [ _('Tag:') ]
|
||||
name = _('Citations with the <tag>')
|
||||
description = _("Matches citations with the particular tag")
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
#-------------------------------------------------------------------------
|
||||
import logging
|
||||
LOG = logging.getLogger(".citation")
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -27,7 +27,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -47,6 +47,7 @@ from ._matchessourcefilter import MatchesSourceFilter
|
||||
from ._hasattribute import HasAttribute
|
||||
from ._hasdata import HasData
|
||||
from ._changedsince import ChangedSince
|
||||
from ._hastag import HasTag
|
||||
|
||||
editor_rule_list = [
|
||||
AllEvents,
|
||||
@ -67,5 +68,6 @@ editor_rule_list = [
|
||||
MatchesSourceFilter,
|
||||
HasAttribute,
|
||||
HasData,
|
||||
ChangedSince
|
||||
ChangedSince,
|
||||
HasTag
|
||||
]
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -29,7 +29,8 @@ Filter rule to match event with a particular citation.
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -28,7 +28,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -27,7 +27,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
51
gramps/gen/filters/rules/event/_hastag.py
Normal file
51
gramps/gen/filters/rules/event/_hastag.py
Normal file
@ -0,0 +1,51 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2010 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
"""
|
||||
Rule that checks for an event with a particular tag.
|
||||
"""
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from .._hastagbase import HasTagBase
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# HasTag
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class HasTag(HasTagBase):
|
||||
"""
|
||||
Rule that checks for an event with a particular tag.
|
||||
"""
|
||||
labels = [ _('Tag:') ]
|
||||
name = _('Events with the <tag>')
|
||||
description = _("Matches events with the particular tag")
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import sgettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().sgettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -27,7 +27,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -60,6 +60,7 @@ from ._childhasnameof import ChildHasNameOf
|
||||
from ._childhasidof import ChildHasIdOf
|
||||
from ._changedsince import ChangedSince
|
||||
from ._hastag import HasTag
|
||||
from ._hastwins import HasTwins
|
||||
|
||||
editor_rule_list = [
|
||||
AllFamilies,
|
||||
@ -89,4 +90,5 @@ editor_rule_list = [
|
||||
ChildHasIdOf,
|
||||
ChangedSince,
|
||||
HasTag,
|
||||
HasTwins,
|
||||
]
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -26,7 +26,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
@ -25,7 +25,8 @@
|
||||
# Standard Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ....ggettext import gettext as _
|
||||
from ....const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.get_translation().gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user