Compare commits
173 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 |
@@ -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,402 +1,174 @@
|
||||
2020-08-11 prculley <paulr2787@gmail.com>
|
||||
2023-06-29 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* po/ar.po, po/bg.po, po/br.po, po/ca.po, po/cs.po, po/da.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:
|
||||
Remove duplicates in Translations
|
||||
* docs/conf.py, gramps/gen/const.py: Update copyright date
|
||||
|
||||
2020-08-10 prculley <paulr2787@gmail.com>
|
||||
2023-05-13 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* 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: Clean up translations for Default/Home Person
|
||||
* gramps/plugins/webreport/media.py: Narrative web: problem with
|
||||
small pictures. Fixes #012884
|
||||
|
||||
2020-08-10 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2023-05-09 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* po/de.po: Update German translation
|
||||
* gramps/plugins/view/familyview.py: Implement the "<CTRL>J" for the
|
||||
family view Fixes #012882
|
||||
|
||||
2020-08-10 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
2022-07-11 Jon Schewe <jpschewe@mtu.net>
|
||||
|
||||
* gramps/gui/views/treemodels/eventmodel.py: Events View: "Main
|
||||
Participants" column does not (#1075) show the full list of participants when expanded. Fixes #11805
|
||||
* 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.
|
||||
|
||||
2020-08-10 Paul Culley <paulr2787@gmail.com>
|
||||
2023-05-13 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* po/pl.po: Fix Charts/Pedigreeview tooltip Polish translation
|
||||
(#1092) Fixes #11852
|
||||
* gramps/plugins/export/exportgedcom.py: Fix export where private
|
||||
citations are excluded
|
||||
|
||||
2020-08-10 Krystian Safjan <ksafjan@gmail.com>
|
||||
2022-06-01 prculley <paulr2787@gmail.com>
|
||||
|
||||
* po/gramps.pot, po/pl.po: Fix and add objects to Polish translation
|
||||
of Gramps (#1088)
|
||||
* gramps/plugins/tool/eventcmp.py: Fix Event compare tool to display
|
||||
enclosed places properly
|
||||
|
||||
2020-08-06 John Ralls <jralls@ceridwen.us>
|
||||
2022-06-08 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* mac/gramps.modules: Use current Gtk release instead of Gtk-3.14.
|
||||
* gramps/gui/viewmanager.py: Check that view exists before calling
|
||||
post_create method Avoids 'NoneType' object has no attribute 'post_create' error. Fixes #12638
|
||||
|
||||
2020-08-06 John Ralls <jralls@ceridwen.us>
|
||||
2022-06-15 Jingxuan He <LostBenjamin@users.noreply.github.com>
|
||||
|
||||
* mac/gramps.modules: Upgrade pymodules for Python 3.8
|
||||
compatibility.
|
||||
* gramps/plugins/webreport/webcal.py: Fix a wrong operator bug in
|
||||
the web calendar report
|
||||
|
||||
2020-07-09 prculley <paulr2787@gmail.com>
|
||||
2022-10-08 Himanshu Gohel <1551217+hgohel@users.noreply.github.com>
|
||||
|
||||
* gramps/plugins/export/exportxml.py: Fix XML export when 'Group-as"
|
||||
name contains XML invalid chars Fixes #11834
|
||||
* 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.
|
||||
|
||||
2020-07-08 SNoiraud <serge.noiraud@laposte.net>
|
||||
2022-10-22 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/webreport/basepage.py: NarWeb: Province place-type
|
||||
is not displayed
|
||||
* 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
|
||||
|
||||
2020-07-07 prculley <paulr2787@gmail.com>
|
||||
2022-12-08 GaryGriffin <genealogy@garygriffin.net>
|
||||
|
||||
* gramps/gui/managedwindow.py: Fix ManagedWindow so that new windows
|
||||
don't appear offscreen when system 'screen' sizes change in part
|
||||
time multi-monitor setups. Fixes #11831
|
||||
* 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.
|
||||
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* gramps/gui/viewmanager.py: Fix menus when db fails to open due to
|
||||
upgrade/downgrade etc. Fixes #11604
|
||||
* 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.
|
||||
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
2023-02-12 Vincent Smeets <Vincent.VSmeets@GMail.com>
|
||||
|
||||
* gramps/gui/plug/_windows.py: Fix issue with attach source tool,
|
||||
results panel Fixes #11780
|
||||
* gramps/plugins/docgen/htmldoc.py: HtmlDoc: Create a unique
|
||||
filename for cropped images
|
||||
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
2022-10-24 D.A.Lordemann <LordemannD@gmail.com>
|
||||
|
||||
* gramps/plugins/export/exportgedcom.py: Fix GEDCOM export; don't
|
||||
include ADDR when address is missing Fixes #11825
|
||||
* 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.
|
||||
|
||||
2020-07-02 SNoiraud <serge.noiraud@laposte.net>
|
||||
2022-09-27 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/editors/editplace.py,
|
||||
gramps/gui/editors/editplaceref.py: Coordinates containing a comma
|
||||
instead of a period Fixes #11823
|
||||
* gramps/gui/viewmanager.py: Fix IndexError that sometimes occurs
|
||||
when changing view This occurs when restarting Gramps. Fixes #12636, #12304, #12429, #12623, #12695.
|
||||
|
||||
2020-07-23 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2023-03-18 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* po/de.po: German translation fixed typo
|
||||
* gramps/gen/proxy/referencedbyselection.py,
|
||||
gramps/gui/widgets/styledtexteditor.py,
|
||||
gramps/plugins/lib/libhtmlbackend.py: Fix crash when invalid note
|
||||
link Fixes #012854
|
||||
|
||||
2020-07-17 niememat <niememat@gmail.com>
|
||||
2023-04-17 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* po/fi.po: Update finnish translation
|
||||
* 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
|
||||
|
||||
2020-06-07 Tian Shixiong <tiansworld@fedoraproject.org>
|
||||
2023-04-05 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* po/zh_CN.po: Update Simplified Chinese translation for gramps51
|
||||
branch
|
||||
* gramps/gui/views/treemodels/eventmodel.py: Crash when invalid
|
||||
event date
|
||||
|
||||
2020-07-08 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
2023-04-04 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/webreport/basepage.py,
|
||||
gramps/plugins/webreport/person.py,
|
||||
gramps/plugins/webreport/surname.py: NarrativeWeb should show
|
||||
patronymic in individuals (#1048) In the individuals and in surnames pages, we should show the
|
||||
complete name like defined in the display tab from the narrative web
|
||||
configuration. Fixes #04404
|
||||
* 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
|
||||
|
||||
2020-07-08 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
2023-03-07 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/plugins/webreport/person.py,
|
||||
gramps/plugins/webreport/place.py: Narrated Website Google Maps
|
||||
Output JS Warning (#1038) SensorNotRequired: The sensor parameter is no longer required for
|
||||
the Maps JavaScript API. It won't prevent the Maps JavaScript API
|
||||
from working correctly, but we recommend that you remove the sensor
|
||||
parameter from the script element. Fixes #011654
|
||||
* .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.
|
||||
|
||||
2020-01-11 giansalvo <pioggia3+github@gmail.com>
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* gramps/gen/filters/rules/person/_isdefaultperson.py,
|
||||
gramps/gen/filters/rules/person/_islessthannthgenerationancestorofd
|
||||
efaultperson.py, gramps/gui/views/navigationview.py,
|
||||
gramps/plugins/lib/libpersonview.py,
|
||||
gramps/plugins/view/fanchartview.py,
|
||||
gramps/plugins/view/geoclose.py,
|
||||
gramps/plugins/view/geofamclose.py,
|
||||
gramps/plugins/view/geomoves.py, gramps/plugins/view/geoperson.py,
|
||||
gramps/plugins/view/pedigreeview.py,
|
||||
gramps/plugins/view/relview.py, 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/gramps.pot,
|
||||
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: Fix bug
|
||||
0011078: 'Default person' instead of 'Home person' - modified button hints - modified filter rules names and descriptions - modified .pot and .po files - substituted 'home person' with 'Home Person'
|
||||
* mac/gramps.modules: mac: Patch bsddb to use berkeleydb instead of
|
||||
bsddb3 module.
|
||||
|
||||
2020-07-07 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2022-12-27 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* po/de.po: Germen fixed translation error of Media:
|
||||
* mac/gramps.modules, mac/patches/berkeleydb-4.8-mutex.patch: Mac
|
||||
build: Patch berkeleydb configure to work on Apple Silicon.
|
||||
|
||||
2020-07-04 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2022-12-26 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* po/de.po: Fix typo
|
||||
* mac/gramps.modules: [mac] Update Exiv2 download URL, moved to
|
||||
github.
|
||||
|
||||
2020-07-01 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2022-12-24 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* po/de.po: update German translation
|
||||
* mac/Info.plist, mac/gramps.bundle, mac/gramps.modules: Repackage
|
||||
Gramps 5.1.5 with Gtk updates fixing use on macOS 13 Ventura.
|
||||
|
||||
2020-02-16 Nick Hall <nick-h@gramps-project.org>
|
||||
2022-03-08 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gui/editors/editeventref.py: 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. Fixes #11576.
|
||||
* gramps/plugins/lib/librecords.py: Fix spouse's name and underlined
|
||||
call names in records Fixes #12391
|
||||
|
||||
2020-04-23 SNoiraud <serge.noiraud@laposte.net>
|
||||
2022-03-16 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gui/configure.py, 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: Fix typo in gui/configure.py
|
||||
and translation files Fixes #11665
|
||||
* .github/workflows/gramps-ci.yml: Fix package installation failures
|
||||
in CI
|
||||
|
||||
2020-05-07 prculley <paulr2787@gmail.com>
|
||||
2019-12-09 Sam Manzi <manzi.sam@gmail.com>
|
||||
|
||||
* gramps/plugins/tool/verify.py: Fix Verify tool bug caused by bad
|
||||
change in GObject introspection Fixes: #11708
|
||||
* gramps/gen/utils/grampslocale.py: Update INCOMPLETE_TRANSLATIONS * Remove: he * Add: zh_HK, zh_TW
|
||||
|
||||
2020-06-22 pehlm <par.ekholm@pekholm.org>
|
||||
2022-02-12 Ross Gammon <rossgammon@debian.org>
|
||||
|
||||
* po/sv.po: A little adjustment to Swedish translation
|
||||
* debian/changelog, debian/copyright,
|
||||
debian/patches/fix-probably_alive_test.patch, debian/patches/series:
|
||||
Update Debian folder after 5.1.5 release
|
||||
|
||||
2020-06-21 pehlm <par.ekholm@pekholm.org>
|
||||
2022-02-05 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* po/sv.po: Updates to Swedish translation
|
||||
* mac/Info.plist, mac/gramps.modules: Package Gramps 5.1.5 for
|
||||
macOS.
|
||||
|
||||
2020-06-20 Nick Hall <nick-h@gramps-project.org>
|
||||
2022-02-05 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gen/utils/grampslocale.py: Remove Japanese from the
|
||||
incomplete translations Japanese now has a coverage of 83.2% which is above the 70%
|
||||
threshold.
|
||||
|
||||
2020-06-20 Megumi Sakata <megumi.sakata.k@gmail.com>
|
||||
|
||||
* po/ja.po: Update Japanese translation
|
||||
|
||||
2020-06-07 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/webreport/person.py,
|
||||
gramps/plugins/webreport/place.py: Navweb: incorrect link type for
|
||||
osm css files (#1071) Fixes #011787
|
||||
|
||||
2020-06-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* data/tests/imp_sample.gramps: Fix import test for change cause by
|
||||
commit a2c66417 which was Fix GEDCOM import for bad source title
|
||||
when sources precede references.
|
||||
|
||||
2020-06-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* : commit e614a79cef213f57552ceb566eb2d294c9435231 Author: vantu5z
|
||||
<vantu5z@mail.ru> Date: Tue Apr 28 15:23:25 2020 +0300
|
||||
|
||||
2020-03-16 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/plug/menu/_enumeratedlist.py: Fix some reports for CLI
|
||||
where warning message about Value not found Fixes #11621
|
||||
|
||||
2020-03-16 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/cli/plug/__init__.py: Fix Genealogy Tree reports for crash
|
||||
in CLI Fixes #11621
|
||||
|
||||
2020-04-10 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/views/treemodels/treebasemodel.py: Add uistate to tree
|
||||
views filter initialization Fixes #11657
|
||||
|
||||
2020-04-04 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/plugins/lib/libgedcom.py: Fix GEDCOM import for bad source
|
||||
title when sources precede references. Fixes #11610
|
||||
|
||||
2020-03-31 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/plugins/tool/removeunused.py: Fix RemoveUnused tool for
|
||||
crash caused by Gtk introspection bug Fixes #11634
|
||||
|
||||
2020-03-30 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/plug/_manager.py, gramps/gen/plug/_pluginreg.py,
|
||||
gramps/gui/pluginmanager.py,
|
||||
gramps/plugins/lib/maps/messagelayer.py: Fix some Python syntax
|
||||
errors that appear in v3.8.x Fixes #11641
|
||||
|
||||
2020-03-26 SNoiraud <serge.noiraud@laposte.net>
|
||||
|
||||
* gramps/gui/editors/displaytabs/eventrefmodel.py,
|
||||
gramps/plugins/gramplet/events.py: Age: test if the death is the
|
||||
same day as birth
|
||||
|
||||
2020-03-25 SNoiraud <serge.noiraud@laposte.net>
|
||||
|
||||
* gramps/gui/editors/displaytabs/eventrefmodel.py,
|
||||
gramps/plugins/gramplet/events.py: 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, ... Fixes #0007745
|
||||
|
||||
2020-03-23 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/viewmanager.py: Fix Dashboard Gramplets to update
|
||||
during db close when not shown Fixes #11632
|
||||
|
||||
2020-03-14 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/grampsapp.py: Fix Windows GUI mode startup for crash with
|
||||
some languages Fixes: #11612. #11490, #11518, #9179, #9201, #9266
|
||||
|
||||
2020-03-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/db/generic.py, gramps/plugins/db/dbapi/dbapi.py: Fix
|
||||
dbapi to support "Abandon Changes & Quit" feature Fixes #11599
|
||||
|
||||
2020-02-08 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/lib/grampstype.py: Fix GrampsType for comparison bug
|
||||
with empty string as one value Fixes #11563
|
||||
|
||||
2020-05-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/plugins/tool/verify.py: Fix Verify tool bug caused by bad
|
||||
change in GObject introspection Fixes: #11708
|
||||
|
||||
2020-04-24 niememat <niememat@gmail.com>
|
||||
|
||||
* po/fi.po: Fix translation in Finnish
|
||||
|
||||
2020-04-18 Joan Creus <joan.creusandreu@gmail.com>
|
||||
|
||||
* po/ca.po: Updating Catalan translation
|
||||
|
||||
2020-04-18 Joan Creus <joan.creusandreu@gmail.com>
|
||||
|
||||
* po/ca.po: Updating Catalan translation
|
||||
|
||||
2020-01-20 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/datehandler/__init__.py: Fix Date Display so that it
|
||||
uses LC_TIME if defined Fixes #11230
|
||||
|
||||
2020-01-12 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/lib/styledtext.py,
|
||||
gramps/gen/lib/test/styledtext_test.py: Fix StyledText so serialize
|
||||
will match for style list order changes Fixes #11529
|
||||
|
||||
2020-01-08 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/managedwindow.py: Try to fix exceptions on
|
||||
ManagedWindow close Issues #10252, #10642, #10821, #11163, #11440, #11476, #11482,
|
||||
#11508
|
||||
|
||||
2020-04-08 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* : Merge John Ralls's 'bug11639' into maintenance/gramps51
|
||||
|
||||
2020-04-04 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/tool/verify.py: Same date of birth and death gives
|
||||
an error. (#1011) Fixes #011553
|
||||
|
||||
2020-04-04 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/lib/maps/osmgps.py: Geography: add a popup for a
|
||||
bad tiles path (#1025)
|
||||
|
||||
2020-04-04 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/webreport/narrativeweb.py: Narweb: image size limit
|
||||
doesn't match tooltip (#1004) Fixes #011536
|
||||
|
||||
2020-04-01 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* gramps/plugins/db/dbapi/sqlite.py: Protect SQLite3 locale from
|
||||
old-style Unicode locale characters. PySQLite3 requires that collation names have only ascii
|
||||
alphanumerics and _. ICU locales use old-style Unicode specifiers
|
||||
and passing them to create_locale will raise an exception. Translate
|
||||
those characters into underscores. Fixes #11639
|
||||
|
||||
2020-03-26 vantu5z <vantu5z@mail.ru>
|
||||
|
||||
* po/ru.po: update Russian translation
|
||||
|
||||
2020-03-25 Translator5 <Translator5@users.noreply.github.com>
|
||||
|
||||
* po/ru.po: [Language: Russian] Maintenance/gramps51 (#1027) * some Russian translations updates Новый перевод для неких случаев, но
|
||||
улучшающие понимание и выглядит
|
||||
более уместно. Также применены
|
||||
русские переводы слов, которые
|
||||
использовали до того англицизмы
|
||||
|
||||
2020-03-03 Joan Creus <joan.creusandreu@gmail.com>
|
||||
|
||||
* po/ca.po: Updating Catalan translation
|
||||
|
||||
2020-02-29 Joan Creus <joan.creusandreu@gmail.com>
|
||||
|
||||
* po/ca.po: Updating Catalan translation
|
||||
|
||||
2020-02-25 Bernard Banko <beernarrd@gmail.com>
|
||||
|
||||
* po/sl.po: V&O changed to PZV to avoid ampersand
|
||||
|
||||
2020-02-07 pehlm <par.ekholm@pekholm.org>
|
||||
|
||||
* po/sv.po: Minor update to Swedish translation
|
||||
|
||||
2020-01-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* data/tests/exp_sample_ged.ged,
|
||||
gramps/plugins/export/exportgedcom.py: Fix GEDCOM export of
|
||||
estimated/calculated dates with modifers Fixes #11513
|
||||
|
||||
2020-01-11 Ross Gammon <rossgammon@mail.dk>
|
||||
|
||||
* debian/changelog: New debian release - update changelog
|
||||
|
||||
2020-01-31 vantu5z <vantu5z@mail.ru>
|
||||
|
||||
* po/ru.po: update Russian translation
|
||||
|
||||
2020-01-26 Bernard Banko <beernarrd@gmail.com>
|
||||
|
||||
* po/sl.po: Slovenian translation update
|
||||
|
||||
2020-01-23 prculley <paulr2787@gmail.com>
|
||||
|
||||
* po/ru.po: Fix typo in Russian translation
|
||||
|
||||
2020-01-21 système <romjerome@users.noreply.github.com>
|
||||
|
||||
* po/fr.po: typos in french translation #11534 #10534
|
||||
|
||||
2020-01-21 Fedik <getthesite@gmail.com>
|
||||
|
||||
* po/uk.po: Ukrainian translation update
|
||||
|
||||
2020-01-11 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* mac/Info.plist, mac/gramps.modules: Mac release of 5.1.2.
|
||||
|
||||
2020-01-10 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/const.py, gramps/gui/grampsgui.py, gramps/version.py:
|
||||
Bump to v5.1.3
|
||||
* Bump to 5.1.6
|
||||
|
||||
|
||||
@@ -1,3 +1,155 @@
|
||||
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
|
||||
@@ -94,7 +246,7 @@ Version 5.1.2
|
||||
* [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 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
|
||||
|
||||
@@ -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 |
@@ -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>
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -225,7 +225,7 @@ GTK_GETTEXT_DOMAIN = 'gtk30'
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
|
||||
"© 2007-2020 The Gramps Developers"
|
||||
"© 2007-2023 The Gramps Developers"
|
||||
COMMENTS = _("Gramps\n (Genealogical Research and Analysis "
|
||||
"Management Programming System)\n"
|
||||
"is a personal genealogy program.")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() """
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
@@ -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', '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'),
|
||||
|
||||
@@ -127,15 +127,32 @@ if win():
|
||||
elif not os.path.isdir(HOME_DIR):
|
||||
os.makedirs(HOME_DIR)
|
||||
sys.stdout = sys.stderr = open(logfile, "w", encoding='utf-8')
|
||||
stderrh = logging.StreamHandler(sys.stderr)
|
||||
stderrh.setFormatter(form)
|
||||
stderrh.setLevel(logging.DEBUG)
|
||||
# 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):
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -532,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:
|
||||
@@ -548,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()
|
||||
@@ -569,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)
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -186,10 +186,41 @@ class EditPlace(EditPrimary):
|
||||
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(', ')
|
||||
longitude = value[coma+2:].strip().replace(',','.')
|
||||
latitude = value[:coma].strip().replace(',','.')
|
||||
# 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)
|
||||
|
||||
@@ -180,9 +180,14 @@ class EditPlaceRef(EditReference):
|
||||
|
||||
def set_latlongitude(self, value):
|
||||
try:
|
||||
coma = value.index(', ')
|
||||
longitude = value[coma+2:].strip().replace(',','.')
|
||||
latitude = value[:coma].strip().replace(',','.')
|
||||
# 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,11 +549,26 @@ 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 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)/16.0**(lenv//3)
|
||||
@@ -563,6 +578,7 @@ def hex_to_rgb(value):
|
||||
"""
|
||||
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)
|
||||
@@ -877,18 +886,28 @@ class ViewManager(CLIManager):
|
||||
"""
|
||||
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):
|
||||
"""
|
||||
@@ -993,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):
|
||||
@@ -1061,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
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -160,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:
|
||||
|
||||
@@ -371,10 +371,6 @@ class GrampletBar(Gtk.Notebook):
|
||||
"""
|
||||
Add a tab to the notebook for the given gramplet.
|
||||
"""
|
||||
width = -1 # Allow tab width to adjust (smaller) to sidebar
|
||||
height = min(int(self.uistate.screen_height() * 0.20), 400)
|
||||
gramplet.set_size_request(width, height)
|
||||
|
||||
label = self.__create_tab_label(gramplet)
|
||||
page_num = self.append_page(gramplet, label)
|
||||
return page_num
|
||||
|
||||
@@ -1239,6 +1239,12 @@ class GrampletPane(Gtk.ScrolledWindow):
|
||||
else:
|
||||
cnt = 0
|
||||
for item in base_opts["data"]:
|
||||
# If we have a "%" in a string,
|
||||
# escape it by writing "%%"
|
||||
# to avoid InterpolationSyntaxError
|
||||
# in python configparser module.
|
||||
if isinstance(item, str):
|
||||
item = item.replace("%", "%%")
|
||||
fp.write("data[%d]=%s\n" % (cnt, item))
|
||||
cnt += 1
|
||||
else:
|
||||
|
||||
@@ -396,7 +396,7 @@ class StyledTextEditor(Gtk.TextView):
|
||||
simple_access = SimpleAccess(win_obj.dbstate.db)
|
||||
url = link_tag.data
|
||||
if url.startswith("gramps://"):
|
||||
obj_class, prop, value = url[9:].split("/")
|
||||
obj_class, prop, value = url[9:].split("/", 2)
|
||||
display = simple_access.display(obj_class, prop, value) or url
|
||||
return display + ((_("\nCommand-Click to follow link") if mac() else
|
||||
_("\nCtrl-Click to follow link"))
|
||||
@@ -809,7 +809,7 @@ class StyledTextEditor(Gtk.TextView):
|
||||
win_obj = find_parent_with_attr(self, attr="dbstate")
|
||||
if win_obj:
|
||||
# Edit the object:
|
||||
obj_class, prop, value = url[9:].split("/")
|
||||
obj_class, prop, value = url[9:].split("/", 2)
|
||||
from ..editors import EditObject
|
||||
EditObject(win_obj.dbstate,
|
||||
win_obj.uistate,
|
||||
|
||||
@@ -29,7 +29,6 @@ BSDDBTxn class: Wrapper for BSDDB transaction-oriented methods
|
||||
#-------------------------------------------------------------------------
|
||||
import logging
|
||||
import inspect
|
||||
import os
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -73,14 +72,13 @@ class BSDDBTxn:
|
||||
"""
|
||||
# Conditional on __debug__ because all that frame stuff may be slow
|
||||
if __debug__:
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
_LOG.debug(" BSDDBTxn %s instantiated. Called from file %s,"
|
||||
" line %s, in %s" %
|
||||
((hex(id(self)),)+
|
||||
(os.path.split(caller_frame[1])[1],)+
|
||||
(tuple(caller_frame[i] for i in range(2, 4)))
|
||||
)
|
||||
)
|
||||
" line %s, in %s", hex(id(self)), c_code.co_filename,
|
||||
c_frame.f_lineno, c_code.co_name)
|
||||
|
||||
self.env = env
|
||||
self.db = db
|
||||
self.txn = None
|
||||
@@ -220,7 +218,10 @@ class BSDDBTxn:
|
||||
# test code
|
||||
if __name__ == "__main__":
|
||||
print("1")
|
||||
from bsddb3 import db, dbshelve
|
||||
try:
|
||||
from bsddb3 import db, dbshelve
|
||||
except:
|
||||
from berkeleydb import db, dbshelve
|
||||
print("2")
|
||||
x = db.DBEnv()
|
||||
print("3")
|
||||
|
||||
@@ -29,14 +29,17 @@ from pickle import dumps, loads
|
||||
try:
|
||||
from bsddb3 import db
|
||||
except:
|
||||
try:
|
||||
from berkeleydb import db
|
||||
except:
|
||||
# FIXME: make this more abstract to deal with other backends
|
||||
class db:
|
||||
DB_RMW = 0
|
||||
DB_FIRST = 0
|
||||
DB_LAST = 0
|
||||
DB_CURRENT = 0
|
||||
DB_PREV = 0
|
||||
DB_NEXT = 0
|
||||
class db:
|
||||
DB_RMW = 0
|
||||
DB_FIRST = 0
|
||||
DB_LAST = 0
|
||||
DB_CURRENT = 0
|
||||
DB_PREV = 0
|
||||
DB_NEXT = 0
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -41,12 +41,15 @@ from functools import partial
|
||||
try:
|
||||
from bsddb3 import db
|
||||
except:
|
||||
# FIXME: make this more abstract to deal with other backends
|
||||
class db:
|
||||
DBRunRecoveryError = 0
|
||||
DBAccessError = 0
|
||||
DBPageNotFoundError = 0
|
||||
DBInvalidArgError = 0
|
||||
try:
|
||||
from berkeleydb import db
|
||||
except:
|
||||
# FIXME: make this more abstract to deal with other backends
|
||||
class db:
|
||||
DBRunRecoveryError = 0
|
||||
DBAccessError = 0
|
||||
DBPageNotFoundError = 0
|
||||
DBInvalidArgError = 0
|
||||
|
||||
import re
|
||||
import logging
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
## specific to bsddb
|
||||
|
||||
import os
|
||||
from bsddb3 import dbshelve, db
|
||||
|
||||
try:
|
||||
from bsddb3 import dbshelve, db
|
||||
except:
|
||||
from berkeleydb import db, dbshelve
|
||||
from gramps.gen.db import META, PERSON_TBL
|
||||
from gramps.gen.db.dbconst import BDBVERSFN
|
||||
|
||||
|
||||
@@ -23,8 +23,10 @@ import os
|
||||
import tempfile
|
||||
import shutil
|
||||
|
||||
from bsddb3 import dbshelve, db
|
||||
|
||||
try:
|
||||
from bsddb3 import dbshelve, db
|
||||
except:
|
||||
from berkeleydb import db, dbshelve
|
||||
from ..read import DbBsddbTreeCursor
|
||||
|
||||
class Data:
|
||||
|
||||
@@ -36,12 +36,15 @@ from collections import deque
|
||||
try:
|
||||
from bsddb3 import db
|
||||
except:
|
||||
try:
|
||||
from berkeleydb import db
|
||||
except:
|
||||
# FIXME: make this more abstract to deal with other backends
|
||||
class db:
|
||||
DBRunRecoveryError = 0
|
||||
DBAccessError = 0
|
||||
DBPageNotFoundError = 0
|
||||
DBInvalidArgError = 0
|
||||
class db:
|
||||
DBRunRecoveryError = 0
|
||||
DBAccessError = 0
|
||||
DBPageNotFoundError = 0
|
||||
DBInvalidArgError = 0
|
||||
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
|
||||
@@ -32,8 +32,10 @@ import os
|
||||
import re
|
||||
import time
|
||||
import logging
|
||||
from bsddb3 import db
|
||||
|
||||
try:
|
||||
from bsddb3 import db
|
||||
except:
|
||||
from berkeleydb import db
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
|
||||
@@ -40,8 +40,14 @@ import logging
|
||||
from sys import maxsize, getfilesystemencoding, version_info
|
||||
from ast import literal_eval as safe_eval
|
||||
|
||||
from bsddb3 import dbshelve, db
|
||||
from bsddb3.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY
|
||||
try:
|
||||
from bsddb3 import dbshelve, db
|
||||
except:
|
||||
from berkeleydb import db, dbshelve
|
||||
try:
|
||||
from bsddb3.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY
|
||||
except:
|
||||
from berkeleydb.db import DB_CREATE, DB_AUTO_COMMIT, DB_DUP, DB_DUPSORT, DB_RDONLY
|
||||
|
||||
DBFLAGS_O = DB_CREATE | DB_AUTO_COMMIT # Default flags for database open
|
||||
DBFLAGS_R = DB_RDONLY # Flags to open a database read-only
|
||||
|
||||
@@ -224,6 +224,16 @@ class DBAPI(DbGeneric):
|
||||
if self.transaction == None:
|
||||
self.dbapi.rollback()
|
||||
|
||||
def _collation(self, locale):
|
||||
"""
|
||||
Get the adjusted collation if there is one, falling back on
|
||||
the locale.collation.
|
||||
"""
|
||||
collation = self.dbapi.check_collation(locale)
|
||||
if collation == None:
|
||||
return locale.get_collation()
|
||||
return collation
|
||||
|
||||
def transaction_begin(self, transaction):
|
||||
"""
|
||||
Transactions are handled automatically by the db layer.
|
||||
@@ -364,12 +374,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM person '
|
||||
'ORDER BY surname '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM person")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -386,9 +393,6 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
sql = ('SELECT family.handle ' +
|
||||
'FROM family ' +
|
||||
'LEFT JOIN person AS father ' +
|
||||
@@ -403,7 +407,7 @@ class DBAPI(DbGeneric):
|
||||
'THEN mother.given_name ' +
|
||||
'ELSE father.given_name ' +
|
||||
'END) ' +
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
self.dbapi.execute(sql)
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM family")
|
||||
@@ -430,12 +434,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM citation '
|
||||
'ORDER BY page '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM citation")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -452,12 +453,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM source '
|
||||
'ORDER BY title '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle from source")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -474,12 +472,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM place '
|
||||
'ORDER BY title '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM place")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -505,12 +500,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM media '
|
||||
'ORDER BY desc '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM media")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -536,12 +528,9 @@ class DBAPI(DbGeneric):
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if sort_handles:
|
||||
if locale != glocale:
|
||||
self.dbapi.check_collation(locale)
|
||||
|
||||
self.dbapi.execute('SELECT handle FROM tag '
|
||||
'ORDER BY name '
|
||||
'COLLATE "%s"' % locale.get_collation())
|
||||
'COLLATE "%s"' % self._collation(locale))
|
||||
else:
|
||||
self.dbapi.execute("SELECT handle FROM tag")
|
||||
rows = self.dbapi.fetchall()
|
||||
@@ -588,12 +577,13 @@ class DBAPI(DbGeneric):
|
||||
"WHERE name = ?", [grouping, name])
|
||||
elif row and grouping is None:
|
||||
self.dbapi.execute("DELETE FROM name_group WHERE name = ?", [name])
|
||||
grouping = ''
|
||||
else:
|
||||
self.dbapi.execute(
|
||||
"INSERT INTO name_group (name, grouping) VALUES (?, ?)",
|
||||
[name, grouping])
|
||||
self._txn_commit()
|
||||
if grouping is None:
|
||||
grouping = ''
|
||||
self.emit('person-groupname-rebuild', (name, grouping))
|
||||
|
||||
def _commit_base(self, obj, obj_key, trans, change_time):
|
||||
|
||||
@@ -117,6 +117,8 @@ class Connection:
|
||||
collation = locale.get_collation().translate(self.__tmap)
|
||||
if collation not in self.__collations:
|
||||
self.__connection.create_collation(collation, locale.strcoll)
|
||||
self.__collations.append(collation)
|
||||
return collation
|
||||
|
||||
def execute(self, *args, **kwargs):
|
||||
"""
|
||||
|
||||
@@ -556,7 +556,10 @@ class HtmlDoc(BaseDoc, TextDoc):
|
||||
"""
|
||||
self._empty = 0
|
||||
size = int(max(w_cm, h_cm) * float(150.0/2.54))
|
||||
refname = "is%s" % os.path.basename(name)
|
||||
if crop:
|
||||
refname = "is-%d-%d-%d-%d-%s" % (crop[0], crop[1], crop[2], crop[3], os.path.basename(name))
|
||||
else:
|
||||
refname = "is%s" % os.path.basename(name)
|
||||
|
||||
imdir = self._backend.datadirfull()
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ SVG document generator.
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from io import StringIO
|
||||
|
||||
from xml.sax.saxutils import escape
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
@@ -147,7 +147,7 @@ class SvgDrawDoc(BaseDoc, DrawDoc):
|
||||
linex = xpos + (width - self.string_width(font, line)) / 2
|
||||
self.buffer.write(
|
||||
'<tspan x="%4.2f" dy="%d">' % (linex, size) +
|
||||
line +
|
||||
escape(line) +
|
||||
'</tspan>'
|
||||
)
|
||||
self.buffer.write('</text>\n')
|
||||
@@ -273,7 +273,7 @@ class SvgDrawDoc(BaseDoc, DrawDoc):
|
||||
self.buffer.write(' font-family:serif;')
|
||||
self.buffer.write(
|
||||
'">' +
|
||||
line +
|
||||
escape(line) +
|
||||
'</text>\n'
|
||||
)
|
||||
|
||||
@@ -307,7 +307,7 @@ class SvgDrawDoc(BaseDoc, DrawDoc):
|
||||
self.buffer.write('font-family:serif;')
|
||||
self.buffer.write(
|
||||
'">' +
|
||||
text +
|
||||
escape(text) +
|
||||
'</text>\n'
|
||||
)
|
||||
|
||||
|
||||
@@ -267,7 +267,8 @@ class Calendar(Report):
|
||||
day_col * cell_width + cell_width/2,
|
||||
header + week_row * cell_height)
|
||||
list_ = self.calendar.get(month, {}).get(thisday.day, [])
|
||||
list_.sort() # to get CAL-Holiday on bottom
|
||||
# sort the list to get CAL-Holiday on bottom
|
||||
list_.sort(key=lambda x: (x[0], x[1]))
|
||||
position = spacing
|
||||
for (format, p, m_list) in list_:
|
||||
for line in reversed(p.split("\n")):
|
||||
|
||||
@@ -160,10 +160,9 @@ def breakup(txt, limit):
|
||||
data = []
|
||||
while len(txt) > limit:
|
||||
# look for non-space pair to break between
|
||||
# do not break within a UTF-8 byte sequence, i. e. first char >127
|
||||
# fix issue #0012709 by removing Python2 code obsoleted by Python3
|
||||
idx = limit
|
||||
while (idx > 0 and (txt[idx - 1].isspace() or txt[idx].isspace() or
|
||||
ord(txt[idx - 1]) > 127)):
|
||||
while (idx > 0 and (txt[idx - 1].isspace() or txt[idx].isspace())):
|
||||
idx -= 1
|
||||
if idx == 0:
|
||||
#no words to break on, just break at limit anyway
|
||||
@@ -1344,6 +1343,8 @@ class GedcomWriter(UpdateCallback):
|
||||
"""
|
||||
|
||||
citation = self.dbase.get_citation_from_handle(citation_handle)
|
||||
if citation is None: # removed by proxy
|
||||
return
|
||||
|
||||
src_handle = citation.get_reference_handle()
|
||||
if src_handle is None:
|
||||
|
||||
@@ -202,7 +202,7 @@ class CalendarWriter:
|
||||
date = event.get_date_object()
|
||||
place_handle = event.get_place_handle()
|
||||
date_string = self.format_date(date, 1)
|
||||
if date_string is not "":
|
||||
if date_string != "":
|
||||
# self.writeln("")
|
||||
self.writeln("BEGIN:VEVENT")
|
||||
time_s = time.gmtime(event.change)
|
||||
|
||||
@@ -92,13 +92,17 @@ class Backlinks(Gramplet):
|
||||
|
||||
edit_object(self.dbstate, self.uistate, objclass, handle)
|
||||
|
||||
def db_changed(self):
|
||||
for item in ['person', 'family', 'source', 'citation', 'event',
|
||||
'media', 'place', 'repository', 'note']:
|
||||
self.connect(self.dbstate.db, '%s-delete' % item, self.update)
|
||||
self.connect(self.dbstate.db, '%s-add' % item, self.update)
|
||||
self.connect(self.dbstate.db, '%s-update' % item, self.update)
|
||||
|
||||
class PersonBacklinks(Backlinks):
|
||||
"""
|
||||
Displays the back references for a person.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'person-update', self.update)
|
||||
|
||||
def active_changed(self, handle):
|
||||
self.update()
|
||||
|
||||
@@ -119,7 +123,7 @@ class EventBacklinks(Backlinks):
|
||||
Displays the back references for an event.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'event-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Event', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -139,7 +143,7 @@ class FamilyBacklinks(Backlinks):
|
||||
Displays the back references for a family.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'family-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Family', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -159,7 +163,7 @@ class PlaceBacklinks(Backlinks):
|
||||
Displays the back references for a place.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'place-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Place', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -179,7 +183,7 @@ class SourceBacklinks(Backlinks):
|
||||
Displays the back references for a source,.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'source-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Source', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -199,7 +203,7 @@ class CitationBacklinks(Backlinks):
|
||||
Displays the back references for a Citation,.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'citation-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Citation', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -219,7 +223,7 @@ class RepositoryBacklinks(Backlinks):
|
||||
Displays the back references for a repository.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'repository-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Repository', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -239,7 +243,7 @@ class MediaBacklinks(Backlinks):
|
||||
Displays the back references for a media object.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'media-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Media', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
@@ -259,7 +263,7 @@ class NoteBacklinks(Backlinks):
|
||||
Displays the back references for a note.
|
||||
"""
|
||||
def db_changed(self):
|
||||
self.connect(self.dbstate.db, 'note-update', self.update)
|
||||
super().db_changed()
|
||||
self.connect_signal('Note', self.update)
|
||||
|
||||
def update_has_data(self):
|
||||
|
||||
@@ -184,10 +184,13 @@ class Leak(Gramplet):
|
||||
try:
|
||||
from bsddb3.db import DBError
|
||||
except:
|
||||
class DBError(Exception):
|
||||
"""
|
||||
Dummy.
|
||||
"""
|
||||
try:
|
||||
from berkeleydb.db import DBError
|
||||
except:
|
||||
class DBError(Exception):
|
||||
"""
|
||||
Dummy.
|
||||
"""
|
||||
self.parent = self.top.get_toplevel()
|
||||
progress = ProgressMeter(
|
||||
_('Updating display...'), '', parent=self.parent, can_cancel=True)
|
||||
|
||||
@@ -300,6 +300,8 @@ class DateRange:
|
||||
"""
|
||||
start = None
|
||||
stop = None
|
||||
if date.is_empty():
|
||||
return (None, None)
|
||||
if date.modifier == Date.MOD_NONE:
|
||||
start = date.sortval
|
||||
stop = date.sortval
|
||||
|
||||
@@ -300,7 +300,7 @@ class HtmlBackend(DocBackend):
|
||||
"""
|
||||
if value.startswith("gramps://"):
|
||||
if self.build_link:
|
||||
obj_class, prop, handle = value[9:].split("/", 3)
|
||||
obj_class, prop, handle = value[9:].split("/", 2)
|
||||
if prop in ["handle", "gramps_id"]:
|
||||
value = self.build_link(prop, handle, obj_class)
|
||||
if not value:
|
||||
|
||||
@@ -206,8 +206,10 @@ class PlaceBaseView(ListView):
|
||||
"""
|
||||
if action:
|
||||
action.set_state(value)
|
||||
self.mapservice = mapkey = value.get_string()
|
||||
config.set('interface.mapservice', mapkey)
|
||||
self.mapservice = value.get_string()
|
||||
else:
|
||||
self.mapservice = value
|
||||
config.set('interface.mapservice', self.mapservice)
|
||||
config.save()
|
||||
_ui = self.__create_maps_menu_actions()
|
||||
self.uimanager.add_ui_from_string(_ui)
|
||||
|
||||
@@ -314,13 +314,16 @@ def find_records(db, filter, top_size, callname,
|
||||
if mother is None:
|
||||
continue
|
||||
|
||||
name = StyledText(trans_text("%(father)s and %(mother)s")) % {
|
||||
'father': _get_styled_primary_name(father, callname,
|
||||
trans_text=trans_text,
|
||||
name_format=name_format),
|
||||
'mother': _get_styled_primary_name(mother, callname,
|
||||
trans_text=trans_text,
|
||||
name_format=name_format)}
|
||||
father_name = _get_styled_primary_name(father, callname,
|
||||
trans_text=trans_text,
|
||||
name_format=name_format)
|
||||
mother_name = _get_styled_primary_name(mother, callname,
|
||||
trans_text=trans_text,
|
||||
name_format=name_format)
|
||||
|
||||
name = StyledText(trans_text("%(father)s and %(mother)s"))
|
||||
name = name.replace('%(father)s', father_name)
|
||||
name = name.replace('%(mother)s', mother_name)
|
||||
|
||||
if (living_mode == LivingProxyDb.MODE_INCLUDE_ALL
|
||||
or (not probably_alive(unfil_father, db) and
|
||||
|
||||
@@ -346,7 +346,7 @@ class PlaceFormat(GenericFormat):
|
||||
return None
|
||||
|
||||
def _default_format(self, place):
|
||||
return _pd.display(self.database, place)
|
||||
return _pd.display(self.database, place, place.event_date)
|
||||
|
||||
def parse_format(self, database, place):
|
||||
""" Parse the place """
|
||||
@@ -432,6 +432,8 @@ class EventFormat(GenericFormat):
|
||||
""" start formatting a place in this event """
|
||||
place_format = PlaceFormat(self.database, self.string_in)
|
||||
place = place_format.get_place(self.database, event)
|
||||
if event and place:
|
||||
place.event_date = event.get_date_object()
|
||||
return place_format.parse_format(self.database, place)
|
||||
|
||||
def format_attrib():
|
||||
@@ -889,6 +891,8 @@ class VariableParse:
|
||||
return the result """
|
||||
place_f = PlaceFormat(self.database, self._in)
|
||||
place = place_f.get_place(self.database, event)
|
||||
if event and place:
|
||||
place.event_date = event.get_date_object()
|
||||
if self.empty_item(place):
|
||||
return
|
||||
return place_f.parse_format(self.database, place)
|
||||
|
||||
@@ -193,11 +193,12 @@ class GeoGraphyView(OsmGps, NavigationView):
|
||||
"""
|
||||
self.build_tree()
|
||||
|
||||
def add_bookmark(self, menu):
|
||||
def add_bookmark(self, menu, handle):
|
||||
"""
|
||||
Add the place to the bookmark
|
||||
"""
|
||||
dummy_menu = menu
|
||||
dummy_hdle = handle
|
||||
mlist = self.selected_handles()
|
||||
if mlist:
|
||||
self.bookmarks.add(mlist[0])
|
||||
@@ -289,9 +290,6 @@ class GeoGraphyView(OsmGps, NavigationView):
|
||||
if self.active:
|
||||
self.bookmarks.redraw()
|
||||
self.build_tree()
|
||||
if self.osm:
|
||||
self.osm.grab_focus()
|
||||
self.set_crosshair(config.get("geography.show_cross"))
|
||||
|
||||
def can_configure(self):
|
||||
"""
|
||||
|
||||
@@ -182,14 +182,11 @@ class OsmGps:
|
||||
self.osm = DummyMapNoGpsPoint()
|
||||
else:
|
||||
if http_proxy:
|
||||
self.osm = osmgpsmap.Map(tile_cache=tiles_path,
|
||||
proxy_uri=http_proxy,
|
||||
map_source=constants.MAP_TYPE[
|
||||
map_type])
|
||||
self.osm = osmgpsmap.Map(proxy_uri=http_proxy)
|
||||
else:
|
||||
self.osm = osmgpsmap.Map(tile_cache=tiles_path,
|
||||
map_source=constants.MAP_TYPE[
|
||||
map_type])
|
||||
self.osm = osmgpsmap.Map()
|
||||
self.osm.set_property("tile_cache", tiles_path)
|
||||
self.osm.set_property("map_source", constants.MAP_TYPE[map_type])
|
||||
self.osm.props.tile_cache = osmgpsmap.MAP_CACHE_AUTO
|
||||
current_map = osmgpsmap.MapOsd(show_dpad=False, show_zoom=True)
|
||||
self.end_selection = None
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||
# Copyright (C) 2008 Stefan Siegel
|
||||
# Copyright (C) 2008 Brian G. Matherly
|
||||
# Copyright (C) 2021 Mirko Leonhaeuser
|
||||
#
|
||||
# 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
|
||||
@@ -156,7 +157,7 @@ class RelationshipCalculator(gramps.gen.relationship.RelationshipCalculator):
|
||||
if removed < len(_removed):
|
||||
return _removed[removed]
|
||||
else:
|
||||
return '(%s)' % self._make_roman(removed-2)
|
||||
return '(%s) Urgroß' % self._make_roman(removed-1)
|
||||
|
||||
def _degree_text(self, degree, removed):
|
||||
if removed == 0:
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
# Copyright (C) 2003-2005 Donald N. Allingham
|
||||
# Copyright (C) 2008 Brian G. Matherly
|
||||
# Copyright (C) 2018 Robin van der Vliet
|
||||
# Copyright (C) 2020 Jan Sparreboom
|
||||
#
|
||||
# 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
|
||||
@@ -35,7 +36,7 @@ import gramps.gen.relationship
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
# Levels
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -69,9 +70,207 @@ _child_level = [ "", "",
|
||||
_nibling_level = [ "", "",
|
||||
"achter", "achterachter", "achterachterachter" ]
|
||||
|
||||
_parents_level = ["",
|
||||
"ouders",
|
||||
"grootouders",
|
||||
"overgrootouders",
|
||||
"betovergrootouders",
|
||||
"overgrootouders 5e graad",
|
||||
"overgrootouders 6e graad",
|
||||
"overgrootouders 7e graad",
|
||||
"overgrootouders 8e graad",
|
||||
"overgrootouders 9e graad",
|
||||
"overgrootouders 10e graad",
|
||||
"overgrootouders 11e graad",
|
||||
"overgrootouders 12e graad",
|
||||
"overgrootouders 13e graad",
|
||||
"overgrootouders 14e graad",
|
||||
"overgrootouders 15e graad",
|
||||
"overgrootouders 16e graad",
|
||||
"overgrootouders 17e graad",
|
||||
"overgrootouders 18e graad",
|
||||
"overgrootouders 19e graad",
|
||||
"overgrootouders 20e graad",
|
||||
"overgrootouders 21e graad",
|
||||
"overgrootouders 22e graad",
|
||||
"overgrootouders 23e graad",
|
||||
"overgrootouders 24e graad",
|
||||
"overgrootouders 25e graad",
|
||||
"overgrootouders 26e graad",
|
||||
"overgrootouders 27e graad",
|
||||
"overgrootouders 28e graad",
|
||||
"overgrootouders 29e graad",
|
||||
"overgrootouders 30e graad",
|
||||
"overgrootouders 31e graad",
|
||||
"overgrootouders 32e graad",
|
||||
"overgrootouders 33e graad",
|
||||
"overgrootouders 34e graad",
|
||||
"overgrootouders 35e graad",
|
||||
"overgrootouders 36e graad",
|
||||
"overgrootouders 37e graad",
|
||||
"overgrootouders 38e graad",
|
||||
"overgrootouders 39e graad",
|
||||
"overgrootouders 40e graad",
|
||||
"overgrootouders 41e graad",
|
||||
"overgrootouders 42e graad",
|
||||
"overgrootouders 43e graad",
|
||||
"overgrootouders 44e graad",
|
||||
"overgrootouders 45e graad",
|
||||
"overgrootouders 46e graad",
|
||||
"overgrootouders 47e graad",
|
||||
"overgrootouders 48e graad",
|
||||
"overgrootouders 49e graad",
|
||||
"overgrootouders 50e graad", ]
|
||||
|
||||
_siblings_level = ["",
|
||||
"broers en zussen",
|
||||
"ooms en tantes",
|
||||
"oudooms en -tantes",
|
||||
"overoudooms en -tantes",
|
||||
"overoudooms en -tantes 5e graad",
|
||||
"overoudooms en -tantes 6e graad",
|
||||
"overoudooms en -tantes 7e graad",
|
||||
"overoudooms en -tantes 8e graad",
|
||||
"overoudooms en -tantes 9e graad",
|
||||
"overoudooms en -tantes 10e graad",
|
||||
"overoudooms en -tantes 11e graad",
|
||||
"overoudooms en -tantes 12e graad",
|
||||
"overoudooms en -tantes 13e graad",
|
||||
"overoudooms en -tantes 14e graad",
|
||||
"overoudooms en -tantes 15e graad",
|
||||
"overoudooms en -tantes 16e graad",
|
||||
"overoudooms en -tantes 17e graad",
|
||||
"overoudooms en -tantes 18e graad",
|
||||
"overoudooms en -tantes 19e graad",
|
||||
"overoudooms en -tantes 20e graad",
|
||||
"overoudooms en -tantes 21e graad",
|
||||
"overoudooms en -tantes 22e graad",
|
||||
"overoudooms en -tantes 23e graad",
|
||||
"overoudooms en -tantes 24e graad",
|
||||
"overoudooms en -tantes 25e graad",
|
||||
"overoudooms en -tantes 26e graad",
|
||||
"overoudooms en -tantes 27e graad",
|
||||
"overoudooms en -tantes 28e graad",
|
||||
"overoudooms en -tantes 29e graad",
|
||||
"overoudooms en -tantes 30e graad",
|
||||
"overoudooms en -tantes 41e graad",
|
||||
"overoudooms en -tantes 42e graad",
|
||||
"overoudooms en -tantes 43e graad",
|
||||
"overoudooms en -tantes 44e graad",
|
||||
"overoudooms en -tantes 45e graad",
|
||||
"overoudooms en -tantes 46e graad",
|
||||
"overoudooms en -tantes 47e graad",
|
||||
"overoudooms en -tantes 48e graad",
|
||||
"overoudooms en -tantes 49e graad",
|
||||
"overoudooms en -tantes 50e graad", ]
|
||||
|
||||
_children_level = ["",
|
||||
"kinderen",
|
||||
"kleinkinderen",
|
||||
"achterkleinkinderen",
|
||||
"betachterkleinkinderen",
|
||||
"kleinkinderen 5e graad",
|
||||
"kleinkinderen 6e graad",
|
||||
"kleinkinderen 7e graad",
|
||||
"kleinkinderen 8e graad",
|
||||
"kleinkinderen 9e graad",
|
||||
"kleinkinderen 10e graad",
|
||||
"kleinkinderen 11e graad",
|
||||
"kleinkinderen 12e graad",
|
||||
"kleinkinderen 13e graad",
|
||||
"kleinkinderen 14e graad",
|
||||
"kleinkinderen 15e graad",
|
||||
"kleinkinderen 16e graad",
|
||||
"kleinkinderen 17e graad",
|
||||
"kleinkinderen 18e graad",
|
||||
"kleinkinderen 19e graad",
|
||||
"kleinkinderen 20e graad",
|
||||
"kleinkinderen 21e graad",
|
||||
"kleinkinderen 22e graad",
|
||||
"kleinkinderen 23e graad",
|
||||
"kleinkinderen 24e graad",
|
||||
"kleinkinderen 25e graad",
|
||||
"kleinkinderen 26e graad",
|
||||
"kleinkinderen 27e graad",
|
||||
"kleinkinderen 28e graad",
|
||||
"kleinkinderen 29e graad",
|
||||
"kleinkinderen 30e graad",
|
||||
"kleinkinderen 31e graad",
|
||||
"kleinkinderen 32e graad",
|
||||
"kleinkinderen 33e graad",
|
||||
"kleinkinderen 34e graad",
|
||||
"kleinkinderen 35e graad",
|
||||
"kleinkinderen 36e graad",
|
||||
"kleinkinderen 37e graad",
|
||||
"kleinkinderen 38e graad",
|
||||
"kleinkinderen 39e graad",
|
||||
"kleinkinderen 40e graad",
|
||||
"kleinkinderen 41e graad",
|
||||
"kleinkinderen 42e graad",
|
||||
"kleinkinderen 43e graad",
|
||||
"kleinkinderen 44e graad",
|
||||
"kleinkinderen 45e graad",
|
||||
"kleinkinderen 46e graad",
|
||||
"kleinkinderen 47e graad",
|
||||
"kleinkinderen 48e graad",
|
||||
"kleinkinderen 49e graad",
|
||||
"kleinkinderen 50e graad", ]
|
||||
|
||||
_nephews_nieces_level = ["",
|
||||
"broers en zussen",
|
||||
"neven en nichten",
|
||||
"achterneven en -nichten",
|
||||
"achterneven en -nichten 4e graad",
|
||||
"achterneven en -nichten 5e graad",
|
||||
"achterneven en -nichten 6e graad",
|
||||
"achterneven en -nichten 7e graad",
|
||||
"achterneven en -nichten 8e graad",
|
||||
"achterneven en -nichten 9e graad",
|
||||
"achterneven en -nichten 10e graad",
|
||||
"achterneven en -nichten 11e graad",
|
||||
"achterneven en -nichten 12e graad",
|
||||
"achterneven en -nichten 13e graad",
|
||||
"achterneven en -nichten 14e graad",
|
||||
"achterneven en -nichten 15e graad",
|
||||
"achterneven en -nichten 16e graad",
|
||||
"achterneven en -nichten 17e graad",
|
||||
"achterneven en -nichten 18e graad",
|
||||
"achterneven en -nichten 19e graad",
|
||||
"achterneven en -nichten 20e graad",
|
||||
"achterneven en -nichten 21e graad",
|
||||
"achterneven en -nichten 22e graad",
|
||||
"achterneven en -nichten 23e graad",
|
||||
"achterneven en -nichten 24e graad",
|
||||
"achterneven en -nichten 25e graad",
|
||||
"achterneven en -nichten 26e graad",
|
||||
"achterneven en -nichten 27e graad",
|
||||
"achterneven en -nichten 28e graad",
|
||||
"achterneven en -nichten 29e graad",
|
||||
"achterneven en -nichten 30e graad",
|
||||
"achterneven en -nichten 31e graad",
|
||||
"achterneven en -nichten 32e graad",
|
||||
"achterneven en -nichten 33e graad",
|
||||
"achterneven en -nichten 34e graad",
|
||||
"achterneven en -nichten 35e graad",
|
||||
"achterneven en -nichten 36e graad",
|
||||
"achterneven en -nichten 37e graad",
|
||||
"achterneven en -nichten 38e graad",
|
||||
"achterneven en -nichten 39e graad",
|
||||
"achterneven en -nichten 40e graad",
|
||||
"achterneven en -nichten 41e graad",
|
||||
"achterneven en -nichten 42e graad",
|
||||
"achterneven en -nichten 43e graad",
|
||||
"achterneven en -nichten 44e graad",
|
||||
"achterneven en -nichten 45e graad",
|
||||
"achterneven en -nichten 46e graad",
|
||||
"achterneven en -nichten 47e graad",
|
||||
"achterneven en -nichten 48e graad",
|
||||
"achterneven en -nichten 49e graad",
|
||||
"achterneven en -nichten 50e graad", ]
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
# Relationship calculator Dutch version
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -273,6 +472,104 @@ class RelationshipCalculator(gramps.gen.relationship.RelationshipCalculator):
|
||||
else:
|
||||
return "%s%snicht (kozijn)" % (inlaw, step) \
|
||||
+ " " + _ordinal_level[removed] + " graad"
|
||||
# NIEUW
|
||||
def get_plural_relationship_string(self, Ga, Gb,
|
||||
reltocommon_a='', reltocommon_b='',
|
||||
only_birth=True,
|
||||
in_law_a=False, in_law_b=False):
|
||||
"""
|
||||
Provide a string that describes the relationsip between a person, and
|
||||
a group of people with the same relationship. E.g. "grandparents" or
|
||||
"children".
|
||||
|
||||
Ga and Gb can be used to mathematically calculate the relationship.
|
||||
|
||||
.. seealso::
|
||||
http://en.wikipedia.org/wiki/Cousin#Mathematical_definitions
|
||||
|
||||
:param Ga: The number of generations between the main person and the
|
||||
common ancestor.
|
||||
:type Ga: int
|
||||
:param Gb: The number of generations between the group of people and the
|
||||
common ancestor
|
||||
:type Gb: int
|
||||
:param reltocommon_a: relation path to common ancestor or common
|
||||
Family for person a.
|
||||
Note that length = Ga
|
||||
:type reltocommon_a: str
|
||||
:param reltocommon_b: relation path to common ancestor or common
|
||||
Family for person b.
|
||||
Note that length = Gb
|
||||
:type reltocommon_b: str
|
||||
:param only_birth: True if relation between a and b is by birth only
|
||||
False otherwise
|
||||
:type only_birth: bool
|
||||
:param in_law_a: True if path to common ancestors is via the partner
|
||||
of person a
|
||||
:type in_law_a: bool
|
||||
:param in_law_b: True if path to common ancestors is via the partner
|
||||
of person b
|
||||
:type in_law_b: bool
|
||||
:returns: A string describing the relationship between the person and
|
||||
the group.
|
||||
:rtype: str
|
||||
"""
|
||||
rel_str = "verre familie"
|
||||
if Ga == 0:
|
||||
# These are descendants
|
||||
if Gb < len(_children_level):
|
||||
rel_str = _children_level[Gb]
|
||||
else:
|
||||
rel_str = "verre afstammelingen"
|
||||
elif Gb == 0:
|
||||
# These are parents/grand parents
|
||||
if Ga < len(_parents_level):
|
||||
rel_str = _parents_level[Ga]
|
||||
else:
|
||||
rel_str = "verre voorouders"
|
||||
elif Gb == 1:
|
||||
# These are siblings/aunts/uncles
|
||||
if Ga < len(_siblings_level):
|
||||
rel_str = _siblings_level[Ga]
|
||||
else:
|
||||
rel_str = "verre ooms/tantes"
|
||||
elif Ga == 1:
|
||||
# These are nieces/nephews
|
||||
if Gb < len(_nephews_nieces_level):
|
||||
rel_str = _nephews_nieces_level[Gb]
|
||||
else:
|
||||
rel_str = "verre neven/nichten"
|
||||
elif Ga > 1 and Ga == Gb:
|
||||
# These are cousins in the same generation
|
||||
if Ga <= len(_ordinal_level):
|
||||
rel_str = "%s neven" % _ordinal_level[Ga-1]
|
||||
else:
|
||||
rel_str = "verre neven"
|
||||
elif Ga > 1 and Ga > Gb:
|
||||
# These are cousins in different generations with the second person
|
||||
# being in a higher generation from the common ancestor than the
|
||||
# first person.
|
||||
if Gb <= len(_LEVEL_NAME) and (Ga-Gb) < len(_removed_level):
|
||||
rel_str = "%s neven%s (omhoog)" % (_ordinal_level[Gb-1],
|
||||
_removed_level[Ga-Gb])
|
||||
else:
|
||||
rel_str = "verre neven"
|
||||
elif Gb > 1 and Gb > Ga:
|
||||
# These are cousins in different generations with the second person
|
||||
# being in a lower generation from the common ancestor than the
|
||||
# first person.
|
||||
if Ga <= len(_LEVEL_NAME) and (Gb-Ga) < len(_removed_level):
|
||||
rel_str = "%s neven%s (omlaag)" % (_ordinal_level[Ga-1],
|
||||
_removed_level[Gb-Ga])
|
||||
else:
|
||||
rel_str = "verre neven"
|
||||
|
||||
if in_law_b is True:
|
||||
rel_str = "echtgenoten van %s" % rel_str
|
||||
|
||||
return rel_str
|
||||
|
||||
|
||||
|
||||
def get_single_relationship_string(self, Ga, Gb, gender_a, gender_b,
|
||||
reltocommon_a, reltocommon_b,
|
||||
@@ -424,3 +721,6 @@ if __name__ == "__main__":
|
||||
from gramps.gen.relationship import test
|
||||
RC = RelationshipCalculator()
|
||||
test(RC, True)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class DbTestClassBase(object):
|
||||
self._log_sig("note-delete", args)
|
||||
|
||||
def _log_sig(self, sig, args):
|
||||
print("('%s', %s)," % (sig, args))
|
||||
# print("('%s', %s)," % (sig, args))
|
||||
self.sigs.append((sig, args[0]))
|
||||
|
||||
def _cm_pers_add(self, *args):
|
||||
|
||||
@@ -271,6 +271,7 @@ class BirthdayReport(Report):
|
||||
for person_handle in people:
|
||||
step()
|
||||
person = self.database.get_person_from_handle(person_handle)
|
||||
short_name = self.get_name(person)
|
||||
birth_ref = person.get_birth_ref()
|
||||
birth_date = None
|
||||
if birth_ref:
|
||||
|
||||
@@ -441,7 +441,8 @@ class TagReport(Report):
|
||||
|
||||
for place_handle in place_list:
|
||||
place = self.database.get_place_from_handle(place_handle)
|
||||
place_title = _pd.display(self.database, place, self.place_format)
|
||||
place_title = _pd.display(self.database, place, None,
|
||||
self.place_format)
|
||||
|
||||
self.doc.start_row()
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ _ = glocale.translation.sgettext
|
||||
from gramps.gui.glade import Glade
|
||||
from gramps.gui.editors import FilterEditor
|
||||
from gramps.gen.constfunc import get_curr_dir
|
||||
from gramps.gen.display.place import displayer as _pd
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -332,7 +333,7 @@ class EventComparisonResults(ManagedWindow):
|
||||
if ename in the_map and len(the_map[ename]) > 0:
|
||||
event_handle = the_map[ename][0]
|
||||
del the_map[ename][0]
|
||||
date = place = ""
|
||||
date = p_title = ""
|
||||
|
||||
if event_handle:
|
||||
event = self.db.get_event_from_handle(event_handle)
|
||||
@@ -343,8 +344,9 @@ class EventComparisonResults(ManagedWindow):
|
||||
place_handle = event.get_place_handle()
|
||||
if place_handle:
|
||||
place = self.db.get_place_from_handle(
|
||||
place_handle).get_title()
|
||||
tlist += [date, sortdate, place]
|
||||
place_handle)
|
||||
p_title = _pd.display(self.dbstate.db, place)
|
||||
tlist += [date, sortdate, p_title]
|
||||
added = True
|
||||
else:
|
||||
tlist += [""]*3
|
||||
|
||||
@@ -348,6 +348,16 @@ class FamilyView(ListView):
|
||||
_("A bookmark could not be set because "
|
||||
"no one was selected."), parent=self.uistate.window)
|
||||
|
||||
def get_handle_from_gramps_id(self, gid):
|
||||
"""
|
||||
Return the handle of the family having the given Gramps ID.
|
||||
"""
|
||||
obj = self.dbstate.db.get_family_from_gramps_id(gid)
|
||||
if obj:
|
||||
return obj.get_handle()
|
||||
else:
|
||||
return None
|
||||
|
||||
def add(self, *obj):
|
||||
family = Family()
|
||||
try:
|
||||
|
||||
@@ -246,6 +246,14 @@ class GeoClose(GeoGraphyView):
|
||||
self.add_item = None
|
||||
self.newmenu = None
|
||||
self.config_meeting_slider = None
|
||||
self.dbstate.connect('database-changed', self.reset_change_db)
|
||||
|
||||
def reset_change_db(self, dummy_dbase):
|
||||
"""
|
||||
Used to reset the family reference
|
||||
"""
|
||||
self.refperson = None
|
||||
|
||||
|
||||
def get_title(self):
|
||||
"""
|
||||
|
||||
@@ -243,6 +243,13 @@ class GeoFamClose(GeoGraphyView):
|
||||
self.cal = config.get('preferences.calendar-format-report')
|
||||
self.no_show_places_in_status_bar = False
|
||||
self.config_meeting_slider = None
|
||||
self.dbstate.connect('database-changed', self.reset_change_db)
|
||||
|
||||
def reset_change_db(self, dummy_dbase):
|
||||
"""
|
||||
Used to reset the family reference
|
||||
"""
|
||||
self.reffamily = None
|
||||
|
||||
def get_title(self):
|
||||
"""
|
||||
|
||||
@@ -370,8 +370,9 @@ class GeoFamily(GeoGraphyView):
|
||||
_("Family places for %s") % self.family_label(family))
|
||||
person = None
|
||||
if family:
|
||||
person = dbstate.db.get_person_from_handle(
|
||||
family.get_father_handle())
|
||||
handle = family.get_father_handle()
|
||||
if handle:
|
||||
person = dbstate.db.get_person_from_handle(handle)
|
||||
else:
|
||||
return
|
||||
family_id = family.gramps_id
|
||||
|
||||
@@ -2873,9 +2873,17 @@ class BasePage: # pylint: disable=C1001
|
||||
if self.reference_sort:
|
||||
role = ""
|
||||
elif role[1:2] == ':':
|
||||
# format of role is role_type:ISO date string
|
||||
if role.count(':') > 1:
|
||||
print("Invalid date :", role[2:], " for individual with ID:", gid,
|
||||
". Please, use the 'verify the data' tool to correct this.")
|
||||
cal, role = role.split(':', 1)
|
||||
else:
|
||||
cal, role = role.split(':')
|
||||
|
||||
# cal is the original calendar
|
||||
cal, role = role.split(':')
|
||||
# conver ISO date to Date for translation.
|
||||
|
||||
# convert ISO date to Date for translation.
|
||||
# all modifiers are in english, so convert them
|
||||
# to the local language
|
||||
if len(role.split(' - ')) > 1:
|
||||
|
||||
@@ -472,7 +472,13 @@ class MediaPages(BasePage):
|
||||
if orig_image_path != newpath:
|
||||
url = self.report.build_url_fname(
|
||||
newpath, None, self.uplink)
|
||||
s_width = 'width: %dpx;' % max_width
|
||||
regions = self.media_ref_rect_regions(media_handle)
|
||||
if regions:
|
||||
s_width = 'width: %dpx;' % max_width
|
||||
elif width < max_width:
|
||||
s_width = 'width: %dpx;' % width
|
||||
else:
|
||||
s_width = 'width: %dpx;' % max_width
|
||||
mediadisplay += Html("a", href=url) + (
|
||||
Html("img", src=url,
|
||||
style=s_width,
|
||||
|
||||
@@ -1307,7 +1307,7 @@ class WebCalReport(Report):
|
||||
age_at_death = age_at_death.format(dlocale=self.rlocale)
|
||||
|
||||
# determine birthday information???
|
||||
if (self.birthday and birth_date is not Date()
|
||||
if (self.birthday and birth_date != Date()
|
||||
and birth_date.is_valid()):
|
||||
birth_date = gregorian(birth_date)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
|
||||
VERSION_TUPLE = (5, 1, 4)
|
||||
VERSION_TUPLE = (5, 1, 7)
|
||||
VERSION_QUALIFIER = ""
|
||||
VERSION = '.'.join(map(str,VERSION_TUPLE)) + VERSION_QUALIFIER
|
||||
major_version = "%s.%s" % (VERSION_TUPLE[0], VERSION_TUPLE[1])
|
||||
|
||||