Compare commits

..

48 Commits

Author SHA1 Message Date
Jérôme Rapinat
c18d73ea8f update translation template
svn: r20901
2012-12-31 09:59:59 +00:00
Jérôme Rapinat
671f64c08c update NEWS and RELEASE_NOTES files, update ChangeLog (no revision)
svn: r20900
2012-12-31 09:48:50 +00:00
Jérôme Rapinat
b9cd27550f Fix structure of build directory for locale files (merged from trunk; changes by Nick.H), road to alpha2
svn: r20899
2012-12-31 09:44:49 +00:00
Benny Malengier
8b26f688cb 6205: Gtk.CALENDAR needs a migration to new GI/GTK3 API
svn: r20896
2012-12-30 23:20:31 +00:00
Doug Blank
e41c6db70d Added addons-url to config and Preferences; currently set to invalid URL, but will update in a couple of days when new addons URL comes on-line
svn: r20895
2012-12-30 22:00:58 +00:00
Benny Malengier
fdcc02d1bd Fix divisionbyzero in python3
svn: r20888
2012-12-30 17:32:22 +00:00
Benny Malengier
f4f5104b72 6205: Gtk.CALENDAR needs a migration to new GI/GTK3 API
Also: don't expand the calendar more than needed to show it.


svn: r20884
2012-12-30 15:41:54 +00:00
Jérôme Rapinat
0caf61b805 avoid specific case with decimal comparison
svn: r20882
2012-12-30 15:28:48 +00:00
Benny Malengier
c46a66ecd1 More version strings
svn: r20880
2012-12-30 15:14:40 +00:00
Jérôme Rapinat
35d553b4eb typo
svn: r20879
2012-12-30 10:05:42 +00:00
Erik De Richter
8bc6d475d9 updated dutch translation
svn: r20877
2012-12-29 22:11:31 +00:00
Gary Burton
b5fec9d1a3 Set the correct number of update callbacks. Bug #6219.
svn: r20875
2012-12-29 17:20:47 +00:00
Benny Malengier
1a5c516179 6112: Cannot install addons via dialog
svn: r20869
2012-12-28 20:33:01 +00:00
Benny Malengier
054d29612c 6208: Cannot iterate on attributes when trying to paginate via cairodoc
At same time, fix deprecated cairocontext


svn: r20863
2012-12-28 17:21:28 +00:00
Erik De Richter
ad066ba200 updated dutch translation
svn: r20862
2012-12-28 16:51:41 +00:00
Benny Malengier
ffb3b1e232 6123: Index into undohistory, correct fail on older gobject
svn: r20859
2012-12-28 13:01:28 +00:00
Benny Malengier
76c896f977 Improve hover handling on displaytabs
svn: r20858
2012-12-28 10:27:38 +00:00
Jérôme Rapinat
5e00312139 spacing, tab (fr) and paths for files (en, fr)
svn: r20855
2012-12-28 09:41:22 +00:00
Benny Malengier
c7ad3f3295 correct wrong function call
svn: r20851
2012-12-27 17:50:58 +00:00
Mirko Leonhäuser
11723ffd8c updated german translation
svn: r20850
2012-12-27 12:13:26 +00:00
Benny Malengier
cb9bebee1e Fix crash on callback after clean_up in gallerytab
svn: r20848
2012-12-26 23:18:50 +00:00
Benny Malengier
a9ac56b33c bug 1772: follow cursor to completely resolve bug
svn: r20846
2012-12-26 22:39:40 +00:00
Benny Malengier
19038fab93 bug 1772, correct event handling
svn: r20844
2012-12-26 22:22:07 +00:00
Benny Malengier
fd13311aa0 1. context menu on displaytabs showing
2. partially do bug 1772


svn: r20842
2012-12-26 22:15:03 +00:00
Benny Malengier
ec0b9fb54b 1567: beautify Relation Ship Graph, remove - if no date of birth or death
svn: r20840
2012-12-26 18:19:17 +00:00
Benny Malengier
8b94955772 GTK3 conversion in tools
svn: r20838
2012-12-24 12:35:40 +00:00
Erik De Richter
9a229466fd updated dutch translation
svn: r20837
2012-12-24 08:16:52 +00:00
Benny Malengier
647c9cfef5 rows_reoredered patch not yet in GTK
svn: r20833
2012-12-23 14:07:16 +00:00
Fedik
29443339cb small translation and uptades
svn: r20832
2012-12-23 14:05:35 +00:00
Erik De Richter
f4f2747c65 updated dutch translation
svn: r20830
2012-12-23 08:11:31 +00:00
John Ralls
ba7913fe3c Restore include to git.gnome.org
svn: r20828
2012-12-23 02:20:13 +00:00
John Ralls
5526f64e1f Mods for Gtk3, Gramps 4.0.0
svn: r20827
2012-12-23 02:17:31 +00:00
Jérôme Rapinat
0a17eab461 spacing, tab (fr) and VERSION (en, fr)
svn: r20825
2012-12-22 19:48:21 +00:00
Jérôme Rapinat
fcce312e0a update used paths and gramps versions
svn: r20823
2012-12-22 17:51:22 +00:00
Benny Malengier
4ed2b0bace Convert validated masked entry to normal gtk.entry with icon
Working background color change on error


svn: r20821
2012-12-22 13:24:21 +00:00
Benny Malengier
759075b3e4 rows_reordered is present again in GTK 3.8
svn: r20820
2012-12-22 09:24:00 +00:00
Erik De Richter
7f4956dd00 updated dutch translation
svn: r20818
2012-12-21 19:59:12 +00:00
Doug Blank
e1ab03348e Someone optimized some code incorrectly; lines at bottom of calendar where placed off the page
svn: r20816
2012-12-21 18:57:32 +00:00
Doug Blank
2033fd6567 If you try to lookup an object too early, you might find that the tbl is still a dict; this protects such early lookups from crashing
svn: r20814
2012-12-21 18:34:44 +00:00
Jérôme Rapinat
7c6872c11a alpha1 environment, what should be the VERSION into gen/const.py.in ?
svn: r20810
2012-12-21 14:15:45 +00:00
Jérôme Rapinat
71f87a31b3 update content for 4.0.0-alpha1
svn: r20809
2012-12-21 14:09:38 +00:00
Jérôme Rapinat
eb2ca43ff6 avoid fatal errors on norwegian bokmål translation, string status to fuzzy before review
svn: r20808
2012-12-21 13:47:14 +00:00
Jérôme Rapinat
71b951f31d avoid fatal errors on swedish translation, string status to fuzzy before review
svn: r20807
2012-12-21 13:38:45 +00:00
Jérôme Rapinat
a542081e25 test update and merge processes with the french translation file
svn: r20806
2012-12-21 13:26:33 +00:00
Jérôme Rapinat
5b8da49bae do not need to check untranslated and fuzzy strings because they have not been reviewed yet; warning this script uses tab for the bloc indentation...
svn: r20804
2012-12-20 17:41:09 +00:00
Benny Malengier
4d7e1043ef On translation error, allow build to continue after asking user
svn: r20802
2012-12-20 16:40:23 +00:00
Jérôme Rapinat
2040716b9c common date handler for Norwegian Bokmål and Norwegian Nynorsk
svn: r20801
2012-12-20 14:16:30 +00:00
Brian Matherly
8a3a477ea4 Create 4.0 branch
svn: r20798
2012-12-20 13:31:33 +00:00
1134 changed files with 85196 additions and 84071 deletions

5
.gitignore vendored
View File

@@ -2,12 +2,11 @@
*.py[cod]
# Distutils
MANIFEST
build/
dist/
sdist/
# Gramps
data/tips.xml
gramps/data/tips.xml
gramps/gen/const.py
gramps/plugins/lib/holidays.xml
po/.intltool-merge-cache

