Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b57b8d0b75 | ||
|
|
9fe57a2eb2 | ||
|
|
ddfc88946a | ||
|
|
52e4790753 | ||
|
|
8a2c94a3dd | ||
|
|
e40b727a57 | ||
|
|
160d5952f2 | ||
|
|
482199d29c | ||
|
|
bfa7c0c9f4 | ||
|
|
614332aac8 | ||
|
|
0a981f0ca6 | ||
|
|
9e81014fc6 | ||
|
|
2da93aad1f | ||
|
|
97434a0136 | ||
|
|
181e2d8540 | ||
|
|
36d03137dd | ||
|
|
f6ac1999dd | ||
|
|
a99b48711f | ||
|
|
d5d86e9139 | ||
|
|
4ebba02b6b | ||
|
|
e535fcefa5 | ||
|
|
0170e2b1e6 | ||
|
|
54799df049 | ||
|
|
b97facb66f | ||
|
|
aae38a6861 | ||
|
|
e0ee86c36a | ||
|
|
e3e89e6592 | ||
|
|
2cde1f0cdb | ||
|
|
2ca3839904 | ||
|
|
66cac5e852 | ||
|
|
99ec8e876b | ||
|
|
b27480f7a1 | ||
|
|
e0e81cf56a | ||
|
|
6df7c46400 | ||
|
|
b98f166a6d | ||
|
|
33e78d47db | ||
|
|
c753ca66b0 | ||
|
|
ff87829b99 | ||
|
|
a1ec516340 | ||
|
|
60b4866296 | ||
|
|
3ad5248af0 | ||
|
|
aa7d9c10c8 | ||
|
|
9f458578c0 | ||
|
|
3418027e50 | ||
|
|
8eed6b869a | ||
|
|
f5202a9ab8 | ||
|
|
b8e5eacbbe | ||
|
|
810d2fca24 | ||
|
|
7c0e138ad2 | ||
|
|
85535c0f5b | ||
|
|
b52d90221f | ||
|
|
bfcbd38610 | ||
|
|
2ada529a21 | ||
|
|
8d355ee184 | ||
|
|
d5b28435e0 | ||
|
|
61189d3930 | ||
|
|
fec961d992 | ||
|
|
8ceccb4a28 | ||
|
|
6ba9722dee | ||
|
|
4a9f658dd4 | ||
|
|
c9537b355e | ||
|
|
49c3fa0f3f | ||
|
|
eb002718b1 | ||
|
|
19c714d57a | ||
|
|
b392ce01e0 | ||
|
|
b43b6bdd6d | ||
|
|
c027276466 | ||
|
|
898b6b26e8 | ||
|
|
ab2df73268 | ||
|
|
e1794090e1 | ||
|
|
87860fcfd2 | ||
|
|
79986e1f5e | ||
|
|
0f38a1a645 | ||
|
|
14618917c2 | ||
|
|
ae7a2500de | ||
|
|
358a6b118b | ||
|
|
9352f0c438 | ||
|
|
1ab4cbfa63 | ||
|
|
1fd319e13a | ||
|
|
7cb8489ba2 | ||
|
|
a685b96f70 | ||
|
|
b24ebd5d77 | ||
|
|
6dcb1d00d5 | ||
|
|
a3b37b9627 | ||
|
|
034720321c | ||
|
|
09f01a69d5 | ||
|
|
597f3ebedf | ||
|
|
c7b5e149fa | ||
|
|
f7203aa029 | ||
|
|
9cca728a66 | ||
|
|
df270adc94 | ||
|
|
c177c13f99 | ||
|
|
15f1bb0201 | ||
|
|
f75aa9302a | ||
|
|
708c83dc58 | ||
|
|
0a809904dc | ||
|
|
e8f50deabc | ||
|
|
486fae91ce | ||
|
|
9ee5468bda | ||
|
|
eac6a935f6 | ||
|
|
cc68b7acfc | ||
|
|
c321e7f0d6 | ||
|
|
e13a852523 | ||
|
|
3c4c433a84 | ||
|
|
e8268cb37e | ||
|
|
721d964741 | ||
|
|
7d4ec1be73 | ||
|
|
36ce375a2a | ||
|
|
9f6afcc7db | ||
|
|
c66fc6423d | ||
|
|
f91d3e94ab | ||
|
|
3c1c21163c | ||
|
|
09709ec0c6 | ||
|
|
bb7f5fa522 | ||
|
|
9957506f35 | ||
|
|
eb4ce9ff79 | ||
|
|
1d72f4b23d | ||
|
|
5ad5f08a2b | ||
|
|
9e43f060d1 | ||
|
|
bc1ed688c4 | ||
|
|
9d358d06f5 | ||
|
|
16b1945a0e | ||
|
|
5e9be68ad5 | ||
|
|
cd3ef08ffb | ||
|
|
773e763093 | ||
|
|
0badfb6b47 | ||
|
|
5af80da5cd | ||
|
|
0045f134c6 | ||
|
|
1035f8930f | ||
|
|
d4bceeb6ff | ||
|
|
c8fc88cfe7 | ||
|
|
b4b6d52306 | ||
|
|
4f390c6b33 | ||
|
|
0442c34258 | ||
|
|
c903f5e5a5 | ||
|
|
3329860f50 | ||
|
|
e7401f3aaa | ||
|
|
1a48e8a03e | ||
|
|
9a4adab9d6 | ||
|
|
bb0647274b | ||
|
|
f6bfb46fc0 | ||
|
|
b6fa5da8ee | ||
|
|
14c2d0e1b6 | ||
|
|
226e8c549a | ||
|
|
d173809d8c | ||
|
|
63c52fa1bb | ||
|
|
455628d44a | ||
|
|
670bb355cb | ||
|
|
202c7a9bf6 | ||
|
|
72955840f1 | ||
|
|
b8e73d5ee1 | ||
|
|
990db39664 | ||
|
|
9c0dca6bd1 | ||
|
|
02e0c1c67d | ||
|
|
ebf1715468 | ||
|
|
c10f2da00e | ||
|
|
9f71372a97 | ||
|
|
0993d9cfc3 | ||
|
|
34471834ab | ||
|
|
ff912f844c | ||
|
|
45eac501a9 | ||
|
|
d4e85c2397 | ||
|
|
c7a4d287f0 | ||
|
|
c0d622c16a | ||
|
|
b38f77f2aa | ||
|
|
d91fc9e2fb | ||
|
|
198602be61 | ||
|
|
3f9f3215ee | ||
|
|
beb388a30d | ||
|
|
29e78d4253 | ||
|
|
b80dcaf701 | ||
|
|
a876d94fbc | ||
|
|
95e1e8cb67 | ||
|
|
4147bc728a | ||
|
|
3a9a7053ec | ||
|
|
b96fd8a274 | ||
|
|
26cf0601d8 | ||
|
|
c59278ef20 | ||
|
|
767557be61 | ||
|
|
495d4e58ae | ||
|
|
fd90a80cf8 | ||
|
|
f6c0103f32 | ||
|
|
04c1dc8503 | ||
|
|
8172e1017e | ||
|
|
ea30c3599b | ||
|
|
5f3ca40633 | ||
|
|
9c64dafaea | ||
|
|
13d83919b9 | ||
|
|
62d5a136a4 | ||
|
|
b57061d7c9 | ||
|
|
f7be7ab63f | ||
|
|
97923e7530 | ||
|
|
75aabf570d | ||
|
|
41f1e91600 | ||
|
|
981c0dfc5c | ||
|
|
d558a9a004 | ||
|
|
914bd6c0d3 | ||
|
|
e8eb5bf0a1 | ||
|
|
b523530fb0 | ||
|
|
0d698c13cc | ||
|
|
4232032ce3 | ||
|
|
8f4b51c837 | ||
|
|
f2caecd621 | ||
|
|
c26d6902d1 | ||
|
|
b00b1f37f1 | ||
|
|
9230de61be | ||
|
|
9906f1e4ab | ||
|
|
a68c0f7aa7 | ||
|
|
513b27531d | ||
|
|
b8f007c4dd | ||
|
|
e375df1e2a | ||
|
|
df81a10fe8 | ||
|
|
fa53805534 | ||
|
|
e614a79cef | ||
|
|
343633a189 | ||
|
|
eb14abbf3e | ||
|
|
5154d0c016 | ||
|
|
a2c6641774 | ||
|
|
924d82a7c4 | ||
|
|
f1f8847a86 | ||
|
|
748fbd0949 | ||
|
|
e2e659dc94 | ||
|
|
6cbc2b896d | ||
|
|
d210275a4e | ||
|
|
0a3a65ffb0 | ||
|
|
e34b98033e | ||
|
|
96de0ceb4e | ||
|
|
58335cfee2 | ||
|
|
2ce48d3793 | ||
|
|
f91063884e | ||
|
|
06732b1b5d | ||
|
|
26b78c17af | ||
|
|
d83fff3b62 | ||
|
|
823bcaac0d | ||
|
|
b9c324ef37 | ||
|
|
23d2c8e694 | ||
|
|
28dc2e5158 | ||
|
|
2baa6f5e40 | ||
|
|
eb1b4c1eb5 | ||
|
|
51f2052cfe | ||
|
|
ccf6d59b17 | ||
|
|
74d72f4dd0 | ||
|
|
9ce92f41e3 | ||
|
|
77cdbb11b5 | ||
|
|
72277db766 | ||
|
|
7ae77abead | ||
|
|
04b1463746 | ||
|
|
1eeae2edf8 | ||
|
|
740adc7070 | ||
|
|
a2dbdbb61a | ||
|
|
8d5b0c83ce | ||
|
|
01afe251fb | ||
|
|
152ed0b6bc | ||
|
|
5624fb1490 | ||
|
|
32c700c6bf | ||
|
|
130740553d | ||
|
|
675dfdbc70 | ||
|
|
34beeaad70 | ||
|
|
06cb9d7ea6 | ||
|
|
d693881b98 | ||
|
|
801be84465 | ||
|
|
7807ff8a6d | ||
|
|
672603c8ae | ||
|
|
c30dfc6343 | ||
|
|
e6ed0612e3 | ||
|
|
9b0cf1b976 | ||
|
|
ddb29b1628 | ||
|
|
1a8406e2e4 | ||
|
|
09e89549de | ||
|
|
afaeb7c995 | ||
|
|
6fa30b889d | ||
|
|
1916383a28 | ||
|
|
379c96ee6a | ||
|
|
7b45bbf72e | ||
|
|
aea9ef3645 | ||
|
|
05f7744cba | ||
|
|
bfc76a08d4 | ||
|
|
b7487330a7 | ||
|
|
1025a38caa | ||
|
|
2054c467db | ||
|
|
789b72289c | ||
|
|
2e1132bec0 | ||
|
|
8ccfa43e56 | ||
|
|
40140859af | ||
|
|
e69e6ca338 | ||
|
|
fb29a77f83 | ||
|
|
06cca96ad0 | ||
|
|
2c49461529 | ||
|
|
73d19851ef | ||
|
|
16c8e61944 | ||
|
|
2fbf945309 | ||
|
|
cf184e72e8 | ||
|
|
1c27b785f4 | ||
|
|
da7e4cc763 | ||
|
|
5d2fd8cbda | ||
|
|
005beac33f | ||
|
|
ae53b401ce | ||
|
|
79c54aaedc | ||
|
|
4360976d73 | ||
|
|
5e9d79ac6f | ||
|
|
ee1d9be898 | ||
|
|
75b0b66269 | ||
|
|
c54f381737 | ||
|
|
2aa6b54de4 | ||
|
|
49bad564ae | ||
|
|
03ab64c4d5 | ||
|
|
f7bd062bdb | ||
|
|
c312c96987 | ||
|
|
6b2066c797 | ||
|
|
5d15ccb2a2 | ||
|
|
0095a07f12 | ||
|
|
bb5b03dd78 | ||
|
|
26351c18c9 | ||
|
|
ecd6da40dd | ||
|
|
793b13be67 | ||
|
|
48dfca57e2 | ||
|
|
a07aae2e30 | ||
|
|
8f5daac4a7 | ||
|
|
0cd6394b72 | ||
|
|
57d8dcd574 | ||
|
|
d5bb4da5a1 | ||
|
|
5c44d925e1 | ||
|
|
c7e2e09b42 | ||
|
|
669e4af0b7 | ||
|
|
88f7a701a3 | ||
|
|
52c087154f | ||
|
|
2b62729f52 | ||
|
|
1c856bb93b | ||
|
|
710e40425f |
@@ -0,0 +1,77 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2022 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
name: Gramps CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ maintenance/gramps51 ]
|
||||
pull_request:
|
||||
branches: [ maintenance/gramps51 ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install gir1.2-pango-1.0
|
||||
sudo apt-get install gir1.2-gtk-3.0
|
||||
sudo apt-get install xdg-utils
|
||||
sudo apt-get install librsvg2-common
|
||||
sudo apt-get install libglib2.0-dev
|
||||
sudo apt-get install intltool
|
||||
sudo apt-get install python3-gi
|
||||
sudo apt-get install python3-cairo
|
||||
sudo apt-get install python3-gi-cairo
|
||||
sudo apt-get install python3-bsddb3
|
||||
sudo apt-get install python3-dev
|
||||
sudo apt-get install python3-nose
|
||||
sudo apt-get install python3-mock
|
||||
sudo apt-get install python3-icu
|
||||
sudo apt-get install python3-coverage
|
||||
sudo apt-get install python3-jsonschema
|
||||
sudo apt-get install libxml2-utils
|
||||
sudo apt-get install python3-lxml
|
||||
sudo apt-get install python-libxml2
|
||||
sudo apt-get install zlib1g-dev
|
||||
sudo apt-get install python3-setuptools
|
||||
- name: Install addons
|
||||
run: |
|
||||
mkdir -p ~/.gramps/gramps51/plugins/
|
||||
wget https://github.com/gramps-project/addons/raw/master/gramps51/download/CliMerge.addon.tgz
|
||||
tar -C ~/.gramps/gramps51/plugins -xzf CliMerge.addon.tgz
|
||||
wget https://github.com/gramps-project/addons/raw/master/gramps51/download/ExportRaw.addon.tgz
|
||||
tar -C ~/.gramps/gramps51/plugins -xzf ExportRaw.addon.tgz
|
||||
- name: Build
|
||||
run: |
|
||||
python3 setup.py build
|
||||
- name: Run unit test suite
|
||||
run: |
|
||||
python3 setup.py test
|
||||
- name: Trailing whitespace check
|
||||
run: |
|
||||
if git --no-pager grep --color -n --full-name '[ ]$' -- \*.py; then
|
||||
echo "ERROR - Trailing whitespace found in source file(s)";
|
||||
exit 1;
|
||||
fi
|
||||
@@ -1,129 +0,0 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2015-2015 Doug Blank
|
||||
# Copyright (C) 2016 DaAwesomeP
|
||||
# Copyright (C) 2016 QuLogic
|
||||
# Copyright (C) 2016 Tim G L Lyons
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
# After changing this file, check it on:
|
||||
# http://lint.travis-ci.org/
|
||||
|
||||
sudo: required
|
||||
dist: trusty
|
||||
language: python
|
||||
python:
|
||||
- 3.3 # This is irrelevant, because the virtualenv is not used at all
|
||||
|
||||
# FIXME: The minimum requirement for Gramps is Python 3.2, so a test environment
|
||||
# for Python 3.2 should be added to this environment which is Python 3.3. It
|
||||
# will not be possible to run coverage under Python 3.2, because coverage is
|
||||
# Python 3.3 (or above) only.
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gir1.2-pango-1.0
|
||||
- gir1.2-gtk-3.0
|
||||
- xdg-utils
|
||||
- librsvg2-common
|
||||
- libglib2.0-dev
|
||||
- intltool
|
||||
# - python3-gobject Provided by python3-gi
|
||||
- python3-gi
|
||||
- python3-cairo
|
||||
- python3-gi-cairo
|
||||
- python3-bsddb3
|
||||
- python3-dev
|
||||
- python3-nose
|
||||
- python3-mock
|
||||
- python3-pyicu
|
||||
- python3-coverage
|
||||
- python3-jsonschema
|
||||
# lxml dependencies. for merge_ref_test to work
|
||||
# - libxml2-dev
|
||||
# - libxslt1-dev
|
||||
- libxml2-utils
|
||||
- python3-lxml
|
||||
- python-libxml2
|
||||
# ubuntu 14.04 requires this in addition to libxml2-dev and
|
||||
# libxslt1-dev for compiling lxml.
|
||||
# https://github.com/deanmalmgren/textract/issues/19
|
||||
- zlib1g-dev
|
||||
|
||||
before_install:
|
||||
|
||||
install:
|
||||
# The working directory is set to /home/travis/build/gramps-project/gramps
|
||||
# by the automatic git checkout.
|
||||
|
||||
# Download Sean Ross-Ross's Pure Python module containing a framework to
|
||||
# manipulate and analyze python ast�s and bytecode. This is loaded to
|
||||
# /home/travis/build/gramps-project/gramps/meta
|
||||
# FIXME: This should be loaded from the release directory at
|
||||
# https://pypi.python.org/pypi/meta
|
||||
- git clone -b master https://github.com/srossross/meta
|
||||
|
||||
# Build Gramps package. This seems to copy everything to
|
||||
# /home/travis/build/scripts-3.3
|
||||
- python setup.py build
|
||||
|
||||
before_script:
|
||||
# Create the Gramps database directory.
|
||||
- mkdir -p ~/.gramps/grampsdb/
|
||||
# set PYTHONPATH so the directly installed module (meta) is picked up from
|
||||
# /home/travis/build/gramps-project/gramps/meta
|
||||
- export PYTHONPATH=meta
|
||||
# set module exclusions. --exclude=TestUser because of older version of mock
|
||||
# without configure_mock
|
||||
- export EXCLUDE="--exclude=TestcaseGenerator"
|
||||
# --exclude=merge_ref_test"
|
||||
# set GRAMPS_RESOURCES for locale, data,image and documentation
|
||||
- export GRAMPS_RESOURCES=.
|
||||
# Install addons
|
||||
- mkdir -p ~/.gramps/gramps51/plugins/
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/CliMerge.addon.tgz
|
||||
- tar -C ~/.gramps/gramps51/plugins -xzf CliMerge.addon.tgz
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/ExportRaw.addon.tgz
|
||||
- tar -C ~/.gramps/gramps51/plugins -xzf ExportRaw.addon.tgz
|
||||
|
||||
script:
|
||||
# Ignore the virtualenv entirely. Use nosetests3, python3 (3.4.0) and coverage
|
||||
# from /usr/bin. Use libraries from /usr/lib/python3.4,
|
||||
# /usr/local/lib/python3.4/dist-packages and /usr/lib/python3/dist-packages
|
||||
- nosetests3 --nologcapture --with-coverage --cover-package=gramps $EXCLUDE
|
||||
gramps
|
||||
# FIXME: This should have run from the current directory, rather than from
|
||||
# gramps, because there is some test code in that directory.
|
||||
|
||||
# give an error for any trailing whitespace
|
||||
- if git --no-pager grep --color -n --full-name '[ ]$' -- \*.py; then
|
||||
echo "ERROR - Trailing whitespace found in source file(s)";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
after_success:
|
||||
# apt-get installs python3-coverage, but codecov only invokes coverage, so make
|
||||
# a link
|
||||
- sudo ln /usr/bin/python3-coverage /usr/bin/coverage
|
||||
|
||||
# We have to use the bash script because the apt-get coverage does not install
|
||||
# codecov. If we used pip to install codecov, it would run inside the
|
||||
# virtualenv, and that doesn't work. Change the path to ensure that codecov
|
||||
# picks up coverage from /usr/bin, rather than from
|
||||
# /home/travis/virtualenv/python3.3.6/bin/
|
||||
- PATH=/usr/bin:$PATH bash <(curl -s https://codecov.io/bash)
|
||||
@@ -1,277 +1,174 @@
|
||||
2019-09-14 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2023-06-29 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Fix deprecation
|
||||
warning in withinarea rule
|
||||
* docs/conf.py, gramps/gen/const.py: Update copyright date
|
||||
|
||||
2019-09-14 Nick Hall <nick-h@gramps-project.org>
|
||||
2023-05-13 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/grampsgui.py: Disable development warning message
|
||||
* gramps/plugins/webreport/media.py: Narrative web: problem with
|
||||
small pictures. Fixes #012884
|
||||
|
||||
2019-09-13 Jonas Hahnfeld <hahnjo@hahnjo.de>
|
||||
2023-05-09 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gen/plug/docgen/treedoc.py: Add options to sandclock in
|
||||
tree document generator This works and is actually needed to style the root node.
|
||||
* gramps/plugins/view/familyview.py: Implement the "<CTRL>J" for the
|
||||
family view Fixes #012882
|
||||
|
||||
2019-09-11 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2022-07-11 Jon Schewe <jpschewe@mtu.net>
|
||||
|
||||
* gramps/gui/filters/sidebar/_personsidebarfilter.py: Using regex in
|
||||
the sidebar gives different result from previous gramps release. Fixes #11321
|
||||
* gramps/plugins/webreport/basepage.py: Avoid application crash on
|
||||
invalid user input If the user inputs an invalid date this change keeps the application
|
||||
from crashing when such a date is found. The invalid date
|
||||
information is reported to the user in the log. Fixes #12658.
|
||||
|
||||
2019-09-12 Jérôme Rapinat <romjerome@yahoo.fr>
|
||||
2023-05-13 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* po/fr.po: Add missing French translation strings
|
||||
* gramps/plugins/export/exportgedcom.py: Fix export where private
|
||||
citations are excluded
|
||||
|
||||
2019-09-10 Gil da Costa <gdacosta@sommier-colas.fr>
|
||||
2022-06-01 prculley <paulr2787@gmail.com>
|
||||
|
||||
* po/fr.po: Update French translation
|
||||
* gramps/plugins/tool/eventcmp.py: Fix Event compare tool to display
|
||||
enclosed places properly
|
||||
|
||||
2019-09-09 prculley <paulr2787@gmail.com>
|
||||
2022-06-08 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/docgen/odfdoc.py: Fix odt output when db owner has
|
||||
XML unfriendly chars ('&') Fixes #11327
|
||||
* gramps/gui/viewmanager.py: Check that view exists before calling
|
||||
post_create method Avoids 'NoneType' object has no attribute 'post_create' error. Fixes #12638
|
||||
|
||||
2019-09-11 John Bickmore <johnbickmore@users.noreply.github.com>
|
||||
2022-06-15 Jingxuan He <LostBenjamin@users.noreply.github.com>
|
||||
|
||||
* README.md: Bump required Python version to 3.3 on Readme As mentioned on the release announcement
|
||||
* gramps/plugins/webreport/webcal.py: Fix a wrong operator bug in
|
||||
the web calendar report
|
||||
|
||||
https://gramps-project.org/introduction-WP/2019/08/gramps-5-1-0-released/
|
||||
2022-10-08 Himanshu Gohel <1551217+hgohel@users.noreply.github.com>
|
||||
|
||||
2019-09-08 SNoiraud <Serge.Noiraud@free.fr>
|
||||
* gramps/gen/plug/docgen/treedoc.py: Revert "Enclose tree report
|
||||
image path and file name in braces" Fixes #12437 by reverting commit
|
||||
75921ceaf40f3ced597d99c43794b98f81e49957 due to reports of
|
||||
regression where processing of the generated TeX file fails due to
|
||||
bad path specificiation for image files. Change was introduced in bug fix for #10495. Bugs #12437 and #12697 reported the regression and confirmed that
|
||||
reverting the change fixes the regression.
|
||||
|
||||
* gramps/plugins/webreport/narrativeweb.py: Remove
|
||||
reload_custom_filters to conform to PR894
|
||||
2022-10-22 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-07 prculley <paulr2787@gmail.com>
|
||||
* gramps/plugins/lib/maps/geography.py: Geography View: Fix number
|
||||
of arguments in add_bookmark method add_bookmark() takes 2 positional arguments but 3 were given Fixes #12718
|
||||
|
||||
* gramps/cli/grampscli.py: Fix CLI crash when generating reports Fixes #11318, #11213
|
||||
2022-12-08 GaryGriffin <genealogy@garygriffin.net>
|
||||
|
||||
2019-09-06 prculley <paulr2787@gmail.com>
|
||||
* gramps/plugins/lib/libsubstkeyword.py: Use date-specific place in
|
||||
report substitution variables Fix place title in graphical reports which have user-defined display
|
||||
formats to use date-specific alternate name. This impacts Ancestor Tree, Descendant Tree, and Family Descendant
|
||||
Tree. Fixes #12763.
|
||||
|
||||
* gramps/gui/views/listview.py: Fix Statusbar HandleError on merge
|
||||
families Fixes #11320, #11294, #11279
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-09-12 Avi Markovitz <avi.markovitz@gmail.com>
|
||||
* gramps/grampsapp.py, gramps/gui/aboutdialog.py,
|
||||
gramps/gui/logger/_errorreportassistant.py,
|
||||
gramps/plugins/db/bsddb/bsddbtxn.py,
|
||||
gramps/plugins/db/bsddb/cursor.py, gramps/plugins/db/bsddb/read.py,
|
||||
gramps/plugins/db/bsddb/summary.py,
|
||||
gramps/plugins/db/bsddb/test/cursor_test.py,
|
||||
gramps/plugins/db/bsddb/undoredo.py,
|
||||
gramps/plugins/db/bsddb/upgrade.py,
|
||||
gramps/plugins/db/bsddb/write.py, gramps/plugins/gramplet/leak.py,
|
||||
mac/patches/gramps-berkeleydb.patch: Try to import berkeleydb if
|
||||
bsddb3 isn't found. berkelydb is usable for python >= 3.6 and required for python >=
|
||||
3.10. See https://www.jcea.es/programacion/pybsddb.htm.
|
||||
|
||||
* po/he.po: Update Hebrew translation
|
||||
2023-02-12 Vincent Smeets <Vincent.VSmeets@GMail.com>
|
||||
|
||||
2019-09-12 Matti Niemelä <matti.u.niemela@gmail.com>
|
||||
* gramps/plugins/docgen/htmldoc.py: HtmlDoc: Create a unique
|
||||
filename for cropped images
|
||||
|
||||
* po/fi.po: Fix translation in Finnish
|
||||
2022-10-24 D.A.Lordemann <LordemannD@gmail.com>
|
||||
|
||||
2019-09-12 Matti Niemelä <matti.u.niemela@gmail.com>
|
||||
* gramps/plugins/export/exportgedcom.py: Fix corrupted NOTE tag in
|
||||
Gedcom export Remove Python2 code obsoleted by Python3, which was corrupting
|
||||
GEDCOM export of Gramps Notes text that includes multi-byte utf-8
|
||||
characters. Fixes #12709.
|
||||
|
||||
* po/fi.po: Update finnish translation
|
||||
2022-09-27 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-11 vantu5z <vantu5z@mail.ru>
|
||||
* gramps/gui/viewmanager.py: Fix IndexError that sometimes occurs
|
||||
when changing view This occurs when restarting Gramps. Fixes #12636, #12304, #12429, #12623, #12695.
|
||||
|
||||
* po/ru.po: update Russian translation
|
||||
2023-03-18 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-10 pehlm <par.ekholm@pekholm.org>
|
||||
* gramps/gen/proxy/referencedbyselection.py,
|
||||
gramps/gui/widgets/styledtexteditor.py,
|
||||
gramps/plugins/lib/libhtmlbackend.py: Fix crash when invalid note
|
||||
link Fixes #012854
|
||||
|
||||
* po/sv.po: Update Swedish translation
|
||||
2023-04-17 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-10 Mirko Leonhaeuser <mirko@leonhaeuser.de>
|
||||
* gramps/gui/utils.py: Tags with color names don't work in pedigree
|
||||
views Color tags work correctly in all views except in pedigree views.
|
||||
These views modify colors: ... context.set_source_rgba(*(self.bordercolor[:3] + (0.4,))) ... and context.set_source_rgb(*self.bgcolor[:3]) As it works everywhere except in these views, I think it is a bug
|
||||
even if we cannot enter color names in tags Fixes #012866
|
||||
|
||||
* po/de.po: Update German translation
|
||||
2023-04-05 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-10 Nick Hall <nick-h@gramps-project.org>
|
||||
* gramps/gui/views/treemodels/eventmodel.py: Crash when invalid
|
||||
event date
|
||||
|
||||
* po/ar.po, po/bg.po, po/br.po, po/ca.po, po/cs.po, po/da.po,
|
||||
po/de.po, po/el.po, po/en_GB.po, po/eo.po, po/es.po, po/fi.po,
|
||||
po/fr.po, po/ga.po, po/he.po, po/hr.po, po/hu.po, po/is.po,
|
||||
po/it.po, po/ja.po, po/lt.po, po/mk.po, po/nb.po, po/nl.po,
|
||||
po/nn.po, po/pl.po, po/pt_BR.po, po/pt_PT.po, po/ro.po, po/ru.po,
|
||||
po/sk.po, po/sl.po, po/sq.po, po/sr.po, po/sr_Latn.po, po/sv.po,
|
||||
po/ta.po, po/tr.po, po/uk.po, po/vi.po, po/zh_CN.po, po/zh_HK.po,
|
||||
po/zh_TW.po: Merge po files and new template
|
||||
2023-04-04 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
2019-09-10 Nick Hall <nick-h@gramps-project.org>
|
||||
* gramps/gui/listmodel.py: ListModel: Only the first level is
|
||||
managed When we use checkboxes in columns. The path was converted to int.
|
||||
Why ? But when we have multiple level, the path format is "x:y" for
|
||||
two levels, "x:y:z" for three levels, etc
|
||||
|
||||
* po/gramps.pot: Update translation template for new release
|
||||
2023-03-07 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
2019-08-27 Avi Markovitz <avi.markovitz@gmail.com>
|
||||
* .github/workflows/gramps-ci.yml: Update Gramps CI workflow to run
|
||||
on Ubuntu 20.04 Ubuntu 18.04 became fully unsupported on 1 Dec 2022.
|
||||
|
||||
* po/he.po: Update Hebrew translation
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-07-11 Pedro Albuquerque <palbuquerque73@gmail.com>
|
||||
* mac/gramps.modules: mac: Patch bsddb to use berkeleydb instead of
|
||||
bsddb3 module.
|
||||
|
||||
* po/pt_PT.po: Update Portuguese (Europe) translation
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-06-24 Milo Ivir <mail@milotype.de>
|
||||
* mac/gramps.modules, mac/patches/berkeleydb-4.8-mutex.patch: Mac
|
||||
build: Patch berkeleydb configure to work on Apple Silicon.
|
||||
|
||||
* po/hr.po: Update croatian translation - update with newest/current .pot file - translation is complete - corrections in wording and some missing accelerators
|
||||
2022-12-26 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-09-02 prculley <paulr2787@gmail.com>
|
||||
* mac/gramps.modules: [mac] Update Exiv2 download URL, moved to
|
||||
github.
|
||||
|
||||
* gramps/gui/widgets/styledtexteditor.py: Fix missing tooltip
|
||||
translations in the Note editor toolbar Fixes #11289
|
||||
2022-12-24 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-09-01 SNoiraud <Serge.Noiraud@free.fr>
|
||||
* mac/Info.plist, mac/gramps.bundle, mac/gramps.modules: Repackage
|
||||
Gramps 5.1.5 with Gtk updates fixing use on macOS 13 Ventura.
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Avoid bad
|
||||
coordinates in the ref place
|
||||
2022-03-08 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
* gramps/plugins/lib/librecords.py: Fix spouse's name and underlined
|
||||
call names in records Fixes #12391
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Avoid alphabetic
|
||||
characters in filter rules
|
||||
2022-03-16 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
2019-08-23 SNoiraud <Serge.Noiraud@free.fr>
|
||||
* .github/workflows/gramps-ci.yml: Fix package installation failures
|
||||
in CI
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Could not convert
|
||||
string to float by using withinarea filter rule + difference between sidebar filter
|
||||
and filter rule + some pylint improvements
|
||||
2019-12-09 Sam Manzi <manzi.sam@gmail.com>
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
* gramps/gen/utils/grampslocale.py: Update INCOMPLETE_TRANSLATIONS * Remove: he * Add: zh_HK, zh_TW
|
||||
|
||||
* gramps/gen/plug/docgen/graphdoc.py: Fix Graph outputs for multiple
|
||||
page PDF Postscript Fixes #11305
|
||||
2022-02-12 Ross Gammon <rossgammon@debian.org>
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
* debian/changelog, debian/copyright,
|
||||
debian/patches/fix-probably_alive_test.patch, debian/patches/series:
|
||||
Update Debian folder after 5.1.5 release
|
||||
|
||||
* gramps/gen/plug/_pluginreg.py, gramps/gui/managedwindow.py,
|
||||
gramps/gui/plug/quick/_quickreports.py, gramps/gui/uimanager.py,
|
||||
gramps/gui/viewmanager.py, gramps/gui/views/tags.py,
|
||||
gramps/gui/widgets/grampletpane.py: Fix to make Gtk 'action names'
|
||||
always valid Fixes #11291
|
||||
2022-02-05 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
* mac/Info.plist, mac/gramps.modules: Package Gramps 5.1.5 for
|
||||
macOS.
|
||||
|
||||
* gramps/gui/uimanager.py, gramps/gui/views/tags.py: Fix missing
|
||||
menus/buttons when operating in non-English languages Fixes #11292
|
||||
2022-02-05 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
2019-08-31 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/widgets/validatedmaskedentry.py: Cursor position error
|
||||
in lat and long fields Fixes #11310
|
||||
|
||||
2019-08-30 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/tool/removespaces.py: Avoid all characters looking
|
||||
like a dash hyphen non breaking hyphen figure dash em dash horizontal bar Fixes #11308
|
||||
|
||||
2019-08-30 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* data/css/Web_Mainz.css: Narrative web: Mainz Style sheet weird
|
||||
looking Fixes #11282
|
||||
|
||||
2019-09-02 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/view/relview.py: Set symbols for the active person
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/view/relview.py: Set good symbols for marriage,
|
||||
baptism, cremation and burial
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/view/relview.py: Reduce the size of the sexuality
|
||||
symbol in relview Fixes #11295
|
||||
|
||||
2019-08-28 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/widgets/styledtexteditor.py: Fix exception when editing
|
||||
Note with italics/bold etc. in non English Fixes #11284
|
||||
|
||||
2019-08-27 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gui/views/pageview.py: Restore keybindings for gramplet
|
||||
bars Resolves #11297.
|
||||
|
||||
2019-08-27 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gui/plug/quick/_quickreports.py: Fix bug in web connection
|
||||
menu launching incorrect web site Resolves #11280.
|
||||
|
||||
2019-08-26 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/autocomp.py: Translation problem when creating event
|
||||
filter If you create a filter with the rule name: "Events with a particular type" or "Events with <data>" The menu "Travel", "Academic"... are not
|
||||
translated Fixes #11293
|
||||
|
||||
2019-08-26 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/configure.py, gramps/gui/widgets/grampletbar.py: Error
|
||||
when checking option to add Quit to Taskbar Fixes #11290
|
||||
|
||||
2019-08-25 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/webreport/narrativeweb.py,
|
||||
gramps/plugins/webreport/person.py: Make the narratives notes
|
||||
placement an option From 5.1 the narrative notes are placed just after the name, gender
|
||||
and age at death. This follow the feature request #6772. Some
|
||||
people want to have this placement an option to have the same
|
||||
functionality as before Fixes #11283
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
|
||||
* debian/changelog: Finalise Debian changelog for 5.1.0 release
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
|
||||
* debian/control: Bump gtk+ version to 3.12 & add
|
||||
gir1.2-geocodeglib-1.0 dependency
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
|
||||
* debian/copyright: Update copyrights
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
|
||||
* debian/changelog, debian/control: Merge last 5.0.2 debian release
|
||||
information into 51 maintenance branch
|
||||
|
||||
2019-08-23 Sebastian Schubert <schubert.seb@gmail.com>
|
||||
|
||||
* README.md: Add optional fontconfig package to README.md
|
||||
|
||||
2019-08-23 Sebastian Schubert <schubert.seb@gmail.com>
|
||||
|
||||
* NEWS: Fix typo in NEWS
|
||||
|
||||
2019-08-30 Zdeněk Hataš <zdenek.hatas@gmail.com>
|
||||
|
||||
* po/cs.po: Update Czech translation
|
||||
|
||||
2019-08-29 Zdeněk Hataš <zdenek.hatas@gmail.com>
|
||||
|
||||
* po/cs.po: Update Czech translation
|
||||
|
||||
2019-08-25 Mirko Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* po/de.po: German translation updated
|
||||
|
||||
2019-08-24 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* mac/Info.plist, mac/gramps.modules: Release Gramps-5.1.0 on Mac.
|
||||
|
||||
2019-08-16 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* mac/release.entitlements.plist: An entitlements plist for
|
||||
codesigning Gramps. Python is an interpreter and therefore needs to create executable
|
||||
memory. Since it doesn't know how to sign that memory it requires
|
||||
the allow-unsigned-executable-memory entitlement to run in a
|
||||
hardened runtime. One must apply this entitlement to both Gramps.app
|
||||
and Gramps.app/Contents/MacOS/dot when codesigning them.
|
||||
|
||||
2019-06-11 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* mac/gramps.modules: Fix graphviz and exiv2 download URLs.
|
||||
|
||||
2019-06-11 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* mac/gramps.modules: Update dependency versions and download paths.
|
||||
|
||||
2019-08-22 vantu5z <vantu5z@mail.ru>
|
||||
|
||||
* po/ru.po: update Russian translation
|
||||
|
||||
2019-08-22 pehlm <par.ekholm@pekholm.org>
|
||||
|
||||
* po/sv.po: Update Swedish translation with the new gramps.pot
|
||||
|
||||
2019-08-21 prculley <paulr2787@gmail.com>
|
||||
|
||||
* Bump to 5.1.1
|
||||
* Bump to 5.1.6
|
||||
|
||||
|
||||
@@ -1,3 +1,277 @@
|
||||
2023-06-29
|
||||
Version 5.1.6
|
||||
* Update copyright date.
|
||||
* Narrative web: problem with small pictures. Fixes #12884.
|
||||
* Implement the "<CTRL>J" for the family view. Fixes #12882.
|
||||
* Avoid application crash on invalid user input. If the user inputs an invalid
|
||||
date this change keeps the application from crashing. The invalid date
|
||||
information is reported to the user in the log. Fixes #12658.
|
||||
* Fix export where private citations are excluded.
|
||||
* Fix Event Compare tool to display enclosed places properly.
|
||||
* Check that view exists before calling post_create method. Avoids 'NoneType'
|
||||
object has no attribute 'post_create' error. Fixes #12638.
|
||||
* Fix a wrong operator bug in the web calendar report.
|
||||
* Revert "Enclose tree report image path and file name in braces" due to reports
|
||||
of regression where processing of the generated TeX file fails due to bad path
|
||||
specificiation for image files. Fixes #12437 and #12697.
|
||||
* Geography View: Fix number of arguments in add_bookmark method. Fixes #12718.
|
||||
* Use date-specific place in report substitution variables. Fix place title in
|
||||
graphical reports which have user-defined display formats to use date-specific
|
||||
alternate name. This impacts the Ancestor Tree, Descendant Tree, and Family
|
||||
Descendant Tree reports. Fixes #12763.
|
||||
* Try to import berkeleydb if bsddb3 isn't found. berkelydb is usable for
|
||||
python >= 3.6 and required for python >= 3.10.
|
||||
See https://www.jcea.es/programacion/pybsddb.htm.
|
||||
* HtmlDoc: Create a unique filename for cropped images.
|
||||
* Fix corrupted NOTE tag in Gedcom export. Remove Python2 code obsoleted by
|
||||
Python3, which was corrupting Gedcom export of Gramps Notes text that includes
|
||||
multi-byte utf-8 characters. Fixes #12709.
|
||||
* Fix IndexError that sometimes occurs when changing view This occurs when
|
||||
restarting Gramps. Fixes #12636, #12304, #12429, #12623, #12695.
|
||||
* Fix crash when invalid note link. Fixes #12854.
|
||||
* Fix tags with color names in pedigree views. Fixes #12866.
|
||||
* Crash when invalid event date.
|
||||
* ListModel: Fix multiple level paths when we use checkboxes in columns.
|
||||
The path was previously converted to int.
|
||||
* Update Gramps CI workflow to run on Ubuntu 20.04. Ubuntu 18.04 became fully
|
||||
unsupported on 1 Dec 2022.
|
||||
* Fix package installation failures in CI.
|
||||
* Fix spouse's name and underlined call names in records. Fixes #12391.
|
||||
* Update INCOMPLETE_TRANSLATIONS list. Remove: he, Add: zh_HK, zh_TW.
|
||||
* Update Debian folder after 5.1.5 release.
|
||||
* Mac:
|
||||
* Patch bsddb to use berkeleydb instead of bsddb3 module.
|
||||
* Patch berkeleydb configure to work on Apple Silicon.
|
||||
* Update Exiv2 download URL, moved to github.
|
||||
* Repackage Gramps 5.1.5 with Gtk updates fixing use on macOS 13 Ventura.
|
||||
|
||||
2022-02-05
|
||||
Version 5.1.5
|
||||
* Update translations: de, pl, sv, zh_CN.
|
||||
* Remove Travis CI configuration.
|
||||
* Fix badges in README file.
|
||||
* Update copyright date.
|
||||
* Strange behavior for the scrollbar in the bottombar. Fixes #12438.
|
||||
* Fix place object element order in DTD and RNG schemas. Element placeobj
|
||||
content does not follow the DTD and RNG, expecting (ptitle? , pname+).
|
||||
Fixes #12500.
|
||||
* Solve InterpolationSyntaxError if "%" in a string. The grampletpane module
|
||||
saves data in a config file for all the gramplets added in the dashboard. The
|
||||
python configparser module doesn't like if we have a "%" character in a string.
|
||||
Fixes #12423.
|
||||
* '<' not supported between 2 instances of IndexMark. Fixes #12467.
|
||||
* Remove debug statements in unit tests.
|
||||
* Fix negative Span when dates are not Gregorian. Fixes #12525.
|
||||
* Incorrect grouping if no ma/patronymic surname.
|
||||
* Group As override is ignored for ma/patronymic surnames. Fixes #12395.
|
||||
See: https://gramps.discourse.group/t/patronymic-and-matronymic-name/1684/5
|
||||
* Add comments for the lat-lon field of editplace.
|
||||
* Place editor, lat and long text are swapped. Fixes #12374.
|
||||
* Fix Statusbar progress being shown before use. Fixes #12373.
|
||||
* Fix exception when removing a group name in Sqlite db when group name is
|
||||
already missing. Fixes #12367.
|
||||
* Fix error when trying to close name editor during long name group mapping
|
||||
view rebuild. Fixes #12328.
|
||||
* OsmGpsMap-CRITICAL: Map source setup called twice Fixes #12352.
|
||||
* Fix probably alive function unit test.
|
||||
* Use GitHub Actions to run continuous integration checks.
|
||||
* Mac:
|
||||
* Update Exiv2, PYExiv2, and json-glib.
|
||||
* Repackage Gramps.app to work with macOS 12.
|
||||
* Add entitlements path to bundle-file so Gramps.app is signed with it.
|
||||
* Add python-fontconfig to the macOS build. Needed to enable using
|
||||
genealogical symbols.
|
||||
* Inlude fontconfig's etc/fonts in macOS app bundle. Graphviz now uses
|
||||
fontconfig to find its fonts. Fixes #12370.
|
||||
|
||||
2021-07-26
|
||||
Version 5.1.4
|
||||
* Update translations: cs, de, es, fi, fr, hu, nl, pt_BR, ru, sv, zh_CN.
|
||||
* Update copyright date.
|
||||
* Fix probably alive if death without date.
|
||||
* Place editor, copy and paste of lat and long text no longer
|
||||
auto-populating latitude and longitude fields.
|
||||
* Fix for crash when changing views if part of toolbar is not shown because
|
||||
of a small screen when changing views.
|
||||
* Fix bottombar always showing after restart, even when not wanted.
|
||||
* Always use filtered collation names. Store the Sqlite3 collations in the
|
||||
__collations array to short-circuit re-creation.
|
||||
* Fix issue with German relation calculator fixed issue when more than 24
|
||||
generations between the two people.
|
||||
* Add file logging for macOS. When Gramps is launched from macOS's
|
||||
LaunchServices it doesn't have a sys.stderr attached so the default stream
|
||||
logger goes to /dev/null. Use a FileHandler in tht case, writing the log
|
||||
to $TMPDIR/gramps-pid.log. This will help particularly in analyzing
|
||||
crashes where python shuts down as there's no crash report in that case.
|
||||
* Fix libplaceview to avoid exception when mapservice is no longer present.
|
||||
* Fix References Gramplet for inadequate updates when other objects change.
|
||||
* Fix geofamily crash if a family has no father.
|
||||
* Home Person setting does not convey in a merge.
|
||||
* Fix CSV export of view to only put single CR character.
|
||||
* Add Media filter rule 'HasMedia' to list of media rules for editor.
|
||||
* Need to set locale.textdomain under linux. _build_popup_ui() ignores
|
||||
translated strings without locale.textdomain set.
|
||||
* Change category of 'MatchesEventFilter'.
|
||||
* Fix issue where separator between top and bottom bar of View creeps up.
|
||||
* Fix Locations Gramplet (Enclosed by) to properly display certain nested
|
||||
places when the smallest place has undated enclosure and larger places are
|
||||
dated.
|
||||
* Fix Family Tree Manager drop error on Windows.
|
||||
* Fix exportvcalendar error is "is not" with a literal (Python 3.8 issue)
|
||||
* Handle not found when copying source from the citation tree.
|
||||
* Fix call to 'file' function, which doesn't exist in Python3.
|
||||
* Fix write_lock_file exception when USERNAME is missing.
|
||||
* Fix EditPlace so Tab key doesn't get stuck on Private icon.
|
||||
* Fix Tag report for places that have a hierarchy.
|
||||
* Fix exception when cancelling out of a db upgrade in GUI.
|
||||
* Icon file changes:
|
||||
* Install 128x128 and 256x256 application icons.
|
||||
* Install MIME type icons into the hicolor theme.
|
||||
* Remove gnome-mime- prefix from icon filenames.
|
||||
* Install application icons into correct directories.
|
||||
* Fix error in Birthday and Anniversary report. Fixes an error triggered
|
||||
when the first person_handle in the list has a death event, but no birth
|
||||
event and does not have family relationships. These conditions lead to
|
||||
the local variable short_name not being declared before it comes time to
|
||||
process death events.
|
||||
* Fix graphdoc to properly escape characters in ids for Graphviz.
|
||||
* Replace inspect.stack() with inspect.currentframe().
|
||||
Works around https://bugs.python.org/issue12920 which causes every
|
||||
call to inspect.trace() to fail because __main__ is always the
|
||||
starting point.
|
||||
* Fix crash sorting on columns in Selectors with TreeModels.
|
||||
* Fix progress bar freeze due to changes in Gtk.
|
||||
* Fix svgdrawdoc for text containing XML invalid characters.
|
||||
* Mac:
|
||||
* Update PyICU to 2.7.2 in macOS build.
|
||||
* Update dependencies. Includes moving berkeleydb and pybsddb over from
|
||||
gtk-osx.
|
||||
* Further changes for bundling with Python 3.8.
|
||||
* Set __file__ if gramps_launcher.py is run as __main__.
|
||||
* Add geocode-glib to build.
|
||||
|
||||
2020-08-11
|
||||
Version 5.1.3
|
||||
* Update ca, de, fi, fr, ja, pl, ru, sl, sv, uk, zh_CN translation
|
||||
* Events View: "Main Participants" column does not show the full list
|
||||
of participants when expanded.
|
||||
* mac/gramps.modules: Use current Gtk release instead of Gtk-3.14.
|
||||
* mac/gramps.modules: Upgrade pymodules for Python 3.8 compatibility.
|
||||
* Fix XML export when 'Group-as" name contains XML invalid chars
|
||||
* Fix NarWeb: Province place-type is not displayed
|
||||
* Fix ManagedWindow so that new windows don't appear offscreen when
|
||||
system 'screen' sizes change in part time multi-monitor setups.
|
||||
* Fix menus when db fails to open due to upgrade/downgrade etc.
|
||||
* Fix issue with attach source tool, results panel
|
||||
* Fix GEDCOM export; don't include ADDR when address is missing
|
||||
* EditPlace: Allow Coordinates containing a comma instead of a period
|
||||
* NarrativeWeb:
|
||||
* Should show patronymic in individuals.
|
||||
In the individuals and in surnames pages, we should show the
|
||||
complete name like defined in the display tab from the narrative web
|
||||
configuration.
|
||||
* Fix Narrated Website Google Maps Output JS Warning SensorNotRequired
|
||||
* Fix incorrect link type for osm css files
|
||||
* Fix image size limit doesn't match tooltip
|
||||
* Update all translations for changes from 'Default' to 'Home' Person
|
||||
* Change GUI references to 'Home Person' instead of 'Default Person'
|
||||
* Use event attribute types in the event reference editor.
|
||||
In the event reference editor, custom event attribute types should
|
||||
be used rather than the default person attribute types.
|
||||
* Fix Verify tool bug caused by bad change in GObject introspection
|
||||
* Fix RemoveUnused tool for crash caused by Gtk introspection bug
|
||||
* Fix import test for change cause by previous change which was:
|
||||
Fix GEDCOM import for bad source title when sources precede references.
|
||||
* Fix GEDCOM import for bad source title when sources precede references.
|
||||
* Fix some reports for CLI where warning message about Value not found
|
||||
* Fix Genealogy Tree reports for crash in CLI
|
||||
* Add uistate to tree views filter initialization
|
||||
* Fix some Python syntax errors that appear in v3.8.x
|
||||
* Suppress age = 0 days in events list. If the reference event date is equal
|
||||
to the event date, don't show the age except if the date is estimated,
|
||||
calculated, etc.
|
||||
* Fix Dashboard Gramplets to update during db close when not shown
|
||||
* Fix Windows GUI mode startup for crash with some languages
|
||||
* Fix dbapi to support "Abandon Changes & Quit" feature
|
||||
* Fix GrampsType for comparison bug with empty string as one value
|
||||
* Fix Date Display so that it uses LC_TIME if defined
|
||||
* Fix StyledText so serialize will match for style list order changes
|
||||
* Try to fix exceptions on ManagedWindow close
|
||||
* Fix Mac SQLite3 locale bug when locale contains non-ascii characters
|
||||
* Fix issue when Person has Same date of birth and death; gives an error.
|
||||
* Geography: add a popup for a bad tiles path
|
||||
* Fix GEDCOM export of estimated/calculated dates with modifers
|
||||
* Bump to v5.1.3
|
||||
|
||||
2020-01-14
|
||||
Version 5.1.2
|
||||
* Narweb: Private notes for home, intro and contact. If the notes are private,
|
||||
we can't use them in these pages.
|
||||
* Referenced regions problems. When image width > 800, the referenced
|
||||
regions are incorrectly placed
|
||||
* Ancestor's tree display looks weird Solves the following:
|
||||
- Person boxes overlap
|
||||
- Some person boxes partially visible or hidden
|
||||
* some cleanup in ancestortree.css
|
||||
* ancestor tree and long names.
|
||||
* Adapt ancestor tree css file for all themes
|
||||
* dates not localised in place pages
|
||||
* Mainz problem with short text in one note, Issue occurs on the homepage
|
||||
and introduction page.
|
||||
* bad event links on media pages
|
||||
* Navweb: Don't use media regions in some case:
|
||||
- If we don't show families
|
||||
- If we don't show events
|
||||
- Don't show the media regions for a thumbnail
|
||||
* WEBCAL: home link translated to lowercase
|
||||
* Wrong web calendar title on home page. This solves the possibility to
|
||||
have ">", "<" in the title
|
||||
* Update LDS Temple list
|
||||
* Make GuiDestinationOption Folder Icon start in users directory
|
||||
* Allow import file filter to accept case insensitive extensions
|
||||
* Fix db to warn/prevent opening newer schema versions
|
||||
* Fix Progen import dialog and progress meter for correct parent window
|
||||
* Fix Progen import to correctly handle AKA surnames
|
||||
* Fix ExportPkg so errors are not lost, and has progress bar for media
|
||||
* Fix Export Assistant so error messages get correct parent window
|
||||
* Fix GEDCOM import when family is missing; import created a missing note
|
||||
* Fix Dashboard for adding Gramplet crash in Slovenian
|
||||
* Update cs, ca, fr, uk, he, fi, hr, de, sv translation
|
||||
* Update date parsing for czech locale
|
||||
* Fix Spanish translation for dates
|
||||
* fix private proxy tagref support. Add missing code for event, repository,
|
||||
source, citation and place
|
||||
* [Tree doc Tex] fix "-" char on place name "-" can lead to confusion,
|
||||
generating text out of the box with PDF file format
|
||||
* [Tree doc Tex] fix typo on custom size
|
||||
* Fix duplicated "døde døde" Norwegion Translation for libnarrate
|
||||
* Fix up Event Editors Place display for bidi text with Gramps ID
|
||||
* Fix issues with RTL languages and LAT/LONG
|
||||
* Fix display of GPS coordinates in Places view for RTL languages
|
||||
* Fix place editor lat/long entry for RTL languages
|
||||
* Fix GEDCOM export to avoid translated GrampsType strings
|
||||
* Allow Tools with Notbook tabs to expand to fill the window
|
||||
* Limit Age Stats gramplet settings to appropriate values.
|
||||
* Max ages should be divisible by 5 to avoid out of range errors.
|
||||
* The chart width should be greater than 45 to look right and
|
||||
avoid division by zero errors.
|
||||
* Fix the Preferences 'Age display precision' value getting lost
|
||||
* Fix Window family tree title for non-ASCII chars on Windows
|
||||
* Fix Preferences/Genealogical Symbols when only one font is present
|
||||
* Fix various Entry fields so Undo/Redo works
|
||||
* Fix tag colors on PedigreeView
|
||||
* Fix Gramps -v error when Gtk is not present
|
||||
* Fix for PedigreeView not reflecting changes to birthday or death
|
||||
* ODF DOC - Fix improper escaping in odt output for TOC/Bookmark etc.
|
||||
* Fix CLI parser to accept negative integers as valid
|
||||
* Fix Descendant Tree report for HandleError when no parents on family
|
||||
* Fix Reorder ID tool so subsequent db additions used next possible ID
|
||||
* Upgrade export VCalendar to v2.0, so can export all utf8 characters
|
||||
* Fix Preferences so <ctrl>PageUp/PageDn doesn't stick on Dates tab
|
||||
* Graphs: Escape for name, dates and places in graph reports with XML
|
||||
illegal characters
|
||||
* Fix 'Go' menu direct object selection, goes to wrong place
|
||||
|
||||
2019-09-14
|
||||
Version 5.1.1
|
||||
* Update translations: cs, de, fi, fr, he, hr, pt_PT, ru, sv
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
The Gramps Project ( https://gramps-project.org ) [](https://travis-ci.org/gramps-project/gramps)[](https://codecov.io/github/gramps-project/gramps?branch=master)
|
||||
The Gramps Project ( https://gramps-project.org )
|
||||
===================
|
||||
[](https://github.com/gramps-project/gramps/actions/workflows/gramps-ci.yml?query=branch%3Amaintenance%2Fgramps51)
|
||||
[](https://app.codecov.io/gh/gramps-project/gramps/branch/maintenance%2Fgramps51)
|
||||
|
||||
We strive to produce a genealogy program that is both intuitive for hobbyists and feature-complete for professional genealogists.
|
||||
|
||||
Please read the **COPYING** file first.
|
||||
@@ -63,7 +66,7 @@ The following packages are **STRONGLY RECOMMENDED** to be installed:
|
||||
sorting is done through built-in libraries. PyICU is
|
||||
fairly widely available through the package managers of
|
||||
distributions. See http://pyicu.osafoundation.org/
|
||||
(These are Python bindings for the ICU package.
|
||||
(These are Python bindings for the ICU package.
|
||||
https://pypi.python.org/pypi/PyICU/)
|
||||
|
||||
* **Ghostscript**
|
||||
@@ -72,7 +75,7 @@ The following packages are **STRONGLY RECOMMENDED** to be installed:
|
||||
|
||||
The following packages are optional:
|
||||
------------------------------------
|
||||
* **gtkspell**
|
||||
* **gtkspell**
|
||||
|
||||
Enable spell checking in the notes. Gtkspell depends on
|
||||
enchant. A version of gtkspell with gobject introspection
|
||||
|
||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
@@ -473,11 +473,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
border: solid 1px #999;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -838,11 +838,10 @@ div#EventDetail table.eventlist tbody tr td.ColumnDate {
|
||||
}
|
||||
#GalleryDisplay img {
|
||||
margin: 0 auto;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -524,11 +524,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
border: solid 1px #7C8F7C;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -512,15 +512,15 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
border: solid 1px #669;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
#GalleryDetail h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -512,11 +512,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
border: solid 1px #EA8414;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -513,11 +513,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
border: solid 1px #7CA3DD;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ body > div {
|
||||
}
|
||||
.content {
|
||||
padding: 1.5em 1.5em;
|
||||
overflow: auto;
|
||||
background: url(../images/Web_Mainz_Mid.png) #FFF2C6 repeat;
|
||||
}
|
||||
#ThumbnailPreview div.snapshot {
|
||||
@@ -467,11 +468,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
margin: 0px auto;
|
||||
display:block;
|
||||
border: solid 1px #7D5925;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -747,11 +747,10 @@ table.eventlist tbody tr td.ColumnSources {
|
||||
}
|
||||
#GalleryDisplay img {
|
||||
margin:0 auto;
|
||||
max-width: 800px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
#GalleryDisplay img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
@@ -20,10 +20,10 @@
|
||||
#
|
||||
# $Id: $
|
||||
#
|
||||
**************************************************************************************************
|
||||
*******************************************************************************
|
||||
GRAMPS Cascading Style Sheet
|
||||
Style Name: Combined Ancestor Tree Style Sheet
|
||||
***************************************************************************************************
|
||||
*******************************************************************************
|
||||
#
|
||||
===== Ancestor Graph Color Scheme =====
|
||||
Males #BCEAF6
|
||||
@@ -33,10 +33,8 @@ Unknown #000
|
||||
===== Web Graphics =====
|
||||
Males Web_Gender_Male.png
|
||||
Females Web_Gender_Female.png
|
||||
# ------------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* Subsections : Ancestors Tree
|
||||
----------------------------------------------------- */
|
||||
# -------------------------------------------------------------------------- #
|
||||
/* Subsections : Ancestors Tree -------------------------------------------- */
|
||||
#tree {
|
||||
page-break-before:always;
|
||||
margin:0;
|
||||
@@ -52,8 +50,8 @@ Females Web_Gender_Female.png
|
||||
}
|
||||
#treeContainer div.boxbg {
|
||||
position:absolute;
|
||||
margin:0;
|
||||
padding:0;
|
||||
margin:0px;
|
||||
padding:0px;
|
||||
background:none;
|
||||
}
|
||||
#treeContainer div.boxbg a,
|
||||
@@ -61,41 +59,43 @@ Females Web_Gender_Female.png
|
||||
position:relative;
|
||||
z-index:10;
|
||||
display:block;
|
||||
font:normal .7em/1.4em sans-serif;
|
||||
font:normal 1.1em/1.4em sans-serif;
|
||||
text-align:center;
|
||||
word-break:break-word;
|
||||
word-wrap:break-word;
|
||||
text-decoration:none;
|
||||
color: #00029D;
|
||||
width:118px;
|
||||
padding:5px 20px 7px 20px;
|
||||
width:280px;
|
||||
min-height: 70px;
|
||||
margin-left:16px;
|
||||
background-color: #FFF;
|
||||
border: solid 1px #000;
|
||||
border: solid 2px #000;
|
||||
border-radius: 10px;
|
||||
}
|
||||
#treeContainer div.boxbg a.noThumb,
|
||||
#treeContainer div.AncCol3 a,
|
||||
#treeContainer div.AncCol4 a,
|
||||
#treeContainer div.AncCol3 span.unlinked,
|
||||
#treeContainer div.AncCol4 a,
|
||||
#treeContainer div.AncCol4 span.unlinked {
|
||||
margin-top:10px;
|
||||
float: right;
|
||||
}
|
||||
#treeContainer div.boxbg a:hover {
|
||||
position:relative;
|
||||
z-index:999;
|
||||
font-size:1em;
|
||||
font-size:1.3em;
|
||||
word-break:break-word;
|
||||
word-wrap:break-word;
|
||||
text-decoration:none;
|
||||
color: #00029D;
|
||||
width:190px;
|
||||
width:400px;
|
||||
margin-left:-20px;
|
||||
padding:10px 25px 12px 25px;
|
||||
border: solid 2px #000;
|
||||
padding: 0px 0px 0px 40px;
|
||||
}
|
||||
#treeContainer div.boxbg a:hover,
|
||||
#treeContainer div.AncCol3 a:hover,
|
||||
#treeContainer div.boxbg a:hover,
|
||||
#treeContainer div.AncCol4 a:hover {
|
||||
margin-top:-44px;
|
||||
}
|
||||
#treeContainer div.boxbg a.noThumb:hover {
|
||||
margin-top:0;
|
||||
padding-left: 10px;
|
||||
}
|
||||
#treeContainer div.AncCol0 a:hover {
|
||||
margin-left:12px;
|
||||
@@ -105,48 +105,73 @@ Females Web_Gender_Female.png
|
||||
}
|
||||
#treeContainer div.boxbg span.thumbnail {
|
||||
display:block;
|
||||
max-width:80px;
|
||||
max-height:65px;
|
||||
margin:0 auto;
|
||||
padding:4px 0;
|
||||
position: absolute;
|
||||
max-width:85px;
|
||||
max-height:75px;
|
||||
left: 3px;
|
||||
top: 3px;
|
||||
}
|
||||
#treeContainer div.boxbg span.thumbnail img {
|
||||
max-width:80px;
|
||||
max-height:65px;
|
||||
margin:0 auto;
|
||||
#treeContainer div.boxbg a.thumbnail table td.img {
|
||||
padding-right: 5px;
|
||||
}
|
||||
#treeContainer div.boxbg a:hover span.thumbnail, #treeContainer div.boxbg a:hover span.thumbnail img {
|
||||
height:80px;
|
||||
#treeContainer div.boxbg a.thumbnail:hover table td.img {
|
||||
padding-right: 9px;
|
||||
}
|
||||
#treeContainer div.AncCol3 span.thumbnail, #treeContainer div.AncCol4 span.thumbnail {
|
||||
#treeContainer div.boxbg a.thumbnail table td.name {
|
||||
padding-top:3px;
|
||||
padding-left: 2px;
|
||||
padding-right: 23px;
|
||||
width: 90%;
|
||||
}
|
||||
#treeContainer div.boxbg a.thumbnail img {
|
||||
margin-left:0px;
|
||||
padding-left: 0px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
#treeContainer div.boxbg a.thumbnail:hover img {
|
||||
max-height:90%;
|
||||
margin-left:5px;
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
top: 4px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
#treeContainer div.boxbg table td:first-child, table th:first-child {
|
||||
padding-left: 5px;
|
||||
padding-top: 5px;
|
||||
}
|
||||
#IndividualDetail div.subsection table tr td:first-child {
|
||||
padding-left: 5px;
|
||||
padding-top: 5px;
|
||||
}
|
||||
#treeContainer #treeContainer div.AncCol4 span.thumbnail {
|
||||
display:none;
|
||||
}
|
||||
#treeContainer div.boxbg a:hover span.thumbnail {
|
||||
display:block;
|
||||
}
|
||||
|
||||
#treeContainer div.boxbg span.fullname {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#treeContainer div.boxbg span.shortname {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#treeContainer div.boxbg a:hover span.fullname {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#treeContainer div.boxbg a:hover span.shortname {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
#treeContainer div.boxbg a:hover {
|
||||
float: right;
|
||||
margin-top: 10px;
|
||||
border: solid 4px #000;
|
||||
}
|
||||
#treeContainer div.male a,
|
||||
#treeContainer div.male span.unlinked {
|
||||
background:url(../images/Web_Gender_Male.png) #BCEAF6 no-repeat top right;
|
||||
}
|
||||
#treeContainer div.female a,
|
||||
#treeContainer div.female a,
|
||||
#treeContainer div.female span.unlinked {
|
||||
background:url(../images/Web_Gender_Female.png) #FFC0CB no-repeat top right;
|
||||
}
|
||||
|
||||
@@ -251,7 +251,7 @@ PLACES
|
||||
|
||||
<!ELEMENT places (placeobj)*>
|
||||
|
||||
<!ELEMENT placeobj (ptitle?, pname+, code?, coord?, placeref*, location*,
|
||||
<!ELEMENT placeobj (ptitle?, code?, pname+, coord?, placeref*, location*,
|
||||
objref*, url*, noteref*, citationref*, tagref*)>
|
||||
<!ATTLIST placeobj
|
||||
id CDATA #IMPLIED
|
||||
|
||||
@@ -453,10 +453,10 @@
|
||||
<ref name="primary-object"/>
|
||||
<attribute name="type"><text/></attribute>
|
||||
<optional><element name="ptitle"><text/></element></optional>
|
||||
<optional><element name="code"><text/></element></optional>
|
||||
<oneOrMore><element name="pname">
|
||||
<ref name="placename-content"/>
|
||||
</element></oneOrMore>
|
||||
<optional><element name="code"><text/></element></optional>
|
||||
<optional><element name="coord">
|
||||
<attribute name="long"><text/></attribute>
|
||||
<attribute name="lat"><text/></attribute>
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
<code>SAMOA</code>
|
||||
<code>AP</code>
|
||||
</temple>
|
||||
<temple name="Arequipa Peru Temple">
|
||||
<code>AREQU</code>
|
||||
</temple>
|
||||
<temple name="Asuncion, Paraguay">
|
||||
<code>ASUNC</code>
|
||||
</temple>
|
||||
@@ -27,6 +30,9 @@
|
||||
<code>ATLAN</code>
|
||||
<code>AT</code>
|
||||
</temple>
|
||||
<temple name="Barranquilla Colombia Temple">
|
||||
<code>BARRA</code>
|
||||
</temple>
|
||||
<temple name="Baton Rouge, Louisiana">
|
||||
<code>BROUG</code>
|
||||
</temple>
|
||||
@@ -57,6 +63,9 @@
|
||||
<temple name="Bountiful, Utah">
|
||||
<code>BOUNT</code>
|
||||
</temple>
|
||||
<temple name="Brigham City Utah Temple">
|
||||
<code>BRIGH</code>
|
||||
</temple>
|
||||
<temple name="Brisbane, Australia">
|
||||
<code>BRISB</code>
|
||||
</temple>
|
||||
@@ -79,8 +88,12 @@
|
||||
<code>ALBR</code>
|
||||
</temple>
|
||||
<temple name="Cebu, Philippines">
|
||||
<code>CEBUP</code>
|
||||
<code>CEBU</code>
|
||||
</temple>
|
||||
<temple name="Cedar City Utah">
|
||||
<code>CEDAR</code>
|
||||
</temple>
|
||||
<temple name="Chicago, Illinois">
|
||||
<code>CHICA</code>
|
||||
<code>CH</code>
|
||||
@@ -94,15 +107,18 @@
|
||||
<temple name="Colonia Juarez, Chihuahua, Mexico">
|
||||
<code>COLJU</code>
|
||||
</temple>
|
||||
<temple name="Columbia, South Carolina">
|
||||
<code>COLSC</code>
|
||||
</temple>
|
||||
<temple name="Columbia River, Washington">
|
||||
<code>CRIVE</code>
|
||||
</temple>
|
||||
<temple name="Columbia, South Carolina">
|
||||
<code>COLSC</code>
|
||||
</temple>
|
||||
<temple name="Columbus, Ohio">
|
||||
<code>COLUM</code>
|
||||
</temple>
|
||||
<temple name="Concepción Chile">
|
||||
<code>CONCE</code>
|
||||
</temple>
|
||||
<temple name="Copenhagen, Denmark">
|
||||
<code>COPEN</code>
|
||||
</temple>
|
||||
@@ -129,6 +145,19 @@
|
||||
<temple name="Edmonton, Alberta">
|
||||
<code>EDMON</code>
|
||||
</temple>
|
||||
<temple name="Endowment House">
|
||||
<code>EHOUS</code>
|
||||
<code>EH</code>
|
||||
</temple>
|
||||
<temple name="Fort Collins Colorado">
|
||||
<code>FORTC</code>
|
||||
</temple>
|
||||
<temple name="Fort Lauderdale Florida">
|
||||
<code>FORTL</code>
|
||||
</temple>
|
||||
<temple name="Fortaleza Brazil">
|
||||
<code>FORTA</code>
|
||||
</temple>
|
||||
<temple name="Frankfurt, Germany">
|
||||
<code>FRANK</code>
|
||||
<code>FR</code>
|
||||
@@ -191,6 +220,9 @@
|
||||
<code>IFALL</code>
|
||||
<code>IF</code>
|
||||
</temple>
|
||||
<temple name="Indianapolis Indiana">
|
||||
<code>INDIA</code>
|
||||
</temple>
|
||||
<temple name="Johannesburg, South Africa">
|
||||
<code>JOHAN</code>
|
||||
<code>JO</code>
|
||||
@@ -202,10 +234,14 @@
|
||||
<temple name="Kansas City, Missouri">
|
||||
<code>KANSA</code>
|
||||
</temple>
|
||||
<temple name="Kinshasa Democratic Republic of the Congo">
|
||||
<code>KINSH</code>
|
||||
</temple>
|
||||
<temple name="Kona, Hawaii">
|
||||
<code>KONA</code>
|
||||
</temple>
|
||||
<temple name="Kiev, Ukraine">
|
||||
<code>KYIV</code>
|
||||
<code>KIEV</code>
|
||||
</temple>
|
||||
<temple name="Kirtland, Ohio">
|
||||
@@ -223,6 +259,9 @@
|
||||
<code>LIMA</code>
|
||||
<code>LI</code>
|
||||
</temple>
|
||||
<temple name="Lisbon Portugal">
|
||||
<code>LISBO</code>
|
||||
</temple>
|
||||
<temple name="Logan, Utah">
|
||||
<code>LOGAN</code>
|
||||
<code>LG</code>
|
||||
@@ -270,6 +309,9 @@
|
||||
<temple name="Merida, Mexico">
|
||||
<code>MERID</code>
|
||||
</temple>
|
||||
<temple name="Meridian Idaho">
|
||||
<code>MIDAH</code>
|
||||
</temple>
|
||||
<temple name="Mesa, Arizona">
|
||||
<code>ARIZO</code>
|
||||
<code>AZ</code>
|
||||
@@ -325,6 +367,7 @@
|
||||
<code>OKLAH</code>
|
||||
</temple>
|
||||
<temple name="Oquirrh Mountain, Utah">
|
||||
<code>OQUIR</code>
|
||||
<code>OMOUN</code>
|
||||
</temple>
|
||||
<temple name="Orlando, Florida">
|
||||
@@ -340,6 +383,12 @@
|
||||
<code>PAPEE</code>
|
||||
<code>TA</code>
|
||||
</temple>
|
||||
<temple name="Paris France">
|
||||
<code>PARIS</code>
|
||||
</temple>
|
||||
<temple name="Payson Utah">
|
||||
<code>PAYSO</code>
|
||||
</temple>
|
||||
<temple name="Perth, Australia">
|
||||
<code>PERTH</code>
|
||||
</temple>
|
||||
@@ -349,6 +398,9 @@
|
||||
<temple name="Phoenix, Arizona">
|
||||
<code>PHOEN</code>
|
||||
</temple>
|
||||
<temple name="Port-au-Prince Haiti">
|
||||
<code>PORTA</code>
|
||||
</temple>
|
||||
<temple name="Portland, Oregon">
|
||||
<code>PORTL</code>
|
||||
<code>PT</code>
|
||||
@@ -359,6 +411,9 @@
|
||||
<temple name="Preston, England">
|
||||
<code>PREST</code>
|
||||
</temple>
|
||||
<temple name="Provo City Center, Utah">
|
||||
<code>PROCC</code>
|
||||
</temple>
|
||||
<temple name="Provo, Utah">
|
||||
<code>PROVO</code>
|
||||
<code>PV</code>
|
||||
@@ -385,6 +440,7 @@
|
||||
<code>REXBU</code>
|
||||
</temple>
|
||||
<temple name="Rome, Italy">
|
||||
<code>ROMEI</code>
|
||||
<code>ROME</code>
|
||||
</temple>
|
||||
<temple name="Sacramento, California">
|
||||
@@ -394,12 +450,6 @@
|
||||
<code>SGEOR</code>
|
||||
<code>SG</code>
|
||||
</temple>
|
||||
<temple name="St. Louis, Missouri">
|
||||
<code>SLOUI</code>
|
||||
</temple>
|
||||
<temple name="St. Paul, Minnesota">
|
||||
<code>SPMIN</code>
|
||||
</temple>
|
||||
<temple name="Salt Lake City, Utah">
|
||||
<code>SLAKE</code>
|
||||
<code>SL</code>
|
||||
@@ -415,6 +465,7 @@
|
||||
<code>SJOSE</code>
|
||||
</temple>
|
||||
<temple name="San Salvador, El Salvador">
|
||||
<code>SANSA</code>
|
||||
<code>SSALV</code>
|
||||
</temple>
|
||||
<temple name="Santiago, Chile">
|
||||
@@ -428,6 +479,9 @@
|
||||
<code>SPAUL</code>
|
||||
<code>SP</code>
|
||||
</temple>
|
||||
<temple name="Sapporo Japan">
|
||||
<code>SAPPO</code>
|
||||
</temple>
|
||||
<temple name="Seattle, Washington">
|
||||
<code>SEATT</code>
|
||||
<code>SE</code>
|
||||
@@ -442,6 +496,15 @@
|
||||
<temple name="Spokane, Washington">
|
||||
<code>SPOKA</code>
|
||||
</temple>
|
||||
<temple name="St. Louis, Missouri">
|
||||
<code>SLOUI</code>
|
||||
</temple>
|
||||
<temple name="St. Paul, Minnesota">
|
||||
<code>SPMIN</code>
|
||||
</temple>
|
||||
<temple name="Star Valley Wyoming">
|
||||
<code>STARV</code>
|
||||
</temple>
|
||||
<temple name="Stockholm, Sweden">
|
||||
<code>STOCK</code>
|
||||
<code>ST</code>
|
||||
@@ -463,9 +526,15 @@
|
||||
<temple name="Tegucigalpa, Honduras">
|
||||
<code>TEGUC</code>
|
||||
</temple>
|
||||
<temple name="The Gila Valley Arizona">
|
||||
<code>GILAV</code>
|
||||
</temple>
|
||||
<temple name="The Hague, Netherlands">
|
||||
<code>HAGUE</code>
|
||||
</temple>
|
||||
<temple name="Tijuana Mexico">
|
||||
<code>TIJUA</code>
|
||||
</temple>
|
||||
<temple name="Tokyo, Japan">
|
||||
<code>TOKYO</code>
|
||||
<code>TK</code>
|
||||
@@ -474,16 +543,19 @@
|
||||
<code>TORON</code>
|
||||
<code>TORNO</code>
|
||||
<code>TR</code>
|
||||
</temple>
|
||||
<temple name="Trujillo, Peru">
|
||||
<code>TRUJI</code>
|
||||
</temple>
|
||||
<temple name="Tucson Arizona">
|
||||
<code>TUCSO</code>
|
||||
</temple>
|
||||
<temple name="Tuxtla Gutierrez, Mexico">
|
||||
<code>TGUTI</code>
|
||||
</temple>
|
||||
<temple name="Twin Falls, Idaho">
|
||||
<code>TFALL</code>
|
||||
<code>TWINF</code>
|
||||
<code>TFALL</code>
|
||||
</temple>
|
||||
<temple name="Vancouver, British Columbia">
|
||||
<code>VANCO</code>
|
||||
@@ -505,10 +577,6 @@
|
||||
<code>WINTE</code>
|
||||
<code>WQUAR</code>
|
||||
</temple>
|
||||
<temple name="Endowment House">
|
||||
<code>EHOUS</code>
|
||||
<code>EH</code>
|
||||
</temple>
|
||||
<temple name="President's Office">
|
||||
<code>POFFI</code>
|
||||
<code>PO</code>
|
||||
|
||||
@@ -9,6 +9,12 @@ beg
|
||||
- h Hans_Peter.8 17/4/1904 #bp Rønne,_Bornholm,_Denmark 29/1/1977 #dp San_Francisco,_San_Francisco_Co.,_CA
|
||||
end
|
||||
|
||||
notes Hansdotter Anna.1
|
||||
beg
|
||||
******************************************************************890123456789
|
||||
******************************************************************89 123456789
|
||||
end notes
|
||||
|
||||
notes Smith Hjalmar.5
|
||||
beg
|
||||
BIOGRAPHY
|
||||
@@ -61,7 +67,7 @@ Some Bold Unicode Characters: ࣶǼЀج⿄㑝㵋
|
||||
Some Italic Unicode Characters: ࣶǼЀج⿄㑝㵋圛墉幵聟聦𐅉🚶🛈
|
||||
end notes
|
||||
|
||||
fam Smith Gus.6 +~1920 Michaels Evelyn.25 ~1897
|
||||
fam Smith Gus.6 +~1920 Michaels Evelyn.25 ~1897 0
|
||||
|
||||
fam Smith Hjalmar.5 +31/10/1927 #mp Reno,_Washoe_Co.,_NV Ohman Marjorie.26 3/6/1903 #bp Denver,_Denver_Co.,_CO,_Denver_Co.,_Colorado,_USA 22/6/1980 #dp Reno,_Washoe_Co.,_NV
|
||||
beg
|
||||
@@ -98,13 +104,18 @@ beg
|
||||
- h Martin.17 1794..1796 #bp Tommarp,_Kristianstad_Län,_Sweden #dp Sweden
|
||||
end
|
||||
|
||||
fam Willard Edwin.42 ~1886 +~1910 Smith Kirsti_Marie.2
|
||||
fam Willard Edwin.42 ~1886 0 +~1910 Smith Kirsti_Marie.2
|
||||
|
||||
fam Smith Magnes.38 +24/8/1884 #mp Rønne,_Bornholm,_Denmark Streiffert Anna.43 23/9/1860 #bp Hoya/Jona/Hoia,_Sweden 2/2/1927 #dp Rønne,_Bornholm,_Denmark
|
||||
|
||||
fam Tester The.14 + Tester Mrs.44 0
|
||||
beg
|
||||
- h Tom.45 0
|
||||
- h Tom.45 Von_Tester_y_tested 0
|
||||
- Fake.46 von_Person 1954 #bp Fremont,_Alameda_Co.,_CA
|
||||
- f Mary.47 0
|
||||
- f Martha.48 0
|
||||
- h John.49 0
|
||||
- h Mark.50 0
|
||||
end
|
||||
|
||||
notes Tester Mrs.44
|
||||
|
||||
@@ -1,47 +1,52 @@
|
||||
Anna Hansdotter;;;;;2/10/1864-29/9/1945
|
||||
Keith Lloyd Smith;Lloyd Smith;Janis Green;;;11/8/1966
|
||||
Hans Peter Smith;Gustaf Smith;Anna Hansdotter;;;17/4/1904-29/1/1977
|
||||
Hanna Smith;Martin Smith0;Elna Jefferson;;;29/1/1821
|
||||
Herman Julius Nielsen;;;;;31/8/1889-1945
|
||||
Evelyn Michaels;;;;;1897
|
||||
Marjorie Lee Smith;Hjalmar Smith0;Marjorie Ohman;;;4/11/1934
|
||||
Gus Smith;Gustaf Smith;Anna Hansdotter;;;11/9/1897-21/10/1963
|
||||
Jennifer Anderson;;;;;5/11/1907-29/5/1985
|
||||
Lillie Harriet Jones;;;;;2/5/1910-26/6/1990
|
||||
John Hjalmar Smith;Hjalmar Smith0;Marjorie Ohman;;;30/1/1932
|
||||
Eric Lloyd Smith;Lloyd Smith;Janis Green;;;28/8/1963
|
||||
Amber Marie Smith;Edwin Smith;Janice Adams;;;12/4/1998
|
||||
Carl Emil Smith;Gustaf Smith;Anna Hansdotter;;;20/12/1899-28/1/1959
|
||||
Hjalmar Smith;Gustaf Smith;Anna Hansdotter;;;31/1/1893-25/9/1894
|
||||
Martin Smith;Martin Smith0;Elna Jefferson;;;19/11/1830-1899
|
||||
Astrid Shermanna Augusta Smith;Gustaf Smith;Anna Hansdotter;;;31/1/1889-21/12/1963
|
||||
Gustaf Smith, Sr.;Martin Smith;Kerstina Hansdotter;;;28/11/1862-23/7/1930
|
||||
Marta Ericsdotter;;;;;1775
|
||||
Kirsti Marie Smith;Gustaf Smith;Anna Hansdotter;;;15/12/1886-18/7/1966
|
||||
Ingeman Smith;;;;;1770
|
||||
Anna Streiffert;;;;;23/9/1860-2/2/1927
|
||||
Craig Peter Smith;Lloyd Smith;Janis Green;;;1966
|
||||
Magnes Smith;Martin Smith;Kerstina Hansdotter;;;6/10/1858-20/2/1910
|
||||
Janice Ann Adams;;;;;26/8/1965
|
||||
Marjorie Ohman;;;;;3/6/1903-22/6/1980
|
||||
Darcy Horne;;;;;2/7/1966
|
||||
Alice Paula Perkins;;;;;22/11/1933
|
||||
Lars Peter Smith;Eric Smith;Darcy Horne;;;16/9/1991
|
||||
Ingeman Smith0;Martin Smith0;Elna Jefferson;;;29/1/1826
|
||||
Lloyd Smith;Hans Smith;Lillie Jones;;;13/3/1935
|
||||
Elna Jefferson;;;;;14/9/1800-
|
||||
Edwin Michael Smith;John Smith;Alice Perkins;;;24/5/1961
|
||||
Kerstina Hansdotter;;;;;29/11/1832-1908
|
||||
Martin Smith0;Ingeman Smith;Marta Ericsdotter;;;1794-
|
||||
Marjorie Alice Smith0;John Smith;Alice Perkins;;;5/2/1960
|
||||
Janis Elaine Green;;;;;2/12/1935
|
||||
Mason Michael Smith;Edwin Smith;Janice Adams;;;26/6/1996
|
||||
Edwin Willard;;;;;1886
|
||||
Ingar Smith;Martin Smith0;Elna Jefferson;;;1823
|
||||
Hjalmar Smith0;Gustaf Smith;Anna Hansdotter;;;7/4/1895-26/6/1975
|
||||
Emil Smith;Martin Smith;Kerstina Hansdotter;;;27/9/1860
|
||||
雪 Ke 柯;Herman Nielsen;Astrid Smith;;;
|
||||
The Tester;Lloyd Smith;Janis Green;;;29/12/1954
|
||||
Mrs Tester;;;;;
|
||||
ピーター リチミシキスイミ;;;;;
|
||||
Tom Tester;The Tester;Mrs Tester;;;
|
||||
Anna Hansdotter;;;;;2/10/1864-29/9/1945
|
||||
Keith Lloyd Smith;Lloyd Smith;Janis Green;;;11/8/1966
|
||||
Hans Peter Smith;Gustaf Smith;Anna Hansdotter;;;17/4/1904-29/1/1977
|
||||
Hanna Smith;Martin Smith0;Elna Jefferson;;;29/1/1821
|
||||
Herman Julius Nielsen;;;;;31/8/1889-1945
|
||||
Evelyn Michaels;;;;;1897
|
||||
Marjorie Lee Smith;Hjalmar Smith0;Marjorie Ohman;;;4/11/1934
|
||||
Gus Smith;Gustaf Smith;Anna Hansdotter;;;11/9/1897-21/10/1963
|
||||
Jennifer Anderson;;;;;5/11/1907-29/5/1985
|
||||
Lillie Harriet Jones;;;;;2/5/1910-26/6/1990
|
||||
John Hjalmar Smith;Hjalmar Smith0;Marjorie Ohman;;;30/1/1932
|
||||
Eric Lloyd Smith;Lloyd Smith;Janis Green;;;28/8/1963
|
||||
Amber Marie Smith;Edwin Smith;Janice Adams;;;12/4/1998
|
||||
Carl Emil Smith;Gustaf Smith;Anna Hansdotter;;;20/12/1899-28/1/1959
|
||||
Hjalmar Smith;Gustaf Smith;Anna Hansdotter;;;31/1/1893-25/9/1894
|
||||
Martin Smith;Martin Smith0;Elna Jefferson;;;19/11/1830-1899
|
||||
Astrid Shermanna Augusta Smith;Gustaf Smith;Anna Hansdotter;;;31/1/1889-21/12/1963
|
||||
Gustaf Smith, Sr.;Martin Smith;Kerstina Hansdotter;;;28/11/1862-23/7/1930
|
||||
Marta Ericsdotter;;;;;1775
|
||||
Kirsti Marie Smith;Gustaf Smith;Anna Hansdotter;;;15/12/1886-18/7/1966
|
||||
Ingeman Smith;;;;;1770
|
||||
Anna Streiffert;;;;;23/9/1860-2/2/1927
|
||||
Craig Peter Smith;Lloyd Smith;Janis Green;;;1966
|
||||
Magnes Smith;Martin Smith;Kerstina Hansdotter;;;6/10/1858-20/2/1910
|
||||
Janice Ann Adams;;;;;26/8/1965
|
||||
Marjorie Ohman;;;;;3/6/1903-22/6/1980
|
||||
Darcy Horne;;;;;2/7/1966
|
||||
Lloyd Smith;Hans Smith;Lillie Jones;;;13/3/1935
|
||||
Alice Paula Perkins;;;;;22/11/1933
|
||||
Lars Peter Smith;Eric Smith;Darcy Horne;;;16/9/1991
|
||||
Elna Jefferson;;;;;14/9/1800-
|
||||
Edwin Michael Smith;John Smith;Alice Perkins;;;24/5/1961
|
||||
Kerstina Hansdotter;;;;;29/11/1832-1908
|
||||
Martin Smith0;Ingeman Smith;Marta Ericsdotter;;;1794-
|
||||
Ingeman Smith0;Martin Smith0;Elna Jefferson;;;29/1/1826
|
||||
Marjorie Alice Smith0;John Smith;Alice Perkins;;;5/2/1960
|
||||
Janis Elaine Green;;;;;2/12/1935
|
||||
Mason Michael Smith;Edwin Smith;Janice Adams;;;26/6/1996
|
||||
Edwin Willard;;;;;1886
|
||||
Ingar Smith;Martin Smith0;Elna Jefferson;;;1823
|
||||
Hjalmar Smith0;Gustaf Smith;Anna Hansdotter;;;7/4/1895-26/6/1975
|
||||
Emil Smith;Martin Smith;Kerstina Hansdotter;;;27/9/1860
|
||||
雪 Ke 柯;Herman Nielsen;Astrid Smith;;;
|
||||
ピーター リチミシキスイミ;;;;;
|
||||
The Tester;Lloyd Smith;Janis Green;;;29/12/1954
|
||||
Mrs Tester;;;;;
|
||||
Tom Von Tester y tested;The Tester;Mrs Tester;;;
|
||||
Fake von Person, I;The Tester;Mrs Tester;;;1954-
|
||||
Mary Tester;The Tester;Mrs Tester;;;
|
||||
Martha Tester;The Tester;Mrs Tester;;;
|
||||
John Tester;The Tester;Mrs Tester;;;
|
||||
Mark Tester;The Tester;Mrs Tester;;;
|
||||
|
||||
@@ -30,66 +30,65 @@
|
||||
[P0014],"Denver, Denver Co., CO","Denver, Denver Co., CO",City,39.7392,104.9903 W,,[P0024],
|
||||
|
||||
Person,Surname,Given,Call,Suffix,Prefix,Title,Gender,Birth date,Birth place,Birth source,Baptism date,Baptism place,Baptism source,Death date,Death place,Death source,Burial date,Burial place,Burial source,Note
|
||||
[I0030],Adams,Janice Ann,,,,,female,26 Aug 1965,"Fremont, Alameda Co., CA",,,,,,,,,,,
|
||||
[I0016],Anderson,Jennifer,,,,,female,5 Nov 1907,"Rønne, Bornholm, Denmark",,,,,29 May 1985,"San Francisco, San Francisco Co., CA",,,,,
|
||||
[I0025],Ericsdotter,Marta,,,,,female,about 1775,Sweden,,,,,,,,,,,
|
||||
[I0041],Green,Janis Elaine,,,,,female,2 Dec 1935,,,,,,,,,,,,
|
||||
[I0000],Hansdotter,Anna,,,,,female,2 Oct 1864,"Löderup, Malmöhus Län, Sweden",,,,,29 Sep 1945,"Sparks, Washoe Co., NV",,,,,
|
||||
[I0038],Hansdotter,Kerstina,,,,,female,29 Nov 1832,"Smestorp, Kristianstad Län, Sweden",,,,,before 1908,Sweden,,,,,
|
||||
[I0032],Horne,Darcy,,,,,female,2 Jul 1966,"Sacramento, Sacramento Co., CA",,,,,,,,,,,
|
||||
[I0036],Jefferson,Elna,,,,,female,14 Sep 1800,"Gladsax, Kristianstad Län, Sweden",,,,,,Sweden,,,,,
|
||||
[I0017],Jones,Lillie Harriet,,,,,female,2 May 1910,"Rønne, Bornholm, Denmark",,,,,26 Jun 1990,,,,,,
|
||||
[I0030],Adams,Janice Ann,,,,,female,1965-08-26,[P0013],,,,,,,,,,,
|
||||
[I0016],Anderson,Jennifer,,,,,female,1907-11-05,[P0003],,,,,1985-05-29,[P0002],,,,,
|
||||
[I0025],Ericsdotter,Marta,,,,,female,about 1775,[P0008],,,,,,,,,,,
|
||||
[I0041],Green,Janis Elaine,,,,,female,1935-12-02,,,,,,,,,,,,
|
||||
[I0000],Hansdotter,Anna,,,,,female,1864-10-02,[P0000],,,,,1945-09-29,[P0001],,,,,
|
||||
[I0038],Hansdotter,Kerstina,,,,,female,1832-11-29,[P0019],,,,,before 1908,[P0008],,,,,
|
||||
[I0032],Horne,Darcy,,,,,female,1966-07-02,[P0015],,,,,,,,,,,
|
||||
[I0036],Jefferson,Elna,,,,,female,1800-09-14,[P0004],,,,,,[P0008],,,,,
|
||||
[I0017],Jones,Lillie Harriet,,,,,female,1910-05-02,[P0003],,,,,1990-06-26,,,,,,
|
||||
[I0042],Ke 柯,雪,,,,,male,,,,,,,,,,,,,
|
||||
[I0013],Michaels,Evelyn,,,,,female,about 1897,,,,,,,,,,,,
|
||||
[I0012],Nielsen,Herman Julius,,,,,male,31 Aug 1889,"Rønne, Bornholm, Denmark",,,,,1945,,,,,,
|
||||
[I0031],Ohman,Marjorie,,,,,female,3 Jun 1903,"Denver, Denver Co., CO, Denver Co., Colorado, USA",,,,,22 Jun 1980,"Reno, Washoe Co., NV",,,,,
|
||||
[I0034],Perkins,Alice Paula,,,,,female,22 Nov 1933,"Sparks, Washoe Co., NV",,,,,,,,,,,
|
||||
[I0002],Smith,Amber Marie,,,,,female,12 Apr 1998,"Hayward, Alameda Co., CA",,,,,,,,,,,
|
||||
[I0023],Smith,Astrid Shermanna Augusta,,,,,female,31 Jan 1889,"Rønne, Bornholm, Denmark",,,,,21 Dec 1963,"San Francisco, San Francisco Co., CA",,,,,
|
||||
[I0020],Smith,Carl Emil,,,,,male,20 Dec 1899,"Rønne, Bornholm, Denmark",,,,,28 Jan 1959,"Reno, Washoe Co., NV",,,,,
|
||||
[I0029],Smith,Craig Peter,,,,,male,after 1966,"San Francisco, San Francisco Co., CA",,,,,,,,,,,
|
||||
[I0037],Smith,Edwin Michael,,,,,male,24 May 1961,"San Jose, Santa Clara Co., CA","Birth, Death and Marriage Records",,,,,,,,,,
|
||||
[I0009],Smith,Emil,,,,,male,27 Sep 1860,"Simrishamn, Kristianstad Län, Sweden",,,,,,,,,,,
|
||||
[I0019],Smith,Eric Lloyd,,,,Dr.,male,28 Aug 1963,"San Francisco, San Francisco Co., CA",,,,,,,,,,,
|
||||
[I0015],Smith,Gus,,,,,male,11 Sep 1897,"Rønne, Bornholm, Denmark",,,,,21 Oct 1963,"San Francisco, San Francisco Co., CA",,,,,
|
||||
[I0024],Smith,Gustaf,,Sr.,,,male,28 Nov 1862,"Grostorp, Kristianstad Län, Sweden",,,,,before 23 Jul 1930,"Sparks, Washoe Co., NV",,,,,
|
||||
[I0011],Smith,Hanna,,,,,female,29 Jan 1821,"Gladsax, Kristianstad Län, Sweden",,,,,,,,,,,
|
||||
[I0010],Smith,Hans Peter,,,,,male,17 Apr 1904,"Rønne, Bornholm, Denmark",Birth Records,,,,29 Jan 1977,"San Francisco, San Francisco Co., CA",,5 Feb 1977,"San Francisco, San Francisco Co., CA",findagrave.com,
|
||||
[I0021],Smith,Hjalmar,,,,,male,31 Jan 1893,"Rønne, Bornholm, Denmark",,,,,25 Sep 1894,"Rønne, Bornholm, Denmark",,,,,
|
||||
[I0008],Smith,Hjalmar,,,,,male,7 Apr 1895,"Rønne, Bornholm, Denmark",,3 Jun 1895,"Rønne Bornholm, Denmark",,26 Jun 1975,"Reno, Washoe Co., NV",,,,,
|
||||
[I0007],Smith,Ingar,,,,,female,after 1823,"Gladsax, Kristianstad Län, Sweden",,,,,,,,,,,
|
||||
[I0027],Smith,Ingeman,,,,,male,about 1770,Sweden,,,,,,,,,,,
|
||||
[I0004],Smith,Ingeman,,,,,male,29 Jan 1826,"Gladsax, Kristianstad Län, Sweden",,,,,,,,,,,
|
||||
[I0018],Smith,John Hjalmar,,,,,male,30 Jan 1932,"San Francisco, San Francisco Co., CA",,,,,,,,,,,
|
||||
[I0001],Smith,Keith Lloyd,,,,,male,11 Aug 1966,"San Francisco, San Francisco Co., CA",,,,,,,,,,,
|
||||
[I0026],Smith,Kirsti Marie,,,,,female,15 Dec 1886,"Rønne, Bornholm, Denmark",,,,,18 Jul 1966,"San Francisco, San Francisco Co., CA",,,,,
|
||||
[I0035],Smith,Lars Peter,,,,,male,16 Sep 1991,"Santa Rosa, Sonoma Co., CA",,,,,,,,,,,
|
||||
[I0033],Smith,Lloyd,,,,,male,13 Mar 1935,"San Francisco, San Francisco Co., CA",,,,,,,,,,,
|
||||
[I0003],Smith,Magnes,,,,,male,6 Oct 1858,"Simrishamn, Kristianstad Län, Sweden",,,,,20 Feb 1910,"Rønne, Bornholm, Denmark",,,,,
|
||||
[I0040],Smith,Marjorie Alice,,,,,female,5 Feb 1960,"San Jose, Santa Clara Co., CA",,,,,,,,,,,
|
||||
[I0014],Smith,Marjorie Lee,,,,,female,4 Nov 1934,"Reno, Washoe Co., NV",,,,,,,,,,,
|
||||
[I0022],Smith,Martin,,,,,male,19 Nov 1830,"Gladsax, Kristianstad Län, Sweden",,23 Nov 1830,"Gladsax, Kristianstad Län, Sweden",,between 1899 and 1905,Sweden,,,,,
|
||||
[I0039],Smith,Martin,,,,,male,between 1794 and 1796,"Tommarp, Kristianstad Län, Sweden",,,,,,Sweden,,,,,
|
||||
[I0005],Smith,Mason Michael,,,,,male,26 Jun 1996,"Hayward, Alameda Co., CA",,,,,,,,,,,
|
||||
[I0028],Streiffert,Anna,,,,,female,23 Sep 1860,"Hoya/Jona/Hoia, Sweden",,,,,2 Feb 1927,"Rønne, Bornholm, Denmark",,,,,
|
||||
[I0012],Nielsen,Herman Julius,,,,,male,1889-08-31,[P0003],,,,,1945,,,,,,
|
||||
[I0031],Ohman,Marjorie,,,,,female,1903-06-03,[P0014],,,,,1980-06-22,[P0005],,,,,
|
||||
[I0034],Perkins,Alice Paula,,,,,female,1933-11-22,[P0001],,,,,,,,,,,
|
||||
[I0002],Smith,Amber Marie,,,,,female,1998-04-12,[P0006],,,,,,,,,,,
|
||||
[I0023],Smith,Astrid Shermanna Augusta,,,,,female,1889-01-31,[P0003],,,,,1963-12-21,[P0002],,,,,
|
||||
[I0020],Smith,Carl Emil,,,,,male,1899-12-20,[P0003],,,,,1959-01-28,[P0005],,,,,
|
||||
[I0029],Smith,Craig Peter,,,,,male,after 1966,[P0002],,,,,,,,,,,
|
||||
[I0037],Smith,Edwin Michael,,,,,male,1961-05-24,[P0017],"Birth, Death and Marriage Records",,,,,,,,,,
|
||||
[I0009],Smith,Emil,,,,,male,1860-09-27,[P0012],,,,,,,,,,,
|
||||
[I0019],Smith,Eric Lloyd,,,,Dr.,male,1963-08-28,[P0002],,,,,,,,,,,
|
||||
[I0015],Smith,Gus,,,,,male,1897-09-11,[P0003],,,,,1963-10-21,[P0002],,,,,
|
||||
[I0024],Smith,Gustaf,,Sr.,,,male,1862-11-28,[P0009],,,,,before 1930-07-23,[P0001],,,,,
|
||||
[I0011],Smith,Hanna,,,,,female,1821-01-29,[P0004],,,,,,,,,,,
|
||||
[I0010],Smith,Hans Peter,,,,,male,1904-04-17,[P0003],Birth Records,,,,1977-01-29,[P0002],,1977-02-05,[P0002],findagrave.com,
|
||||
[I0021],Smith,Hjalmar,,,,,male,1893-01-31,[P0003],,,,,1894-09-25,[P0003],,,,,
|
||||
[I0008],Smith,Hjalmar,,,,,male,1895-04-07,[P0003],,1895-06-03,[P0021],,1975-06-26,[P0005],,,,,
|
||||
[I0007],Smith,Ingar,,,,,female,after 1823,[P0004],,,,,,,,,,,
|
||||
[I0027],Smith,Ingeman,,,,,male,about 1770,[P0008],,,,,,,,,,,
|
||||
[I0004],Smith,Ingeman,,,,,male,1826-01-29,[P0004],,,,,,,,,,,
|
||||
[I0018],Smith,John Hjalmar,,,,,male,1932-01-30,[P0002],,,,,,,,,,,
|
||||
[I0001],Smith,Keith Lloyd,,,,,male,1966-08-11,[P0002],,,,,,,,,,,
|
||||
[I0026],Smith,Kirsti Marie,,,,,female,1886-12-15,[P0003],,,,,1966-07-18,[P0002],,,,,
|
||||
[I0035],Smith,Lars Peter,,,,,male,1991-09-16,[P0016],,,,,,,,,,,
|
||||
[I0033],Smith,Lloyd,,,,,male,1935-03-13,[P0002],,,,,,,,,,,
|
||||
[I0003],Smith,Magnes,,,,,male,1858-10-06,[P0012],,,,,1910-02-20,[P0003],,,,,
|
||||
[I0040],Smith,Marjorie Alice,,,,,female,1960-02-05,[P0017],,,,,,,,,,,
|
||||
[I0014],Smith,Marjorie Lee,,,,,female,1934-11-04,[P0005],,,,,,,,,,,
|
||||
[I0022],Smith,Martin,,,,,male,1830-11-19,[P0004],,1830-11-23,[P0004],,between 1899 and 1905,[P0008],,,,,
|
||||
[I0039],Smith,Martin,,,,,male,between 1794 and 1796,[P0020],,,,,,[P0008],,,,,
|
||||
[I0005],Smith,Mason Michael,,,,,male,1996-06-26,[P0006],,,,,,,,,,,
|
||||
[I0028],Streiffert,Anna,,,,,female,1860-09-23,[P0011],,,,,1927-02-02,[P0003],,,,,
|
||||
[I0006],Willard,Edwin,,,,,male,about 1886,,,,,,,,,,,,
|
||||
[I0043],リチミシキスイミ,ピーター,,,,,male,,,,,,,,,,,,,
|
||||
|
||||
Marriage,Husband,Wife,Date,Place,Source,Note
|
||||
[F0000],[I0039],[I0036],about 1816,"Gladsax, Kristianstad Län, Sweden",,
|
||||
[F0001],[I0027],[I0025],about 1790,Sweden,,
|
||||
[F0000],[I0039],[I0036],about 1816,[P0004],,
|
||||
[F0001],[I0027],[I0025],about 1790,[P0008],,
|
||||
[F0002],[I0022],[I0038],about 1856,,,
|
||||
[F0003],[I0024],[I0000],27 Nov 1885,"Rønne, Bornholm, Denmark",,
|
||||
[F0003],[I0024],[I0000],1885-11-27,[P0003],,
|
||||
[F0004],[I0006],[I0026],about 1910,,,
|
||||
[F0005],[I0012],[I0023],30 Nov 1912,"Rønne, Bornholm, Denmark",,
|
||||
[F0006],[I0008],[I0031],31 Oct 1927,"Reno, Washoe Co., NV",,
|
||||
[F0005],[I0012],[I0023],1912-11-30,[P0003],,
|
||||
[F0006],[I0008],[I0031],1927-10-31,[P0005],,
|
||||
[F0007],[I0015],[I0013],about 1920,,,
|
||||
[F0008],[I0033],[I0041],10 Aug 1958,"San Francisco, San Francisco Co., CA",,
|
||||
[F0008],[I0033],[I0041],1958-08-10,[P0002],,
|
||||
[F0009],[I0010],[I0017],,,,
|
||||
[F0010],[I0019],[I0032],12 Jul 1986,"Woodland, Yolo Co., CA",,
|
||||
[F0011],[I0003],[I0028],24 Aug 1884,"Rønne, Bornholm, Denmark",,
|
||||
[F0012],[I0018],[I0034],4 Jun 1954,"Sparks, Washoe Co., NV",Marriage Certificae,
|
||||
[F0013],[I0037],[I0030],27 May 1995,"San Ramon, Conta Costa Co., CA",,
|
||||
[F0010],[I0019],[I0032],1986-07-12,[P0022],,
|
||||
[F0011],[I0003],[I0028],1884-08-24,[P0003],,
|
||||
[F0012],[I0018],[I0034],1954-06-04,[P0001],Marriage Certificae,
|
||||
[F0013],[I0037],[I0030],1995-05-27,[P0023],,
|
||||
[F0014],[I0010],[I0016],,,,
|
||||
|
||||
Family,Child
|
||||
|
||||
|
@@ -1,12 +1,12 @@
|
||||
0 HEAD
|
||||
1 SOUR Gramps
|
||||
2 VERS 5.0.2
|
||||
2 VERS 5.1.2
|
||||
2 NAME Gramps
|
||||
1 DATE 4 AUG 2019
|
||||
2 TIME 15:26:44
|
||||
1 DATE 7 JAN 2020
|
||||
2 TIME 13:39:43
|
||||
1 SUBM @SUBM@
|
||||
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
|
||||
1 COPR Copyright (c) 2019 Alex Roitman,,,.
|
||||
1 COPR Copyright (c) 2020 Alex Roitman,,,.
|
||||
1 GEDC
|
||||
2 VERS 5.5.1
|
||||
2 FORM LINEAGE-LINKED
|
||||
@@ -911,7 +911,7 @@
|
||||
2 DATE I think 1970 to 1971
|
||||
2 PLAC San Francisco, San Francisco Co., CA
|
||||
1 SLGC
|
||||
2 DATE EST ABT 1999
|
||||
2 DATE ABT 1999
|
||||
2 FAMC @F0016@
|
||||
2 TEMP DENVE
|
||||
2 PLAC Denver, Denver Co., CO, Denver Co., Colorado, USA
|
||||
@@ -1424,7 +1424,7 @@
|
||||
0 @N0018@ NOTE Another Citation Note
|
||||
0 @N0019@ NOTE A bad photo for sure
|
||||
0 @O0000@ OBJE
|
||||
1 FILE c:\users\prc\workspace\grampsm\main\data\tests\O0.jpg
|
||||
1 FILE d:\users\prc\documents\gramps\data\tests\O0.jpg
|
||||
2 FORM jpg
|
||||
2 TITL Michael O'Toole 2015-11
|
||||
1 NOTE @N0019@
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
|
||||
<database xmlns="http://gramps-project.org/xml/1.7.1/">
|
||||
<header>
|
||||
<created date="2019-08-04" version="5.0.2"/>
|
||||
<created date="1999-12-25" version="5.1.3"/>
|
||||
<researcher>
|
||||
<resname>Alex Roitman,,,</resname>
|
||||
<resaddr>Not Provided</resaddr>
|
||||
@@ -1302,7 +1302,7 @@
|
||||
</reporef>
|
||||
</source>
|
||||
<source handle="_0000008500000085" change="1" id="S0000">
|
||||
<stitle>@S0@</stitle>
|
||||
<stitle>Marriage Certificae</stitle>
|
||||
<noteref hlink="_000000e7000000e7"/>
|
||||
<reporef hlink="_000000e6000000e6" callno="what-321-ever" medium="Photo"/>
|
||||
</source>
|
||||
@@ -1705,7 +1705,7 @@ Unknown tag Line 1111:
|
||||
<range start="0" end="163"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_000000f9000000f9" change="1564950708" id="N0036" type="General">
|
||||
<note handle="_000000f9000000f9" change="1591544255" id="N0036" type="General">
|
||||
<text>Objects referenced by this note were missing in a file imported on 12/25/1999 12:00:00 AM.</text>
|
||||
</note>
|
||||
</notes>
|
||||
|
||||
@@ -1,3 +1,40 @@
|
||||
gramps (5.1.5-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
* Update copyright file
|
||||
* Drop patch, incorporated upstream
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sat, 12 Feb 2022 17:01:21 +0100
|
||||
|
||||
gramps (5.1.4-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
* Add new copyrights
|
||||
* Update watch file
|
||||
* Patch probably alive test to fix FTBFS
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sun, 15 Aug 2021 18:31:56 +0200
|
||||
|
||||
gramps (5.1.3-1) focal; urgency=medium
|
||||
|
||||
* New release
|
||||
* Update debian/copyright for Alex Roitman
|
||||
|
||||
-- Ross Gammon <rosco2@ubuntu.com> Sun, 16 Aug 2020 20:23:34 +0200
|
||||
|
||||
gramps (5.1.2-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sat, 11 Jan 2020 19:07:08 +0100
|
||||
|
||||
gramps (5.1.1-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
* Add python3-fontconfig to recommends
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Tue, 17 Sep 2019 15:21:43 +0200
|
||||
|
||||
gramps (5.1.0-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
|
||||
@@ -42,7 +42,8 @@ Recommends:
|
||||
gir1.2-gexiv2-0.10,
|
||||
gir1.2-osmgpsmap-1.0,
|
||||
python3-icu,
|
||||
gir1.2-geocodeglib-1.0
|
||||
gir1.2-geocodeglib-1.0,
|
||||
python3-fontconfig
|
||||
Suggests:
|
||||
fonts-freefont-ttf,
|
||||
gir1.2-goocanvas-2.0,
|
||||
|
||||
@@ -46,7 +46,7 @@ Copyright: 2000-2007, Alex Roitman
|
||||
2009, Florian Heinle
|
||||
2009, Gerald W. Britton
|
||||
2009, Igal Shapira
|
||||
2009-2018, Nick Hall
|
||||
2009-2022, Nick Hall
|
||||
2009, Pander Musubi
|
||||
2009, Robert Ham
|
||||
2009, Swoon on bug tracker
|
||||
@@ -92,6 +92,8 @@ Copyright: 2000-2007, Alex Roitman
|
||||
2018, Robin van der Vliet
|
||||
2018, Theo van Rijn
|
||||
2019, Matthias Kemmer
|
||||
2020, Jan Sparreboom
|
||||
2021, Mirko Leonhaeuser
|
||||
License: GPL-2+
|
||||
|
||||
Files: debian/*
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
version=3
|
||||
|
||||
version=4
|
||||
opts=\
|
||||
dversionmangle=s/(\~|\+)(debian|dfsg|ds|deb)(\.\d+)?$//,\
|
||||
filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/$1\.tar\.gz/,\
|
||||
filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/gramps-project-$1\.tar\.gz/,\
|
||||
repacksuffix=~dfsg \
|
||||
https://github.com/gramps-project/gramps/tags \
|
||||
.*/archive/v?([\d\.]+).tar.gz
|
||||
.*/v?(\d\S+)\.tar\.gz
|
||||
|
||||
@@ -57,7 +57,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = 'Gramps'
|
||||
copyright = '2001-2019, The Gramps Project'
|
||||
copyright = '2001-2023, The Gramps Project'
|
||||
author = 'Donald N. Allingham'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
|
||||
@@ -280,7 +280,7 @@ class CLIManager:
|
||||
# Attempt to figure out the database title
|
||||
path = os.path.join(filename, "name.txt")
|
||||
try:
|
||||
with open(path) as ifile:
|
||||
with open(path, encoding='utf8') as ifile:
|
||||
title = ifile.readline().strip()
|
||||
except:
|
||||
title = filename
|
||||
|
||||
@@ -88,9 +88,9 @@ def _convert_str_to_match_type(str_val, type_val):
|
||||
return str(str_val)
|
||||
|
||||
elif ret_type == int:
|
||||
if str_val.isdigit():
|
||||
try:
|
||||
return int(str_val)
|
||||
else:
|
||||
except ValueError:
|
||||
print("'%s' is not an integer number" % str_val)
|
||||
return 0
|
||||
|
||||
@@ -519,8 +519,8 @@ class CommandLineReport:
|
||||
self.format = tree_format["class"]
|
||||
if self.format is None:
|
||||
# Pick the first one as the default.
|
||||
self.format = tree_format.FORMATS[0]["class"]
|
||||
_chosen_format = tree_format.FORMATS[0]["type"]
|
||||
self.format = treedoc.FORMATS[0]["class"]
|
||||
_chosen_format = treedoc.FORMATS[0]["type"]
|
||||
else:
|
||||
self.format = None
|
||||
if _chosen_format and _format_str:
|
||||
|
||||
@@ -145,7 +145,7 @@ sys.path.insert(0, ROOT_DIR)
|
||||
git_revision = get_git_revision(ROOT_DIR).replace('\n', '')
|
||||
if sys.platform == 'win32' and git_revision == "":
|
||||
git_revision = get_git_revision(os.path.split(ROOT_DIR)[1])
|
||||
#VERSION += git_revision
|
||||
VERSION += git_revision
|
||||
#VERSION += "-1"
|
||||
|
||||
#
|
||||
@@ -225,7 +225,7 @@ GTK_GETTEXT_DOMAIN = 'gtk30'
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
|
||||
"© 2007-2019 The Gramps Developers"
|
||||
"© 2007-2023 The Gramps Developers"
|
||||
COMMENTS = _("Gramps\n (Genealogical Research and Analysis "
|
||||
"Management Programming System)\n"
|
||||
"is a personal genealogy program.")
|
||||
|
||||
@@ -35,6 +35,7 @@ import logging
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..utils.grampslocale import GrampsLocale
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.sgettext
|
||||
# import prerequisites for localized handlers
|
||||
@@ -72,16 +73,20 @@ from . import _date_uk
|
||||
from . import _date_zh_CN
|
||||
from . import _date_zh_TW
|
||||
|
||||
# the following makes sure we use the LC_TIME value for date display & parsing
|
||||
dlocale = GrampsLocale(lang=glocale.calendar)
|
||||
|
||||
|
||||
# Initialize global parser
|
||||
try:
|
||||
if LANG in LANG_TO_PARSER:
|
||||
parser = LANG_TO_PARSER[LANG](plocale=glocale)
|
||||
parser = LANG_TO_PARSER[LANG](plocale=dlocale)
|
||||
else:
|
||||
parser = LANG_TO_PARSER[LANG_SHORT](plocale=glocale)
|
||||
parser = LANG_TO_PARSER[LANG_SHORT](plocale=dlocale)
|
||||
except:
|
||||
logging.warning(
|
||||
_("Date parser for '%s' not available, using default") % LANG)
|
||||
parser = LANG_TO_PARSER["C"](plocale=glocale)
|
||||
parser = LANG_TO_PARSER["C"](plocale=dlocale)
|
||||
|
||||
# Initialize global displayer
|
||||
try:
|
||||
@@ -92,13 +97,13 @@ except:
|
||||
|
||||
try:
|
||||
if LANG in LANG_TO_DISPLAY:
|
||||
displayer = LANG_TO_DISPLAY[LANG](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY[LANG](val, blocale=dlocale)
|
||||
else:
|
||||
displayer = LANG_TO_DISPLAY[LANG_SHORT](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY[LANG_SHORT](val, blocale=dlocale)
|
||||
except:
|
||||
logging.warning(
|
||||
_("Date displayer for '%s' not available, using default") % LANG)
|
||||
displayer = LANG_TO_DISPLAY["C"](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY["C"](val, blocale=dlocale)
|
||||
|
||||
|
||||
# Import utility functions
|
||||
|
||||
@@ -50,6 +50,15 @@ class DateParserCZ(DateParser):
|
||||
Converts a text string into a Date object
|
||||
"""
|
||||
|
||||
quality_to_int = {
|
||||
'přibližně' : Date.QUAL_ESTIMATED,
|
||||
'odhadem' : Date.QUAL_ESTIMATED,
|
||||
'odh.' : Date.QUAL_ESTIMATED,
|
||||
'vypočteno' : Date.QUAL_CALCULATED,
|
||||
'vypočtené' : Date.QUAL_CALCULATED,
|
||||
'vyp.' : Date.QUAL_CALCULATED,
|
||||
}
|
||||
|
||||
bce = ["před naším letopočtem", "před Kristem",
|
||||
"př. n. l.", "př. Kr."] + DateParser.bce
|
||||
|
||||
@@ -58,6 +67,17 @@ class DateParserCZ(DateParser):
|
||||
# bug 9739 grampslocale.py gets '%-d.%-m.%Y' -- makes it be '%/d.%/m.%Y'
|
||||
self.dhformat = self.dhformat.replace('/', '') # so counteract that
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(mezi)\s+(?P<start>.+)\s+(a)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Czech display
|
||||
|
||||
@@ -83,35 +83,37 @@ class DateParserNL(DateParser):
|
||||
month_to_int["xbris"] = 12
|
||||
|
||||
modifier_to_int = {
|
||||
'voor' : Date.MOD_BEFORE,
|
||||
'na' : Date.MOD_AFTER,
|
||||
'tegen' : Date.MOD_ABOUT,
|
||||
'om' : Date.MOD_ABOUT,
|
||||
'rond' : Date.MOD_ABOUT,
|
||||
'circa' : Date.MOD_ABOUT,
|
||||
'ca.' : Date.MOD_ABOUT,
|
||||
'voor' : Date.MOD_BEFORE,
|
||||
'na' : Date.MOD_AFTER,
|
||||
'ca.' : Date.MOD_ABOUT,
|
||||
'circa' : Date.MOD_ABOUT,
|
||||
'om' : Date.MOD_ABOUT,
|
||||
'omstreeks' : Date.MOD_ABOUT,
|
||||
'ongeveer' : Date.MOD_ABOUT,
|
||||
'rond' : Date.MOD_ABOUT,
|
||||
'tegen' : Date.MOD_ABOUT,
|
||||
}
|
||||
|
||||
calendar_to_int = {
|
||||
'gregoriaans' : Date.CAL_GREGORIAN,
|
||||
'greg.' : Date.CAL_GREGORIAN,
|
||||
'juliaans' : Date.CAL_JULIAN,
|
||||
'jul.' : Date.CAL_JULIAN,
|
||||
'hebreeuws' : Date.CAL_HEBREW,
|
||||
'hebr.' : Date.CAL_HEBREW,
|
||||
'islamitisch' : Date.CAL_ISLAMIC,
|
||||
'isl.' : Date.CAL_ISLAMIC,
|
||||
'franse republiek': Date.CAL_FRENCH,
|
||||
'fran.' : Date.CAL_FRENCH,
|
||||
'persisch' : Date.CAL_PERSIAN,
|
||||
'zweeds' : Date.CAL_SWEDISH,
|
||||
'z' : Date.CAL_SWEDISH,
|
||||
'gregoriaans' : Date.CAL_GREGORIAN,
|
||||
'greg.' : Date.CAL_GREGORIAN,
|
||||
'juliaans' : Date.CAL_JULIAN,
|
||||
'jul.' : Date.CAL_JULIAN,
|
||||
'hebreeuws' : Date.CAL_HEBREW,
|
||||
'hebr.' : Date.CAL_HEBREW,
|
||||
'islamitisch' : Date.CAL_ISLAMIC,
|
||||
'isl.' : Date.CAL_ISLAMIC,
|
||||
'frans republiekeins' : Date.CAL_FRENCH,
|
||||
'fran.' : Date.CAL_FRENCH,
|
||||
'persisch' : Date.CAL_PERSIAN,
|
||||
'zweeds' : Date.CAL_SWEDISH,
|
||||
'z' : Date.CAL_SWEDISH,
|
||||
}
|
||||
|
||||
quality_to_int = {
|
||||
'geschat' : Date.QUAL_ESTIMATED,
|
||||
'geschat' : Date.QUAL_ESTIMATED,
|
||||
'gesch.' : Date.QUAL_ESTIMATED,
|
||||
'berekend' : Date.QUAL_CALCULATED,
|
||||
'berekend' : Date.QUAL_CALCULATED,
|
||||
'ber.' : Date.QUAL_CALCULATED,
|
||||
}
|
||||
|
||||
@@ -147,17 +149,17 @@ class DateDisplayNL(DateDisplay):
|
||||
|
||||
calendar = (
|
||||
"", "juliaans", "hebreeuws",
|
||||
"franse republiek", "persisch", "islamitisch",
|
||||
"frans republikeins", "persisch", "islamitisch",
|
||||
"zweeds" )
|
||||
|
||||
_mod_str = ("", "voor ", "na ", "rond ", "", "", "")
|
||||
_mod_str = ("", "voor ", "na ", "omstreeks ", "", "", "")
|
||||
|
||||
_qual_str = ("", "geschat ", "berekend ")
|
||||
|
||||
_bce_str = "%s v. Chr."
|
||||
|
||||
formats = (
|
||||
"JJJJ-MM-DD (ISO)", "Numerisch DD/MM/JJ", "Maand Dag, Jaar",
|
||||
"JJJJ-MM-DD (ISO)", "Numeriek DD/MM/JJJJ", "Maand Dag, Jaar",
|
||||
"Mnd. Dag Jaar", "Dag Maand Jaar", "Dag Mnd. Jaar"
|
||||
)
|
||||
# this definition must agree with its "_display_gregorian" method
|
||||
|
||||
@@ -52,7 +52,6 @@ methods should be changed to generate exceptions. Possibly by globally changing
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import logging
|
||||
import os
|
||||
import inspect
|
||||
from abc import ABCMeta
|
||||
from types import FunctionType
|
||||
@@ -160,10 +159,12 @@ def wrapper(method):
|
||||
"""
|
||||
class_name = args[0].__class__.__name__
|
||||
func_name = method.__name__
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
LOG.debug('calling %s.%s()... from file %s, line %s in %s',
|
||||
class_name, func_name, os.path.split(caller_frame[1])[1],
|
||||
caller_frame[2], caller_frame[3])
|
||||
class_name, func_name, c_code.co_filename, c_frame.f_lineno,
|
||||
c_code.co_name)
|
||||
return method(*args, **keywargs)
|
||||
return wrapped
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ from . import (DbReadBase, DbWriteBase, DbUndo, DBLOGNAME, DBUNDOFN,
|
||||
REPOSITORY_KEY, NOTE_KEY, TAG_KEY, TXNADD, TXNUPD, TXNDEL,
|
||||
KEY_TO_NAME_MAP, DBMODE_R, DBMODE_W)
|
||||
from .utils import write_lock_file, clear_lock_file
|
||||
from .exceptions import DbVersionError
|
||||
from ..errors import HandleError
|
||||
from ..utils.callback import Callback
|
||||
from ..updatecallback import UpdateCallback
|
||||
@@ -534,7 +535,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
self.undo_history_callback = None
|
||||
self.modified = 0
|
||||
self.transaction = None
|
||||
self.abort_possible = False
|
||||
self.abort_possible = True
|
||||
self._bm_changes = 0
|
||||
self.has_changed = False
|
||||
self.surname_list = []
|
||||
@@ -659,6 +660,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
|
||||
self.db_is_open = True
|
||||
|
||||
# Check on db version to see if too new
|
||||
dbversion = int(self._get_metadata('version', default='0'))
|
||||
if dbversion > self.VERSION[0]:
|
||||
self.close()
|
||||
raise DbVersionError(dbversion, 18, self.VERSION[0])
|
||||
|
||||
def _close(self):
|
||||
"""
|
||||
Close database backend.
|
||||
@@ -757,7 +764,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
if self._directory:
|
||||
filepath = os.path.join(self._directory, "name.txt")
|
||||
try:
|
||||
with open(filepath, "r") as name_file:
|
||||
with open(filepath, "r", encoding='utf8') as name_file:
|
||||
name = name_file.readline().strip()
|
||||
except (OSError, IOError) as msg:
|
||||
LOG.error(str(msg))
|
||||
|
||||
@@ -78,15 +78,13 @@ class DbTxn(defaultdict):
|
||||
|
||||
elapsed_time = time.time() - self.start_time
|
||||
if __debug__:
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
_LOG.debug(" **** DbTxn %s exited. Called from file %s, "
|
||||
"line %s, in %s **** %.2f seconds" %
|
||||
((hex(id(self)),)+
|
||||
(os.path.split(caller_frame[1])[1],)+
|
||||
tuple(caller_frame[i] for i in range(2, 4))+
|
||||
(elapsed_time,)
|
||||
)
|
||||
)
|
||||
"line %s, in %s **** %.2f seconds",
|
||||
hex(id(self)), c_code.co_filename, c_frame.f_lineno,
|
||||
c_code.co_name, elapsed_time)
|
||||
|
||||
return False
|
||||
|
||||
|
||||
@@ -42,6 +42,8 @@ from ..const import PLUGINS_DIR, USER_PLUGINS
|
||||
from ..constfunc import win, get_env_var
|
||||
from ..config import config
|
||||
from .dbconst import DBLOGNAME, DBLOCKFN, DBBACKEND
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -70,12 +72,14 @@ def make_database(plugin_id):
|
||||
database = getattr(mod, pdata.databaseclass)
|
||||
db = database()
|
||||
import inspect
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
_LOG.debug("Database class instance created Class:%s instance:%s. "
|
||||
"Called from File %s, line %s, in %s"
|
||||
% ((db.__class__.__name__, hex(id(db)))
|
||||
+ (os.path.split(caller_frame[1])[1],)
|
||||
+ tuple(caller_frame[i] for i in range(2, 4))))
|
||||
"Called from File %s, line %s, in %s",
|
||||
db.__class__.__name__, hex(id(db)), c_code.co_filename,
|
||||
c_frame.f_lineno, c_code.co_name)
|
||||
|
||||
return db
|
||||
else:
|
||||
raise Exception("can't load database backend: '%s'" % plugin_id)
|
||||
@@ -209,8 +213,8 @@ def write_lock_file(name):
|
||||
if win():
|
||||
user = get_env_var('USERNAME')
|
||||
host = get_env_var('USERDOMAIN')
|
||||
if host is None:
|
||||
host = ""
|
||||
if not user:
|
||||
user = _("Unknown")
|
||||
else:
|
||||
host = os.uname()[1]
|
||||
# An ugly workaround for os.getlogin() issue with Konsole
|
||||
|
||||
@@ -29,7 +29,6 @@ Provide the database state class
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
import inspect
|
||||
|
||||
@@ -88,10 +87,12 @@ class DbState(Callback):
|
||||
"""
|
||||
class_name = self.__class__.__name__
|
||||
func_name = "is_open"
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
_LOG.debug('calling %s.%s()... from file %s, line %s in %s',
|
||||
class_name, func_name, os.path.split(caller_frame[1])[1],
|
||||
caller_frame[2], caller_frame[3])
|
||||
class_name, func_name, c_code.co_filename, c_frame.f_lineno,
|
||||
c_code.co_name)
|
||||
return (self.db is not None) and self.db.is_open()
|
||||
|
||||
def change_database(self, database):
|
||||
|
||||
@@ -999,6 +999,8 @@ class NameDisplay:
|
||||
1. if group name is defined, use that
|
||||
2. if group name is defined for the primary surname, use that
|
||||
3. use primary surname itself otherwise
|
||||
4. if no primary surname, do we have a ma/patronymic surname ?
|
||||
in this case, group name will be the ma/patronymic name.
|
||||
|
||||
:param pn: raw unserialized data of name
|
||||
:type pn: tuple
|
||||
@@ -1007,8 +1009,25 @@ class NameDisplay:
|
||||
"""
|
||||
if pn[_GROUP]:
|
||||
return pn[_GROUP]
|
||||
return db.get_name_group_mapping(_raw_primary_surname_only(
|
||||
pn[_SURNAME_LIST]))
|
||||
name = pn[_GROUP]
|
||||
if not name:
|
||||
# if we have no primary surname, perhaps we have a
|
||||
# patronymic/matronynic name ?
|
||||
srnme = pn[_ORIGINPATRO]
|
||||
surname = []
|
||||
for _surname in srnme:
|
||||
if (_surname[_TYPE_IN_LIST][0] == _ORIGINPATRO
|
||||
or _surname[_TYPE_IN_LIST][0] == _ORIGINMATRO):
|
||||
# Yes, we have one.
|
||||
surname = [_surname]
|
||||
# name1 is the ma/patronymic name.
|
||||
name1 = _raw_patro_surname_only(surname)
|
||||
if name1 and len(srnme) == 1:
|
||||
name = db.get_name_group_mapping(name1)
|
||||
if not name:
|
||||
name = db.get_name_group_mapping(_raw_primary_surname_only(
|
||||
pn[_SURNAME_LIST]))
|
||||
return name
|
||||
|
||||
def _make_fn(self, format_str, d, args):
|
||||
"""
|
||||
|
||||
@@ -51,6 +51,7 @@ editor_rule_list = [
|
||||
MediaPrivate,
|
||||
MatchesFilter,
|
||||
MatchesSourceConfidence,
|
||||
HasMedia,
|
||||
HasAttribute,
|
||||
ChangedSince,
|
||||
HasTag,
|
||||
|
||||
@@ -41,9 +41,9 @@ from .. import Rule
|
||||
class IsDefaultPerson(Rule):
|
||||
"""Rule that checks for a default person in the database"""
|
||||
|
||||
name = _('Default person')
|
||||
name = _('Home Person')
|
||||
category = _('General filters')
|
||||
description = _("Matches the default person")
|
||||
description = _("Matches the Home Person")
|
||||
|
||||
def prepare(self, db, user):
|
||||
p = db.get_default_person()
|
||||
|
||||
@@ -44,10 +44,10 @@ class IsLessThanNthGenerationAncestorOfDefaultPerson(Rule):
|
||||
not more than N generations away"""
|
||||
|
||||
labels = [ _('Number of generations:') ]
|
||||
name = _('Ancestors of the default person '
|
||||
name = _('Ancestors of the Home Person '
|
||||
'not more than <N> generations away')
|
||||
category = _('Ancestral filters')
|
||||
description = _("Matches ancestors of the default person "
|
||||
description = _("Matches ancestors of the Home Person "
|
||||
"not more than N generations away")
|
||||
|
||||
def prepare(self, db, user):
|
||||
|
||||
@@ -52,7 +52,7 @@ class MatchesEventFilter(MatchesEventFilterBase):
|
||||
name = _('Persons with events matching the <event filter>')
|
||||
description = _("Matches persons who have events that match a certain"
|
||||
" event filter")
|
||||
category = _('General filters')
|
||||
category = _('Event filters')
|
||||
|
||||
# we want to have this filter show event filters
|
||||
namespace = 'Event'
|
||||
|
||||
@@ -98,9 +98,10 @@ class BaseTest(unittest.TestCase):
|
||||
filter_.set_invert(invert)
|
||||
stime = perf_counter()
|
||||
results = filter_.apply(self.db)
|
||||
if __debug__:
|
||||
rulename = inspect.stack()[1][3]
|
||||
print("%s: %.2f\n" % (rulename, perf_counter() - stime))
|
||||
# if __debug__:
|
||||
# frame = inspect.currentframe()
|
||||
# rulename = frame.f_back.f_code.co_name
|
||||
# print("%s: %.2f\n" % (rulename, perf_counter() - stime))
|
||||
return set(results)
|
||||
|
||||
def test_Complex_1(self):
|
||||
@@ -346,7 +347,7 @@ class BaseTest(unittest.TestCase):
|
||||
"""
|
||||
rule = ProbablyAlive(['1900'])
|
||||
res = self.filter_with_rule(rule)
|
||||
self.assertEqual(len(res), 766)
|
||||
self.assertEqual(len(res), 733)
|
||||
|
||||
def test_RegExpName(self):
|
||||
"""
|
||||
|
||||
@@ -77,14 +77,14 @@ class Span:
|
||||
self.precision = 2
|
||||
self.negative = False
|
||||
if self.valid:
|
||||
if self.date1.calendar != Date.CAL_GREGORIAN:
|
||||
self.date1 = self.date1.to_calendar("gregorian")
|
||||
if self.date2.calendar != Date.CAL_GREGORIAN:
|
||||
self.date2 = self.date2.to_calendar("gregorian")
|
||||
if self.date1.sortval < self.date2.sortval:
|
||||
self.date1 = date2
|
||||
self.date2 = date1
|
||||
self.negative = True
|
||||
if self.date1.calendar != Date.CAL_GREGORIAN:
|
||||
self.date1 = self.date1.to_calendar("gregorian")
|
||||
if self.date2.calendar != Date.CAL_GREGORIAN:
|
||||
self.date2 = self.date2.to_calendar("gregorian")
|
||||
if self.date1.get_modifier() == Date.MOD_NONE:
|
||||
if self.date2.get_modifier() == Date.MOD_NONE:
|
||||
val = self.date1.sortval - self.date2.sortval
|
||||
|
||||
@@ -288,10 +288,12 @@ class GrampsType(object, metaclass=GrampsTypeMeta):
|
||||
else:
|
||||
return self.__value == value[0]
|
||||
else:
|
||||
if value.value == self._CUSTOM:
|
||||
if value.value == self._CUSTOM and self.__value == self._CUSTOM:
|
||||
return self.__string == value.string
|
||||
else:
|
||||
elif value.value != self._CUSTOM and self.__value != self._CUSTOM:
|
||||
return self.__value == value.value
|
||||
else:
|
||||
return False
|
||||
|
||||
def __ne__(self, value):
|
||||
return not self.__eq__(value)
|
||||
|
||||
@@ -299,6 +299,7 @@ class StyledText:
|
||||
"""
|
||||
if self._tags:
|
||||
the_tags = [tag.serialize() for tag in self._tags]
|
||||
the_tags.sort()
|
||||
else:
|
||||
the_tags = []
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ from ...datehandler import get_date_formats, set_format
|
||||
from ...datehandler import parser as _dp
|
||||
from ...datehandler import displayer as _dd
|
||||
from ...datehandler._datedisplay import DateDisplayEn
|
||||
from ...lib.date import Date, DateError, Today, calendar_has_fixed_newyear
|
||||
from ...lib.date import Date, DateError, Today, calendar_has_fixed_newyear, Span
|
||||
|
||||
date_tests = {}
|
||||
|
||||
@@ -432,6 +432,36 @@ class ArithmeticDateTest(BaseDateTest):
|
||||
self.assertEqual(val1, val2,
|
||||
"'%s' should be '%s' but was '%s'" % (exp1, val2, val1))
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# SpanTest
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class SpanTest(BaseDateTest):
|
||||
"""
|
||||
Test spans.
|
||||
"""
|
||||
tests = [((2000, 1, 31), (2000, 1, 1), 30),
|
||||
((1799, 11, 19), (8, 2, 18, Date.CAL_FRENCH), 10),
|
||||
((8, 2, 18, Date.CAL_FRENCH), (1799, 11, 4), 5),
|
||||
((8, 2, 18, Date.CAL_FRENCH), (3, 2, 9, Date.CAL_FRENCH), 1836)]
|
||||
|
||||
def test_evaluate(self):
|
||||
for value1, value2, duration in self.tests:
|
||||
date1 = self._get_date(value1)
|
||||
date2 = self._get_date(value2)
|
||||
span1 = Span(date1, date2)
|
||||
self.assertEqual(int(span1), duration)
|
||||
span2 = Span(date2, date1)
|
||||
self.assertEqual(int(span2), -duration)
|
||||
|
||||
def _get_date(self, value):
|
||||
date = Date()
|
||||
if len(value) == 4:
|
||||
date.set_calendar(value[3])
|
||||
date.set_yr_mon_day(value[0], value[1], value[2])
|
||||
return date
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# SwedishDateTest
|
||||
|
||||
@@ -64,11 +64,11 @@ class Test1(unittest.TestCase):
|
||||
C = self.C.join([self.A, self.S, deepcopy(self.B)])
|
||||
C = C.replace('X', StyledText('_', [self.T3]))
|
||||
_C = ('123_456\ncleartext\nabc_def',
|
||||
[((1, ''), 'v1', [(0, 2), (2, 3)]),
|
||||
((0, ''), 'v3', [(3, 4)]),
|
||||
[((0, ''), 'v3', [(3, 4)]),
|
||||
((0, ''), 'v3', [(21, 22)]),
|
||||
((1, ''), 'v1', [(0, 2), (2, 3)]),
|
||||
((1, ''), 'v1', [(4, 6)]),
|
||||
((2, ''), 'v2', [(19, 21), (18, 21)]),
|
||||
((0, ''), 'v3', [(21, 22)]),
|
||||
((2, ''), 'v2', [(22, 23), (22, 25)])])
|
||||
self.assertEqual(C.serialize(), _C)
|
||||
|
||||
|
||||
@@ -31,8 +31,8 @@ Provide merge capabilities for persons.
|
||||
#-------------------------------------------------------------------------
|
||||
from ..db import DbTxn
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.sgettext
|
||||
from ..errors import MergeError
|
||||
_ = glocale.translation.sgettext
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -49,11 +49,12 @@ class MergePersonQuery:
|
||||
self.titanic = titanic
|
||||
if self.check_for_spouse(self.phoenix, self.titanic):
|
||||
raise MergeError(_("Spouses cannot be merged. To merge these "
|
||||
"people, you must first break the relationship between them."))
|
||||
"people, you must first break the relationship"
|
||||
" between them."))
|
||||
if self.check_for_child(self.phoenix, self.titanic):
|
||||
raise MergeError(_("A parent and child cannot be merged. To merge "
|
||||
"these people, you must first break the relationship between "
|
||||
"them."))
|
||||
"these people, you must first break the relatio"
|
||||
"nship between them."))
|
||||
|
||||
def check_for_spouse(self, person1, person2):
|
||||
"""Return if person1 and person2 are spouses of eachother."""
|
||||
@@ -80,12 +81,12 @@ class MergePersonQuery:
|
||||
main_family.merge(family)
|
||||
for childref in family.get_child_ref_list():
|
||||
child = self.database.get_person_from_handle(
|
||||
childref.get_reference_handle())
|
||||
childref.get_reference_handle())
|
||||
if main_family_handle in child.parent_family_list:
|
||||
child.remove_handle_references('Family', [family_handle])
|
||||
else:
|
||||
child.replace_handle_reference('Family', family_handle,
|
||||
main_family_handle)
|
||||
main_family_handle)
|
||||
self.database.commit_person(child, trans)
|
||||
if self.phoenix:
|
||||
self.phoenix.remove_family_handle(family_handle)
|
||||
@@ -143,7 +144,8 @@ class MergePersonQuery:
|
||||
for family_handle in self.phoenix.get_parent_family_handle_list():
|
||||
family = self.database.get_family_from_handle(family_handle)
|
||||
if family.has_handle_reference('Person', old_handle):
|
||||
family.replace_handle_reference('Person', old_handle,new_handle)
|
||||
family.replace_handle_reference('Person', old_handle,
|
||||
new_handle)
|
||||
self.database.commit_family(family, trans)
|
||||
|
||||
family_merge_guard = False
|
||||
@@ -182,7 +184,10 @@ class MergePersonQuery:
|
||||
self.database.commit_family(family, trans)
|
||||
parent_list.append(parents)
|
||||
|
||||
if self.database.get_default_handle() == old_handle:
|
||||
self.database.set_default_person_handle(None)
|
||||
hp_hdl = self.database.get_default_handle()
|
||||
if (hp_hdl in (self.phoenix.get_handle(), self.titanic.get_handle())
|
||||
and hp_hdl != self.phoenix.get_handle()):
|
||||
self.database.set_default_person_handle(self.phoenix.get_handle())
|
||||
|
||||
self.database.remove_person(old_handle, trans)
|
||||
return family_merge_ok
|
||||
|
||||
@@ -83,7 +83,7 @@ class BasePluginManager:
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if BasePluginManager.__instance is not 1:
|
||||
if BasePluginManager.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
|
||||
|
||||
@@ -1135,7 +1135,7 @@ class PluginRegister:
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if PluginRegister.__instance is not 1:
|
||||
if PluginRegister.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
self.stable_only = True
|
||||
|
||||
@@ -113,6 +113,10 @@ else:
|
||||
_GS_CMD = where_is("gs")
|
||||
|
||||
|
||||
def esc(id_txt):
|
||||
return id_txt.replace('"', '\\"')
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# GVOptions
|
||||
@@ -575,7 +579,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
text += ' URL="%s"' % url
|
||||
|
||||
text += " ]"
|
||||
self.write(' "%s" %s;\n' % (node_id, text))
|
||||
self.write(' "%s" %s;\n' % (esc(node_id), text))
|
||||
|
||||
def add_link(self, id1, id2, style="", head="", tail="", comment=""):
|
||||
"""
|
||||
@@ -583,7 +587,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.add_link().
|
||||
"""
|
||||
self.write(' "%s" -> "%s"' % (id1, id2))
|
||||
self.write(' "%s" -> "%s"' % (esc(id1), esc(id2)))
|
||||
|
||||
if style or head or tail:
|
||||
self.write(' [')
|
||||
@@ -635,7 +639,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.add_samerank().
|
||||
"""
|
||||
self.write(' {rank=same "%s" "%s"}\n' % (id1, id2))
|
||||
self.write(' {rank=same "%s" "%s"}\n' % (esc(id1), esc(id2)))
|
||||
|
||||
def rewrite_label(self, id, label):
|
||||
"""
|
||||
@@ -643,7 +647,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.rewrite_label().
|
||||
"""
|
||||
self.write(' "%s" [label = "%s"]\n' % (id, label))
|
||||
self.write(' "%s" [label = "%s"]\n' % (esc(id), label))
|
||||
|
||||
def start_subgraph(self, graph_id):
|
||||
""" Implement GVDocBase.start_subgraph() """
|
||||
|
||||
@@ -302,7 +302,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
||||
name = paper_size.get_name().lower()
|
||||
if name == 'custom size':
|
||||
width = str(paper_size.get_width())
|
||||
height = str(paper_size.get_width())
|
||||
height = str(paper_size.get_height())
|
||||
paper = 'papersize={%scm,%scm}' % (width, height)
|
||||
elif name in ('a', 'b', 'c', 'd', 'e'):
|
||||
paper = 'ansi' + name + 'paper'
|
||||
@@ -460,8 +460,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
||||
if os.path.isfile(path):
|
||||
if win():
|
||||
path = path.replace('\\', '/')
|
||||
self.write(level+1, 'image = {{%s}%s},\n' %
|
||||
os.path.splitext(path))
|
||||
self.write(level+1, 'image = {%s},\n' % path)
|
||||
break # first image only
|
||||
self.write(level, '}\n')
|
||||
|
||||
@@ -519,6 +518,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
||||
date_str = date_str + '/' + stop_date
|
||||
|
||||
place = escape(_pd.display_event(db, event))
|
||||
place = place.replace("-", "\--")
|
||||
|
||||
if modifier:
|
||||
event_type += '+'
|
||||
|
||||
@@ -62,6 +62,7 @@ class EnumeratedListOption(Option):
|
||||
:type value: int
|
||||
:return: nothing
|
||||
"""
|
||||
self.ini_value = value
|
||||
Option.__init__(self, label, value)
|
||||
self.__items = []
|
||||
self.__xml_items = []
|
||||
@@ -138,6 +139,8 @@ class EnumeratedListOption(Option):
|
||||
"""
|
||||
if value in (v for v, d in self.__items):
|
||||
Option.set_value(self, value)
|
||||
elif value == self.ini_value:
|
||||
return
|
||||
else:
|
||||
logging.warning(_("Value '%(val)s' not found for option '%(opt)s'") %
|
||||
{'val' : str(value), 'opt' : self.get_label()})
|
||||
|
||||
@@ -769,6 +769,7 @@ def sanitize_citation(db, citation):
|
||||
new_citation.set_gramps_id(citation.get_gramps_id())
|
||||
new_citation.set_handle(citation.get_handle())
|
||||
new_citation.set_change_time(citation.get_change_time())
|
||||
new_citation.set_tag_list(citation.get_tag_list())
|
||||
copy_srcattributes(db, citation, new_citation)
|
||||
copy_notes(db, citation, new_citation)
|
||||
copy_media_ref_list(db, citation, new_citation)
|
||||
@@ -914,6 +915,7 @@ def sanitize_source(db, source):
|
||||
new_source.set_gramps_id(source.get_gramps_id())
|
||||
new_source.set_handle(source.get_handle())
|
||||
new_source.set_change_time(source.get_change_time())
|
||||
new_source.set_tag_list(source.get_tag_list())
|
||||
|
||||
for repo_ref in source.get_reporef_list():
|
||||
if repo_ref and not repo_ref.get_privacy():
|
||||
@@ -987,6 +989,7 @@ def sanitize_place(db, place):
|
||||
new_place.set_type(place.get_type())
|
||||
new_place.set_code(place.get_code())
|
||||
new_place.set_placeref_list(place.get_placeref_list())
|
||||
new_place.set_tag_list(place.get_tag_list())
|
||||
|
||||
copy_citation_ref_list(db, place, new_place)
|
||||
copy_notes(db, place, new_place)
|
||||
@@ -1017,6 +1020,7 @@ def sanitize_event(db, event):
|
||||
new_event.set_handle(event.get_handle())
|
||||
new_event.set_date_object(event.get_date_object())
|
||||
new_event.set_change_time(event.get_change_time())
|
||||
new_event.set_tag_list(event.get_tag_list())
|
||||
|
||||
copy_citation_ref_list(db, event, new_event)
|
||||
copy_notes(db, event, new_event)
|
||||
@@ -1120,6 +1124,7 @@ def sanitize_repository(db, repository):
|
||||
new_repository.set_gramps_id(repository.get_gramps_id())
|
||||
new_repository.set_handle(repository.get_handle())
|
||||
new_repository.set_change_time(repository.get_change_time())
|
||||
new_repository.set_tag_list(repository.get_tag_list())
|
||||
|
||||
copy_notes(db, repository, new_repository)
|
||||
copy_addresses(db, repository, new_repository)
|
||||
|
||||
@@ -346,7 +346,7 @@ class ReferencedBySelectionProxyDb(ProxyDbBase):
|
||||
for tag in note.text.get_tags():
|
||||
if tag.name == 'Link':
|
||||
if tag.value.startswith("gramps://"):
|
||||
obj_class, prop, value = tag.value[9:].split("/")
|
||||
obj_class, prop, value = tag.value[9:].split("/", 2)
|
||||
if obj_class == "Media": # bug6493
|
||||
obj_class = "Media"
|
||||
if prop == "handle":
|
||||
|
||||
@@ -142,6 +142,8 @@ class ProbablyAlive:
|
||||
# person died more than MAX after current year
|
||||
if death_date.is_valid():
|
||||
birth_date = death_date.copy_offset_ymd(year=-self.MAX_AGE_PROB_ALIVE)
|
||||
else:
|
||||
birth_date = death_date
|
||||
explain = _("death date")
|
||||
|
||||
if not death_date and birth_date:
|
||||
|
||||
@@ -324,12 +324,16 @@ class Callback:
|
||||
return
|
||||
|
||||
# Check signal exists
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
frame_info = (c_code.co_filename, c_frame.f_lineno, c_code.co_name)
|
||||
if signal_name not in self.__signal_map:
|
||||
self._warn("Attempt to emit to unknown signal: %s\n"
|
||||
" from: file: %s\n"
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4]))
|
||||
% ((str(signal_name), ) + frame_info))
|
||||
return
|
||||
|
||||
# check that the signal is not already being emitted. This prevents
|
||||
@@ -340,7 +344,7 @@ class Callback:
|
||||
" from: file: %s\n"
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4]))
|
||||
% ((str(signal_name), ) + frame_info))
|
||||
return
|
||||
|
||||
try:
|
||||
@@ -358,7 +362,7 @@ class Callback:
|
||||
" from: file: %s\n"
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4]))
|
||||
% ((str(signal_name), ) + frame_info))
|
||||
return
|
||||
|
||||
# type check arguments
|
||||
@@ -369,7 +373,7 @@ class Callback:
|
||||
" from: file: %s\n"
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4]))
|
||||
% ((str(signal_name), ) + frame_info))
|
||||
return
|
||||
|
||||
if len(args) > 0:
|
||||
@@ -379,7 +383,7 @@ class Callback:
|
||||
" from: file: %s\n"
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4]))
|
||||
% ((str(signal_name), ) + frame_info))
|
||||
return
|
||||
|
||||
if arg_types is not None:
|
||||
@@ -391,7 +395,7 @@ class Callback:
|
||||
" line: %d\n"
|
||||
" func: %s\n"
|
||||
" arg passed was: %s, type of arg passed %s, type should be: %s\n"
|
||||
% ((str(signal_name), ) + inspect.stack()[1][1:4] +\
|
||||
% ((str(signal_name), ) + frame_info +\
|
||||
(args[i], repr(type(args[i])), repr(arg_types[i]))))
|
||||
return
|
||||
if signal_name in self.__callback_map:
|
||||
|
||||
@@ -49,7 +49,7 @@ class CSVTab(TabbedDoc):
|
||||
else:
|
||||
self.filename = filename
|
||||
|
||||
self.f = open(self.filename, "w",
|
||||
self.f = open(self.filename, "w", newline='',
|
||||
encoding='utf_8_sig' if win() else 'utf_8')
|
||||
self.writer = csv.writer(self.f)
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ _LOCALE_NAMES = {
|
||||
_RTL_LOCALES = ('ar', 'he')
|
||||
|
||||
# locales with less than 70% currently translated
|
||||
INCOMPLETE_TRANSLATIONS = ('ar', 'bg', 'he', 'ja', 'sq', 'ta', 'tr')
|
||||
INCOMPLETE_TRANSLATIONS = ('ar', 'bg', 'sq', 'ta', 'tr', 'zh_HK', 'zh_TW')
|
||||
|
||||
def _check_mswin_locale(locale):
|
||||
msloc = None
|
||||
@@ -525,6 +525,8 @@ class GrampsLocale:
|
||||
# with locale instead of gettext. Win32 doesn't support bindtextdomain.
|
||||
if self.localedir:
|
||||
if not sys.platform == 'win32':
|
||||
# bug12278, _build_popup_ui() under linux and macOS
|
||||
locale.textdomain(self.localedomain)
|
||||
locale.bindtextdomain(self.localedomain, self.localedir)
|
||||
else:
|
||||
self._win_bindtextdomain(self.localedomain.encode('utf-8'),
|
||||
|
||||
@@ -126,16 +126,33 @@ if win():
|
||||
pass # ok
|
||||
elif not os.path.isdir(HOME_DIR):
|
||||
os.makedirs(HOME_DIR)
|
||||
sys.stdout = sys.stderr = open(logfile, "w")
|
||||
stderrh = logging.StreamHandler(sys.stderr)
|
||||
stderrh.setFormatter(form)
|
||||
stderrh.setLevel(logging.DEBUG)
|
||||
sys.stdout = sys.stderr = open(logfile, "w", encoding='utf-8')
|
||||
# macOS sets stderr to /dev/null when running without a terminal,
|
||||
# e.g. if Gramps.app is lauched by double-clicking on it in
|
||||
# finder. Write to a file instead.
|
||||
if mac() and not sys.stdin.isatty():
|
||||
from tempfile import gettempdir
|
||||
|
||||
# Setup the base level logger, this one gets
|
||||
# everything.
|
||||
l = logging.getLogger()
|
||||
l.setLevel(logging.WARNING)
|
||||
l.addHandler(stderrh)
|
||||
log_file_name = 'gramps-' + str(os.getpid()) + '.log'
|
||||
log_file_path = os.path.join(gettempdir(), log_file_name)
|
||||
log_file_handler = logging.FileHandler(log_file_path, mode='a',
|
||||
encoding='utf-8')
|
||||
log_file_handler.setFormatter(form)
|
||||
log_file_handler.setLevel(logging.DEBUG)
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.WARNING)
|
||||
logger.addHandler(log_file_handler)
|
||||
else:
|
||||
stderrh = logging.StreamHandler(sys.stderr)
|
||||
stderrh.setFormatter(form)
|
||||
stderrh.setLevel(logging.DEBUG)
|
||||
|
||||
# Setup the base level logger, this one gets
|
||||
# everything.
|
||||
l = logging.getLogger()
|
||||
l.setLevel(logging.WARNING)
|
||||
l.addHandler(stderrh)
|
||||
|
||||
|
||||
def exc_hook(err_type, value, t_b):
|
||||
@@ -212,7 +229,7 @@ def show_settings():
|
||||
Gtk.get_minor_version(), Gtk.get_micro_version())
|
||||
except: # any failure to 'get' the version
|
||||
gtkver_str = 'unknown version'
|
||||
except ImportError:
|
||||
except (ImportError, ValueError):
|
||||
gtkver_str = 'not found'
|
||||
# no DISPLAY is a RuntimeError in an older pygtk (e.g. 2.17 in Fedora 14)
|
||||
except RuntimeError:
|
||||
@@ -308,9 +325,16 @@ def show_settings():
|
||||
.replace('(', '').replace(')', '')
|
||||
bsddb_location_str = bsddb.__file__
|
||||
except:
|
||||
bsddb_str = 'not found'
|
||||
bsddb_db_str = 'not found'
|
||||
bsddb_location_str = 'not found'
|
||||
try:
|
||||
import berkeleydb as bsddb
|
||||
bsddb_str = bsddb.__version__
|
||||
bsddb_db_str = str(bsddb.db.version()).replace(', ', '.')\
|
||||
.replace('(', '').replace(')', '')
|
||||
bsddb_location_str = bsddb.__file__
|
||||
except:
|
||||
bsddb_str = 'not found'
|
||||
bsddb_db_str = 'not found'
|
||||
bsddb_location_str = 'not found'
|
||||
|
||||
try:
|
||||
import sqlite3
|
||||
|
||||
@@ -68,7 +68,11 @@ try:
|
||||
import bsddb3 as bsddb ## ok, in try/except
|
||||
BSDDB_STR = ellipses(str(bsddb.__version__) + " " + str(bsddb.db.version()))
|
||||
except:
|
||||
BSDDB_STR = 'not found'
|
||||
try:
|
||||
import berkeleydb as bsddb
|
||||
BSDDB_STR = ellipses(str(bsddb.__version__) + " " + str(bsddb.db.version()))
|
||||
except:
|
||||
BSDDB_STR = 'not found'
|
||||
|
||||
try:
|
||||
import sqlite3
|
||||
|
||||
@@ -471,27 +471,36 @@ class ClipCitation(ClipHandleWrapper):
|
||||
|
||||
def refresh(self):
|
||||
if self._handle:
|
||||
citation = clipdb.get_citation_from_handle(self._handle)
|
||||
if citation:
|
||||
self._title = citation.get_gramps_id()
|
||||
notelist = list(map(clipdb.get_note_from_handle,
|
||||
citation.get_note_list()))
|
||||
srctxtlist = [note for note in notelist
|
||||
if note.get_type() == NoteType.SOURCE_TEXT]
|
||||
page = citation.get_page()
|
||||
if not page:
|
||||
page = _('not available|NA')
|
||||
text = ""
|
||||
if srctxtlist:
|
||||
text = " ".join(srctxtlist[0].get().split())
|
||||
#String must be unicode for truncation to work for non
|
||||
#ascii characters
|
||||
text = str(text)
|
||||
if len(text) > 60:
|
||||
text = text[:60] + "..."
|
||||
self._value = _("Volume/Page: %(pag)s -- %(sourcetext)s") % {
|
||||
'pag' : page,
|
||||
'sourcetext' : text}
|
||||
try:
|
||||
citation = clipdb.get_citation_from_handle(self._handle)
|
||||
if citation:
|
||||
self._title = citation.get_gramps_id()
|
||||
notelist = list(map(clipdb.get_note_from_handle,
|
||||
citation.get_note_list()))
|
||||
srctxtlist = [note for note in notelist
|
||||
if note.get_type() == NoteType.SOURCE_TEXT]
|
||||
page = citation.get_page()
|
||||
if not page:
|
||||
page = _('not available|NA')
|
||||
text = ""
|
||||
if srctxtlist:
|
||||
text = " ".join(srctxtlist[0].get().split())
|
||||
#String must be unicode for truncation to work for non
|
||||
#ascii characters
|
||||
text = str(text)
|
||||
if len(text) > 60:
|
||||
text = text[:60] + "..."
|
||||
self._value = _("Volume/Page: %(pag)s -- %(sourcetext)s"
|
||||
) % { 'pag' : page,
|
||||
'sourcetext' : text}
|
||||
except:
|
||||
# We are in the Source tree view. The shortcuts only
|
||||
# work for citations.
|
||||
print("We cannot copy the source from this view."
|
||||
" Use drag and drop.")
|
||||
self._title = self._value = ''
|
||||
self._pickle = self._type = self._objclass = None
|
||||
self._handle = self._dbid = self._dbname = None
|
||||
|
||||
|
||||
class ClipRepoRef(ClipObjWrapper):
|
||||
@@ -1281,6 +1290,14 @@ class ClipboardListView:
|
||||
model.insert_before(node, data)
|
||||
else:
|
||||
model.insert_after(node, data)
|
||||
elif isinstance(data[1], ClipCitation):
|
||||
if data[3]:
|
||||
# we have a real citation
|
||||
model.append(data)
|
||||
#else:
|
||||
# We are in a Source treeview and trying
|
||||
# to copy a source with a shortcut.
|
||||
# Use drag and drop to do that.
|
||||
else:
|
||||
model.append(data)
|
||||
|
||||
|
||||
@@ -1241,7 +1241,7 @@ class GrampsPreferences(ConfigureDialog):
|
||||
row, 'preferences.place-auto', start=0, stop=1,
|
||||
extra_callback=self.auto_title_changed,
|
||||
tooltip=_("Enables automatic place title generation "
|
||||
"using specifed format."))
|
||||
"using specified format."))
|
||||
self.auto_title_changed(cb_widget)
|
||||
hbox.pack_start(self.pformat, True, True, 0)
|
||||
hbox.pack_start(self.fmt_btn, False, False, 0)
|
||||
@@ -1256,14 +1256,15 @@ class GrampsPreferences(ConfigureDialog):
|
||||
_("Years, Months, Days")]
|
||||
list(map(obox.append_text, age_precision))
|
||||
# Combo_box active index is from 0 to 2, we need values from 1 to 3
|
||||
constant = 'preferences.age-display-precision'
|
||||
active = config.get(constant) - 1
|
||||
active = config.get('preferences.age-display-precision') - 1
|
||||
if active >= 0 and active <= 2:
|
||||
obox.set_active(active)
|
||||
else:
|
||||
obox.set_active(0)
|
||||
obox.connect('changed',
|
||||
lambda obj: config.set(constant, obj.get_active() + 1))
|
||||
obox.connect(
|
||||
'changed',
|
||||
lambda obj: config.set('preferences.age-display-precision',
|
||||
obj.get_active() + 1))
|
||||
lwidget = BasicLabel(_("%s: ")
|
||||
% _('Age display precision (requires restart)'))
|
||||
grid.attach(lwidget, 0, row, 1, 1)
|
||||
@@ -1300,10 +1301,10 @@ class GrampsPreferences(ConfigureDialog):
|
||||
obox = Gtk.ComboBoxText()
|
||||
formats = FamilyRelType().get_standard_names()
|
||||
list(map(obox.append_text, formats))
|
||||
constant = 'preferences.family-relation-type'
|
||||
obox.set_active(config.get(constant))
|
||||
obox.set_active(config.get('preferences.family-relation-type'))
|
||||
obox.connect('changed',
|
||||
lambda obj: config.set(constant, obj.get_active()))
|
||||
lambda obj: config.set('preferences.family-relation-type',
|
||||
obj.get_active()))
|
||||
lwidget = BasicLabel(_("%s: ") % _('Default family relationship'))
|
||||
grid.attach(lwidget, 0, row, 1, 1)
|
||||
grid.attach(obox, 1, row, 2, 1)
|
||||
@@ -1489,6 +1490,26 @@ class GrampsPreferences(ConfigureDialog):
|
||||
align=Gtk.Align.CENTER, bold=True)
|
||||
|
||||
row = 1
|
||||
self.add_pos_int_entry(
|
||||
grid, _('Markup for invalid date format'),
|
||||
row, 'preferences.invalid-date-format',
|
||||
self.update_markup_entry,
|
||||
helptext=_(
|
||||
'Convenience markups are:\n'
|
||||
'<b><b>Bold</b></b>\n'
|
||||
'<big><big>'
|
||||
'Makes font relatively larger</big></big>\n'
|
||||
'<i><i>Italic</i></i>\n'
|
||||
'<s><s>Strikethrough</s></s>\n'
|
||||
'<sub><sub>Subscript</sub></sub>\n'
|
||||
'<sup><sup>Superscript</sup></sup>\n'
|
||||
'<small><small>'
|
||||
'Makes font relatively smaller</small></small>\n'
|
||||
'<tt><tt>Monospace font</tt></tt>\n'
|
||||
'<u><u>Underline</u></u>\n\n'
|
||||
'For example: <u><b>%s</b></u>\n'
|
||||
'will display <u><b>Underlined bold date</b></u>.\n'))
|
||||
row += 1
|
||||
self.add_spinner(
|
||||
grid, _('Date about range'),
|
||||
row, 'behavior.date-about-range', (1, 9999))
|
||||
@@ -1516,26 +1537,6 @@ class GrampsPreferences(ConfigureDialog):
|
||||
self.add_spinner(
|
||||
grid, _('Average years between generations'),
|
||||
row, 'behavior.avg-generation-gap', (10, 30))
|
||||
row += 1
|
||||
self.add_pos_int_entry(
|
||||
grid, _('Markup for invalid date format'),
|
||||
row, 'preferences.invalid-date-format',
|
||||
self.update_markup_entry,
|
||||
helptext=_(
|
||||
'Convenience markups are:\n'
|
||||
'<b><b>Bold</b></b>\n'
|
||||
'<big><big>'
|
||||
'Makes font relatively larger</big></big>\n'
|
||||
'<i><i>Italic</i></i>\n'
|
||||
'<s><s>Strikethrough</s></s>\n'
|
||||
'<sub><sub>Subscript</sub></sub>\n'
|
||||
'<sup><sup>Superscript</sup></sup>\n'
|
||||
'<small><small>'
|
||||
'Makes font relatively smaller</small></small>\n'
|
||||
'<tt><tt>Monospace font</tt></tt>\n'
|
||||
'<u><u>Underline</u></u>\n\n'
|
||||
'For example: <u><b>%s</b></u>\n'
|
||||
'will display <u><b>Underlined bold date</b></u>.\n'))
|
||||
|
||||
return _('Dates'), grid
|
||||
|
||||
@@ -1572,7 +1573,7 @@ class GrampsPreferences(ConfigureDialog):
|
||||
self.add_checkbox(grid, _('Add tag on import'), current_line,
|
||||
cb_const, stop=2,
|
||||
extra_callback=self.toggle_tag_on_import,
|
||||
tooltip=_("Specifed tag will be added on import.\n"
|
||||
tooltip=_("Specified tag will be added on import.\n"
|
||||
"Clear to set default value."))
|
||||
grid.attach(self.tag_format_entry, 2, current_line, 1, 1)
|
||||
|
||||
@@ -2093,9 +2094,9 @@ class GrampsPreferences(ConfigureDialog):
|
||||
self.all_avail_fonts, callback=self.utf8_update_font,
|
||||
valueactive=True, setactive=active_val)
|
||||
if len(available_fonts) == 1:
|
||||
single_font = self.all_avail_fonts[choosefont.get_active()][1]
|
||||
single_font = self.all_avail_fonts[choosefont.get_active()][0]
|
||||
config.set('utf8.selected-font',
|
||||
self.all_avail_fonts[single_font])
|
||||
self.all_avail_fonts[single_font][1])
|
||||
self.utf8_show_example()
|
||||
symbols = Symbols()
|
||||
all_sbls = symbols.get_death_symbols()
|
||||
|
||||
@@ -317,6 +317,13 @@ def add_all_files_filter(chooser):
|
||||
mime_filter.add_pattern('*')
|
||||
chooser.add_filter(mime_filter)
|
||||
|
||||
|
||||
def icase(ext):
|
||||
"""
|
||||
Return a glob reresenting a case insensitive file extension.
|
||||
"""
|
||||
return ''.join(['[{}{}]'.format(s.lower(), s.upper()) for s in ext])
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Format selectors: explictly set the format of the file
|
||||
@@ -446,8 +453,7 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
file_filter = Gtk.FileFilter()
|
||||
name = "%s (.%s)" % (plugin.get_name(), plugin.get_extension())
|
||||
file_filter.set_name(name)
|
||||
file_filter.add_pattern("*.%s" % plugin.get_extension())
|
||||
file_filter.add_pattern(plugin.get_extension().capitalize())
|
||||
file_filter.add_pattern("*.%s" % icase(plugin.get_extension()))
|
||||
import_dialog.add_filter(file_filter)
|
||||
|
||||
(box, type_selector) = format_maker()
|
||||
@@ -526,7 +532,7 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
return True
|
||||
else:
|
||||
try:
|
||||
f = file(filename,'w')
|
||||
f = open(filename, 'w')
|
||||
f.close()
|
||||
os.remove(filename)
|
||||
except IOError:
|
||||
@@ -542,7 +548,6 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
self.import_info = None
|
||||
self._begin_progress()
|
||||
self.uistate.set_sensitive(False)
|
||||
self.uistate.viewmanager.enable_menu(False)
|
||||
|
||||
try:
|
||||
#an importer can return an object with info, object.info_text()
|
||||
@@ -563,7 +568,6 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
except Exception:
|
||||
_LOG.error("Failed to import database.", exc_info=True)
|
||||
self.uistate.set_sensitive(True)
|
||||
self.uistate.viewmanager.enable_menu(True)
|
||||
self._end_progress()
|
||||
|
||||
def build_menu_names(self, obj): # this is meaningless since it's modal
|
||||
|
||||
@@ -1013,7 +1013,7 @@ class DbManager(CLIDbManager, ManagedWindow):
|
||||
"""
|
||||
Handle the reception of drag data
|
||||
"""
|
||||
drag_value = selection.get_data().decode()
|
||||
drag_value = selection.get_data().decode().strip(' \r\n\x00')
|
||||
fname = None
|
||||
type = None
|
||||
title = None
|
||||
|
||||
@@ -520,7 +520,10 @@ class DisplayState(Callback):
|
||||
history.push(handle)
|
||||
|
||||
def set_sensitive(self, state):
|
||||
self.window.set_sensitive(state)
|
||||
tbar = self.uimanager.get_widget('ToolBar')
|
||||
tbar.set_sensitive(state)
|
||||
self.viewmanager.hpane.set_sensitive(state)
|
||||
self.uimanager.enable_all_actions(state)
|
||||
|
||||
def db_changed(self, db):
|
||||
db.connect('long-op-start', self.progress_monitor.add_op)
|
||||
|
||||
@@ -46,7 +46,7 @@ from html import escape
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...widgets.undoablebuffer import UndoableBuffer
|
||||
from gramps.gen.lib import EventRoleType
|
||||
from gramps.gen.lib import (EventRoleType, EventType, Date)
|
||||
from gramps.gen.datehandler import get_date, get_date_valid
|
||||
from gramps.gen.config import config
|
||||
from gramps.gen.utils.db import get_participant_from_event
|
||||
@@ -175,7 +175,12 @@ class EventRefModel(Gtk.TreeStore):
|
||||
"""
|
||||
date = event.get_date_object()
|
||||
if date and self.start_date:
|
||||
return (date - self.start_date).format(precision=age_precision)
|
||||
if (date == self.start_date and date.modifier == Date.MOD_NONE
|
||||
and not (event.get_type().is_death_fallback() or
|
||||
event.get_type() == EventType.DEATH)):
|
||||
return ""
|
||||
else:
|
||||
return (date - self.start_date).format(precision=age_precision)
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ from gramps.gen.lib import EventType, NoteType
|
||||
from gramps.gen.db import DbTxn
|
||||
from ..glade import Glade
|
||||
from .displaytabs import (CitationEmbedList, NoteTab, GalleryTab,
|
||||
EventBackRefList, AttrEmbedList)
|
||||
EventBackRefList, EventAttrEmbedList)
|
||||
from ..widgets import (PrivacyButton, MonitoredEntry,
|
||||
MonitoredDate, MonitoredDataType, MonitoredTagList)
|
||||
from .editreference import RefTab, EditReference
|
||||
@@ -209,10 +209,10 @@ class EditEventRef(EditReference):
|
||||
self._add_tab(notebook, self.srcref_list)
|
||||
self.track_ref_for_deletion("srcref_list")
|
||||
|
||||
self.attr_list = AttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source.get_attribute_list())
|
||||
self.attr_list = EventAttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source.get_attribute_list())
|
||||
self._add_tab(notebook, self.attr_list)
|
||||
self.track_ref_for_deletion("attr_list")
|
||||
|
||||
@@ -247,10 +247,11 @@ class EditEventRef(EditReference):
|
||||
self._add_tab(notebook, self.backref_tab)
|
||||
self.track_ref_for_deletion("backref_tab")
|
||||
|
||||
self.attr_ref_list = AttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source_ref.get_attribute_list())
|
||||
self.attr_ref_list = EventAttrEmbedList(
|
||||
self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source_ref.get_attribute_list())
|
||||
self._add_tab(notebook_ref, self.attr_ref_list)
|
||||
self.track_ref_for_deletion("attr_ref_list")
|
||||
|
||||
|
||||
@@ -366,6 +366,7 @@ class EditName(EditSecondary):
|
||||
5/ local set, not global set --> set (change local)
|
||||
6/ local set, global set --> set (set to global if possible)
|
||||
"""
|
||||
ngm = False # name group mapping setting
|
||||
closeit = True
|
||||
surname = self.obj.get_primary_surname().get_surname()
|
||||
group_as= self.obj.get_group_as()
|
||||
@@ -388,7 +389,7 @@ class EditName(EditSecondary):
|
||||
val = q.run()
|
||||
if val:
|
||||
#delete the grouping link on database
|
||||
self.db.set_name_group_mapping(surname, None)
|
||||
ngm = None # delay setting until dialog closes
|
||||
self.obj.set_group_as("")
|
||||
else :
|
||||
closeit = False
|
||||
@@ -421,9 +422,9 @@ class EditName(EditSecondary):
|
||||
val = q.run()
|
||||
if val:
|
||||
if group_as == surname :
|
||||
self.db.set_name_group_mapping(surname, None)
|
||||
ngm = None # delay setting until dialog closes
|
||||
else:
|
||||
self.db.set_name_group_mapping(surname, group_as)
|
||||
ngm = group_as # delay setting until dialog closes
|
||||
self.obj.set_group_as("")
|
||||
else:
|
||||
if self.global_group_set :
|
||||
@@ -455,10 +456,15 @@ class EditName(EditSecondary):
|
||||
pass
|
||||
|
||||
if closeit:
|
||||
db = self.db # close cleanup loses self.db, so save for later
|
||||
if self.callback:
|
||||
self.callback(self.obj)
|
||||
self.callback = None
|
||||
self.close()
|
||||
# bug 12328 to avoid gui interaction during view rebuild, delay
|
||||
# the rebuild until closeing this dialog
|
||||
if ngm is not False:
|
||||
db.set_name_group_mapping(surname, ngm)
|
||||
|
||||
def _cleanup_on_exit(self):
|
||||
"""
|
||||
|
||||
@@ -158,32 +158,71 @@ class EditPlace(EditPrimary):
|
||||
self.obj.set_code, self.obj.get_code,
|
||||
self.db.readonly)
|
||||
|
||||
entry = self.top.get_object("lon_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.longitude = MonitoredEntry(
|
||||
self.top.get_object("lon_entry"),
|
||||
entry,
|
||||
self.obj.set_longitude, self.obj.get_longitude,
|
||||
self.db.readonly)
|
||||
self.longitude.connect("validate", self._validate_coordinate, "lon")
|
||||
#force validation now with initial entry
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
entry.validate(force=True)
|
||||
|
||||
entry = self.top.get_object("lat_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.latitude = MonitoredEntry(
|
||||
self.top.get_object("lat_entry"),
|
||||
entry,
|
||||
self.obj.set_latitude, self.obj.get_latitude,
|
||||
self.db.readonly)
|
||||
self.latitude.connect("validate", self._validate_coordinate, "lat")
|
||||
#force validation now with initial entry
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
entry.validate(force=True)
|
||||
|
||||
entry = self.top.get_object("latlon_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.latlon = MonitoredEntry(
|
||||
self.top.get_object("latlon_entry"),
|
||||
entry,
|
||||
self.set_latlongitude, self.get_latlongitude,
|
||||
self.db.readonly)
|
||||
|
||||
def set_latlongitude(self, value):
|
||||
"""
|
||||
This method is useful for directly copying the coordinates
|
||||
of openstreetmap, googlemaps, and perhaps other if they
|
||||
provide coordinates like it is define in conv_lat_lon
|
||||
(see gramps/gen/utils/place.py)
|
||||
|
||||
To copy the coordinates:
|
||||
|
||||
- openstreetmap:
|
||||
1 - choose the place where you want to save the coordinates.
|
||||
2 - right click on this place
|
||||
3 - select "show address"
|
||||
4 - On the left side of the map, copy the coordinates of
|
||||
"Result from internal"
|
||||
5 - In the latlon field of the edit place window of gramps,
|
||||
type <CTRL> V
|
||||
|
||||
- googlemap:
|
||||
1 - choose the place where you want to save the coordinates.
|
||||
2 - right click on this place
|
||||
3 - select the coordinates at the top of the popup window.
|
||||
They are automaticaly copied.
|
||||
4 - In the latlon field of the edit place window of gramps,
|
||||
type <CTRL> V
|
||||
|
||||
"""
|
||||
try:
|
||||
coma = value.index(',')
|
||||
self.longitude.set_text(value[coma+1:].strip())
|
||||
self.latitude.set_text(value[:coma].strip())
|
||||
# Bug 12349, 12374
|
||||
parts = value.split(', ')
|
||||
if len(parts) == 2:
|
||||
latitude = parts[0].strip().replace(',', '.')
|
||||
longitude = parts[1].strip().replace(',', '.')
|
||||
else:
|
||||
latitude, longitude = value.split(',')
|
||||
|
||||
self.longitude.set_text(longitude)
|
||||
self.latitude.set_text(latitude)
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
self.obj.set_latitude(self.latitude.get_value())
|
||||
|
||||
@@ -151,32 +151,45 @@ class EditPlaceRef(EditReference):
|
||||
self.source.set_code, self.source.get_code,
|
||||
self.db.readonly)
|
||||
|
||||
entry = self.top.get_object("lon_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.longitude = MonitoredEntry(
|
||||
self.top.get_object("lon_entry"),
|
||||
entry,
|
||||
self.source.set_longitude, self.source.get_longitude,
|
||||
self.db.readonly)
|
||||
self.longitude.connect("validate", self._validate_coordinate, "lon")
|
||||
#force validation now with initial entry
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
entry.validate(force=True)
|
||||
|
||||
entry = self.top.get_object("lat_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.latitude = MonitoredEntry(
|
||||
self.top.get_object("lat_entry"),
|
||||
entry,
|
||||
self.source.set_latitude, self.source.get_latitude,
|
||||
self.db.readonly)
|
||||
self.latitude.connect("validate", self._validate_coordinate, "lat")
|
||||
#force validation now with initial entry
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
entry.validate(force=True)
|
||||
|
||||
entry = self.top.get_object("latlon_entry")
|
||||
entry.set_ltr_mode()
|
||||
self.latlon = MonitoredEntry(
|
||||
self.top.get_object("latlon_entry"),
|
||||
entry,
|
||||
self.set_latlongitude, self.get_latlongitude,
|
||||
self.db.readonly)
|
||||
|
||||
def set_latlongitude(self, value):
|
||||
try:
|
||||
coma = value.index(',')
|
||||
self.longitude.set_text(value[coma+1:].strip())
|
||||
self.latitude.set_text(value[:coma].strip())
|
||||
# Bug 12349, 12374
|
||||
parts = value.split(', ')
|
||||
if len(parts) == 2:
|
||||
latitude = parts[0].strip().replace(',', '.')
|
||||
longitude = parts[1].strip().replace(',', '.')
|
||||
else:
|
||||
latitude, longitude = value.split(',')
|
||||
|
||||
self.longitude.set_text(longitude)
|
||||
self.latitude.set_text(latitude)
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
self.source.set_latitude(self.latitude.get_value())
|
||||
|
||||
@@ -311,7 +311,10 @@ class PlaceEntry(ObjEntry):
|
||||
|
||||
def get_label(self, place):
|
||||
place_title = place_displayer.display(self.db, place)
|
||||
return "%s [%s]" % (place_title, place.gramps_id)
|
||||
# When part of the place title contains RTL text, the gramps_id gets
|
||||
# messed up; so use Unicode FSI/PDI and LRM chars to isolate it.
|
||||
# see bug 10124 and PR924
|
||||
return "%s \u2068[%s]\u200e\u2069" % (place_title, place.gramps_id)
|
||||
|
||||
def call_editor(self, obj=None):
|
||||
if obj is None:
|
||||
@@ -356,7 +359,7 @@ class SourceEntry(ObjEntry):
|
||||
return self.db.get_source_from_handle(handle)
|
||||
|
||||
def get_label(self, source):
|
||||
return "%s [%s]" % (source.get_title(), source.gramps_id)
|
||||
return "%s \u2068[%s]\u200e\u2069" % (source.get_title(), source.gramps_id)
|
||||
|
||||
def call_editor(self, obj=None):
|
||||
if obj is None:
|
||||
@@ -402,7 +405,8 @@ class MediaEntry(ObjEntry):
|
||||
return self.db.get_media_from_handle(handle)
|
||||
|
||||
def get_label(self, object):
|
||||
return "%s [%s]" % (object.get_description(), object.gramps_id)
|
||||
return "%s \u2068[%s]\u200e\u2069" % (object.get_description(),
|
||||
object.gramps_id)
|
||||
|
||||
def call_editor(self, obj=None):
|
||||
if obj is None:
|
||||
@@ -462,7 +466,7 @@ class NoteEntry(ObjEntry):
|
||||
txt = " ".join(note.get().split())
|
||||
if len(txt) > 35:
|
||||
txt = txt[:35] + "..."
|
||||
return "%s [%s]" % (txt, note.gramps_id)
|
||||
return "%s \u2068[%s]\u200e\u2069" % (txt, note.gramps_id)
|
||||
|
||||
def call_editor(self, obj=None):
|
||||
if obj is None:
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generated with glade 3.18.3 -->
|
||||
<!-- Generated with glade 3.22.2 -->
|
||||
<interface>
|
||||
<requires lib="gtk+" version="3.10"/>
|
||||
<requires lib="grampswidgets" version="0.0"/>
|
||||
<object class="GtkDialog" id="editplace">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<child type="titlebar">
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="dialog-vbox19">
|
||||
<property name="visible">True</property>
|
||||
@@ -101,7 +103,7 @@
|
||||
<child>
|
||||
<object class="GtkLabel" id="comment1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Either use the two fields below to enter coordinates (latitude and longitude),</property>
|
||||
<property name="hexpand">True</property>
|
||||
|
||||
@@ -233,7 +233,7 @@ class ListModel:
|
||||
new_value = not self.model[path][col]
|
||||
self.model[path][col] = new_value
|
||||
if col in self.function:
|
||||
self.function[col](int(path), new_value)
|
||||
self.function[col](path, new_value)
|
||||
|
||||
def __edited_cb(self, cell, path, new_text, col):
|
||||
"""
|
||||
@@ -241,7 +241,7 @@ class ListModel:
|
||||
"""
|
||||
self.model[path][col] = new_text
|
||||
if col in self.function:
|
||||
self.function[col](int(path), new_text)
|
||||
self.function[col](path, new_text)
|
||||
|
||||
def unselect(self):
|
||||
"""
|
||||
|
||||
@@ -37,7 +37,11 @@ try:
|
||||
import bsddb3 as bsddb # ok, in try/except
|
||||
BSDDB_STR = str(bsddb.__version__) + " " + str(bsddb.db.version())
|
||||
except:
|
||||
BSDDB_STR = 'not found'
|
||||
try:
|
||||
import berkeleydb as bsddb
|
||||
BSDDB_STR = str(bsddb.__version__) + " " + str(bsddb.db.version())
|
||||
except:
|
||||
BSDDB_STR = 'not found'
|
||||
|
||||
try:
|
||||
import sqlite3
|
||||
|
||||
@@ -32,6 +32,14 @@ the create/deletion of dialog windows.
|
||||
import os
|
||||
from io import StringIO
|
||||
import html
|
||||
import logging
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Set up logging
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
_LOG = logging.getLogger(".")
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GNOME/GTK
|
||||
@@ -575,6 +583,9 @@ class ManagedWindow:
|
||||
|
||||
Takes care of closing children and removing itself from menu.
|
||||
"""
|
||||
if hasattr(self, 'opened') and not self.opened:
|
||||
_LOG.warning("Tried to close a ManagedWindow more than once.")
|
||||
return # in case close somehow gets called again
|
||||
self.opened = False
|
||||
self._save_position(save_config=False) # the next line will save it
|
||||
self._save_size()
|
||||
@@ -622,6 +633,17 @@ class ManagedWindow:
|
||||
if self.horiz_position_key is not None:
|
||||
horiz_position = config.get(self.horiz_position_key)
|
||||
vert_position = config.get(self.vert_position_key)
|
||||
# make sure some of left side shows on screen
|
||||
# for part time multi monitor setups
|
||||
screen = Gtk.Window().get_screen()
|
||||
s_width = screen.get_width()
|
||||
s_height = screen.get_height()
|
||||
if horiz_position > s_width - 50 or vert_position > s_height - 50:
|
||||
(p_width, p_height) = self.parent_window.get_size()
|
||||
(p_horiz, p_vert) = self.parent_window.get_position()
|
||||
(w_width, w_height) = self.window.get_size()
|
||||
horiz_position = p_horiz + ((p_width - w_width) // 2)
|
||||
vert_position = p_vert + ((p_height - w_height) // 2)
|
||||
self.window.move(horiz_position, vert_position)
|
||||
|
||||
def _save_position(self, save_config=True):
|
||||
|
||||
@@ -1756,7 +1756,8 @@ class GuiDestinationOption(Gtk.Box):
|
||||
name = get_curr_dir
|
||||
fcd.set_current_folder(name)
|
||||
else:
|
||||
fcd.set_current_name(name)
|
||||
fcd.set_current_name(os.path.basename(name))
|
||||
fcd.set_current_folder(os.path.dirname(name))
|
||||
|
||||
status = fcd.run()
|
||||
if status == Gtk.ResponseType.OK:
|
||||
|
||||
@@ -768,7 +768,7 @@ class ToolManagedWindowBase(ManagedWindow):
|
||||
|
||||
self.notebook = Gtk.Notebook()
|
||||
self.notebook.set_border_width(6)
|
||||
self.window.get_content_area().add(self.notebook)
|
||||
self.window.get_content_area().pack_start(self.notebook, True, True, 0)
|
||||
|
||||
self.results_text = Gtk.TextView()
|
||||
self.results_text.connect('button-press-event',
|
||||
@@ -814,9 +814,12 @@ class ToolManagedWindowBase(ManagedWindow):
|
||||
buffer_location = view.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
|
||||
int(event.x),
|
||||
int(event.y))
|
||||
iter = view.get_iter_at_location(*buffer_location)
|
||||
_iter = view.get_iter_at_location(*buffer_location)
|
||||
if isinstance(_iter, tuple): # Gtk changed api in recent versions
|
||||
_iter = _iter[1]
|
||||
|
||||
for (tag, person_handle) in self.tags:
|
||||
if iter.has_tag(tag):
|
||||
if _iter.has_tag(tag):
|
||||
_window = view.get_window(Gtk.TextWindowType.TEXT)
|
||||
_window.set_cursor(self.link_cursor)
|
||||
return False # handle event further, if necessary
|
||||
@@ -827,9 +830,11 @@ class ToolManagedWindowBase(ManagedWindow):
|
||||
buffer_location = view.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
|
||||
int(event.x),
|
||||
int(event.y))
|
||||
iter = view.get_iter_at_location(*buffer_location)
|
||||
_iter = view.get_iter_at_location(*buffer_location)
|
||||
if isinstance(_iter, tuple): # Gtk changed api in recent versions
|
||||
_iter = _iter[1]
|
||||
for (tag, person_handle) in self.tags:
|
||||
if iter.has_tag(tag):
|
||||
if _iter.has_tag(tag):
|
||||
person = self.db.get_person_from_handle(person_handle)
|
||||
if event.button == 1:
|
||||
if event.type == Gdk.EventType.DOUBLE_BUTTON_PRESS:
|
||||
|
||||
@@ -586,11 +586,11 @@ class ExportAssistant(ManagedWindow, Gtk.Assistant):
|
||||
ix = self.get_selected_format_index()
|
||||
config.set('behavior.recent-export-type', ix)
|
||||
export_function = self.map_exporters[ix].get_export_function()
|
||||
success = export_function(self.dbstate.db,
|
||||
filename,
|
||||
User(error=ErrorDialog, parent=self.uistate.window,
|
||||
callback=self.callback),
|
||||
self.option_box_instance)
|
||||
success = export_function(
|
||||
self.dbstate.db, filename,
|
||||
User(error=ErrorDialog, parent=self.window,
|
||||
callback=self.callback),
|
||||
self.option_box_instance)
|
||||
except:
|
||||
#an error not catched in the export_function itself
|
||||
success = False
|
||||
|
||||
@@ -71,7 +71,7 @@ class GuiPluginManager(Callback):
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if GuiPluginManager.__instance is not 1:
|
||||
if GuiPluginManager.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
|
||||
|
||||
@@ -325,7 +325,6 @@ class BaseSelector(ManagedWindow):
|
||||
self.sortorder = Gtk.SortType.ASCENDING
|
||||
else:
|
||||
self.sortorder = Gtk.SortType.DESCENDING
|
||||
self.model.reverse_order()
|
||||
self.build_tree()
|
||||
|
||||
return True
|
||||
|
||||
@@ -496,6 +496,16 @@ class UIManager():
|
||||
"""
|
||||
return group.act_group.lookup_action(actionname)
|
||||
|
||||
def enable_all_actions(self, state):
|
||||
for group in self.action_groups:
|
||||
if group.act_group:
|
||||
for item in group.actionlist:
|
||||
action = group.act_group.lookup_action(item[ACTION_NAME])
|
||||
if action:
|
||||
# We check in case the group has not been inserted into
|
||||
# UIManager yet
|
||||
action.set_enabled(group.sensitive if state else False)
|
||||
|
||||
def dump_all_accels(self):
|
||||
''' A function used diagnostically to see what accels are present.
|
||||
This will only dump the current accel set, if other non-open windows
|
||||
|
||||
@@ -450,7 +450,7 @@ def open_file_with_default_application(path, uistate):
|
||||
GLib.timeout_add_seconds(1, poll_external, (proc, errstrings, uistate))
|
||||
return
|
||||
|
||||
def process_pending_events(max_count=10):
|
||||
def process_pending_events(max_count=20):
|
||||
"""
|
||||
Process pending events, but don't get into an infinite loop.
|
||||
"""
|
||||
@@ -549,19 +549,36 @@ def color_graph_box(alive=False, gender=Person.MALE):
|
||||
|
||||
# color functions. For hsv and hls values, use import colorsys !
|
||||
|
||||
def name_to_hex(value):
|
||||
"""
|
||||
Convert a named color to a 6 digit hexadecimal value to rgb.
|
||||
"""
|
||||
if value[:1] != "#":
|
||||
# We have color names like "green", "orange", "yellow",...
|
||||
# We need to convert them to hex format
|
||||
Color = Gdk.RGBA()
|
||||
Color.parse(value)
|
||||
value = "#%02x%02x%02x" % (int(Color.red * 255),
|
||||
int(Color.green * 255),
|
||||
int(Color.blue * 255))
|
||||
return value
|
||||
|
||||
def hex_to_rgb_float(value):
|
||||
"""
|
||||
Convert a hexademical value #FF00FF to rgb. Returns tuple of float between
|
||||
0 and 1
|
||||
Convert a 6 or 12 digit hexademical value to rgb. Returns tuple of floats
|
||||
between 0 and 1.
|
||||
"""
|
||||
value = name_to_hex(value)
|
||||
value = value.lstrip('#')
|
||||
lenv = len(value)
|
||||
return tuple(int(value[i:i+lenv//3], 16)/256.0 for i in range(0, lenv, lenv//3))
|
||||
return tuple(int(value[i:i+lenv//3], 16)/16.0**(lenv//3)
|
||||
for i in range(0, lenv, lenv//3))
|
||||
|
||||
def hex_to_rgb(value):
|
||||
"""
|
||||
Convert a hexadecimal value #FF00FF to rgb. Returns tuple of integers
|
||||
Convert a 6 or 12 digit hexadecimal value to rgb. Returns tuple of integers.
|
||||
"""
|
||||
value = name_to_hex(value)
|
||||
value = value.lstrip('#')
|
||||
lenv = len(value)
|
||||
return tuple(int(value[i:i+lenv//3], 16) for i in range(0, lenv, lenv//3))
|
||||
|
||||
@@ -56,6 +56,7 @@ LOG = logging.getLogger(".")
|
||||
#-------------------------------------------------------------------------
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
from gi.repository import GLib
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -273,13 +274,13 @@ class ViewManager(CLIManager):
|
||||
Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.MOD1_MASK)
|
||||
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
|
||||
self.window.add(vbox)
|
||||
hpane = Gtk.Paned()
|
||||
self.hpane = Gtk.Paned()
|
||||
self.ebox = Gtk.EventBox()
|
||||
|
||||
self.navigator = Navigator(self)
|
||||
self.ebox.add(self.navigator.get_top())
|
||||
hpane.pack1(self.ebox, False, False)
|
||||
hpane.show()
|
||||
self.hpane.pack1(self.ebox, False, False)
|
||||
self.hpane.show()
|
||||
|
||||
self.notebook = Gtk.Notebook()
|
||||
self.notebook.set_scrollable(True)
|
||||
@@ -288,13 +289,14 @@ class ViewManager(CLIManager):
|
||||
self.__init_lists()
|
||||
self.__build_ui_manager()
|
||||
|
||||
hpane.add2(self.notebook)
|
||||
self.hpane.add2(self.notebook)
|
||||
toolbar = self.uimanager.get_widget('ToolBar')
|
||||
toolbar.show_all()
|
||||
self.statusbar = Statusbar()
|
||||
self.statusbar.show()
|
||||
vbox.pack_end(self.statusbar, False, True, 0)
|
||||
vbox.pack_start(toolbar, False, True, 0)
|
||||
vbox.pack_end(hpane, True, True, 0)
|
||||
vbox.pack_end(self.hpane, True, True, 0)
|
||||
vbox.show()
|
||||
|
||||
self.uistate = DisplayState(self.window, self.statusbar,
|
||||
@@ -784,7 +786,12 @@ class ViewManager(CLIManager):
|
||||
self.__create_page(page_def[0], page_def[1])
|
||||
|
||||
self.notebook.set_current_page(page_num)
|
||||
return self.pages[page_num]
|
||||
try:
|
||||
return self.pages[page_num]
|
||||
except IndexError:
|
||||
# The following is to avoid 'IndexError: list index out of range'
|
||||
# Should solve bug 12636
|
||||
return self.pages[0]
|
||||
|
||||
def get_category(self, cat_name):
|
||||
"""
|
||||
@@ -835,6 +842,8 @@ class ViewManager(CLIManager):
|
||||
hbox.add(Gtk.Label(label=pdata.name))
|
||||
hbox.show_all()
|
||||
page_num = self.notebook.append_page(page.get_display(), hbox)
|
||||
if self.active_page:
|
||||
self.active_page.post_create()
|
||||
if not self.file_loaded:
|
||||
self.uimanager.set_actions_visible(self.actiongroup, False)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, False)
|
||||
@@ -875,23 +884,30 @@ class ViewManager(CLIManager):
|
||||
"""
|
||||
Perform necessary actions when a page is changed.
|
||||
"""
|
||||
if not self.dbstate.is_open():
|
||||
return
|
||||
|
||||
self.__disconnect_previous_page()
|
||||
|
||||
self.active_page = self.pages[page_num]
|
||||
# The following is to avoid 'IndexError: list index out of range'
|
||||
# Bugs: 12304, 12429, 12623, 12695
|
||||
try:
|
||||
self.active_page = self.pages[page_num]
|
||||
except IndexError:
|
||||
self.active_page = self.pages[0]
|
||||
self.__connect_active_page(page_num)
|
||||
self.active_page.set_active()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
self.uimanager.update_menu()
|
||||
# bug 12048 this avoids crash if part of toolbar in view is not shown
|
||||
# because of a small screen when changing views. Part of the Gtk code
|
||||
# was deleting a toolbar object too soon; and another part of Gtk still
|
||||
# had a reference.
|
||||
def page_changer(self):
|
||||
self.uimanager.update_menu()
|
||||
self.active_page.change_page()
|
||||
return False
|
||||
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
self.active_page.change_page()
|
||||
GLib.idle_add(page_changer, self,
|
||||
priority=GLib.PRIORITY_DEFAULT_IDLE - 10)
|
||||
|
||||
def __delete_pages(self):
|
||||
"""
|
||||
@@ -961,8 +977,7 @@ class ViewManager(CLIManager):
|
||||
self.dbstate.db.close(user=self.user)
|
||||
(filename, title) = value
|
||||
self.db_loader.read_file(filename)
|
||||
if self.dbstate.db.is_open():
|
||||
self._post_load_newdb(filename, 'x-directory/normal', title)
|
||||
self._post_load_newdb(filename, 'x-directory/normal', title)
|
||||
else:
|
||||
if dialog.after_change != "":
|
||||
# We change the title of the main window.
|
||||
@@ -997,7 +1012,8 @@ class ViewManager(CLIManager):
|
||||
The method called after load of a new database.
|
||||
Inherit CLI method to add GUI part
|
||||
"""
|
||||
self._post_load_newdb_nongui(filename, title)
|
||||
if self.dbstate.db.is_open():
|
||||
self._post_load_newdb_nongui(filename, title)
|
||||
self._post_load_newdb_gui(filename, filetype, title)
|
||||
|
||||
def _post_load_newdb_gui(self, filename, filetype, title=None):
|
||||
@@ -1012,11 +1028,16 @@ class ViewManager(CLIManager):
|
||||
if title:
|
||||
name = title
|
||||
|
||||
rw = not self.dbstate.db.readonly
|
||||
if rw:
|
||||
msg = "%s - Gramps" % name
|
||||
isopen = self.dbstate.is_open()
|
||||
if not isopen:
|
||||
rw = False
|
||||
msg = "Gramps"
|
||||
else:
|
||||
msg = "%s (%s) - Gramps" % (name, _('Read Only'))
|
||||
rw = not self.dbstate.db.readonly
|
||||
if rw:
|
||||
msg = "%s - Gramps" % name
|
||||
else:
|
||||
msg = "%s (%s) - Gramps" % (name, _('Read Only'))
|
||||
self.uistate.window.set_title(msg)
|
||||
|
||||
if(bool(config.get('behavior.runcheck')) and QuestionDialog2(
|
||||
@@ -1035,7 +1056,7 @@ class ViewManager(CLIManager):
|
||||
config.set('behavior.runcheck', False)
|
||||
self.__change_page(self.notebook.get_current_page())
|
||||
self.uimanager.set_actions_visible(self.actiongroup, rw)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, True)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, isopen)
|
||||
self.uimanager.set_actions_visible(self.undoactions, rw)
|
||||
self.uimanager.set_actions_visible(self.redoactions, rw)
|
||||
|
||||
@@ -1060,51 +1081,6 @@ class ViewManager(CLIManager):
|
||||
config.set('paths.recent-file', '')
|
||||
config.save()
|
||||
|
||||
def enable_menu(self, enable):
|
||||
""" Enable/disable the menues. Used by the dbloader for import to
|
||||
prevent other operations during import. Needed because simpler methods
|
||||
don't work under Gnome with application menus at top of screen (instead
|
||||
of Gramps window).
|
||||
Note: enable must be set to False on first call.
|
||||
"""
|
||||
if not enable:
|
||||
self.action_st = (
|
||||
self.uimanager.get_actions_sensitive(self.actiongroup),
|
||||
self.uimanager.get_actions_sensitive(self.readonlygroup),
|
||||
self.uimanager.get_actions_sensitive(self.undoactions),
|
||||
self.uimanager.get_actions_sensitive(self.redoactions),
|
||||
self.uimanager.get_actions_sensitive(self.fileactions),
|
||||
self.uimanager.get_actions_sensitive(self.toolactions),
|
||||
self.uimanager.get_actions_sensitive(self.reportactions),
|
||||
self.uimanager.get_actions_sensitive(
|
||||
self.recent_manager.action_group))
|
||||
self.uimanager.set_actions_sensitive(self.actiongroup, enable)
|
||||
self.uimanager.set_actions_sensitive(self.readonlygroup, enable)
|
||||
self.uimanager.set_actions_sensitive(self.undoactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.redoactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.fileactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.toolactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.reportactions, enable)
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.recent_manager.action_group, enable)
|
||||
else:
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.actiongroup, self.action_st[0])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.readonlygroup, self.action_st[1])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.undoactions, self.action_st[2])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.redoactions, self.action_st[3])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.fileactions, self.action_st[4])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.toolactions, self.action_st[5])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.reportactions, self.action_st[6])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.recent_manager.action_group, self.action_st[7])
|
||||
|
||||
def __change_undo_label(self, label, update_menu=True):
|
||||
"""
|
||||
Change the UNDO label
|
||||
|
||||
@@ -321,7 +321,7 @@ class NavigationView(PageView):
|
||||
else:
|
||||
from ..dialog import WarningDialog
|
||||
WarningDialog(_("No Home Person"),
|
||||
_("You need to set a 'default person' to go to. "
|
||||
_("You need to set a 'Home Person' to go to. "
|
||||
"Select the People View, select the person you want as "
|
||||
"'Home Person', then confirm your choice "
|
||||
"via the menu Edit -> Set Home Person."),
|
||||
@@ -434,19 +434,15 @@ class NavigationView(PageView):
|
||||
hobj = self.get_history()
|
||||
menu_len = min(len(items) - 1, MRU_SIZE)
|
||||
|
||||
for index in range(0, menu_len):
|
||||
name, obj = navigation_label(self.dbstate.db, nav_type,
|
||||
items[index])
|
||||
menus += menuitem % (nav_type, index, html.escape(name))
|
||||
self.mru_ui = [MRU_TOP + menus + MRU_BTM]
|
||||
|
||||
mitems = items[-MRU_SIZE - 1:-1] # Ignore current handle
|
||||
mitems.reverse()
|
||||
data = []
|
||||
for index, handle in enumerate(mitems):
|
||||
data.append(('%s%02d'%(nav_type, index),
|
||||
make_callback(hobj.push, handle),
|
||||
"%s%d" % (mod_key(), index)))
|
||||
for index in range(menu_len - 1, -1, -1):
|
||||
name, _obj = navigation_label(self.dbstate.db, nav_type,
|
||||
items[index])
|
||||
menus += menuitem % (nav_type, index, html.escape(name))
|
||||
data.append(('%s%02d' % (nav_type, index),
|
||||
make_callback(hobj.push, items[index]),
|
||||
"%s%d" % (mod_key(), menu_len - 1 - index)))
|
||||
self.mru_ui = [MRU_TOP + menus + MRU_BTM]
|
||||
|
||||
self.mru_action = ActionGroup(name=self.title + '/MRU')
|
||||
self.mru_action.add_actions(data)
|
||||
|
||||
@@ -138,6 +138,7 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
|
||||
self.sidebar = None
|
||||
self.bottombar = None
|
||||
self.widget = None
|
||||
self.vpane = None
|
||||
|
||||
DbGUIElement.__init__(self, dbstate.db)
|
||||
|
||||
@@ -154,18 +155,20 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
|
||||
self.ident + "_bottombar",
|
||||
defaults[1])
|
||||
hpane = Gtk.Paned()
|
||||
vpane = Gtk.Paned(orientation=Gtk.Orientation.VERTICAL)
|
||||
hpane.pack1(vpane, resize=True, shrink=False)
|
||||
self.vpane = Gtk.Paned(orientation=Gtk.Orientation.VERTICAL)
|
||||
hpane.pack1(self.vpane, resize=True, shrink=False)
|
||||
hpane.pack2(self.sidebar, resize=False, shrink=False)
|
||||
hpane.show()
|
||||
vpane.show()
|
||||
self.vpane.show()
|
||||
|
||||
self.widget = self.build_widget()
|
||||
self.widget.show_all()
|
||||
self.widget.set_name('view')
|
||||
vpane.pack1(self.widget, resize=True, shrink=False)
|
||||
vpane.pack2(self.bottombar, resize=False, shrink=True)
|
||||
self._setup_slider_config(vpane, 'vpane.slider-position')
|
||||
self.vpane.pack1(self.widget, resize=True, shrink=False)
|
||||
self.vpane.pack2(self.bottombar, resize=False, shrink=False)
|
||||
self.vpane.show()
|
||||
self._config.register('vpane.slider-position', -1)
|
||||
self.vpane.set_position(self._config.get('vpane.slider-position'))
|
||||
|
||||
self.sidebar_toggled(self.sidebar.get_property('visible'))
|
||||
self.hpane_sig = hpane.connect("draw", self.set_page_slider)
|
||||
@@ -343,6 +346,11 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
|
||||
self.bottombar.set_inactive()
|
||||
self.active = False
|
||||
|
||||
def post_create(self):
|
||||
if self.vpane:
|
||||
self._setup_slider_config(self.vpane, 'vpane.slider-position')
|
||||
self.vpane = None
|
||||
|
||||
@abstractmethod
|
||||
def build_tree(self):
|
||||
"""
|
||||
|
||||
@@ -130,7 +130,8 @@ class EventModel(FlatBaseModel):
|
||||
handle = data[0]
|
||||
cached, value = self.get_cached_value(handle, "PARTICIPANT")
|
||||
if not cached:
|
||||
value = get_participant_from_event(self.db, data[COLUMN_HANDLE])
|
||||
value = get_participant_from_event(self.db, data[COLUMN_HANDLE],
|
||||
all_=True) # all participants
|
||||
self.set_cached_value(handle, "PARTICIPANT", value)
|
||||
return value
|
||||
|
||||
@@ -159,6 +160,8 @@ class EventModel(FlatBaseModel):
|
||||
date_str = get_date(event)
|
||||
if date_str != "":
|
||||
retval = escape(date_str)
|
||||
else:
|
||||
retval = ""
|
||||
if not get_date_valid(event):
|
||||
return INVALID_DATE_FORMAT % retval
|
||||
else:
|
||||
|
||||