View File

@@ -1,4 +1,3 @@
#! /usr/bin/env python
#
# Gramps - a GTK+/GNOME based genealogy program
#

View File

@@ -11,22 +11,34 @@ include TestPlan.txt
recursive-include data *
recursive-include debian *
recursive-include docs *
recursive-include gramps *
recursive-include help *
recursive-include images *
recursive-include mac *
recursive-include po *
recursive-include gramps *
recursive-include test *
recursive-include windows *
# Remove files created in the build
exclude data/tips.xml
exclude gramps/gen/const.py
exclude data/gramps.desktop
exclude data/gramps.keys
exclude data/gramps.xml
recursive-exclude data/man *.1
recursive-exclude data/man *.1.gz
exclude gramps/const.py
exclude gramps/data/tips.xml
exclude gramps/plugins/lib/holidays.xml
exclude po/*.gmo
exclude po/.intltool-merge-cache
exclude po/stamp-it
exclude po/POTFILES
global-exclude *.pyc
global-exclude *.py~
global-exclude *.pyo
global-exclude *.bak
# Remove directories which should not be included in the distribution
prune gramps/guiQML
#prune gramps/webapp
prune gramps/webapp
# Remove Makefiles used by autotools
global-exclude Makefile*

17
NEWS
View File

@@ -1,3 +1,20 @@
2012-10-28
Version 3.4.2 -- the "We're all individuals!" bug fix release.
* Some fixes on NarrativeWeb report
* Some fixes on book report
* Improvement on database path interface and user's preferences
* Consistency on Name display and regex support
* Some platform-specific fixes for Windows system environment
* Better support for media links on Gedcom file format
* Fix possible incorrect family relations on Gedcom file format
* Various fixes on citation records
* Fix and improve places handling on Geography views
* Fix on command line arguments
* Consistency on PDF file format
* New language: Greek
* Various updated translations
* Changelog: http://www.gramps-project.org/bugs/changelog_page.php?version_id=32
2012-08-23
Version 3.4.1 -- The "A tiger? In Africa?!" bug fix release.
Mention in the release that upgrading is advised for two critical issues:

14
README
View File

@@ -8,7 +8,6 @@ The following packages *MUST* be installed in order for Gramps to work:
Python 2.7 or greater, Python 3.2 or greater (python version cannot be mixed)
GTK 3.0 or greater
pygobject 3.3.2 or greater
cairo, pango, pangocairo with instrospection bindings (the gi packages)
librsvg2 (svg icon view)
xdg-utils
@@ -24,7 +23,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_4.0_Wiki_Manual_-_Main_Window#Geography_Category
http://gramps-project.org/wiki/index.php?title=Gramps_3.3_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,14 +38,6 @@ 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
ttf-freefont More font support in the reports
gir-webkit GObject introspection data of WebKit is required for the
@@ -71,6 +62,9 @@ No longer needed in 3.2:
No longer needed in 3.1:
yelp Gnome help browser. At the moment no help is shipped
Remark: There is a conflict when using python-gnome2 in Ubuntu. This is evident
with the error: TypeError: Error when calling the metaclass bases
metaclass conflict
Documentation
---------------------------------

View File

@@ -1,4 +1,4 @@
"UNSTABLE Gramps 4.0.0 Alpha1 release.
"UNSTABLE Gramps 4.0.0 Alpha2 release.
This is a technology preview to allow plugin writers and packagers-installer
writers to update their plugins and scripts. This release is not production

View File

@@ -25,15 +25,15 @@
-->
<!--
This is the Document Type Definition file for v1.6.0
This is the Document Type Definition file for v1.5.0
of the GRAMPS XML genealogy data format.
Please use the following formal public identifier to identify it:
"-//GRAMPS//DTD GRAMPS XML V1.6.0//EN"
"-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
For example:
<!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.6.0//EN"
"http://gramps-project.org/xml/1.6.0/grampsxml.dtd"
<!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
"http://gramps-project.org/xml/1.5.0/grampsxml.dtd"
[...]>
-->
@@ -215,8 +215,7 @@ EVENT
<!ELEMENT events (event)*>
<!ELEMENT event (type?, (daterange|datespan|dateval|datestr)?, place?, cause?,
description?, attribute*, noteref*, citationref*, objref*,
tagref*)>
description?, attribute*, noteref*, citationref*, objref*)>
<!ATTLIST event
id CDATA #IMPLIED
handle ID #REQUIRED
@@ -230,7 +229,7 @@ SOURCES
<!ELEMENT sources (source)*>
<!ELEMENT source (stitle?, sauthor?, spubinfo?, sabbrev?,
noteref*, objref*, data_item*, reporef*, tagref*)>
noteref*, objref*, data_item*, reporef*)>
<!ATTLIST source
id CDATA #IMPLIED
handle ID #REQUIRED
@@ -249,7 +248,7 @@ PLACES
<!ELEMENT places (placeobj)*>
<!ELEMENT placeobj (ptitle?, coord?, location*, objref*, url*, noteref*,
citationref*, tagref*)>
citationref*)>
<!ATTLIST placeobj
id CDATA #IMPLIED
handle ID #REQUIRED
@@ -306,7 +305,7 @@ REPOSITORIES
<!ELEMENT repositories (repository)*>
<!ELEMENT repository (rname, type, address*, url*, noteref*, tagref*)>
<!ELEMENT repository (rname, type, address*, url*, noteref*)>
<!ATTLIST repository
id CDATA #IMPLIED
handle ID #REQUIRED
@@ -369,7 +368,7 @@ CITATIONS
<!ELEMENT citations (citation)*>
<!ELEMENT citation ((daterange|datespan|dateval|datestr)?, page?, confidence?,
noteref*, objref*, data_item*, sourceref, tagref*)>
noteref*, objref*, data_item*, sourceref)>
<!ATTLIST citation
id CDATA #IMPLIED
handle ID #REQUIRED

View File

@@ -32,7 +32,7 @@
<grammar
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
ns="http://gramps-project.org/xml/1.6.0/"
ns="http://gramps-project.org/xml/1.5.0/"
xmlns="http://relaxng.org/ns/structure/1.0">
<start><element name="database">
@@ -160,9 +160,6 @@
<value>0</value>
<value>1</value>
</choice></attribute></optional>
<zeroOrMore><element name="tagref">
<ref name="tagref-content"/>
</element></zeroOrMore>
</define>
<define name="person-content">
@@ -208,6 +205,9 @@
<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,6 +403,9 @@
<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">
@@ -517,6 +520,9 @@
<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">
@@ -575,6 +581,9 @@
</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">

14
data/man/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
# This is the data/man level Makefile for Gramps
# $Id$
SUBDIRS = fr sv nl pl cs pt_BR
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

View File

@@ -48,9 +48,9 @@ copyright = u'2012, Gramps project'
# built documents.
#
# The short X.Y version.
version = '4.1'
version = '4.0'
# The full version, including alpha/beta/rc tags.
release = 'trunk'
release = '4.0.0-alpha2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

14
data/man/cs/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/cs
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/cs/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

14
data/man/fr/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
# This is the data/man/fr level Makefile for Gramps
# $Id$
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/fr
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/fr/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

View File

@@ -48,9 +48,9 @@ copyright = u'2012, Gramps project'
# built documents.
#
# The short X.Y version.
version = '4.1'
version = '4.0'
# The full version, including alpha/beta/rc tags.
release = 'trunk'
release = '4.0.0-alpha2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

15
data/man/nl/Makefile.am Normal file
View File

@@ -0,0 +1,15 @@
# This is the data/man/nl level Makefile for Gramps
# $Id: Makefile.am 9819 2008-01-15 15:42:10Z bmcage $
mandir = @mandir@/nl
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/nl/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

14
data/man/pl/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/pl
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/pl/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

View File

@@ -0,0 +1,14 @@
# This is the data/pt_BR level Makefile for Gramps
# $Id: Makefile.am 16377 2011-01-13 18:32:42Z matlas $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/pt_BR
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/pt_BR/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

14
data/man/sv/Makefile.am Normal file
View File

@@ -0,0 +1,14 @@
# This is the data/man/sv level Makefile for Gramps
# $Id: Makefile.am 6189 2006-03-21 19:05:46Z rshura $
man_IN_FILES = gramps.1.in
man_MANS = $(man_IN_FILES:.1.in=.1)
mandir = @mandir@/sv
EXTRA_DIST = $(man_MANS) $(man_IN_FILES)
gramps.1: $(top_builddir)/config.status gramps.1.in
cd $(top_builddir) && CONFIG_FILES=data/man/sv/$@ $(SHELL) ./config.status
CLEANFILES=$(man_MANS)

View File

@@ -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 in ['linux2', 'darwin', 'cygwin']:
elif sys.platform == 'linux2' or os.name == 'darwin':
pythonCmd = os.path.join(sys.prefix, 'bin', 'python')
sphinxCmd = SPHINXBUILD
else:
print ("Update Man ERROR: unknown system, don't know sphinx, ... commands")
print ("ERROR: unknown system, don't know sphinx, ... commands")
sys.exit(0)
def tests():

View File

@@ -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 in ['linux2', 'darwin', 'cygwin']:
elif sys.platform == 'linux2' or os.name == 'darwin':
pythonCmd = os.path.join(sys.prefix, 'bin', 'python')
sphinxCmd = SPHINXBUILD
else:
print ("Update Docs ERROR: unknown system, don't know sphinx, ... commands")
print ("ERROR: unknown system, don't know sphinx, ... commands")
sys.exit(0)
def tests():

View File

@@ -1,7 +0,0 @@
person,surname,given
a,"CSV Surname","Given 1"
b,"CSV Surname","Given 2"
marriage,mother,father
1,a,b
1 person surname given
2 a CSV Surname Given 1
3 b CSV Surname Given 2
4 marriage mother father
5 1 a b

Binary file not shown.

View File

@@ -39,8 +39,7 @@ Module responsible for handling the command line arguments for GRAMPS.
from __future__ import print_function
import os
import sys
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from gramps.gen.ggettext import gettext as _
#-------------------------------------------------------------------------
#
@@ -186,9 +185,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.stdout.encoding, 'backslashreplace'), file=sys.stderr)
print(msg1.encode(sys.getfilesystemencoding()), file=sys.stderr)
if msg2 is not None:
print(msg2.encode(sys.stdout.encoding, 'backslashreplace'), file=sys.stderr)
print(msg2.encode(sys.getfilesystemencoding()), file=sys.stderr)
#-------------------------------------------------------------------------
# Argument parser: sorts out given arguments
@@ -295,7 +294,7 @@ class ArgHandler(object):
else:
ask = input
ans = ask(_('OK to overwrite? (yes/no) ') \
.encode(sys.stdout.encoding, 'backslashreplace'))
.encode(sys.getfilesystemencoding()))
except EOFError:
print()
sys.exit(0)
@@ -409,26 +408,26 @@ class ArgHandler(object):
if self.list:
print(_('List of known family trees in your database path\n').\
encode(sys.stdout.encoding, 'backslashreplace'))
encode(sys.getfilesystemencoding()))
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.stdout.encoding, 'backslashreplace'))
'f_t_name' : name}).encode(sys.getfilesystemencoding()))
sys.exit(0)
if self.list_more:
print(_('Gramps Family Trees:').encode(sys.stdout.encoding, 'backslashreplace'))
print(_('Gramps Family Trees:').encode(sys.getfilesystemencoding()))
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.stdout.encoding, 'backslashreplace') % summary["Family tree"])
encode(sys.getfilesystemencoding()) % summary["Family tree"])
for item in sorted(summary):
if item != "Family tree":
print((" %s: %s" % (item, summary[item])).\
encode(sys.stdout.encoding, 'backslashreplace'))
encode(sys.getfilesystemencoding()))
sys.exit(0)
self.__open_action()
@@ -443,7 +442,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.stdout.encoding, 'backslashreplace')
fn = expt[0].encode(sys.getfilesystemencoding())
fmt = str(expt[1])
print(_("Exporting: file %(filename)s, "
"format %(format)s.") % \
@@ -481,7 +480,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.stdout.encoding, 'backslashreplace')
.encode(sys.getfilesystemencoding())
newdb = DbBsddb()
newdb.write_version(self.imp_db_path)
@@ -495,7 +494,7 @@ class ArgHandler(object):
sys.exit(0)
for imp in self.imports:
fn = imp[0].encode(sys.stdout.encoding, 'backslashreplace')
fn = imp[0].encode(sys.getfilesystemencoding())
fmt = str(imp[1])
msg = _("Importing: file %(filename)s, format %(format)s.") % \
{'filename' : fn, 'format' : fmt}
@@ -624,10 +623,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.stdout.encoding, 'backslashreplace')), file=sys.stderr)
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
else:
print(" %s\t- %s" % (pdata.id,
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
elif action == "tool":
from gramps.gui.plug import tool
@@ -665,10 +664,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.stdout.encoding, 'backslashreplace')), file=sys.stderr)
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
else:
print(" %s\t- %s" % (pdata.id,
pdata.name.encode(sys.stdout.encoding, 'backslashreplace')), file=sys.stderr)
pdata.name.encode(sys.getfilesystemencoding())), file=sys.stderr)
elif action == "book":
try:

View File

@@ -39,8 +39,7 @@ Module responsible for handling the command line arguments for GRAMPS.
from __future__ import print_function
import sys
import getopt
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from gramps.gen.ggettext import gettext as _
import logging
#-------------------------------------------------------------------------
@@ -293,7 +292,7 @@ class ArgParser(object):
self.list_more = True
elif option in ('-s','--show'):
print ("Gramps config settings from %s:" % \
config.filename.encode(sys.stdout.encoding, 'backslashreplace'))
config.filename.encode(sys.getfilesystemencoding()))
for section in config.data:
for setting in config.data[section]:
print ("%s.%s=%s" % (
@@ -403,7 +402,7 @@ class ArgParser(object):
"""
if self.help:
# Convert Help messages to file system encoding before printing
print (_HELP.encode(sys.stdout.encoding, 'backslashreplace'))
print (_HELP.encode(sys.getfilesystemencoding()))
sys.exit(0)
def print_usage(self):
@@ -412,5 +411,5 @@ class ArgParser(object):
"""
if self.usage:
# Convert Help messages to file system encoding before printing
print (_USAGE.encode(sys.stdout.encoding, 'backslashreplace'))
print (_USAGE.encode(sys.getfilesystemencoding()))
sys.exit(0)

View File

@@ -44,6 +44,7 @@ else:
from urllib.parse import urlparse
from urllib.request import urlopen, url2pathname
import tempfile
from gramps.gen.ggettext import gettext as _
#-------------------------------------------------------------------------
#
# set up logging
@@ -57,8 +58,6 @@ 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
@@ -159,7 +158,6 @@ 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()
@@ -193,7 +191,7 @@ class CLIDbManager(object):
retval["Locked?"] = "no"
retval["DB version"] = version
if sys.version_info[0] < 3:
retval["Family tree"] = name.encode(glocale.getfilesystemencoding())
retval["Family tree"] = name.encode(sys.getfilesystemencoding())
else:
retval["Family tree"] = name
retval["Path"] = dirpath
@@ -208,7 +206,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(glocale.getfilesystemencoding())
dbdir = dbdir.encode(sys.getfilesystemencoding())
db_ok = make_dbdir(dbdir)
self.current_names = []
@@ -219,7 +217,6 @@ 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,
@@ -416,7 +413,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), glocale.getfilesystemencoding())
msg = conv_to_unicode(str(msg), sys.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)
@@ -445,7 +442,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(glocale.getfilesystemencoding())
dbdir = dbdir.encode(sys.getfilesystemencoding())
new_path = os.path.join(dbdir, base)
if not os.path.isdir(new_path):
break
@@ -488,7 +485,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, glocale.getfilesystemencoding())
username = conv_to_unicode(username, sys.getfilesystemencoding())
# feature request 2356: avoid genitive form
last = _("Locked by %s") % username
ifile.close()

View File

@@ -35,8 +35,7 @@ Provides also two small base classes: CLIDbLoader, CLIManager
#-------------------------------------------------------------------------
from __future__ import print_function
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from gramps.gen.ggettext import gettext as _
import os
import sys
@@ -297,10 +296,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.stdout.encoding, 'backslashreplace')
errmsg = errmsg.encode(sys.getfilesystemencoding())
print(errmsg)
errmsg = _(' Details: %s') % errors[0][1]
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
errmsg = errmsg.encode(sys.getfilesystemencoding())
print(errmsg)
sys.exit(1)
@@ -308,10 +307,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.stdout.encoding, 'backslashreplace')
errmsg = errmsg.encode(sys.getfilesystemencoding())
print(errmsg)
errmsg = _(' Details: %s') % argparser.errors[0][1]
errmsg = errmsg.encode(sys.stdout.encoding, 'backslashreplace')
errmsg = errmsg.encode(sys.getfilesystemencoding())
print(errmsg)
sys.exit(1)

View File

@@ -35,8 +35,7 @@
#-------------------------------------------------------------------------
from __future__ import print_function
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from gramps.gen.ggettext import gettext as _
import traceback
import os
import sys
@@ -571,11 +570,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.stdout.encoding, 'backslashreplace'))
print(optmsg.encode(sys.getfilesystemencoding()))
else:
optmsg = " %s%s%s" % (key, tabs,
_('(no help available)'))
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
print(optmsg.encode(sys.getfilesystemencoding()))
print((_(" Use '%(donottranslate)s' to see description "
"and acceptable values") %
{'donottranslate' : "show=option"}))
@@ -588,10 +587,10 @@ class CommandLineReport(object):
if isinstance(vals, (list, tuple)):
for val in vals:
optmsg = " %s" % val
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
print(optmsg.encode(sys.getfilesystemencoding()))
else:
optmsg = " %s" % opt[2]
print(optmsg.encode(sys.stdout.encoding, 'backslashreplace'))
print(optmsg.encode(sys.getfilesystemencoding()))
else:
#there was a show option given, but the option is invalid
@@ -727,7 +726,6 @@ 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.
@@ -745,12 +743,6 @@ 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()
@@ -762,8 +754,6 @@ 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()
#------------------------------------------------------------------------

View File

@@ -38,8 +38,7 @@ import sys
# Gramps Modules
#
#------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from gramps.gen.ggettext import gettext as _
from gramps.gen.user import User
#------------------------------------------------------------------------

21
gramps/data/Makefile.am Normal file
View File

@@ -0,0 +1,21 @@
# This is the src/data level Makefile for gramps
# $Id$
#
SUBDIRS =
pkgdatadir = $(datadir)/@PACKAGE@/data
dist_pkgdata_DATA = \
authors.xml \
papersize.xml \
tips.xml\
lds.xml
# Rules for files with translatable strings
# These are taken care of by the intltool
xml_in_files = tips.xml.in
xml_files = $(xml_in_files:.xml.in=.xml)
@INTLTOOL_XML_NOMERGE_RULE@
EXTRA_DIST = $(xml_in_files)
CLEANFILES = $(xml_files)

View File

@@ -4,7 +4,7 @@
#
# Copyright (C) 2005-2007 Donald N. Allingham
# Copyright (C) 2008-2009 Gary Burton
# Copyright (C) 2009-2012 Doug Blank <doug.blank@gmail.com>
# Copyright (C) 2009 Doug Blank <doug.blank@gmail.com>
# Copyright (C) 2011 Tim G L Lyons
#
# This program is free software; you can redistribute it and/or modify
@@ -41,8 +41,7 @@ import logging
# Gramps imports
#
#---------------------------------------------------------------
from .const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from .ggettext import gettext as _
from .const import HOME_DIR, USER_HOME, VERSION_DIR
from .utils.configmanager import ConfigManager
@@ -152,7 +151,7 @@ register('behavior.surname-guessing', 0)
register('behavior.use-tips', False)
register('behavior.welcome', 100)
register('behavior.web-search-url', 'http://google.com/#&q=%(text)s')
register('behavior.addons-url', "http://svn.code.sf.net/p/gramps-addons/code/trunk/")
register('behavior.addons-url', "http://gramps-addons.svn.sourceforge.net/viewvc/gramps-addons/branches/gramps40/")
register('export.proxy-order', [
["privacy", 0],
@@ -189,7 +188,7 @@ register('interface.clipboard-height', 300)
register('interface.clipboard-width', 300)
register('interface.dont-ask', False)
register('interface.view-categories',
["Dashboard", "People", "Relationships", "Families",
["Gramplets", "People", "Relationships", "Families",
"Ancestry", "Events", "Places", "Geography", "Sources",
"Citations", "Repositories", "Media", "Notes"])
register('interface.edit-filter-width', 500)
@@ -210,7 +209,6 @@ 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)
@@ -281,8 +279,6 @@ register('preferences.date-format', 0)
register('preferences.calendar-format-report', 0)
register('preferences.cprefix', 'C%04d')
register('preferences.default-source', False)
register('preferences.tag-on-import', False)
register('preferences.tag-on-import-format', _("Imported %Y/%m/%d %H:%M:%S"))
register('preferences.eprefix', 'E%04d')
register('preferences.family-warn', True)
register('preferences.fprefix', 'F%04d')

View File

@@ -42,7 +42,7 @@ import uuid
# Gramps modules
#
#-------------------------------------------------------------------------
from .svn_revision import get_svn_revision
from .ggettext import sgettext as _
#-------------------------------------------------------------------------
#
@@ -50,20 +50,11 @@ from .svn_revision import get_svn_revision
#
#-------------------------------------------------------------------------
PROGRAM_NAME = "Gramps"
VERSION = "@VERSIONSTRING@"
if VERSION == "@" + "VERSIONSTRING" + "@":
raise Exception("Please run 'python setup.py build'")
def get_version_tuple(v):
""" Get the numeric-dotted part of version number"""
retval = ""
for c in v:
if c.isdigit() or (c == "." and retval.count(".") <= 1):
retval += c
else:
break
return tuple(map(int, retval.split(".")))
VERSION_TUPLE = get_version_tuple(VERSION)
major_version = "%s.%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1])
if "@VERSIONSTRING@" == "@" + "VERSIONSTRING" + "@":
VERSION = "4.0.0"
else:
VERSION = "@VERSIONSTRING@"
VERSION_TUPLE = (4, 0, 0)
#-------------------------------------------------------------------------
#
@@ -74,11 +65,11 @@ URL_HOMEPAGE = "http://gramps-project.org/"
URL_MAILINGLIST = "http://sourceforge.net/mail/?group_id=25770"
URL_BUGTRACKER = "http://bugs.gramps-project.org/bug_report_advanced_page.php"
URL_WIKISTRING = "http://gramps-project.org/wiki/index.php?title="
URL_MANUAL_PAGE = "Gramps_%s_Wiki_Manual" % major_version
URL_MANUAL_PAGE = "Gramps_4.0_Wiki_Manual"
WIKI_FAQ = "FAQ"
WIKI_KEYBINDINGS = "Gramps_%s_Wiki_Manual_-_Keybindings" % major_version
WIKI_EXTRAPLUGINS= "%s_Addons" % major_version
WIKI_EXTRAPLUGINS_RAWDATA = "Plugins%s&action=raw" % major_version
WIKI_KEYBINDINGS = "Gramps_4.0_Wiki_Manual_-_Keybindings"
WIKI_EXTRAPLUGINS= "4.0_Addons"
WIKI_EXTRAPLUGINS_RAWDATA = "Plugins4.0&action=raw"
#-------------------------------------------------------------------------
#
@@ -93,6 +84,13 @@ APP_GRAMPS_PKG = "application/x-gramps-package"
APP_GENEWEB = "application/x-geneweb"
APP_VCARD = ["text/x-vcard", "text/x-vcalendar"]
#-------------------------------------------------------------------------
#
# system paths
#
#-------------------------------------------------------------------------
LOCALE_DIR = "@LOCALE_DIR@"
#-------------------------------------------------------------------------
#
# Platforms
@@ -135,6 +133,24 @@ if sys.version_info[0] < 3:
else:
pass
#-------------------------------------------------------------------------
#
# Paths to files - assumes that files reside in the same directory as
# this one, and that the plugins directory is in a directory below this.
#
#-------------------------------------------------------------------------
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
__file__), os.pardir))
if sys.version_info[0] < 3:
# test for sys.frozen to detect a py2exe executable on Windows
if hasattr(sys, "frozen"):
ROOT_DIR = os.path.abspath(os.path.dirname(
unicode(sys.executable, sys.getfilesystemencoding())))
else:
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
unicode(__file__, sys.getfilesystemencoding())), os.pardir))
IMAGE_DIR = os.path.join(ROOT_DIR, "images")
VERSION_DIR = os.path.join(
HOME_DIR, "gramps%s%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1]))
@@ -152,28 +168,15 @@ USER_PLUGINS = os.path.join(VERSION_DIR, "plugins")
USER_DIRLIST = (HOME_DIR, VERSION_DIR, ENV_DIR, TEMP_DIR, THUMB_DIR,
THUMB_NORMAL, THUMB_LARGE, USER_PLUGINS)
#-------------------------------------------------------------------------
#
# Paths to python modules - assumes that the root directory is one level
# above this one, and that the plugins directory is below the root directory.
#
#-------------------------------------------------------------------------
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
__file__), os.pardir))
if sys.version_info[0] < 3:
# test for sys.frozen to detect a py2exe executable on Windows
if hasattr(sys, "frozen"):
ROOT_DIR = os.path.abspath(os.path.dirname(
unicode(sys.executable, sys.getfilesystemencoding())))
else:
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(
unicode(__file__, sys.getfilesystemencoding())), os.pardir))
VERSION += get_svn_revision(ROOT_DIR)
ICON = os.path.join(ROOT_DIR, "images", "gramps.png")
LOGO = os.path.join(ROOT_DIR, "images", "logo.png")
SPLASH = os.path.join(ROOT_DIR, "images", "splash.jpg")
LICENSE_FILE = os.path.join(ROOT_DIR, "COPYING")
#
# Glade files
#
GLADE_DIR = os.path.join(ROOT_DIR, "gui", "glade")
GLADE_FILE = os.path.join(GLADE_DIR, "gramps.glade")
PERSON_GLADE = os.path.join(GLADE_DIR, "edit_person.glade")
@@ -183,51 +186,29 @@ RULE_GLADE = os.path.join(GLADE_DIR, "rule.glade")
PLUGINS_DIR = os.path.join(ROOT_DIR, "plugins")
DATA_DIR = os.path.join(ROOT_DIR, "data")
WEB_DIR = os.path.join(ROOT_DIR, 'webapp')
#SYSTEM_FILTERS = os.path.join(DATA_DIR, "system_filters.xml")
TIP_DATA = os.path.join(DATA_DIR, "tips.xml")
WEBSTUFF_DIR = os.path.join(PLUGINS_DIR, "webstuff")
WEBSTUFF_IMAGE_DIR = os.path.join(WEBSTUFF_DIR, "images")
USE_TIPS = False
PAPERSIZE = os.path.join(DATA_DIR, "papersize.xml")
USE_TIPS = False
if os.sys.platform in WINDOWS:
USE_THUMBNAILER = False
else:
USE_THUMBNAILER = True
#-------------------------------------------------------------------------
#
# Paths to data files.
#
#-------------------------------------------------------------------------
LOCALE_DIR = "@LOCALE_DIR@"
DATA_DIR = "@DATA_DIR@"
IMAGE_DIR = "@IMAGE_DIR@"
DOC_DIR = "@DOC_DIR@"
TIP_DATA = os.path.join(DATA_DIR, "tips.xml")
PAPERSIZE = os.path.join(DATA_DIR, "papersize.xml")
ICON = os.path.join(IMAGE_DIR, "gramps.png")
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
#-------------------------------------------------------------------------
#
# About box information
#
#-------------------------------------------------------------------------
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
"© 2007-2013 The Gramps Developers"
"© 2007-2012 The Gramps Developers"
COMMENTS = _("Gramps (Genealogical Research and Analysis "
"Management Programming System) is a personal "
"genealogy program.")
@@ -332,29 +313,3 @@ LONGOPTS = [
SHORTOPTS = "O:C:i:e:f:a:p:d:c:lLhuv?s"
GRAMPS_UUID = uuid.UUID('516cd010-5a41-470f-99f8-eb22f1098ad6')
def need_to_update_const():
""" Check to see if this file is older than
setup.py or const.py.in """
this_file = os.path.join(ROOT_DIR, "gen", "const.py")
in_file = os.path.join(ROOT_DIR, "gen", "const.py.in")
setup_file = os.path.join(ROOT_DIR, "..", "setup.py")
if (os.path.exists(this_file) and
os.path.exists(in_file) and
os.path.exists(setup_file)):
this_file_time = os.path.getmtime(this_file)
in_file_time = os.path.getmtime(in_file)
setup_file_time = os.path.getmtime(setup_file)
# Is this file older than others? If so,
# need to run setup
return (this_file_time < in_file_time or
this_file_time < setup_file_time)
else:
# Can't tell because can't find the files
return False
if need_to_update_const():
print("Outdated gramps.gen.const; please run 'python setup.py build'")

View File

@@ -64,13 +64,6 @@ 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

View File

@@ -25,8 +25,6 @@ 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.
@@ -43,11 +41,7 @@ else:
#locale returns unicode in python 3
to_uni = lambda x, y: x
try:
codeset = glocale.get_translation().info()["charset"]
except KeyError:
codeset = "UTF-8"
try:
codeset = locale.nl_langinfo(locale.CODESET)
month_to_int = {
to_uni(locale.nl_langinfo(locale.MON_1), codeset).lower() : 1,
@@ -143,64 +137,69 @@ 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',(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,
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,
}
long_months = (
"",
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),
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),
)
short_months = (
"",
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),
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),
)
# Gramps day number: Sunday => 1, Monday => 2, etc
@@ -214,24 +213,24 @@ except:
# just a dummy.
long_days = (
"",
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
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
)
short_days = (
"",
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
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
)
# depending on the locale, the value returned for 20th Feb 2009 could be

View File

@@ -67,9 +67,8 @@ else:
#
#------------------------------------------------------------------------
from .exceptions import DbException
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)
from .write import FAMILY_TBL, PLACES_TBL, SOURCES_TBL, MEDIA_TBL, \
EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL, TAG_TBL, META, CITATIONS_TBL
#------------------------------------------------------------------------
#
@@ -216,6 +215,5 @@ 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),
]

View File

@@ -32,8 +32,7 @@ from this class.
# Python libraries
#
#-------------------------------------------------------------------------
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
#-------------------------------------------------------------------------
#
@@ -322,27 +321,6 @@ 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
@@ -458,12 +436,6 @@ 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.
@@ -619,12 +591,6 @@ 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
@@ -901,12 +867,6 @@ 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.
@@ -985,18 +945,6 @@ 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
@@ -1287,13 +1235,6 @@ 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
@@ -1402,13 +1343,6 @@ 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
@@ -1526,15 +1460,6 @@ 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

View File

@@ -45,8 +45,8 @@ __all__ = (
) +
('PERSON_KEY', 'FAMILY_KEY', 'SOURCE_KEY', 'CITATION_KEY',
'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'LOCATION_KEY',
'REPOSITORY_KEY', 'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY'
'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'REPOSITORY_KEY',
'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY'
) +
('TXNADD', 'TXNUPD', 'TXNDEL')
@@ -87,6 +87,5 @@ REFERENCE_KEY = 7
NOTE_KEY = 8
TAG_KEY = 9
CITATION_KEY = 10
LOCATION_KEY = 11
TXNADD, TXNUPD, TXNDEL = 0, 1, 2

View File

@@ -195,7 +195,6 @@ 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 = []
@@ -256,20 +255,6 @@ 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

View File

@@ -27,8 +27,7 @@
# Standard python modules
#
#-------------------------------------------------------------------------
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
class DbException(Exception):

View File

@@ -40,6 +40,7 @@ else:
import pickle
import time
import random
import locale
import os
from sys import maxsize
@@ -48,8 +49,7 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import db
else:
from bsddb import db
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
import re
import logging
@@ -66,7 +66,6 @@ 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
@@ -81,7 +80,6 @@ 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")
@@ -93,7 +91,7 @@ LOG = logging.getLogger(".citation")
from .dbconst import *
_SIGBASE = ('person', 'family', 'source', 'citation',
'event', 'media', 'place', 'location', 'repository',
'event', 'media', 'place', 'repository',
'reference', 'note', 'tag')
DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
@@ -104,17 +102,6 @@ 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
@@ -140,10 +127,7 @@ def __index_surname(surn_list):
NameOriginType.PATRONYMIC, NameOriginType.MATRONYMIC]) ])
else:
surn = ""
if sys.version_info[0] < 3:
return surn.encode('utf-8')
else:
return surn
return surn.encode('utf-8')
#-------------------------------------------------------------------------
@@ -191,32 +175,6 @@ 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
@@ -366,13 +324,6 @@ 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')
@@ -427,7 +378,6 @@ 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 = {}
@@ -531,9 +481,6 @@ 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.
@@ -582,7 +529,6 @@ 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):
"""
@@ -798,17 +744,8 @@ 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
if isinstance(tbl, dict): return None ## trying to get object too early
if isinstance(val, UNITYPE):
val = val.encode('utf-8')
try:
@@ -1014,12 +951,6 @@ 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)
@@ -1144,15 +1075,6 @@ 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.
@@ -1175,7 +1097,6 @@ 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_):
@@ -1202,7 +1123,6 @@ 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):
@@ -1594,8 +1514,6 @@ class DbBsddbRead(DbReadBase, Callback):
"""
Helper method for get_raw_<object>_data methods
"""
if table is None:
return None ## trying to get object too early
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
try:
@@ -1634,9 +1552,6 @@ 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
@@ -1709,16 +1624,10 @@ 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 glocale.sort_key(find_surname(handle,
return locale.strxfrm(find_surname(handle,
self.person_map.get(handle)))
def __sortbyplace(self, first, second):
@@ -1726,13 +1635,13 @@ class DbBsddbRead(DbReadBase, Callback):
first = first.encode('utf-8')
if isinstance(second, UNITYPE):
second = second.encode('utf-8')
return glocale.strcoll(self.place_map.get(first)[2],
return locale.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 glocale.sort_key(self.place_map.get(place)[2])
return locale.strxfrm(self.place_map.get(place)[2])
def __sortbysource(self, first, second):
if isinstance(first, UNITYPE):
@@ -1741,13 +1650,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 glocale.strcoll(source1, source2)
return locale.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 glocale.sort_key(source)
return locale.strxfrm(source)
def __sortbycitation(self, first, second):
if isinstance(first, UNITYPE):
@@ -1756,13 +1665,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 glocale.strcoll(citation1, citation2)
return locale.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 glocale.sort_key(citation)
return locale.strxfrm(citation)
def __sortbymedia(self, first, second):
if isinstance(first, UNITYPE):
@@ -1771,13 +1680,13 @@ class DbBsddbRead(DbReadBase, Callback):
second = second.encode('utf-8')
media1 = self.media_map[first][4]
media2 = self.media_map[second][4]
return glocale.strcoll(media1, media2)
return locale.strcoll(media1, media2)
def __sortbymedia_key(self, key):
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
media = self.media_map[key][4]
return glocale.sort_key(media)
return locale.strxfrm(media)
def __sortbytag(self, first, second):
if isinstance(first, UNITYPE):
@@ -1786,13 +1695,13 @@ class DbBsddbRead(DbReadBase, Callback):
second = second.encode('utf-8')
tag1 = self.tag_map[first][1]
tag2 = self.tag_map[second][1]
return glocale.strcoll(tag1, tag2)
return locale.strcoll(tag1, tag2)
def __sortbytag_key(self, key):
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
tag = self.tag_map[key][1]
return glocale.sort_key(tag)
return locale.strxfrm(tag)
def set_mediapath(self, path):
"""Set the default media path for database, path should be utf-8."""
@@ -1871,10 +1780,6 @@ 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

View File

@@ -46,15 +46,13 @@ if config.get('preferences.use-bsddb3') or sys.version_info[0] >= 3:
from bsddb3 import db
else:
from bsddb import db
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from ..constfunc import conv_to_unicode, handle2internal
from .dbconst import *
from . import BSDDBTxn
from ..errors import DbError
@@ -67,9 +65,8 @@ from ..errors import DbError
DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
db.DBPageNotFoundError, db.DBInvalidArgError)
_SIGBASE = ('person', 'family', 'source', 'event', 'media', 'place',
'location', 'repository', 'reference', 'note', 'tag', 'citation')
_SIGBASE = ('person', 'family', 'source', 'event', 'media',
'place', 'repository', 'reference', 'note', 'tag', 'citation')
#-------------------------------------------------------------------------
#
# DbUndo class
@@ -107,7 +104,6 @@ class DbUndo(object):
self.db.note_map,
self.db.tag_map,
self.db.citation_map,
self.db.location_map,
)
def clear(self):
@@ -319,7 +315,7 @@ class DbUndo(object):
"""
try:
if data is None:
emit(signal_root + '-delete', ([handle2internal(handle)],))
emit(signal_root + '-delete', ([handle],))
db_map.delete(handle, txn=self.txn)
else:
ex_data = db_map.get(handle, txn=self.txn)
@@ -328,7 +324,7 @@ class DbUndo(object):
else:
signal = signal_root + '-add'
db_map.put(handle, data, txn=self.txn)
emit(signal, ([handle2internal(handle)],))
emit(signal, ([handle],))
except DBERRS as msg:
self.db._log_error()
@@ -483,7 +479,6 @@ def testundo():
self.place_map = {}
self.note_map = {}
self.tag_map = {}
self.location_map = {}
self.repository_map = {}
self.reference_map = {}

View File

@@ -30,8 +30,7 @@ import time
import logging
LOG = logging.getLogger(".citation")
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
from ..constfunc import cuni
"""
@@ -43,166 +42,12 @@ 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,
LOCATION_KEY, REPOSITORY_KEY)
from .dbconst import (PERSON_KEY, FAMILY_KEY, EVENT_KEY,
MEDIA_KEY, PLACE_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.
@@ -299,9 +144,7 @@ def gramps_upgrade_16(self):
new_citation_list, note_list, change, tag_list,
private, person_ref_list)
with BSDDBTxn(self.env, self.person_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_person)
txn.put(str(handle), new_person)
self.update()
LOG.debug("%d persons upgraded with %d citations in %d seconds. " %
@@ -333,9 +176,7 @@ def gramps_upgrade_16(self):
change, date, tag_list, private)
LOG.debug(" upgrade new_media %s" % [new_media])
with BSDDBTxn(self.env, self.media_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_media)
txn.put(str(handle), new_media)
LOG.debug(" update ref map media %s" % [handle,
self.get_object_from_handle(handle) ])
self.update()
@@ -354,7 +195,7 @@ def gramps_upgrade_16(self):
start_time = time.time()
for place_handle in self.place_map.keys():
place = self.place_map[place_handle]
(handle, gramps_id, title, longi, lat,
(handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, media_list, source_list, note_list,
change, private) = place
if source_list:
@@ -367,13 +208,11 @@ def gramps_upgrade_16(self):
self, media_list)
if source_list or media_list:
new_place = (handle, gramps_id, title,
longi, lat, main_loc, alt_loc, urls,
int, lat, main_loc, alt_loc, urls,
media_list, new_citation_list, note_list,
change, private)
with BSDDBTxn(self.env, self.place_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_place)
txn.put(str(handle), new_place)
self.update()
LOG.debug("%d places upgraded with %d citations in %d seconds. " %
@@ -421,9 +260,7 @@ def gramps_upgrade_16(self):
attribute_list, lds_seal_list, new_citation_list,
note_list, change, tag_list, private)
with BSDDBTxn(self.env, self.family_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_family)
txn.put(str(handle), new_family)
self.update()
LOG.debug("%d familys upgraded with %d citations in %d seconds. " %
@@ -463,9 +300,7 @@ def gramps_upgrade_16(self):
attribute_list,
change, private)
with BSDDBTxn(self.env, self.event_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_event)
txn.put(str(handle), new_event)
t2 = time.time()
upgrade_time += t2 - t1
t3 = time.time()
@@ -497,9 +332,7 @@ def gramps_upgrade_16(self):
new_repository = (handle, gramps_id, the_type, name, note_list,
address_list, urls, change, private)
with BSDDBTxn(self.env, self.repository_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_repository)
txn.put(str(handle), new_repository)
self.update()
LOG.debug("%d repositorys upgraded with %d citations in %d seconds. " %
@@ -702,9 +535,7 @@ def convert_source_list_to_citation_list_16(self, source_list):
date, page, confidence, ref, note_list, new_media_list,
new_data_map, new_change, private)
with BSDDBTxn(self.env, self.citation_map) as txn:
if isinstance(new_handle, UNITYPE):
new_handle = new_handle.encode('utf-8')
txn.put(new_handle, new_citation)
txn.put(str(new_handle), new_citation)
self.cmap_index += 1
# # add backlinks for references from Citation to Source
# with BSDDBTxn(self.env) as txn:
@@ -790,9 +621,7 @@ def gramps_upgrade_15(self):
)
with BSDDBTxn(self.env, self.person_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_person)
txn.put(str(handle), new_person)
self.update()
#surname is now different, remove secondary index with names
_db = db.DB(self.env)
@@ -815,9 +644,7 @@ def gramps_upgrade_15(self):
new_family[13] = []
new_family = tuple(new_family)
with BSDDBTxn(self.env, self.family_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_family)
txn.put(str(handle), new_family)
self.update()
# ---------------------------------
@@ -834,9 +661,7 @@ def gramps_upgrade_15(self):
new_note[6] = []
new_note = tuple(new_note)
with BSDDBTxn(self.env, self.note_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_note)
txn.put(str(handle), new_note)
self.update()
# ---------------------------------
@@ -849,9 +674,7 @@ def gramps_upgrade_15(self):
new_media[10] = []
new_media = tuple(new_media)
with BSDDBTxn(self.env, self.media_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_media)
txn.put(str(handle), new_media)
self.update()
# ---------------------------------
@@ -865,9 +688,7 @@ def gramps_upgrade_15(self):
#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)
txn.put(str(handle), new_event)
self.update()
# ---------------------------------
@@ -883,9 +704,7 @@ def gramps_upgrade_15(self):
new_place = new_place[:12] + new_place[13:]
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)
txn.put(str(handle), new_place)
self.update()
# ---------------------------------
@@ -898,9 +717,7 @@ def gramps_upgrade_15(self):
new_source = new_source[:11] + new_source[12:]
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)
txn.put(str(handle), new_source)
self.update()
# ---------------------------------
@@ -914,9 +731,7 @@ def gramps_upgrade_15(self):
new_repository[5] = list(map(convert_address, new_repository[5]))
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)
txn.put(str(handle), new_repository)
self.update()
# Bump up database version. Separate transaction to save metadata.
@@ -938,8 +753,6 @@ def convert_marker(self, marker_field):
tag.set_name(tag_name)
tag.set_priority(len(self.tags))
with BSDDBTxn(self.env, self.tag_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, tag.serialize())
self.tags[tag_name] = handle
return self.tags[tag_name]
@@ -1006,9 +819,7 @@ def gramps_upgrade_14(self):
new_note = (handle, gramps_id, styled_text, format, note_type,
change, marker, private)
with BSDDBTxn(self.env, self.note_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_note)
txn.put(str(handle), new_note)
self.update()
# ---------------------------------
@@ -1028,9 +839,7 @@ def gramps_upgrade_14(self):
description, place, new_source_list, note_list,
new_media_list, new_attribute_list, change,marker,private)
with BSDDBTxn(self.env, self.event_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_event)
txn.put(str(handle), new_event)
self.update()
# ---------------------------------
@@ -1112,9 +921,7 @@ def gramps_upgrade_14(self):
)
with BSDDBTxn(self.env, self.person_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_person)
txn.put(str(handle), new_person)
self.update()
# ---------------------------------
@@ -1146,9 +953,7 @@ def gramps_upgrade_14(self):
change, marker, private)
with BSDDBTxn(self.env, self.family_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_family)
txn.put(str(handle), new_family)
self.update()
# ---------------------------------
@@ -1173,9 +978,7 @@ def gramps_upgrade_14(self):
new_address_list, urls, change, marker, private)
with BSDDBTxn(self.env, self.repository_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_repository)
txn.put(str(handle), new_repository)
self.update()
# ---------------------------------
@@ -1193,9 +996,7 @@ def gramps_upgrade_14(self):
new_date, marker, private)
with BSDDBTxn(self.env, self.media_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_media)
txn.put(str(handle), new_media)
self.update()
# ---------------------------------
@@ -1203,19 +1004,17 @@ def gramps_upgrade_14(self):
# ---------------------------------
for place_handle in self.place_map.keys():
place = self.place_map[place_handle]
(handle, gramps_id, title, longi, lat,
(handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, media_list, source_list, note_list,
change, marker, private) = place
new_media_list = new_media_list_14(media_list)
new_source_list = new_source_list_14(source_list)
new_place = (handle, gramps_id, title, longi, lat,
new_place = (handle, gramps_id, title, int, lat,
main_loc, alt_loc, urls, new_media_list,
new_source_list, note_list, change, marker, private)
with BSDDBTxn(self.env, self.place_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_place)
txn.put(str(handle), new_place)
self.update()
# ---------------------------------
@@ -1234,9 +1033,7 @@ def gramps_upgrade_14(self):
marker, private)
with BSDDBTxn(self.env, self.source_map) as txn:
if isinstance(handle, UNITYPE):
handle = handle.encode('utf-8')
txn.put(handle, new_source)
txn.put(str(handle), new_source)
self.update()
# Bump up database version. Separate transaction to save metadata.

View File

@@ -40,11 +40,13 @@ 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
@@ -62,7 +64,6 @@ 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
@@ -73,20 +74,18 @@ from ..lib.researcher import Researcher
from . import (DbBsddbRead, DbWriteBase, BSDDBTxn,
DbTxn, BsddbBaseCursor, BsddbDowngradeError, DbVersionError,
DbEnvironmentError, DbUpgradeRequiredError, find_surname,
find_byte_surname, find_surname_name, DbUndoBSDDB as DbUndo)
find_surname_name, DbUndoBSDDB as DbUndo)
from .dbconst import *
from ..utils.callback import Callback
from ..utils.cast import conv_dbstr_to_unicode
from ..utils.cast import (conv_unicode_tosrtkey, conv_dbstr_to_unicode)
from ..updatecallback import UpdateCallback
from ..errors import DbError
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE, handle2internal
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..constfunc import win, conv_to_unicode, cuni, UNITYPE
_LOG = logging.getLogger(DBLOGNAME)
LOG = logging.getLogger(".citation")
_MINVERSION = 9
_DBVERSION = 18
_DBVERSION = 16
IDTRANS = "person_id"
FIDTRANS = "family_id"
@@ -98,8 +97,6 @@ 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"
@@ -114,7 +111,6 @@ PERSON_TBL = "person"
REPO_TBL = "repo"
NOTE_TBL = "note"
TAG_TBL = "tag"
LOCATION_TBL = "location"
REF_MAP = "reference_map"
REF_PRI = "primary_map"
@@ -138,8 +134,7 @@ CLASS_TO_KEY_MAP = {Person.__name__: PERSON_KEY,
Place.__name__: PLACE_KEY,
Repository.__name__:REPOSITORY_KEY,
Note.__name__: NOTE_KEY,
Tag.__name__: TAG_KEY,
Location.__name__: LOCATION_KEY}
Tag.__name__: TAG_KEY}
KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__,
FAMILY_KEY: Family.__name__,
@@ -150,8 +145,7 @@ KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__,
PLACE_KEY: Place.__name__,
REPOSITORY_KEY: Repository.__name__,
NOTE_KEY: Note.__name__,
TAG_KEY: Tag.__name__,
LOCATION_KEY: Location.__name__}
TAG_KEY: Tag.__name__}
KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
FAMILY_KEY: 'family',
@@ -163,14 +157,13 @@ KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
REPOSITORY_KEY: 'repository',
#REFERENCE_KEY: 'reference',
NOTE_KEY: 'note',
TAG_KEY: 'tag',
LOCATION_KEY: 'location'}
TAG_KEY: 'tag'}
#-------------------------------------------------------------------------
#
# Helper functions
#
#-------------------------------------------------------------------------
def find_idmap(key, data):
""" return id for association of secondary index.
returns a byte string
@@ -180,20 +173,6 @@ 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),
@@ -256,7 +235,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# 1. Signals for primary objects
__signals__ = dict((obj+'-'+op, signal)
for obj in
['person', 'family', 'event', 'place', 'location',
['person', 'family', 'event', 'place',
'source', 'citation', 'media', 'note', 'repository', 'tag']
for op, signal in zip(
['add', 'update', 'delete', 'rebuild'],
@@ -384,20 +363,6 @@ 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
@@ -479,7 +444,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, TAG_TBL, LOCATION_TBL, REF_MAP, META]:
NOTE_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
@@ -593,7 +558,6 @@ 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),
]
@@ -742,8 +706,6 @@ 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),
]
@@ -756,7 +718,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
if not self.readonly:
assoc = [
(self.person_map, self.surnames, find_byte_surname),
(self.person_map, self.surnames, find_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),
@@ -767,8 +729,6 @@ 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,
@@ -810,8 +770,6 @@ 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),
]
@@ -838,60 +796,6 @@ 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):
"""
@@ -953,7 +857,6 @@ 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()
@@ -972,12 +875,8 @@ 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])
main_key = (handle, 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
@@ -1051,12 +950,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
the passed transaction.
"""
if isinstance(key, tuple):
#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))
#create a string key
key = str(key)
if isinstance(key, UNITYPE):
key = key.encode('utf-8')
@@ -1249,8 +1143,6 @@ 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()
@@ -1268,7 +1160,6 @@ 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()
@@ -1282,7 +1173,6 @@ 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
@@ -1301,7 +1191,6 @@ 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
@@ -1467,13 +1356,6 @@ 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
@@ -1588,14 +1470,6 @@ 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:
@@ -1614,7 +1488,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.emit('person-groupname-rebuild', (name, grouppar))
def sort_surname_list(self):
self.surname_list.sort(key=glocale.sort_key)
self.surname_list.sort(key=conv_unicode_tosrtkey)
@catch_db_error
def build_surname_list(self):
@@ -1626,7 +1500,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=glocale.sort_key)
key=conv_unicode_tosrtkey)
def add_to_surname_list(self, person, batch_transaction):
"""
@@ -1916,14 +1790,6 @@ 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')
@@ -2029,10 +1895,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
"""
if (obj_type, trans_type) in transaction:
if trans_type == TXNDEL:
handles = [handle2internal(handle) for handle, data in
handles = [handle for handle, data in
transaction[(obj_type, trans_type)]]
else:
handles = [handle2internal(handle) for handle, data in
handles = [handle for handle, data in
transaction[(obj_type, trans_type)]
if (handle, None) not in transaction[(obj_type,
TXNDEL)]]
@@ -2128,10 +1994,6 @@ 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)

View File

@@ -53,11 +53,8 @@ Specific symbols for parts of a name are defined:
# Python modules
#
#-------------------------------------------------------------------------
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().sgettext
from ..ggettext import sgettext as _
import re
import logging
LOG = logging.getLogger(".gramps.gen")
#-------------------------------------------------------------------------
#
@@ -1050,17 +1047,8 @@ def fn(%s):
else:
return p + str + s
return cleanup_name("%s" %% (%s))""" % (args, new_fmt, ",".join(param))
try:
exec(s) in globals(), locals()
return locals()['fn']
except:
LOG.error("\n" + 'Wrong name format string %s' % new_fmt
+"\n" + ("ERROR, Edit Name format in Preferences->Display to correct")
+"\n" + _('Wrong name format string %s') % new_fmt
+"\n" + ("ERROR, Edit Name format in Preferences->Display to correct")
)
def errfn(*arg):
return _("ERROR, Edit Name format in Preferences")
return errfn
exec(s)
return locals()['fn']
displayer = NameDisplay()

View File

@@ -40,7 +40,6 @@ 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()
#-------------------------------------------------------------------------
@@ -112,7 +111,6 @@ 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")
@@ -125,7 +123,7 @@ class FilterList(object):
return l.replace('"', '&quot;')
def save(self):
f = open(self.file.encode(glocale.getfilesystemencoding()), 'w')
f = open(self.file.encode(sys.getfilesystemencoding()), 'w')
f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
f.write('<filters>\n')
for namespace in self.filter_namespaces:

View File

@@ -28,8 +28,7 @@
from __future__ import print_function, unicode_literals
from xml.sax import handler
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ..ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -26,8 +26,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
import re
import time

View File

@@ -25,8 +25,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -25,8 +25,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -26,8 +26,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -25,8 +25,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -28,8 +28,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -26,8 +26,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -28,8 +28,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -29,8 +29,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -26,8 +26,7 @@
#
#-------------------------------------------------------------------------
import re
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

View File

@@ -25,8 +25,7 @@
# Standard Python modules
#
#-------------------------------------------------------------------------
from ...const import GRAMPS_LOCALE as glocale
_ = glocale.get_translation().gettext
from ...ggettext import gettext as _
#-------------------------------------------------------------------------
#

Some files were not shown because too many files have changed in this diff Show More