Compare commits
145 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1f614bd76f | |||
| 0442c34258 | |||
| c903f5e5a5 | |||
| 3329860f50 | |||
| e7401f3aaa | |||
| 1a48e8a03e | |||
| 9a4adab9d6 | |||
| bb0647274b | |||
| f6bfb46fc0 | |||
| b6fa5da8ee | |||
| 14c2d0e1b6 | |||
| 226e8c549a | |||
| d173809d8c | |||
| 63c52fa1bb | |||
| 455628d44a | |||
| 670bb355cb | |||
| 202c7a9bf6 | |||
| 72955840f1 | |||
| b8e73d5ee1 | |||
| 990db39664 | |||
| 9c0dca6bd1 | |||
| 02e0c1c67d | |||
| ebf1715468 | |||
| c10f2da00e | |||
| 9f71372a97 | |||
| 0993d9cfc3 | |||
| 34471834ab | |||
| ff912f844c | |||
| 45eac501a9 | |||
| d4e85c2397 | |||
| c7a4d287f0 | |||
| c0d622c16a | |||
| b38f77f2aa | |||
| d91fc9e2fb | |||
| 198602be61 | |||
| 3f9f3215ee | |||
| beb388a30d | |||
| 29e78d4253 | |||
| b80dcaf701 | |||
| a876d94fbc | |||
| 95e1e8cb67 | |||
| 4147bc728a | |||
| 3a9a7053ec | |||
| b96fd8a274 | |||
| 26cf0601d8 | |||
| c59278ef20 | |||
| 767557be61 | |||
| 495d4e58ae | |||
| fd90a80cf8 | |||
| f6c0103f32 | |||
| 04c1dc8503 | |||
| 8172e1017e | |||
| ea30c3599b | |||
| 5f3ca40633 | |||
| 9c64dafaea | |||
| 13d83919b9 | |||
| 62d5a136a4 | |||
| b57061d7c9 | |||
| f7be7ab63f | |||
| 97923e7530 | |||
| 75aabf570d | |||
| 41f1e91600 | |||
| 981c0dfc5c | |||
| d558a9a004 | |||
| 914bd6c0d3 | |||
| e8eb5bf0a1 | |||
| b523530fb0 | |||
| 0d698c13cc | |||
| 4232032ce3 | |||
| 8f4b51c837 | |||
| f2caecd621 | |||
| c26d6902d1 | |||
| b00b1f37f1 | |||
| 9230de61be | |||
| 9906f1e4ab | |||
| a68c0f7aa7 | |||
| 513b27531d | |||
| b8f007c4dd | |||
| e375df1e2a | |||
| df81a10fe8 | |||
| fa53805534 | |||
| e614a79cef | |||
| 343633a189 | |||
| eb14abbf3e | |||
| 5154d0c016 | |||
| a2c6641774 | |||
| 924d82a7c4 | |||
| f1f8847a86 | |||
| 748fbd0949 | |||
| e2e659dc94 | |||
| 6cbc2b896d | |||
| d210275a4e | |||
| 0a3a65ffb0 | |||
| e34b98033e | |||
| 96de0ceb4e | |||
| 58335cfee2 | |||
| 2ce48d3793 | |||
| f91063884e | |||
| 06732b1b5d | |||
| 26b78c17af | |||
| d83fff3b62 | |||
| 823bcaac0d | |||
| b9c324ef37 | |||
| 23d2c8e694 | |||
| 28dc2e5158 | |||
| 2baa6f5e40 | |||
| eb1b4c1eb5 | |||
| 51f2052cfe | |||
| ccf6d59b17 | |||
| 74d72f4dd0 | |||
| 9ce92f41e3 | |||
| 77cdbb11b5 | |||
| 72277db766 | |||
| 7ae77abead | |||
| 04b1463746 | |||
| 1eeae2edf8 | |||
| 740adc7070 | |||
| a2dbdbb61a | |||
| 8d5b0c83ce | |||
| 01afe251fb | |||
| 152ed0b6bc | |||
| 5624fb1490 | |||
| 32c700c6bf | |||
| 130740553d | |||
| 675dfdbc70 | |||
| 34beeaad70 | |||
| 06cb9d7ea6 | |||
| d693881b98 | |||
| 801be84465 | |||
| 7807ff8a6d | |||
| 672603c8ae | |||
| c30dfc6343 | |||
| e6ed0612e3 | |||
| 9b0cf1b976 | |||
| ddb29b1628 | |||
| 1a8406e2e4 | |||
| 09e89549de | |||
| afaeb7c995 | |||
| 6fa30b889d | |||
| 1916383a28 | |||
| 379c96ee6a | |||
| 7b45bbf72e | |||
| aea9ef3645 | |||
| 05f7744cba | |||
| bfc76a08d4 |
@@ -1,80 +1,15 @@
|
||||
2019-09-14 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-08-11 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Fix deprecation
|
||||
warning in withinarea rule
|
||||
* 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
|
||||
|
||||
2019-09-14 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/gui/grampsgui.py: Disable development warning message
|
||||
|
||||
2019-09-13 Jonas Hahnfeld <hahnjo@hahnjo.de>
|
||||
|
||||
* gramps/gen/plug/docgen/treedoc.py: Add options to sandclock in
|
||||
tree document generator This works and is actually needed to style the root node.
|
||||
|
||||
2019-09-11 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/gui/filters/sidebar/_personsidebarfilter.py: Using regex in
|
||||
the sidebar gives different result from previous gramps release. Fixes #11321
|
||||
|
||||
2019-09-12 Jérôme Rapinat <romjerome@yahoo.fr>
|
||||
|
||||
* po/fr.po: Add missing French translation strings
|
||||
|
||||
2019-09-10 Gil da Costa <gdacosta@sommier-colas.fr>
|
||||
|
||||
* po/fr.po: Update French translation
|
||||
|
||||
2019-09-09 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/plugins/docgen/odfdoc.py: Fix odt output when db owner has
|
||||
XML unfriendly chars ('&') Fixes #11327
|
||||
|
||||
2019-09-11 John Bickmore <johnbickmore@users.noreply.github.com>
|
||||
|
||||
* README.md: Bump required Python version to 3.3 on Readme As mentioned on the release announcement
|
||||
|
||||
https://gramps-project.org/introduction-WP/2019/08/gramps-5-1-0-released/
|
||||
|
||||
2019-09-08 SNoiraud <Serge.Noiraud@free.fr>
|
||||
|
||||
* gramps/plugins/webreport/narrativeweb.py: Remove
|
||||
reload_custom_filters to conform to PR894
|
||||
|
||||
2019-09-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/cli/grampscli.py: Fix CLI crash when generating reports Fixes #11318, #11213
|
||||
|
||||
2019-09-06 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/views/listview.py: Fix Statusbar HandleError on merge
|
||||
families Fixes #11320, #11294, #11279
|
||||
|
||||
2019-09-12 Avi Markovitz <avi.markovitz@gmail.com>
|
||||
|
||||
* po/he.po: Update Hebrew translation
|
||||
|
||||
2019-09-12 Matti Niemelä <matti.u.niemela@gmail.com>
|
||||
|
||||
* po/fi.po: Fix translation in Finnish
|
||||
|
||||
2019-09-12 Matti Niemelä <matti.u.niemela@gmail.com>
|
||||
|
||||
* po/fi.po: Update finnish translation
|
||||
|
||||
2019-09-11 vantu5z <vantu5z@mail.ru>
|
||||
|
||||
* po/ru.po: update Russian translation
|
||||
|
||||
2019-09-10 pehlm <par.ekholm@pekholm.org>
|
||||
|
||||
* po/sv.po: Update Swedish translation
|
||||
|
||||
2019-09-10 Mirko Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* po/de.po: Update German translation
|
||||
|
||||
2019-09-10 Nick Hall <nick-h@gramps-project.org>
|
||||
2020-08-10 prculley <paulr2787@gmail.com>
|
||||
|
||||
* 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,
|
||||
@@ -83,195 +18,385 @@
|
||||
po/nn.po, po/pl.po, po/pt_BR.po, po/pt_PT.po, po/ro.po, po/ru.po,
|
||||
po/sk.po, po/sl.po, po/sq.po, po/sr.po, po/sr_Latn.po, po/sv.po,
|
||||
po/ta.po, po/tr.po, po/uk.po, po/vi.po, po/zh_CN.po, po/zh_HK.po,
|
||||
po/zh_TW.po: Merge po files and new template
|
||||
po/zh_TW.po: Clean up translations for Default/Home Person
|
||||
|
||||
2019-09-10 Nick Hall <nick-h@gramps-project.org>
|
||||
2020-08-10 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* po/gramps.pot: Update translation template for new release
|
||||
* po/de.po: Update German translation
|
||||
|
||||
2019-08-27 Avi Markovitz <avi.markovitz@gmail.com>
|
||||
2020-08-10 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* po/he.po: Update Hebrew translation
|
||||
* gramps/gui/views/treemodels/eventmodel.py: Events View: "Main
|
||||
Participants" column does not (#1075) show the full list of participants when expanded. Fixes #11805
|
||||
|
||||
2019-07-11 Pedro Albuquerque <palbuquerque73@gmail.com>
|
||||
2020-08-10 Paul Culley <paulr2787@gmail.com>
|
||||
|
||||
* po/pt_PT.po: Update Portuguese (Europe) translation
|
||||
* po/pl.po: Fix Charts/Pedigreeview tooltip Polish translation
|
||||
(#1092) Fixes #11852
|
||||
|
||||
2019-06-24 Milo Ivir <mail@milotype.de>
|
||||
2020-08-10 Krystian Safjan <ksafjan@gmail.com>
|
||||
|
||||
* po/hr.po: Update croatian translation - update with newest/current .pot file - translation is complete - corrections in wording and some missing accelerators
|
||||
* po/gramps.pot, po/pl.po: Fix and add objects to Polish translation
|
||||
of Gramps (#1088)
|
||||
|
||||
2019-09-02 prculley <paulr2787@gmail.com>
|
||||
2020-08-06 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* gramps/gui/widgets/styledtexteditor.py: Fix missing tooltip
|
||||
translations in the Note editor toolbar Fixes #11289
|
||||
* mac/gramps.modules: Use current Gtk release instead of Gtk-3.14.
|
||||
|
||||
2019-09-01 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-08-06 John Ralls <jralls@ceridwen.us>
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Avoid bad
|
||||
coordinates in the ref place
|
||||
* mac/gramps.modules: Upgrade pymodules for Python 3.8
|
||||
compatibility.
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-09 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Avoid alphabetic
|
||||
characters in filter rules
|
||||
* gramps/plugins/export/exportxml.py: Fix XML export when 'Group-as"
|
||||
name contains XML invalid chars Fixes #11834
|
||||
|
||||
2019-08-23 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-08 SNoiraud <serge.noiraud@laposte.net>
|
||||
|
||||
* gramps/gen/filters/rules/place/_withinarea.py: Could not convert
|
||||
string to float by using withinarea filter rule + difference between sidebar filter
|
||||
and filter rule + some pylint improvements
|
||||
* gramps/plugins/webreport/basepage.py: NarWeb: Province place-type
|
||||
is not displayed
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
2020-07-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/plug/docgen/graphdoc.py: Fix Graph outputs for multiple
|
||||
page PDF Postscript Fixes #11305
|
||||
* 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
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gen/plug/_pluginreg.py, gramps/gui/managedwindow.py,
|
||||
gramps/gui/plug/quick/_quickreports.py, gramps/gui/uimanager.py,
|
||||
gramps/gui/viewmanager.py, gramps/gui/views/tags.py,
|
||||
gramps/gui/widgets/grampletpane.py: Fix to make Gtk 'action names'
|
||||
always valid Fixes #11291
|
||||
* gramps/gui/viewmanager.py: Fix menus when db fails to open due to
|
||||
upgrade/downgrade etc. Fixes #11604
|
||||
|
||||
2019-08-31 prculley <paulr2787@gmail.com>
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/uimanager.py, gramps/gui/views/tags.py: Fix missing
|
||||
menus/buttons when operating in non-English languages Fixes #11292
|
||||
* gramps/gui/plug/_windows.py: Fix issue with attach source tool,
|
||||
results panel Fixes #11780
|
||||
|
||||
2019-08-31 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-03 prculley <paulr2787@gmail.com>
|
||||
|
||||
* gramps/gui/widgets/validatedmaskedentry.py: Cursor position error
|
||||
in lat and long fields Fixes #11310
|
||||
* gramps/plugins/export/exportgedcom.py: Fix GEDCOM export; don't
|
||||
include ADDR when address is missing Fixes #11825
|
||||
|
||||
2019-08-30 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-02 SNoiraud <serge.noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/tool/removespaces.py: Avoid all characters looking
|
||||
like a dash hyphen non breaking hyphen figure dash em dash horizontal bar Fixes #11308
|
||||
* gramps/gui/editors/editplace.py,
|
||||
gramps/gui/editors/editplaceref.py: Coordinates containing a comma
|
||||
instead of a period Fixes #11823
|
||||
|
||||
2019-08-30 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-23 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* data/css/Web_Mainz.css: Narrative web: Mainz Style sheet weird
|
||||
looking Fixes #11282
|
||||
* po/de.po: German translation fixed typo
|
||||
|
||||
2019-09-02 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-17 niememat <niememat@gmail.com>
|
||||
|
||||
* gramps/plugins/view/relview.py: Set symbols for the active person
|
||||
* po/fi.po: Update finnish translation
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-06-07 Tian Shixiong <tiansworld@fedoraproject.org>
|
||||
|
||||
* gramps/plugins/view/relview.py: Set good symbols for marriage,
|
||||
baptism, cremation and burial
|
||||
* po/zh_CN.po: Update Simplified Chinese translation for gramps51
|
||||
branch
|
||||
|
||||
2019-08-28 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-08 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/plugins/view/relview.py: Reduce the size of the sexuality
|
||||
symbol in relview Fixes #11295
|
||||
* 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
|
||||
|
||||
2019-08-28 prculley <paulr2787@gmail.com>
|
||||
2020-07-08 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* gramps/gui/widgets/styledtexteditor.py: Fix exception when editing
|
||||
Note with italics/bold etc. in non English Fixes #11284
|
||||
* 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
|
||||
|
||||
2019-08-27 Nick Hall <nick-h@gramps-project.org>
|
||||
2020-01-11 giansalvo <pioggia3+github@gmail.com>
|
||||
|
||||
* gramps/gui/views/pageview.py: Restore keybindings for gramplet
|
||||
bars Resolves #11297.
|
||||
* 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'
|
||||
|
||||
2019-08-27 Nick Hall <nick-h@gramps-project.org>
|
||||
2020-07-07 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* gramps/gui/plug/quick/_quickreports.py: Fix bug in web connection
|
||||
menu launching incorrect web site Resolves #11280.
|
||||
* po/de.po: Germen fixed translation error of Media:
|
||||
|
||||
2019-08-26 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-04 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* gramps/gui/autocomp.py: Translation problem when creating event
|
||||
filter If you create a filter with the rule name: "Events with a particular type" or "Events with <data>" The menu "Travel", "Academic"... are not
|
||||
translated Fixes #11293
|
||||
* po/de.po: Fix typo
|
||||
|
||||
2019-08-26 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-07-01 Leonhaeuser <mirko@leonhaeuser.de>
|
||||
|
||||
* gramps/gui/configure.py, gramps/gui/widgets/grampletbar.py: Error
|
||||
when checking option to add Quit to Taskbar Fixes #11290
|
||||
* po/de.po: update German translation
|
||||
|
||||
2019-08-25 SNoiraud <Serge.Noiraud@free.fr>
|
||||
2020-02-16 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* gramps/plugins/webreport/narrativeweb.py,
|
||||
gramps/plugins/webreport/person.py: Make the narratives notes
|
||||
placement an option From 5.1 the narrative notes are placed just after the name, gender
|
||||
and age at death. This follow the feature request #6772. Some
|
||||
people want to have this placement an option to have the same
|
||||
functionality as before Fixes #11283
|
||||
* 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.
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
2020-04-23 SNoiraud <serge.noiraud@laposte.net>
|
||||
|
||||
* debian/changelog: Finalise Debian changelog for 5.1.0 release
|
||||
* 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
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
2020-05-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* debian/control: Bump gtk+ version to 3.12 & add
|
||||
gir1.2-geocodeglib-1.0 dependency
|
||||
* gramps/plugins/tool/verify.py: Fix Verify tool bug caused by bad
|
||||
change in GObject introspection Fixes: #11708
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
2020-06-22 pehlm <par.ekholm@pekholm.org>
|
||||
|
||||
* debian/copyright: Update copyrights
|
||||
* po/sv.po: A little adjustment to Swedish translation
|
||||
|
||||
2019-08-24 Ross Gammon <rossgammon@mail.dk>
|
||||
2020-06-21 pehlm <par.ekholm@pekholm.org>
|
||||
|
||||
* debian/changelog, debian/control: Merge last 5.0.2 debian release
|
||||
information into 51 maintenance branch
|
||||
* po/sv.po: Updates to Swedish translation
|
||||
|
||||
2019-08-23 Sebastian Schubert <schubert.seb@gmail.com>
|
||||
2020-06-20 Nick Hall <nick-h@gramps-project.org>
|
||||
|
||||
* README.md: Add optional fontconfig package to README.md
|
||||
* 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.
|
||||
|
||||
2019-08-23 Sebastian Schubert <schubert.seb@gmail.com>
|
||||
2020-06-20 Megumi Sakata <megumi.sakata.k@gmail.com>
|
||||
|
||||
* NEWS: Fix typo in NEWS
|
||||
* po/ja.po: Update Japanese translation
|
||||
|
||||
2019-08-30 Zdeněk Hataš <zdenek.hatas@gmail.com>
|
||||
2020-06-07 Serge Noiraud <Serge.Noiraud@laposte.net>
|
||||
|
||||
* po/cs.po: Update Czech translation
|
||||
* gramps/plugins/webreport/person.py,
|
||||
gramps/plugins/webreport/place.py: Navweb: incorrect link type for
|
||||
osm css files (#1071) Fixes #011787
|
||||
|
||||
2019-08-29 Zdeněk Hataš <zdenek.hatas@gmail.com>
|
||||
2020-06-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* po/cs.po: Update Czech translation
|
||||
* 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.
|
||||
|
||||
2019-08-25 Mirko Leonhaeuser <mirko@leonhaeuser.de>
|
||||
2020-06-07 prculley <paulr2787@gmail.com>
|
||||
|
||||
* po/de.po: German translation updated
|
||||
* : commit e614a79cef213f57552ceb566eb2d294c9435231 Author: vantu5z
|
||||
<vantu5z@mail.ru> Date: Tue Apr 28 15:23:25 2020 +0300
|
||||
|
||||
2019-08-24 John Ralls <jralls@ceridwen.us>
|
||||
2020-03-16 prculley <paulr2787@gmail.com>
|
||||
|
||||
* mac/Info.plist, mac/gramps.modules: Release Gramps-5.1.0 on Mac.
|
||||
* gramps/gen/plug/menu/_enumeratedlist.py: Fix some reports for CLI
|
||||
where warning message about Value not found Fixes #11621
|
||||
|
||||
2019-08-16 John Ralls <jralls@ceridwen.us>
|
||||
2020-03-16 prculley <paulr2787@gmail.com>
|
||||
|
||||
* mac/release.entitlements.plist: An entitlements plist for
|
||||
codesigning Gramps. Python is an interpreter and therefore needs to create executable
|
||||
memory. Since it doesn't know how to sign that memory it requires
|
||||
the allow-unsigned-executable-memory entitlement to run in a
|
||||
hardened runtime. One must apply this entitlement to both Gramps.app
|
||||
and Gramps.app/Contents/MacOS/dot when codesigning them.
|
||||
* gramps/cli/plug/__init__.py: Fix Genealogy Tree reports for crash
|
||||
in CLI Fixes #11621
|
||||
|
||||
2019-06-11 John Ralls <jralls@ceridwen.us>
|
||||
2020-04-10 prculley <paulr2787@gmail.com>
|
||||
|
||||
* mac/gramps.modules: Fix graphviz and exiv2 download URLs.
|
||||
* gramps/gui/views/treemodels/treebasemodel.py: Add uistate to tree
|
||||
views filter initialization Fixes #11657
|
||||
|
||||
2019-06-11 John Ralls <jralls@ceridwen.us>
|
||||
2020-04-04 prculley <paulr2787@gmail.com>
|
||||
|
||||
* mac/gramps.modules: Update dependency versions and download paths.
|
||||
* gramps/plugins/lib/libgedcom.py: Fix GEDCOM import for bad source
|
||||
title when sources precede references. Fixes #11610
|
||||
|
||||
2019-08-22 vantu5z <vantu5z@mail.ru>
|
||||
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
|
||||
|
||||
2019-08-22 pehlm <par.ekholm@pekholm.org>
|
||||
2020-03-25 Translator5 <Translator5@users.noreply.github.com>
|
||||
|
||||
* po/sv.po: Update Swedish translation with the new gramps.pot
|
||||
* po/ru.po: [Language: Russian] Maintenance/gramps51 (#1027) * some Russian translations updates Новый перевод для неких случаев, но
|
||||
улучшающие понимание и выглядит
|
||||
более уместно. Также применены
|
||||
русские переводы слов, которые
|
||||
использовали до того англицизмы
|
||||
|
||||
2019-08-21 prculley <paulr2787@gmail.com>
|
||||
2020-03-03 Joan Creus <joan.creusandreu@gmail.com>
|
||||
|
||||
* Bump to 5.1.1
|
||||
* 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
|
||||
|
||||
|
||||
@@ -1,3 +1,125 @@
|
||||
2020-08-11
|
||||
Version 5.1.3
|
||||
* Update ca, de, fi, fr, ja, pl, ru, sl, sv, uk, zh_CN translation
|
||||
* Events View: "Main Participants" column does not show the full list
|
||||
of participants when expanded.
|
||||
* mac/gramps.modules: Use current Gtk release instead of Gtk-3.14.
|
||||
* mac/gramps.modules: Upgrade pymodules for Python 3.8 compatibility.
|
||||
* Fix XML export when 'Group-as" name contains XML invalid chars
|
||||
* Fix NarWeb: Province place-type is not displayed
|
||||
* Fix ManagedWindow so that new windows don't appear offscreen when
|
||||
system 'screen' sizes change in part time multi-monitor setups.
|
||||
* Fix menus when db fails to open due to upgrade/downgrade etc.
|
||||
* Fix issue with attach source tool, results panel
|
||||
* Fix GEDCOM export; don't include ADDR when address is missing
|
||||
* EditPlace: Allow Coordinates containing a comma instead of a period
|
||||
* NarrativeWeb:
|
||||
* Should show patronymic in individuals.
|
||||
In the individuals and in surnames pages, we should show the
|
||||
complete name like defined in the display tab from the narrative web
|
||||
configuration.
|
||||
* Fix Narrated Website Google Maps Output JS Warning SensorNotRequired
|
||||
* Fix incorrect link type for osm css files
|
||||
* Fix image size limit doesn't match tooltip
|
||||
* Update all translations for changes from 'Default' to 'Home' Person
|
||||
* Change GUI references to 'Home Person' instead of 'Default Person'
|
||||
* Use event attribute types in the event reference editor.
|
||||
In the event reference editor, custom event attribute types should
|
||||
be used rather than the default person attribute types.
|
||||
* Fix Verify tool bug caused by bad change in GObject introspection
|
||||
* Fix RemoveUnused tool for crash caused by Gtk introspection bug
|
||||
* Fix import test for change cause by previous change which was:
|
||||
Fix GEDCOM import for bad source title when sources precede references.
|
||||
* Fix GEDCOM import for bad source title when sources precede references.
|
||||
* Fix some reports for CLI where warning message about Value not found
|
||||
* Fix Genealogy Tree reports for crash in CLI
|
||||
* Add uistate to tree views filter initialization
|
||||
* Fix some Python syntax errors that appear in v3.8.x
|
||||
* Suppress age = 0 days in events list. If the reference event date is equal
|
||||
to the event date, don't show the age except if the date is estimated,
|
||||
calculated, etc.
|
||||
* Fix Dashboard Gramplets to update during db close when not shown
|
||||
* Fix Windows GUI mode startup for crash with some languages
|
||||
* Fix dbapi to support "Abandon Changes & Quit" feature
|
||||
* Fix GrampsType for comparison bug with empty string as one value
|
||||
* Fix Date Display so that it uses LC_TIME if defined
|
||||
* Fix StyledText so serialize will match for style list order changes
|
||||
* Try to fix exceptions on ManagedWindow close
|
||||
* Fix Mac SQLite3 locale bug when locale contains non-ascii characters
|
||||
* Fix issue when Person has Same date of birth and death; gives an error.
|
||||
* Geography: add a popup for a bad tiles path
|
||||
* Fix GEDCOM export of estimated/calculated dates with modifers
|
||||
* Bump to v5.1.3
|
||||
|
||||
2020-01-14
|
||||
Version 5.1.2
|
||||
* Narweb: Private notes for home, intro and contact. If the notes are private,
|
||||
we can't use them in these pages.
|
||||
* Referenced regions problems. When image width > 800, the referenced
|
||||
regions are incorrectly placed
|
||||
* Ancestor's tree display looks weird Solves the following:
|
||||
- Person boxes overlap
|
||||
- Some person boxes partially visible or hidden
|
||||
* some cleanup in ancestortree.css
|
||||
* ancestor tree and long names.
|
||||
* Adapt ancestor tree css file for all themes
|
||||
* dates not localised in place pages
|
||||
* Mainz problem with short text in one note, Issue occurs on the homepage
|
||||
and introduction page.
|
||||
* bad event links on media pages
|
||||
* Navweb: Don't use media regions in some case:
|
||||
- If we don't show families
|
||||
- If we don't show events
|
||||
- Don't show the media regions for a thumbnail
|
||||
* WEBCAL: home link translated to lowercase
|
||||
* Wrong web calendar title on home page. This solves the possibility to
|
||||
have ">", "<" in the title
|
||||
* Update LDS Temple list
|
||||
* Make GuiDestinationOption Folder Icon start in users directory
|
||||
* Allow import file filter to accept case insensitive extensions
|
||||
* Fix db to warn/prevent opening newer schema versions
|
||||
* Fix Progen import dialog and progress meter for correct parent window
|
||||
* Fix Progen import to correctly handle AKA surnames
|
||||
* Fix ExportPkg so errors are not lost, and has progress bar for media
|
||||
* Fix Export Assistant so error messages get correct parent window
|
||||
* Fix GEDCOM import when family is missing; import created a missing note
|
||||
* Fix Dashboard for adding Gramplet crash in Slovenian
|
||||
* Update cs, ca, fr, uk, he, fi, hr, de, sv translation
|
||||
* Update date parsing for czech locale
|
||||
* Fix Spanish translation for dates
|
||||
* fix private proxy tagref support. Add missing code for event, repository,
|
||||
source, citation and place
|
||||
* [Tree doc Tex] fix "-" char on place name "-" can lead to confusion,
|
||||
generating text out of the box with PDF file format
|
||||
* [Tree doc Tex] fix typo on custom size
|
||||
* Fix duplicated "døde døde" Norwegion Translation for libnarrate
|
||||
* Fix up Event Editors Place display for bidi text with Gramps ID
|
||||
* Fix issues with RTL languages and LAT/LONG
|
||||
* Fix display of GPS coordinates in Places view for RTL languages
|
||||
* Fix place editor lat/long entry for RTL languages
|
||||
* Fix GEDCOM export to avoid translated GrampsType strings
|
||||
* Allow Tools with Notbook tabs to expand to fill the window
|
||||
* Limit Age Stats gramplet settings to appropriate values.
|
||||
* Max ages should be divisible by 5 to avoid out of range errors.
|
||||
* The chart width should be greater than 45 to look right and
|
||||
avoid division by zero errors.
|
||||
* Fix the Preferences 'Age display precision' value getting lost
|
||||
* Fix Window family tree title for non-ASCII chars on Windows
|
||||
* Fix Preferences/Genealogical Symbols when only one font is present
|
||||
* Fix various Entry fields so Undo/Redo works
|
||||
* Fix tag colors on PedigreeView
|
||||
* Fix Gramps -v error when Gtk is not present
|
||||
* Fix for PedigreeView not reflecting changes to birthday or death
|
||||
* ODF DOC - Fix improper escaping in odt output for TOC/Bookmark etc.
|
||||
* Fix CLI parser to accept negative integers as valid
|
||||
* Fix Descendant Tree report for HandleError when no parents on family
|
||||
* Fix Reorder ID tool so subsequent db additions used next possible ID
|
||||
* Upgrade export VCalendar to v2.0, so can export all utf8 characters
|
||||
* Fix Preferences so <ctrl>PageUp/PageDn doesn't stick on Dates tab
|
||||
* Graphs: Escape for name, dates and places in graph reports with XML
|
||||
illegal characters
|
||||
* Fix 'Go' menu direct object selection, goes to wrong place
|
||||
|
||||
2019-09-14
|
||||
Version 5.1.1
|
||||
* Update translations: cs, de, fi, fr, he, hr, pt_PT, ru, sv
|
||||
|
||||
|
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 |
@@ -20,6 +20,9 @@
|
||||
<code>SAMOA</code>
|
||||
<code>AP</code>
|
||||
</temple>
|
||||
<temple name="Arequipa Peru Temple">
|
||||
<code>AREQU</code>
|
||||
</temple>
|
||||
<temple name="Asuncion, Paraguay">
|
||||
<code>ASUNC</code>
|
||||
</temple>
|
||||
@@ -27,6 +30,9 @@
|
||||
<code>ATLAN</code>
|
||||
<code>AT</code>
|
||||
</temple>
|
||||
<temple name="Barranquilla Colombia Temple">
|
||||
<code>BARRA</code>
|
||||
</temple>
|
||||
<temple name="Baton Rouge, Louisiana">
|
||||
<code>BROUG</code>
|
||||
</temple>
|
||||
@@ -57,6 +63,9 @@
|
||||
<temple name="Bountiful, Utah">
|
||||
<code>BOUNT</code>
|
||||
</temple>
|
||||
<temple name="Brigham City Utah Temple">
|
||||
<code>BRIGH</code>
|
||||
</temple>
|
||||
<temple name="Brisbane, Australia">
|
||||
<code>BRISB</code>
|
||||
</temple>
|
||||
@@ -79,8 +88,12 @@
|
||||
<code>ALBR</code>
|
||||
</temple>
|
||||
<temple name="Cebu, Philippines">
|
||||
<code>CEBUP</code>
|
||||
<code>CEBU</code>
|
||||
</temple>
|
||||
<temple name="Cedar City Utah">
|
||||
<code>CEDAR</code>
|
||||
</temple>
|
||||
<temple name="Chicago, Illinois">
|
||||
<code>CHICA</code>
|
||||
<code>CH</code>
|
||||
@@ -94,15 +107,18 @@
|
||||
<temple name="Colonia Juarez, Chihuahua, Mexico">
|
||||
<code>COLJU</code>
|
||||
</temple>
|
||||
<temple name="Columbia, South Carolina">
|
||||
<code>COLSC</code>
|
||||
</temple>
|
||||
<temple name="Columbia River, Washington">
|
||||
<code>CRIVE</code>
|
||||
</temple>
|
||||
<temple name="Columbia, South Carolina">
|
||||
<code>COLSC</code>
|
||||
</temple>
|
||||
<temple name="Columbus, Ohio">
|
||||
<code>COLUM</code>
|
||||
</temple>
|
||||
<temple name="Concepción Chile">
|
||||
<code>CONCE</code>
|
||||
</temple>
|
||||
<temple name="Copenhagen, Denmark">
|
||||
<code>COPEN</code>
|
||||
</temple>
|
||||
@@ -129,6 +145,19 @@
|
||||
<temple name="Edmonton, Alberta">
|
||||
<code>EDMON</code>
|
||||
</temple>
|
||||
<temple name="Endowment House">
|
||||
<code>EHOUS</code>
|
||||
<code>EH</code>
|
||||
</temple>
|
||||
<temple name="Fort Collins Colorado">
|
||||
<code>FORTC</code>
|
||||
</temple>
|
||||
<temple name="Fort Lauderdale Florida">
|
||||
<code>FORTL</code>
|
||||
</temple>
|
||||
<temple name="Fortaleza Brazil">
|
||||
<code>FORTA</code>
|
||||
</temple>
|
||||
<temple name="Frankfurt, Germany">
|
||||
<code>FRANK</code>
|
||||
<code>FR</code>
|
||||
@@ -191,6 +220,9 @@
|
||||
<code>IFALL</code>
|
||||
<code>IF</code>
|
||||
</temple>
|
||||
<temple name="Indianapolis Indiana">
|
||||
<code>INDIA</code>
|
||||
</temple>
|
||||
<temple name="Johannesburg, South Africa">
|
||||
<code>JOHAN</code>
|
||||
<code>JO</code>
|
||||
@@ -202,10 +234,14 @@
|
||||
<temple name="Kansas City, Missouri">
|
||||
<code>KANSA</code>
|
||||
</temple>
|
||||
<temple name="Kinshasa Democratic Republic of the Congo">
|
||||
<code>KINSH</code>
|
||||
</temple>
|
||||
<temple name="Kona, Hawaii">
|
||||
<code>KONA</code>
|
||||
</temple>
|
||||
<temple name="Kiev, Ukraine">
|
||||
<code>KYIV</code>
|
||||
<code>KIEV</code>
|
||||
</temple>
|
||||
<temple name="Kirtland, Ohio">
|
||||
@@ -223,6 +259,9 @@
|
||||
<code>LIMA</code>
|
||||
<code>LI</code>
|
||||
</temple>
|
||||
<temple name="Lisbon Portugal">
|
||||
<code>LISBO</code>
|
||||
</temple>
|
||||
<temple name="Logan, Utah">
|
||||
<code>LOGAN</code>
|
||||
<code>LG</code>
|
||||
@@ -270,6 +309,9 @@
|
||||
<temple name="Merida, Mexico">
|
||||
<code>MERID</code>
|
||||
</temple>
|
||||
<temple name="Meridian Idaho">
|
||||
<code>MIDAH</code>
|
||||
</temple>
|
||||
<temple name="Mesa, Arizona">
|
||||
<code>ARIZO</code>
|
||||
<code>AZ</code>
|
||||
@@ -325,6 +367,7 @@
|
||||
<code>OKLAH</code>
|
||||
</temple>
|
||||
<temple name="Oquirrh Mountain, Utah">
|
||||
<code>OQUIR</code>
|
||||
<code>OMOUN</code>
|
||||
</temple>
|
||||
<temple name="Orlando, Florida">
|
||||
@@ -340,6 +383,12 @@
|
||||
<code>PAPEE</code>
|
||||
<code>TA</code>
|
||||
</temple>
|
||||
<temple name="Paris France">
|
||||
<code>PARIS</code>
|
||||
</temple>
|
||||
<temple name="Payson Utah">
|
||||
<code>PAYSO</code>
|
||||
</temple>
|
||||
<temple name="Perth, Australia">
|
||||
<code>PERTH</code>
|
||||
</temple>
|
||||
@@ -349,6 +398,9 @@
|
||||
<temple name="Phoenix, Arizona">
|
||||
<code>PHOEN</code>
|
||||
</temple>
|
||||
<temple name="Port-au-Prince Haiti">
|
||||
<code>PORTA</code>
|
||||
</temple>
|
||||
<temple name="Portland, Oregon">
|
||||
<code>PORTL</code>
|
||||
<code>PT</code>
|
||||
@@ -359,6 +411,9 @@
|
||||
<temple name="Preston, England">
|
||||
<code>PREST</code>
|
||||
</temple>
|
||||
<temple name="Provo City Center, Utah">
|
||||
<code>PROCC</code>
|
||||
</temple>
|
||||
<temple name="Provo, Utah">
|
||||
<code>PROVO</code>
|
||||
<code>PV</code>
|
||||
@@ -385,6 +440,7 @@
|
||||
<code>REXBU</code>
|
||||
</temple>
|
||||
<temple name="Rome, Italy">
|
||||
<code>ROMEI</code>
|
||||
<code>ROME</code>
|
||||
</temple>
|
||||
<temple name="Sacramento, California">
|
||||
@@ -394,12 +450,6 @@
|
||||
<code>SGEOR</code>
|
||||
<code>SG</code>
|
||||
</temple>
|
||||
<temple name="St. Louis, Missouri">
|
||||
<code>SLOUI</code>
|
||||
</temple>
|
||||
<temple name="St. Paul, Minnesota">
|
||||
<code>SPMIN</code>
|
||||
</temple>
|
||||
<temple name="Salt Lake City, Utah">
|
||||
<code>SLAKE</code>
|
||||
<code>SL</code>
|
||||
@@ -415,6 +465,7 @@
|
||||
<code>SJOSE</code>
|
||||
</temple>
|
||||
<temple name="San Salvador, El Salvador">
|
||||
<code>SANSA</code>
|
||||
<code>SSALV</code>
|
||||
</temple>
|
||||
<temple name="Santiago, Chile">
|
||||
@@ -428,6 +479,9 @@
|
||||
<code>SPAUL</code>
|
||||
<code>SP</code>
|
||||
</temple>
|
||||
<temple name="Sapporo Japan">
|
||||
<code>SAPPO</code>
|
||||
</temple>
|
||||
<temple name="Seattle, Washington">
|
||||
<code>SEATT</code>
|
||||
<code>SE</code>
|
||||
@@ -442,6 +496,15 @@
|
||||
<temple name="Spokane, Washington">
|
||||
<code>SPOKA</code>
|
||||
</temple>
|
||||
<temple name="St. Louis, Missouri">
|
||||
<code>SLOUI</code>
|
||||
</temple>
|
||||
<temple name="St. Paul, Minnesota">
|
||||
<code>SPMIN</code>
|
||||
</temple>
|
||||
<temple name="Star Valley Wyoming">
|
||||
<code>STARV</code>
|
||||
</temple>
|
||||
<temple name="Stockholm, Sweden">
|
||||
<code>STOCK</code>
|
||||
<code>ST</code>
|
||||
@@ -463,9 +526,15 @@
|
||||
<temple name="Tegucigalpa, Honduras">
|
||||
<code>TEGUC</code>
|
||||
</temple>
|
||||
<temple name="The Gila Valley Arizona">
|
||||
<code>GILAV</code>
|
||||
</temple>
|
||||
<temple name="The Hague, Netherlands">
|
||||
<code>HAGUE</code>
|
||||
</temple>
|
||||
<temple name="Tijuana Mexico">
|
||||
<code>TIJUA</code>
|
||||
</temple>
|
||||
<temple name="Tokyo, Japan">
|
||||
<code>TOKYO</code>
|
||||
<code>TK</code>
|
||||
@@ -474,16 +543,19 @@
|
||||
<code>TORON</code>
|
||||
<code>TORNO</code>
|
||||
<code>TR</code>
|
||||
</temple>
|
||||
<temple name="Trujillo, Peru">
|
||||
<code>TRUJI</code>
|
||||
</temple>
|
||||
<temple name="Tucson Arizona">
|
||||
<code>TUCSO</code>
|
||||
</temple>
|
||||
<temple name="Tuxtla Gutierrez, Mexico">
|
||||
<code>TGUTI</code>
|
||||
</temple>
|
||||
<temple name="Twin Falls, Idaho">
|
||||
<code>TFALL</code>
|
||||
<code>TWINF</code>
|
||||
<code>TFALL</code>
|
||||
</temple>
|
||||
<temple name="Vancouver, British Columbia">
|
||||
<code>VANCO</code>
|
||||
@@ -505,10 +577,6 @@
|
||||
<code>WINTE</code>
|
||||
<code>WQUAR</code>
|
||||
</temple>
|
||||
<temple name="Endowment House">
|
||||
<code>EHOUS</code>
|
||||
<code>EH</code>
|
||||
</temple>
|
||||
<temple name="President's Office">
|
||||
<code>POFFI</code>
|
||||
<code>PO</code>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
0 HEAD
|
||||
1 SOUR Gramps
|
||||
2 VERS 5.0.2
|
||||
2 VERS 5.1.2
|
||||
2 NAME Gramps
|
||||
1 DATE 4 AUG 2019
|
||||
2 TIME 15:26:44
|
||||
1 DATE 7 JAN 2020
|
||||
2 TIME 13:39:43
|
||||
1 SUBM @SUBM@
|
||||
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
|
||||
1 COPR Copyright (c) 2019 Alex Roitman,,,.
|
||||
1 COPR Copyright (c) 2020 Alex Roitman,,,.
|
||||
1 GEDC
|
||||
2 VERS 5.5.1
|
||||
2 FORM LINEAGE-LINKED
|
||||
@@ -911,7 +911,7 @@
|
||||
2 DATE I think 1970 to 1971
|
||||
2 PLAC San Francisco, San Francisco Co., CA
|
||||
1 SLGC
|
||||
2 DATE EST ABT 1999
|
||||
2 DATE ABT 1999
|
||||
2 FAMC @F0016@
|
||||
2 TEMP DENVE
|
||||
2 PLAC Denver, Denver Co., CO, Denver Co., Colorado, USA
|
||||
@@ -1424,7 +1424,7 @@
|
||||
0 @N0018@ NOTE Another Citation Note
|
||||
0 @N0019@ NOTE A bad photo for sure
|
||||
0 @O0000@ OBJE
|
||||
1 FILE c:\users\prc\workspace\grampsm\main\data\tests\O0.jpg
|
||||
1 FILE d:\users\prc\documents\gramps\data\tests\O0.jpg
|
||||
2 FORM jpg
|
||||
2 TITL Michael O'Toole 2015-11
|
||||
1 NOTE @N0019@
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
|
||||
<database xmlns="http://gramps-project.org/xml/1.7.1/">
|
||||
<header>
|
||||
<created date="2019-08-04" version="5.0.2"/>
|
||||
<created date="1999-12-25" version="5.1.3"/>
|
||||
<researcher>
|
||||
<resname>Alex Roitman,,,</resname>
|
||||
<resaddr>Not Provided</resaddr>
|
||||
@@ -1302,7 +1302,7 @@
|
||||
</reporef>
|
||||
</source>
|
||||
<source handle="_0000008500000085" change="1" id="S0000">
|
||||
<stitle>@S0@</stitle>
|
||||
<stitle>Marriage Certificae</stitle>
|
||||
<noteref hlink="_000000e7000000e7"/>
|
||||
<reporef hlink="_000000e6000000e6" callno="what-321-ever" medium="Photo"/>
|
||||
</source>
|
||||
@@ -1705,7 +1705,7 @@ Unknown tag Line 1111:
|
||||
<range start="0" end="163"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_000000f9000000f9" change="1564950708" id="N0036" type="General">
|
||||
<note handle="_000000f9000000f9" change="1591544255" id="N0036" type="General">
|
||||
<text>Objects referenced by this note were missing in a file imported on 12/25/1999 12:00:00 AM.</text>
|
||||
</note>
|
||||
</notes>
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
gramps (5.1.3-1) focal; urgency=medium
|
||||
|
||||
* New release
|
||||
* Update debian/copyright for Alex Roitman
|
||||
|
||||
-- Ross Gammon <rosco2@ubuntu.com> Sun, 16 Aug 2020 20:23:34 +0200
|
||||
|
||||
gramps (5.1.2-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sat, 11 Jan 2020 19:07:08 +0100
|
||||
|
||||
gramps (5.1.1-1) unstable; urgency=medium
|
||||
|
||||
* New release
|
||||
|
||||
@@ -3,7 +3,7 @@ Upstream-Name: Gramps
|
||||
Source: https://gramps-project.org
|
||||
|
||||
Files: *
|
||||
Copyright: 2000-2007, Alex Roitman
|
||||
Copyright: 2000-2007, 2020 Alex Roitman
|
||||
2000-2002, Bruce J. DeGrasse
|
||||
2000-2008, Donald N. Allingham
|
||||
2000-2007, Martin Hawlisch
|
||||
|
||||
@@ -519,8 +519,8 @@ class CommandLineReport:
|
||||
self.format = tree_format["class"]
|
||||
if self.format is None:
|
||||
# Pick the first one as the default.
|
||||
self.format = tree_format.FORMATS[0]["class"]
|
||||
_chosen_format = tree_format.FORMATS[0]["type"]
|
||||
self.format = treedoc.FORMATS[0]["class"]
|
||||
_chosen_format = treedoc.FORMATS[0]["type"]
|
||||
else:
|
||||
self.format = None
|
||||
if _chosen_format and _format_str:
|
||||
|
||||
@@ -225,7 +225,7 @@ GTK_GETTEXT_DOMAIN = 'gtk30'
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
|
||||
"© 2007-2019 The Gramps Developers"
|
||||
"© 2007-2020 The Gramps Developers"
|
||||
COMMENTS = _("Gramps\n (Genealogical Research and Analysis "
|
||||
"Management Programming System)\n"
|
||||
"is a personal genealogy program.")
|
||||
|
||||
@@ -35,6 +35,7 @@ import logging
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..utils.grampslocale import GrampsLocale
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.sgettext
|
||||
# import prerequisites for localized handlers
|
||||
@@ -72,16 +73,20 @@ from . import _date_uk
|
||||
from . import _date_zh_CN
|
||||
from . import _date_zh_TW
|
||||
|
||||
# the following makes sure we use the LC_TIME value for date display & parsing
|
||||
dlocale = GrampsLocale(lang=glocale.calendar)
|
||||
|
||||
|
||||
# Initialize global parser
|
||||
try:
|
||||
if LANG in LANG_TO_PARSER:
|
||||
parser = LANG_TO_PARSER[LANG](plocale=glocale)
|
||||
parser = LANG_TO_PARSER[LANG](plocale=dlocale)
|
||||
else:
|
||||
parser = LANG_TO_PARSER[LANG_SHORT](plocale=glocale)
|
||||
parser = LANG_TO_PARSER[LANG_SHORT](plocale=dlocale)
|
||||
except:
|
||||
logging.warning(
|
||||
_("Date parser for '%s' not available, using default") % LANG)
|
||||
parser = LANG_TO_PARSER["C"](plocale=glocale)
|
||||
parser = LANG_TO_PARSER["C"](plocale=dlocale)
|
||||
|
||||
# Initialize global displayer
|
||||
try:
|
||||
@@ -92,13 +97,13 @@ except:
|
||||
|
||||
try:
|
||||
if LANG in LANG_TO_DISPLAY:
|
||||
displayer = LANG_TO_DISPLAY[LANG](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY[LANG](val, blocale=dlocale)
|
||||
else:
|
||||
displayer = LANG_TO_DISPLAY[LANG_SHORT](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY[LANG_SHORT](val, blocale=dlocale)
|
||||
except:
|
||||
logging.warning(
|
||||
_("Date displayer for '%s' not available, using default") % LANG)
|
||||
displayer = LANG_TO_DISPLAY["C"](val, blocale=glocale)
|
||||
displayer = LANG_TO_DISPLAY["C"](val, blocale=dlocale)
|
||||
|
||||
|
||||
# Import utility functions
|
||||
|
||||
@@ -50,6 +50,15 @@ class DateParserCZ(DateParser):
|
||||
Converts a text string into a Date object
|
||||
"""
|
||||
|
||||
quality_to_int = {
|
||||
'přibližně' : Date.QUAL_ESTIMATED,
|
||||
'odhadem' : Date.QUAL_ESTIMATED,
|
||||
'odh.' : Date.QUAL_ESTIMATED,
|
||||
'vypočteno' : Date.QUAL_CALCULATED,
|
||||
'vypočtené' : Date.QUAL_CALCULATED,
|
||||
'vyp.' : Date.QUAL_CALCULATED,
|
||||
}
|
||||
|
||||
bce = ["před naším letopočtem", "před Kristem",
|
||||
"př. n. l.", "př. Kr."] + DateParser.bce
|
||||
|
||||
@@ -58,6 +67,17 @@ class DateParserCZ(DateParser):
|
||||
# bug 9739 grampslocale.py gets '%-d.%-m.%Y' -- makes it be '%/d.%/m.%Y'
|
||||
self.dhformat = self.dhformat.replace('/', '') # so counteract that
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(mezi)\s+(?P<start>.+)\s+(a)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Czech display
|
||||
|
||||
@@ -52,7 +52,6 @@ methods should be changed to generate exceptions. Possibly by globally changing
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import logging
|
||||
import os
|
||||
import inspect
|
||||
from abc import ABCMeta
|
||||
from types import FunctionType
|
||||
@@ -160,10 +159,12 @@ def wrapper(method):
|
||||
"""
|
||||
class_name = args[0].__class__.__name__
|
||||
func_name = method.__name__
|
||||
caller_frame = inspect.stack()[1]
|
||||
frame = inspect.currentframe()
|
||||
c_frame = frame.f_back
|
||||
c_code = c_frame.f_code
|
||||
LOG.debug('calling %s.%s()... from file %s, line %s in %s',
|
||||
class_name, func_name, os.path.split(caller_frame[1])[1],
|
||||
caller_frame[2], caller_frame[3])
|
||||
class_name, func_name, c_code.co_filename, c_frame.f_lineno,
|
||||
c_code.co_name)
|
||||
return method(*args, **keywargs)
|
||||
return wrapped
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ from . import (DbReadBase, DbWriteBase, DbUndo, DBLOGNAME, DBUNDOFN,
|
||||
REPOSITORY_KEY, NOTE_KEY, TAG_KEY, TXNADD, TXNUPD, TXNDEL,
|
||||
KEY_TO_NAME_MAP, DBMODE_R, DBMODE_W)
|
||||
from .utils import write_lock_file, clear_lock_file
|
||||
from .exceptions import DbVersionError
|
||||
from ..errors import HandleError
|
||||
from ..utils.callback import Callback
|
||||
from ..updatecallback import UpdateCallback
|
||||
@@ -534,7 +535,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
self.undo_history_callback = None
|
||||
self.modified = 0
|
||||
self.transaction = None
|
||||
self.abort_possible = False
|
||||
self.abort_possible = True
|
||||
self._bm_changes = 0
|
||||
self.has_changed = False
|
||||
self.surname_list = []
|
||||
@@ -659,6 +660,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
|
||||
self.db_is_open = True
|
||||
|
||||
# Check on db version to see if too new
|
||||
dbversion = int(self._get_metadata('version', default='0'))
|
||||
if dbversion > self.VERSION[0]:
|
||||
self.close()
|
||||
raise DbVersionError(dbversion, 18, self.VERSION[0])
|
||||
|
||||
def _close(self):
|
||||
"""
|
||||
Close database backend.
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -41,9 +41,9 @@ from .. import Rule
|
||||
class IsDefaultPerson(Rule):
|
||||
"""Rule that checks for a default person in the database"""
|
||||
|
||||
name = _('Default person')
|
||||
name = _('Home Person')
|
||||
category = _('General filters')
|
||||
description = _("Matches the default person")
|
||||
description = _("Matches the Home Person")
|
||||
|
||||
def prepare(self, db, user):
|
||||
p = db.get_default_person()
|
||||
|
||||
@@ -44,10 +44,10 @@ class IsLessThanNthGenerationAncestorOfDefaultPerson(Rule):
|
||||
not more than N generations away"""
|
||||
|
||||
labels = [ _('Number of generations:') ]
|
||||
name = _('Ancestors of the default person '
|
||||
name = _('Ancestors of the Home Person '
|
||||
'not more than <N> generations away')
|
||||
category = _('Ancestral filters')
|
||||
description = _("Matches ancestors of the default person "
|
||||
description = _("Matches ancestors of the Home Person "
|
||||
"not more than N generations away")
|
||||
|
||||
def prepare(self, db, user):
|
||||
|
||||
@@ -52,7 +52,7 @@ class MatchesEventFilter(MatchesEventFilterBase):
|
||||
name = _('Persons with events matching the <event filter>')
|
||||
description = _("Matches persons who have events that match a certain"
|
||||
" event filter")
|
||||
category = _('General filters')
|
||||
category = _('Event filters')
|
||||
|
||||
# we want to have this filter show event filters
|
||||
namespace = 'Event'
|
||||
|
||||
@@ -99,7 +99,8 @@ class BaseTest(unittest.TestCase):
|
||||
stime = perf_counter()
|
||||
results = filter_.apply(self.db)
|
||||
if __debug__:
|
||||
rulename = inspect.stack()[1][3]
|
||||
frame = inspect.currentframe()
|
||||
rulename = frame.f_back.f_code.co_name
|
||||
print("%s: %.2f\n" % (rulename, perf_counter() - stime))
|
||||
return set(results)
|
||||
|
||||
|
||||
@@ -288,10 +288,12 @@ class GrampsType(object, metaclass=GrampsTypeMeta):
|
||||
else:
|
||||
return self.__value == value[0]
|
||||
else:
|
||||
if value.value == self._CUSTOM:
|
||||
if value.value == self._CUSTOM and self.__value == self._CUSTOM:
|
||||
return self.__string == value.string
|
||||
else:
|
||||
elif value.value != self._CUSTOM and self.__value != self._CUSTOM:
|
||||
return self.__value == value.value
|
||||
else:
|
||||
return False
|
||||
|
||||
def __ne__(self, value):
|
||||
return not self.__eq__(value)
|
||||
|
||||
@@ -299,6 +299,7 @@ class StyledText:
|
||||
"""
|
||||
if self._tags:
|
||||
the_tags = [tag.serialize() for tag in self._tags]
|
||||
the_tags.sort()
|
||||
else:
|
||||
the_tags = []
|
||||
|
||||
|
||||
@@ -64,11 +64,11 @@ class Test1(unittest.TestCase):
|
||||
C = self.C.join([self.A, self.S, deepcopy(self.B)])
|
||||
C = C.replace('X', StyledText('_', [self.T3]))
|
||||
_C = ('123_456\ncleartext\nabc_def',
|
||||
[((1, ''), 'v1', [(0, 2), (2, 3)]),
|
||||
((0, ''), 'v3', [(3, 4)]),
|
||||
[((0, ''), 'v3', [(3, 4)]),
|
||||
((0, ''), 'v3', [(21, 22)]),
|
||||
((1, ''), 'v1', [(0, 2), (2, 3)]),
|
||||
((1, ''), 'v1', [(4, 6)]),
|
||||
((2, ''), 'v2', [(19, 21), (18, 21)]),
|
||||
((0, ''), 'v3', [(21, 22)]),
|
||||
((2, ''), 'v2', [(22, 23), (22, 25)])])
|
||||
self.assertEqual(C.serialize(), _C)
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ class BasePluginManager:
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if BasePluginManager.__instance is not 1:
|
||||
if BasePluginManager.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
|
||||
|
||||
@@ -1135,7 +1135,7 @@ class PluginRegister:
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if PluginRegister.__instance is not 1:
|
||||
if PluginRegister.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
self.stable_only = True
|
||||
|
||||
@@ -113,6 +113,10 @@ else:
|
||||
_GS_CMD = where_is("gs")
|
||||
|
||||
|
||||
def esc(id_txt):
|
||||
return id_txt.replace('"', '\\"')
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
#
|
||||
# GVOptions
|
||||
@@ -575,7 +579,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
text += ' URL="%s"' % url
|
||||
|
||||
text += " ]"
|
||||
self.write(' "%s" %s;\n' % (node_id, text))
|
||||
self.write(' "%s" %s;\n' % (esc(node_id), text))
|
||||
|
||||
def add_link(self, id1, id2, style="", head="", tail="", comment=""):
|
||||
"""
|
||||
@@ -583,7 +587,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.add_link().
|
||||
"""
|
||||
self.write(' "%s" -> "%s"' % (id1, id2))
|
||||
self.write(' "%s" -> "%s"' % (esc(id1), esc(id2)))
|
||||
|
||||
if style or head or tail:
|
||||
self.write(' [')
|
||||
@@ -635,7 +639,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.add_samerank().
|
||||
"""
|
||||
self.write(' {rank=same "%s" "%s"}\n' % (id1, id2))
|
||||
self.write(' {rank=same "%s" "%s"}\n' % (esc(id1), esc(id2)))
|
||||
|
||||
def rewrite_label(self, id, label):
|
||||
"""
|
||||
@@ -643,7 +647,7 @@ class GVDocBase(BaseDoc, GVDoc):
|
||||
|
||||
Implements GVDocBase.rewrite_label().
|
||||
"""
|
||||
self.write(' "%s" [label = "%s"]\n' % (id, label))
|
||||
self.write(' "%s" [label = "%s"]\n' % (esc(id), label))
|
||||
|
||||
def start_subgraph(self, graph_id):
|
||||
""" Implement GVDocBase.start_subgraph() """
|
||||
|
||||
@@ -302,7 +302,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
||||
name = paper_size.get_name().lower()
|
||||
if name == 'custom size':
|
||||
width = str(paper_size.get_width())
|
||||
height = str(paper_size.get_width())
|
||||
height = str(paper_size.get_height())
|
||||
paper = 'papersize={%scm,%scm}' % (width, height)
|
||||
elif name in ('a', 'b', 'c', 'd', 'e'):
|
||||
paper = 'ansi' + name + 'paper'
|
||||
@@ -519,6 +519,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
||||
date_str = date_str + '/' + stop_date
|
||||
|
||||
place = escape(_pd.display_event(db, event))
|
||||
place = place.replace("-", "\--")
|
||||
|
||||
if modifier:
|
||||
event_type += '+'
|
||||
|
||||
@@ -62,6 +62,7 @@ class EnumeratedListOption(Option):
|
||||
:type value: int
|
||||
:return: nothing
|
||||
"""
|
||||
self.ini_value = value
|
||||
Option.__init__(self, label, value)
|
||||
self.__items = []
|
||||
self.__xml_items = []
|
||||
@@ -138,6 +139,8 @@ class EnumeratedListOption(Option):
|
||||
"""
|
||||
if value in (v for v, d in self.__items):
|
||||
Option.set_value(self, value)
|
||||
elif value == self.ini_value:
|
||||
return
|
||||
else:
|
||||
logging.warning(_("Value '%(val)s' not found for option '%(opt)s'") %
|
||||
{'val' : str(value), 'opt' : self.get_label()})
|
||||
|
||||
@@ -769,6 +769,7 @@ def sanitize_citation(db, citation):
|
||||
new_citation.set_gramps_id(citation.get_gramps_id())
|
||||
new_citation.set_handle(citation.get_handle())
|
||||
new_citation.set_change_time(citation.get_change_time())
|
||||
new_citation.set_tag_list(citation.get_tag_list())
|
||||
copy_srcattributes(db, citation, new_citation)
|
||||
copy_notes(db, citation, new_citation)
|
||||
copy_media_ref_list(db, citation, new_citation)
|
||||
@@ -914,6 +915,7 @@ def sanitize_source(db, source):
|
||||
new_source.set_gramps_id(source.get_gramps_id())
|
||||
new_source.set_handle(source.get_handle())
|
||||
new_source.set_change_time(source.get_change_time())
|
||||
new_source.set_tag_list(source.get_tag_list())
|
||||
|
||||
for repo_ref in source.get_reporef_list():
|
||||
if repo_ref and not repo_ref.get_privacy():
|
||||
@@ -987,6 +989,7 @@ def sanitize_place(db, place):
|
||||
new_place.set_type(place.get_type())
|
||||
new_place.set_code(place.get_code())
|
||||
new_place.set_placeref_list(place.get_placeref_list())
|
||||
new_place.set_tag_list(place.get_tag_list())
|
||||
|
||||
copy_citation_ref_list(db, place, new_place)
|
||||
copy_notes(db, place, new_place)
|
||||
@@ -1017,6 +1020,7 @@ def sanitize_event(db, event):
|
||||
new_event.set_handle(event.get_handle())
|
||||
new_event.set_date_object(event.get_date_object())
|
||||
new_event.set_change_time(event.get_change_time())
|
||||
new_event.set_tag_list(event.get_tag_list())
|
||||
|
||||
copy_citation_ref_list(db, event, new_event)
|
||||
copy_notes(db, event, new_event)
|
||||
@@ -1120,6 +1124,7 @@ def sanitize_repository(db, repository):
|
||||
new_repository.set_gramps_id(repository.get_gramps_id())
|
||||
new_repository.set_handle(repository.get_handle())
|
||||
new_repository.set_change_time(repository.get_change_time())
|
||||
new_repository.set_tag_list(repository.get_tag_list())
|
||||
|
||||
copy_notes(db, repository, new_repository)
|
||||
copy_addresses(db, repository, new_repository)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -117,7 +117,7 @@ _LOCALE_NAMES = {
|
||||
_RTL_LOCALES = ('ar', 'he')
|
||||
|
||||
# locales with less than 70% currently translated
|
||||
INCOMPLETE_TRANSLATIONS = ('ar', 'bg', 'he', 'ja', 'sq', 'ta', 'tr')
|
||||
INCOMPLETE_TRANSLATIONS = ('ar', 'bg', 'he', 'sq', 'ta', 'tr')
|
||||
|
||||
def _check_mswin_locale(locale):
|
||||
msloc = None
|
||||
|
||||
@@ -126,7 +126,7 @@ if win():
|
||||
pass # ok
|
||||
elif not os.path.isdir(HOME_DIR):
|
||||
os.makedirs(HOME_DIR)
|
||||
sys.stdout = sys.stderr = open(logfile, "w")
|
||||
sys.stdout = sys.stderr = open(logfile, "w", encoding='utf-8')
|
||||
stderrh = logging.StreamHandler(sys.stderr)
|
||||
stderrh.setFormatter(form)
|
||||
stderrh.setLevel(logging.DEBUG)
|
||||
|
||||
@@ -471,27 +471,36 @@ class ClipCitation(ClipHandleWrapper):
|
||||
|
||||
def refresh(self):
|
||||
if self._handle:
|
||||
citation = clipdb.get_citation_from_handle(self._handle)
|
||||
if citation:
|
||||
self._title = citation.get_gramps_id()
|
||||
notelist = list(map(clipdb.get_note_from_handle,
|
||||
citation.get_note_list()))
|
||||
srctxtlist = [note for note in notelist
|
||||
if note.get_type() == NoteType.SOURCE_TEXT]
|
||||
page = citation.get_page()
|
||||
if not page:
|
||||
page = _('not available|NA')
|
||||
text = ""
|
||||
if srctxtlist:
|
||||
text = " ".join(srctxtlist[0].get().split())
|
||||
#String must be unicode for truncation to work for non
|
||||
#ascii characters
|
||||
text = str(text)
|
||||
if len(text) > 60:
|
||||
text = text[:60] + "..."
|
||||
self._value = _("Volume/Page: %(pag)s -- %(sourcetext)s") % {
|
||||
'pag' : page,
|
||||
'sourcetext' : text}
|
||||
try:
|
||||
citation = clipdb.get_citation_from_handle(self._handle)
|
||||
if citation:
|
||||
self._title = citation.get_gramps_id()
|
||||
notelist = list(map(clipdb.get_note_from_handle,
|
||||
citation.get_note_list()))
|
||||
srctxtlist = [note for note in notelist
|
||||
if note.get_type() == NoteType.SOURCE_TEXT]
|
||||
page = citation.get_page()
|
||||
if not page:
|
||||
page = _('not available|NA')
|
||||
text = ""
|
||||
if srctxtlist:
|
||||
text = " ".join(srctxtlist[0].get().split())
|
||||
#String must be unicode for truncation to work for non
|
||||
#ascii characters
|
||||
text = str(text)
|
||||
if len(text) > 60:
|
||||
text = text[:60] + "..."
|
||||
self._value = _("Volume/Page: %(pag)s -- %(sourcetext)s"
|
||||
) % { 'pag' : page,
|
||||
'sourcetext' : text}
|
||||
except:
|
||||
# We are in the Source tree view. The shortcuts only
|
||||
# work for citations.
|
||||
print("We cannot copy the source from this view."
|
||||
" Use drag and drop.")
|
||||
self._title = self._value = ''
|
||||
self._pickle = self._type = self._objclass = None
|
||||
self._handle = self._dbid = self._dbname = None
|
||||
|
||||
|
||||
class ClipRepoRef(ClipObjWrapper):
|
||||
@@ -1281,6 +1290,14 @@ class ClipboardListView:
|
||||
model.insert_before(node, data)
|
||||
else:
|
||||
model.insert_after(node, data)
|
||||
elif isinstance(data[1], ClipCitation):
|
||||
if data[3]:
|
||||
# we have a real citation
|
||||
model.append(data)
|
||||
#else:
|
||||
# We are in a Source treeview and trying
|
||||
# to copy a source with a shortcut.
|
||||
# Use drag and drop to do that.
|
||||
else:
|
||||
model.append(data)
|
||||
|
||||
|
||||
@@ -1241,7 +1241,7 @@ class GrampsPreferences(ConfigureDialog):
|
||||
row, 'preferences.place-auto', start=0, stop=1,
|
||||
extra_callback=self.auto_title_changed,
|
||||
tooltip=_("Enables automatic place title generation "
|
||||
"using specifed format."))
|
||||
"using specified format."))
|
||||
self.auto_title_changed(cb_widget)
|
||||
hbox.pack_start(self.pformat, True, True, 0)
|
||||
hbox.pack_start(self.fmt_btn, False, False, 0)
|
||||
@@ -1573,7 +1573,7 @@ class GrampsPreferences(ConfigureDialog):
|
||||
self.add_checkbox(grid, _('Add tag on import'), current_line,
|
||||
cb_const, stop=2,
|
||||
extra_callback=self.toggle_tag_on_import,
|
||||
tooltip=_("Specifed tag will be added on import.\n"
|
||||
tooltip=_("Specified tag will be added on import.\n"
|
||||
"Clear to set default value."))
|
||||
grid.attach(self.tag_format_entry, 2, current_line, 1, 1)
|
||||
|
||||
|
||||
@@ -317,6 +317,13 @@ def add_all_files_filter(chooser):
|
||||
mime_filter.add_pattern('*')
|
||||
chooser.add_filter(mime_filter)
|
||||
|
||||
|
||||
def icase(ext):
|
||||
"""
|
||||
Return a glob reresenting a case insensitive file extension.
|
||||
"""
|
||||
return ''.join(['[{}{}]'.format(s.lower(), s.upper()) for s in ext])
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Format selectors: explictly set the format of the file
|
||||
@@ -446,8 +453,7 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
file_filter = Gtk.FileFilter()
|
||||
name = "%s (.%s)" % (plugin.get_name(), plugin.get_extension())
|
||||
file_filter.set_name(name)
|
||||
file_filter.add_pattern("*.%s" % plugin.get_extension())
|
||||
file_filter.add_pattern(plugin.get_extension().capitalize())
|
||||
file_filter.add_pattern("*.%s" % icase(plugin.get_extension()))
|
||||
import_dialog.add_filter(file_filter)
|
||||
|
||||
(box, type_selector) = format_maker()
|
||||
@@ -526,7 +532,7 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
return True
|
||||
else:
|
||||
try:
|
||||
f = file(filename,'w')
|
||||
f = open(filename, 'w')
|
||||
f.close()
|
||||
os.remove(filename)
|
||||
except IOError:
|
||||
@@ -542,7 +548,6 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
self.import_info = None
|
||||
self._begin_progress()
|
||||
self.uistate.set_sensitive(False)
|
||||
self.uistate.viewmanager.enable_menu(False)
|
||||
|
||||
try:
|
||||
#an importer can return an object with info, object.info_text()
|
||||
@@ -563,7 +568,6 @@ class GrampsImportFileDialog(ManagedWindow):
|
||||
except Exception:
|
||||
_LOG.error("Failed to import database.", exc_info=True)
|
||||
self.uistate.set_sensitive(True)
|
||||
self.uistate.viewmanager.enable_menu(True)
|
||||
self._end_progress()
|
||||
|
||||
def build_menu_names(self, obj): # this is meaningless since it's modal
|
||||
|
||||
@@ -1013,7 +1013,7 @@ class DbManager(CLIDbManager, ManagedWindow):
|
||||
"""
|
||||
Handle the reception of drag data
|
||||
"""
|
||||
drag_value = selection.get_data().decode()
|
||||
drag_value = selection.get_data().decode().strip(' \r\n\x00')
|
||||
fname = None
|
||||
type = None
|
||||
title = None
|
||||
|
||||
@@ -520,7 +520,10 @@ class DisplayState(Callback):
|
||||
history.push(handle)
|
||||
|
||||
def set_sensitive(self, state):
|
||||
self.window.set_sensitive(state)
|
||||
tbar = self.uimanager.get_widget('ToolBar')
|
||||
tbar.set_sensitive(state)
|
||||
self.viewmanager.hpane.set_sensitive(state)
|
||||
self.uimanager.enable_all_actions(state)
|
||||
|
||||
def db_changed(self, db):
|
||||
db.connect('long-op-start', self.progress_monitor.add_op)
|
||||
|
||||
@@ -46,7 +46,7 @@ from html import escape
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ...widgets.undoablebuffer import UndoableBuffer
|
||||
from gramps.gen.lib import EventRoleType
|
||||
from gramps.gen.lib import (EventRoleType, EventType, Date)
|
||||
from gramps.gen.datehandler import get_date, get_date_valid
|
||||
from gramps.gen.config import config
|
||||
from gramps.gen.utils.db import get_participant_from_event
|
||||
@@ -175,7 +175,12 @@ class EventRefModel(Gtk.TreeStore):
|
||||
"""
|
||||
date = event.get_date_object()
|
||||
if date and self.start_date:
|
||||
return (date - self.start_date).format(precision=age_precision)
|
||||
if (date == self.start_date and date.modifier == Date.MOD_NONE
|
||||
and not (event.get_type().is_death_fallback() or
|
||||
event.get_type() == EventType.DEATH)):
|
||||
return ""
|
||||
else:
|
||||
return (date - self.start_date).format(precision=age_precision)
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ from gramps.gen.lib import EventType, NoteType
|
||||
from gramps.gen.db import DbTxn
|
||||
from ..glade import Glade
|
||||
from .displaytabs import (CitationEmbedList, NoteTab, GalleryTab,
|
||||
EventBackRefList, AttrEmbedList)
|
||||
EventBackRefList, EventAttrEmbedList)
|
||||
from ..widgets import (PrivacyButton, MonitoredEntry,
|
||||
MonitoredDate, MonitoredDataType, MonitoredTagList)
|
||||
from .editreference import RefTab, EditReference
|
||||
@@ -209,10 +209,10 @@ class EditEventRef(EditReference):
|
||||
self._add_tab(notebook, self.srcref_list)
|
||||
self.track_ref_for_deletion("srcref_list")
|
||||
|
||||
self.attr_list = AttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source.get_attribute_list())
|
||||
self.attr_list = EventAttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source.get_attribute_list())
|
||||
self._add_tab(notebook, self.attr_list)
|
||||
self.track_ref_for_deletion("attr_list")
|
||||
|
||||
@@ -247,10 +247,11 @@ class EditEventRef(EditReference):
|
||||
self._add_tab(notebook, self.backref_tab)
|
||||
self.track_ref_for_deletion("backref_tab")
|
||||
|
||||
self.attr_ref_list = AttrEmbedList(self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source_ref.get_attribute_list())
|
||||
self.attr_ref_list = EventAttrEmbedList(
|
||||
self.dbstate,
|
||||
self.uistate,
|
||||
self.track,
|
||||
self.source_ref.get_attribute_list())
|
||||
self._add_tab(notebook_ref, self.attr_ref_list)
|
||||
self.track_ref_for_deletion("attr_ref_list")
|
||||
|
||||
|
||||
@@ -39,6 +39,9 @@ from ..glade import Glade
|
||||
from gramps.gen.simple import SimpleAccess
|
||||
from gramps.gen.const import URL_MANUAL_SECT2
|
||||
|
||||
import logging
|
||||
_LOG = logging.getLogger("editlink")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Constants
|
||||
@@ -154,6 +157,12 @@ class EditLink(ManagedWindow):
|
||||
|
||||
def _on_new_callback(self, obj):
|
||||
object_class = obj.__class__.__name__
|
||||
# workaround for bug12260
|
||||
try:
|
||||
test = obj.handle
|
||||
except AttributeError:
|
||||
_LOG.warn(str(object_class))
|
||||
return
|
||||
self.selected.set_text(self.display_link(
|
||||
object_class, "handle", obj.handle))
|
||||
self.url_link.set_text("gramps://%s/%s/%s" %
|
||||
|
||||
@@ -187,9 +187,11 @@ class EditPlace(EditPrimary):
|
||||
|
||||
def set_latlongitude(self, value):
|
||||
try:
|
||||
coma = value.index(',')
|
||||
self.longitude.set_text(value[coma+1:].strip())
|
||||
self.latitude.set_text(value[:coma].strip())
|
||||
coma = value.index(', ')
|
||||
longitude = value[coma+2:].strip().replace(',','.')
|
||||
latitude = value[:coma].strip().replace(',','.')
|
||||
self.longitude.set_text(longitude)
|
||||
self.latitude.set_text(latitude)
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
self.obj.set_latitude(self.latitude.get_value())
|
||||
|
||||
@@ -180,9 +180,11 @@ class EditPlaceRef(EditReference):
|
||||
|
||||
def set_latlongitude(self, value):
|
||||
try:
|
||||
coma = value.index(',')
|
||||
self.longitude.set_text(value[coma+1:].strip())
|
||||
self.latitude.set_text(value[:coma].strip())
|
||||
coma = value.index(', ')
|
||||
longitude = value[coma+2:].strip().replace(',','.')
|
||||
latitude = value[:coma].strip().replace(',','.')
|
||||
self.longitude.set_text(longitude)
|
||||
self.latitude.set_text(latitude)
|
||||
self.top.get_object("lat_entry").validate(force=True)
|
||||
self.top.get_object("lon_entry").validate(force=True)
|
||||
self.source.set_latitude(self.latitude.get_value())
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -32,6 +32,14 @@ the create/deletion of dialog windows.
|
||||
import os
|
||||
from io import StringIO
|
||||
import html
|
||||
import logging
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Set up logging
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
_LOG = logging.getLogger(".")
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GNOME/GTK
|
||||
@@ -575,6 +583,9 @@ class ManagedWindow:
|
||||
|
||||
Takes care of closing children and removing itself from menu.
|
||||
"""
|
||||
if hasattr(self, 'opened') and not self.opened:
|
||||
_LOG.warning("Tried to close a ManagedWindow more than once.")
|
||||
return # in case close somehow gets called again
|
||||
self.opened = False
|
||||
self._save_position(save_config=False) # the next line will save it
|
||||
self._save_size()
|
||||
@@ -622,6 +633,17 @@ class ManagedWindow:
|
||||
if self.horiz_position_key is not None:
|
||||
horiz_position = config.get(self.horiz_position_key)
|
||||
vert_position = config.get(self.vert_position_key)
|
||||
# make sure some of left side shows on screen
|
||||
# for part time multi monitor setups
|
||||
screen = Gtk.Window().get_screen()
|
||||
s_width = screen.get_width()
|
||||
s_height = screen.get_height()
|
||||
if horiz_position > s_width - 50 or vert_position > s_height - 50:
|
||||
(p_width, p_height) = self.parent_window.get_size()
|
||||
(p_horiz, p_vert) = self.parent_window.get_position()
|
||||
(w_width, w_height) = self.window.get_size()
|
||||
horiz_position = p_horiz + ((p_width - w_width) // 2)
|
||||
vert_position = p_vert + ((p_height - w_height) // 2)
|
||||
self.window.move(horiz_position, vert_position)
|
||||
|
||||
def _save_position(self, save_config=True):
|
||||
|
||||
@@ -1756,7 +1756,8 @@ class GuiDestinationOption(Gtk.Box):
|
||||
name = get_curr_dir
|
||||
fcd.set_current_folder(name)
|
||||
else:
|
||||
fcd.set_current_name(name)
|
||||
fcd.set_current_name(os.path.basename(name))
|
||||
fcd.set_current_folder(os.path.dirname(name))
|
||||
|
||||
status = fcd.run()
|
||||
if status == Gtk.ResponseType.OK:
|
||||
|
||||
@@ -814,9 +814,12 @@ class ToolManagedWindowBase(ManagedWindow):
|
||||
buffer_location = view.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
|
||||
int(event.x),
|
||||
int(event.y))
|
||||
iter = view.get_iter_at_location(*buffer_location)
|
||||
_iter = view.get_iter_at_location(*buffer_location)
|
||||
if isinstance(_iter, tuple): # Gtk changed api in recent versions
|
||||
_iter = _iter[1]
|
||||
|
||||
for (tag, person_handle) in self.tags:
|
||||
if iter.has_tag(tag):
|
||||
if _iter.has_tag(tag):
|
||||
_window = view.get_window(Gtk.TextWindowType.TEXT)
|
||||
_window.set_cursor(self.link_cursor)
|
||||
return False # handle event further, if necessary
|
||||
@@ -827,9 +830,11 @@ class ToolManagedWindowBase(ManagedWindow):
|
||||
buffer_location = view.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
|
||||
int(event.x),
|
||||
int(event.y))
|
||||
iter = view.get_iter_at_location(*buffer_location)
|
||||
_iter = view.get_iter_at_location(*buffer_location)
|
||||
if isinstance(_iter, tuple): # Gtk changed api in recent versions
|
||||
_iter = _iter[1]
|
||||
for (tag, person_handle) in self.tags:
|
||||
if iter.has_tag(tag):
|
||||
if _iter.has_tag(tag):
|
||||
person = self.db.get_person_from_handle(person_handle)
|
||||
if event.button == 1:
|
||||
if event.type == Gdk.EventType.DOUBLE_BUTTON_PRESS:
|
||||
|
||||
@@ -586,11 +586,11 @@ class ExportAssistant(ManagedWindow, Gtk.Assistant):
|
||||
ix = self.get_selected_format_index()
|
||||
config.set('behavior.recent-export-type', ix)
|
||||
export_function = self.map_exporters[ix].get_export_function()
|
||||
success = export_function(self.dbstate.db,
|
||||
filename,
|
||||
User(error=ErrorDialog, parent=self.uistate.window,
|
||||
callback=self.callback),
|
||||
self.option_box_instance)
|
||||
success = export_function(
|
||||
self.dbstate.db, filename,
|
||||
User(error=ErrorDialog, parent=self.window,
|
||||
callback=self.callback),
|
||||
self.option_box_instance)
|
||||
except:
|
||||
#an error not catched in the export_function itself
|
||||
success = False
|
||||
|
||||
@@ -71,7 +71,7 @@ class GuiPluginManager(Callback):
|
||||
|
||||
def __init__(self):
|
||||
""" This function should only be run once by get_instance() """
|
||||
if GuiPluginManager.__instance is not 1:
|
||||
if GuiPluginManager.__instance != 1:
|
||||
raise Exception("This class is a singleton. "
|
||||
"Use the get_instance() method")
|
||||
|
||||
|
||||
@@ -325,7 +325,6 @@ class BaseSelector(ManagedWindow):
|
||||
self.sortorder = Gtk.SortType.ASCENDING
|
||||
else:
|
||||
self.sortorder = Gtk.SortType.DESCENDING
|
||||
self.model.reverse_order()
|
||||
self.build_tree()
|
||||
|
||||
return True
|
||||
|
||||
@@ -496,6 +496,16 @@ class UIManager():
|
||||
"""
|
||||
return group.act_group.lookup_action(actionname)
|
||||
|
||||
def enable_all_actions(self, state):
|
||||
for group in self.action_groups:
|
||||
if group.act_group:
|
||||
for item in group.actionlist:
|
||||
action = group.act_group.lookup_action(item[ACTION_NAME])
|
||||
if action:
|
||||
# We check in case the group has not been inserted into
|
||||
# UIManager yet
|
||||
action.set_enabled(group.sensitive if state else False)
|
||||
|
||||
def dump_all_accels(self):
|
||||
''' A function used diagnostically to see what accels are present.
|
||||
This will only dump the current accel set, if other non-open windows
|
||||
|
||||
@@ -450,7 +450,7 @@ def open_file_with_default_application(path, uistate):
|
||||
GLib.timeout_add_seconds(1, poll_external, (proc, errstrings, uistate))
|
||||
return
|
||||
|
||||
def process_pending_events(max_count=10):
|
||||
def process_pending_events(max_count=20):
|
||||
"""
|
||||
Process pending events, but don't get into an infinite loop.
|
||||
"""
|
||||
|
||||
@@ -273,13 +273,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,14 +288,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')
|
||||
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.show()
|
||||
vbox.pack_end(self.hpane, True, True, 0)
|
||||
vbox.show_all()
|
||||
|
||||
self.uistate = DisplayState(self.window, self.statusbar,
|
||||
self.uimanager, self)
|
||||
@@ -835,6 +835,7 @@ class ViewManager(CLIManager):
|
||||
hbox.add(Gtk.Label(label=pdata.name))
|
||||
hbox.show_all()
|
||||
page_num = self.notebook.append_page(page.get_display(), hbox)
|
||||
self.active_page.post_create()
|
||||
if not self.file_loaded:
|
||||
self.uimanager.set_actions_visible(self.actiongroup, False)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, False)
|
||||
@@ -875,9 +876,6 @@ class ViewManager(CLIManager):
|
||||
"""
|
||||
Perform necessary actions when a page is changed.
|
||||
"""
|
||||
if not self.dbstate.is_open():
|
||||
return
|
||||
|
||||
self.__disconnect_previous_page()
|
||||
|
||||
self.active_page = self.pages[page_num]
|
||||
@@ -961,8 +959,7 @@ class ViewManager(CLIManager):
|
||||
self.dbstate.db.close(user=self.user)
|
||||
(filename, title) = value
|
||||
self.db_loader.read_file(filename)
|
||||
if self.dbstate.db.is_open():
|
||||
self._post_load_newdb(filename, 'x-directory/normal', title)
|
||||
self._post_load_newdb(filename, 'x-directory/normal', title)
|
||||
else:
|
||||
if dialog.after_change != "":
|
||||
# We change the title of the main window.
|
||||
@@ -997,7 +994,8 @@ class ViewManager(CLIManager):
|
||||
The method called after load of a new database.
|
||||
Inherit CLI method to add GUI part
|
||||
"""
|
||||
self._post_load_newdb_nongui(filename, title)
|
||||
if self.dbstate.db.is_open():
|
||||
self._post_load_newdb_nongui(filename, title)
|
||||
self._post_load_newdb_gui(filename, filetype, title)
|
||||
|
||||
def _post_load_newdb_gui(self, filename, filetype, title=None):
|
||||
@@ -1012,11 +1010,16 @@ class ViewManager(CLIManager):
|
||||
if title:
|
||||
name = title
|
||||
|
||||
rw = not self.dbstate.db.readonly
|
||||
if rw:
|
||||
msg = "%s - Gramps" % name
|
||||
isopen = self.dbstate.is_open()
|
||||
if not isopen:
|
||||
rw = False
|
||||
msg = "Gramps"
|
||||
else:
|
||||
msg = "%s (%s) - Gramps" % (name, _('Read Only'))
|
||||
rw = not self.dbstate.db.readonly
|
||||
if rw:
|
||||
msg = "%s - Gramps" % name
|
||||
else:
|
||||
msg = "%s (%s) - Gramps" % (name, _('Read Only'))
|
||||
self.uistate.window.set_title(msg)
|
||||
|
||||
if(bool(config.get('behavior.runcheck')) and QuestionDialog2(
|
||||
@@ -1035,7 +1038,7 @@ class ViewManager(CLIManager):
|
||||
config.set('behavior.runcheck', False)
|
||||
self.__change_page(self.notebook.get_current_page())
|
||||
self.uimanager.set_actions_visible(self.actiongroup, rw)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, True)
|
||||
self.uimanager.set_actions_visible(self.readonlygroup, isopen)
|
||||
self.uimanager.set_actions_visible(self.undoactions, rw)
|
||||
self.uimanager.set_actions_visible(self.redoactions, rw)
|
||||
|
||||
@@ -1060,51 +1063,6 @@ class ViewManager(CLIManager):
|
||||
config.set('paths.recent-file', '')
|
||||
config.save()
|
||||
|
||||
def enable_menu(self, enable):
|
||||
""" Enable/disable the menues. Used by the dbloader for import to
|
||||
prevent other operations during import. Needed because simpler methods
|
||||
don't work under Gnome with application menus at top of screen (instead
|
||||
of Gramps window).
|
||||
Note: enable must be set to False on first call.
|
||||
"""
|
||||
if not enable:
|
||||
self.action_st = (
|
||||
self.uimanager.get_actions_sensitive(self.actiongroup),
|
||||
self.uimanager.get_actions_sensitive(self.readonlygroup),
|
||||
self.uimanager.get_actions_sensitive(self.undoactions),
|
||||
self.uimanager.get_actions_sensitive(self.redoactions),
|
||||
self.uimanager.get_actions_sensitive(self.fileactions),
|
||||
self.uimanager.get_actions_sensitive(self.toolactions),
|
||||
self.uimanager.get_actions_sensitive(self.reportactions),
|
||||
self.uimanager.get_actions_sensitive(
|
||||
self.recent_manager.action_group))
|
||||
self.uimanager.set_actions_sensitive(self.actiongroup, enable)
|
||||
self.uimanager.set_actions_sensitive(self.readonlygroup, enable)
|
||||
self.uimanager.set_actions_sensitive(self.undoactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.redoactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.fileactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.toolactions, enable)
|
||||
self.uimanager.set_actions_sensitive(self.reportactions, enable)
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.recent_manager.action_group, enable)
|
||||
else:
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.actiongroup, self.action_st[0])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.readonlygroup, self.action_st[1])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.undoactions, self.action_st[2])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.redoactions, self.action_st[3])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.fileactions, self.action_st[4])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.toolactions, self.action_st[5])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.reportactions, self.action_st[6])
|
||||
self.uimanager.set_actions_sensitive(
|
||||
self.recent_manager.action_group, self.action_st[7])
|
||||
|
||||
def __change_undo_label(self, label, update_menu=True):
|
||||
"""
|
||||
Change the UNDO label
|
||||
|
||||
@@ -321,7 +321,7 @@ class NavigationView(PageView):
|
||||
else:
|
||||
from ..dialog import WarningDialog
|
||||
WarningDialog(_("No Home Person"),
|
||||
_("You need to set a 'default person' to go to. "
|
||||
_("You need to set a 'Home Person' to go to. "
|
||||
"Select the People View, select the person you want as "
|
||||
"'Home Person', then confirm your choice "
|
||||
"via the menu Edit -> Set Home Person."),
|
||||
|
||||
@@ -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=True)
|
||||
self.vpane.show_all()
|
||||
self._config.register('vpane.slider-position', -1)
|
||||
self.vpane.set_position(self._config.get('vpane.slider-position'))
|
||||
|
||||
self.sidebar_toggled(self.sidebar.get_property('visible'))
|
||||
self.hpane_sig = hpane.connect("draw", self.set_page_slider)
|
||||
@@ -343,6 +346,11 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
|
||||
self.bottombar.set_inactive()
|
||||
self.active = False
|
||||
|
||||
def post_create(self):
|
||||
if self.vpane:
|
||||
self._setup_slider_config(self.vpane, 'vpane.slider-position')
|
||||
self.vpane = None
|
||||
|
||||
@abstractmethod
|
||||
def build_tree(self):
|
||||
"""
|
||||
|
||||
@@ -130,7 +130,8 @@ class EventModel(FlatBaseModel):
|
||||
handle = data[0]
|
||||
cached, value = self.get_cached_value(handle, "PARTICIPANT")
|
||||
if not cached:
|
||||
value = get_participant_from_event(self.db, data[COLUMN_HANDLE])
|
||||
value = get_participant_from_event(self.db, data[COLUMN_HANDLE],
|
||||
all_=True) # all participants
|
||||
self.set_cached_value(handle, "PARTICIPANT", value)
|
||||
return value
|
||||
|
||||
|
||||
@@ -587,7 +587,8 @@ class TreeBaseModel(GObject.GObject, Gtk.TreeModel, BaseModel):
|
||||
if dfilter:
|
||||
cdb = CacheProxyDb(self.db)
|
||||
for handle in dfilter.apply(cdb, tree=True,
|
||||
user=User(parent=self.uistate.window)):
|
||||
user=User(parent=self.uistate.window,
|
||||
uistate=self.uistate)):
|
||||
status_ppl.heartbeat()
|
||||
data = data_map(handle)
|
||||
add_func(handle, data)
|
||||
|
||||
@@ -1473,7 +1473,7 @@ class GrampletPane(Gtk.ScrolledWindow):
|
||||
plugs.sort(key=lambda x: x.name)
|
||||
for plug in plugs:
|
||||
action_name = valid_action_name(plug.id)
|
||||
a_menuitems += menuitem % (action_name, plug.name)
|
||||
a_menuitems += menuitem % (action_name, escape(plug.name))
|
||||
actions.append((action_name,
|
||||
make_callback(self.add_gramplet, plug.name)))
|
||||
names = [gramplet.title for gramplet in self.closed_gramplets]
|
||||
@@ -1484,7 +1484,7 @@ class GrampletPane(Gtk.ScrolledWindow):
|
||||
# 'name' could be non-ASCII when in non-English language
|
||||
# action names must be in ASCII, so use 'id' instead.
|
||||
action_name = valid_action_name(str(id(name)))
|
||||
r_menuitems += menuitem % (action_name, name)
|
||||
r_menuitems += menuitem % (action_name, escape(name))
|
||||
actions.append((action_name,
|
||||
make_callback(self.restore_gramplet,
|
||||
name)))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -231,6 +231,10 @@ class DBAPI(DbGeneric):
|
||||
_LOG.debug(" %sDBAPI %s transaction begin for '%s'",
|
||||
"Batch " if transaction.batch else "",
|
||||
hex(id(self)), transaction.get_description())
|
||||
if transaction.batch:
|
||||
# A batch transaction does not store the commits
|
||||
# Aborting the session completely will become impossible.
|
||||
self.abort_possible = False
|
||||
self.transaction = transaction
|
||||
self.dbapi.begin()
|
||||
return transaction
|
||||
|
||||
@@ -101,6 +101,7 @@ class Connection:
|
||||
self.__cursor = self.__connection.cursor()
|
||||
self.__connection.create_function("regexp", 2, regexp)
|
||||
self.__collations = []
|
||||
self.__tmap = str.maketrans('-.@=;', '_____')
|
||||
self.check_collation(glocale)
|
||||
|
||||
def check_collation(self, locale):
|
||||
@@ -110,7 +111,10 @@ class Connection:
|
||||
:param locale: Locale to be checked.
|
||||
:param type: A GrampsLocale object.
|
||||
"""
|
||||
collation = locale.get_collation()
|
||||
#PySQlite3 permits only ascii alphanumerics and underscores in
|
||||
#collation names so first translate any old-style Unicode locale
|
||||
#delimiters to underscores.
|
||||
collation = locale.get_collation().translate(self.__tmap)
|
||||
if collation not in self.__collations:
|
||||
self.__connection.create_collation(collation, locale.strcoll)
|
||||
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
|
||||
@@ -1250,20 +1250,14 @@ class GedcomWriter(UpdateCallback):
|
||||
if start != Date.EMPTY:
|
||||
cal = date.get_calendar()
|
||||
mod = date.get_modifier()
|
||||
quality = date.get_quality()
|
||||
if quality in libgedcom.DATE_QUALITY:
|
||||
qual_text = libgedcom.DATE_QUALITY[quality] + " "
|
||||
else:
|
||||
qual_text = ""
|
||||
quality = None if mod else date.get_quality()
|
||||
if mod == Date.MOD_SPAN:
|
||||
val = "%sFROM %s TO %s" % (
|
||||
qual_text,
|
||||
val = "FROM %s TO %s" % (
|
||||
libgedcom.make_gedcom_date(start, cal, mod, None),
|
||||
libgedcom.make_gedcom_date(date.get_stop_date(),
|
||||
cal, mod, None))
|
||||
elif mod == Date.MOD_RANGE:
|
||||
val = "%sBET %s AND %s" % (
|
||||
qual_text,
|
||||
val = "BET %s AND %s" % (
|
||||
libgedcom.make_gedcom_date(start, cal, mod, None),
|
||||
libgedcom.make_gedcom_date(date.get_stop_date(),
|
||||
cal, mod, None))
|
||||
@@ -1559,7 +1553,7 @@ class GedcomWriter(UpdateCallback):
|
||||
@type addr: [a super-type of] LocationBase
|
||||
"""
|
||||
if addr.get_street() or addr.get_locality() or addr.get_city() or \
|
||||
addr.get_state() or addr.get_postal_code or addr.get_country():
|
||||
addr.get_state() or addr.get_postal_code() or addr.get_country():
|
||||
self._writeln(level, 'ADDR', addr.get_street())
|
||||
if addr.get_locality():
|
||||
self._writeln(level + 1, 'CONT', addr.get_locality())
|
||||
|
||||
@@ -179,34 +179,35 @@ class PackageWriter:
|
||||
#---------------------------------------------------------------
|
||||
|
||||
try:
|
||||
archive = tarfile.open(self.filename,'w:gz')
|
||||
except EnvironmentError as msg:
|
||||
with tarfile.open(self.filename, 'w:gz') as archive:
|
||||
|
||||
# Write media files first, since the database may be modified
|
||||
# during the process (i.e. when removing object)
|
||||
handles = self.db.get_media_handles(sort_handles=True)
|
||||
for indx, m_id in enumerate(handles):
|
||||
self.user.callback(indx * 100 / len(handles))
|
||||
mobject = self.db.get_media_from_handle(m_id)
|
||||
filename = media_path_full(self.db, mobject.get_path())
|
||||
archname = str(mobject.get_path())
|
||||
if os.path.isfile(filename) and os.access(filename,
|
||||
os.R_OK):
|
||||
archive.add(filename, archname, filter=fix_mtime)
|
||||
|
||||
# Write XML now
|
||||
with BytesIO() as g:
|
||||
gfile = XmlWriter(self.db, self.user, 2)
|
||||
gfile.write_handle(g)
|
||||
tarinfo = tarfile.TarInfo('data.gramps')
|
||||
tarinfo.size = len(g.getvalue())
|
||||
tarinfo.mtime = time.time()
|
||||
if not win():
|
||||
tarinfo.uid = os.getuid()
|
||||
tarinfo.gid = os.getgid()
|
||||
g.seek(0)
|
||||
archive.addfile(tarinfo, g)
|
||||
|
||||
return True
|
||||
except (EnvironmentError, OSError) as msg:
|
||||
log.warning(str(msg))
|
||||
self.user.notify_error(_('Failure writing %s') % self.filename, str(msg))
|
||||
return 0
|
||||
|
||||
# Write media files first, since the database may be modified
|
||||
# during the process (i.e. when removing object)
|
||||
for m_id in self.db.get_media_handles(sort_handles=True):
|
||||
mobject = self.db.get_media_from_handle(m_id)
|
||||
filename = media_path_full(self.db, mobject.get_path())
|
||||
archname = str(mobject.get_path())
|
||||
if os.path.isfile(filename) and os.access(filename, os.R_OK):
|
||||
archive.add(filename, archname, filter=fix_mtime)
|
||||
|
||||
# Write XML now
|
||||
g = BytesIO()
|
||||
gfile = XmlWriter(self.db, self.user, 2)
|
||||
gfile.write_handle(g)
|
||||
tarinfo = tarfile.TarInfo('data.gramps')
|
||||
tarinfo.size = len(g.getvalue())
|
||||
tarinfo.mtime = time.time()
|
||||
if not win():
|
||||
tarinfo.uid = os.getuid()
|
||||
tarinfo.gid = os.getgid()
|
||||
g.seek(0)
|
||||
archive.addfile(tarinfo, g)
|
||||
archive.close()
|
||||
g.close()
|
||||
|
||||
return True
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -376,7 +376,7 @@ class GrampsXmlWriter(UpdateCallback):
|
||||
for key in group_map:
|
||||
value = self.db.get_name_group_mapping(key)
|
||||
self.g.write(' <map type="group_as" key="%s" value="%s"/>\n'
|
||||
% (self.fix(key), value))
|
||||
% (self.fix(key), self.fix(value)))
|
||||
self.g.write(" </namemaps>\n")
|
||||
|
||||
def write_bookmarks(self):
|
||||
|
||||
@@ -32,6 +32,7 @@ from gi.repository import Gtk
|
||||
from gramps.gui.editors import EditEvent
|
||||
from gramps.gui.listmodel import ListModel, NOSORT
|
||||
from gramps.gen.plug import Gramplet
|
||||
from gramps.gen.lib import (EventType, Date)
|
||||
from gramps.gen.plug.report.utils import find_spouse
|
||||
from gramps.gui.dbguielement import DbGUIElement
|
||||
from gramps.gen.display.place import displayer as place_displayer
|
||||
@@ -129,7 +130,12 @@ class Events(Gramplet, DbGUIElement):
|
||||
date = event.get_date_object()
|
||||
start_date = self.cached_start_date
|
||||
if date and start_date:
|
||||
return (date - start_date).format(precision=age_precision)
|
||||
if (date == start_date and date.modifier == Date.MOD_NONE
|
||||
and not (event.get_type().is_death_fallback() or
|
||||
event.get_type() == EventType.DEATH)):
|
||||
return ""
|
||||
else:
|
||||
return (date - start_date).format(precision=age_precision)
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -258,7 +258,8 @@ class ProgenOptions(ManagedWindow):
|
||||
|
||||
# display window if GUI active
|
||||
if self.uistate:
|
||||
ManagedWindow.__init__(self, self.uistate, [], self.__class__)
|
||||
ManagedWindow.__init__(self, self.uistate, [], self.__class__,
|
||||
modal=True)
|
||||
self._display()
|
||||
|
||||
def __on_source_button_toggled(self, widget):
|
||||
@@ -580,6 +581,7 @@ class ProgenOptions(ManagedWindow):
|
||||
widget.grab_focus()
|
||||
|
||||
# creates a modal window and display immediatly!
|
||||
self.show()
|
||||
self.glade.toplevel.run()
|
||||
|
||||
def _collect(self):
|
||||
|
||||
@@ -3222,6 +3222,7 @@ class GedcomParser(UpdateCallback):
|
||||
make_unknown(gramps_id, self.explanation.handle,
|
||||
class_func, commit_func, self.trans,
|
||||
db=self.dbase)
|
||||
self.missing_references += 1
|
||||
self.__add_msg(_("Error: %(msg)s '%(gramps_id)s'"
|
||||
" (input as @%(xref)s@) not in input"
|
||||
" GEDCOM. Record synthesised") %
|
||||
@@ -7775,7 +7776,8 @@ class GedcomParser(UpdateCallback):
|
||||
# have got deleted by Chack and repair because the record is empty.
|
||||
# If we find the source record, the title is overwritten in
|
||||
# __source_title.
|
||||
src.set_title(line.data)
|
||||
if not src.title:
|
||||
src.set_title(line.data)
|
||||
self.dbase.commit_source(src, self.trans)
|
||||
self.__parse_source_reference(citation, level, src.handle, state)
|
||||
citation.set_reference_handle(src.handle)
|
||||
|
||||
@@ -290,7 +290,7 @@ class BasePersonView(ListView):
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -729,7 +729,8 @@ class ProgenParser(UpdateCallback):
|
||||
|
||||
# provide feedback about import progress (GUI / TXT)
|
||||
if self.uistate:
|
||||
self.progress = ProgressMeter(_("Import from Pro-Gen"), '')
|
||||
self.progress = ProgressMeter(_("Import from Pro-Gen"), '',
|
||||
parent=self.uistate.window)
|
||||
else:
|
||||
UpdateCallback.__init__(self, user.callback)
|
||||
|
||||
@@ -1331,9 +1332,10 @@ class ProgenParser(UpdateCallback):
|
||||
if attr:
|
||||
person.add_attribute(attr)
|
||||
else:
|
||||
self.__add_name(person, citation.handle, NameType.AKA,
|
||||
' '.join(alias_text[0:-1]),
|
||||
'', alias_text[-1].split(), '')
|
||||
self.__add_name(
|
||||
person, citation.handle if citation else None,
|
||||
NameType.AKA, ' '.join(alias_text[0:-1]),
|
||||
'', alias_text[-1], '')
|
||||
|
||||
# process F09 Person Code
|
||||
refn_code = recflds[person_ix[9]] # F09: INDI REFN/INDI CODE
|
||||
|
||||
@@ -113,7 +113,7 @@ class MessageLayer(GObject.GObject, osmgpsmap.MapLayer):
|
||||
"""
|
||||
Add a message
|
||||
"""
|
||||
self.message += "\n%s" % message if self.message is not "" else message
|
||||
self.message += "\n%s" % message if self.message else message
|
||||
|
||||
def do_draw(self, gpsmap, ctx):
|
||||
"""
|
||||
|
||||
@@ -64,6 +64,7 @@ _ = glocale.translation.sgettext
|
||||
from gramps.gen.config import config
|
||||
from gramps.gui.dialog import ErrorDialog
|
||||
from gramps.gen.constfunc import get_env_var
|
||||
from gramps.gen.const import VERSION_DIR
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -138,7 +139,19 @@ class OsmGps:
|
||||
ErrorDialog(_("Can't create "
|
||||
"tiles cache directory %s") % cache_path,
|
||||
parent=self.uistate.window)
|
||||
return self.vbox
|
||||
gini = os.path.join(VERSION_DIR, 'gramps.ini')
|
||||
ErrorDialog(_("You must verify and change the tiles cache"
|
||||
"\n..."
|
||||
"\n[geography]"
|
||||
"\n..."
|
||||
"\npath='bad/path'"
|
||||
"\n..."
|
||||
"\nin the gramps.ini file :\n%s"
|
||||
"\n\nBefore to change the gramps.ini file, "
|
||||
"you need to close gramps"
|
||||
"\n\nThe next errors will be normal") % gini,
|
||||
parent=self.uistate.window)
|
||||
return None
|
||||
|
||||
self.change_map(None, config.get("geography.map_service"))
|
||||
return self.vbox
|
||||
|
||||
@@ -145,8 +145,8 @@ class ToolControl(unittest.TestCase):
|
||||
"1 invalid birth event name was fixed",
|
||||
"1 invalid death event name was fixed",
|
||||
"2 places were referenced, but not found",
|
||||
"15 citations were referenced, but not found",
|
||||
"18 sources were referenced, but not found",
|
||||
"14 citations were referenced, but not found",
|
||||
"17 sources were referenced, but not found",
|
||||
"9 Duplicated Gramps IDs fixed",
|
||||
"7 empty objects removed",
|
||||
"1 person objects",
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -172,7 +172,11 @@ class RemoveUnused(tool.Tool, ManagedWindow, UpdateCallback):
|
||||
GObject.TYPE_STRING,
|
||||
GObject.TYPE_STRING,
|
||||
GObject.TYPE_STRING)
|
||||
self.sort_model = self.real_model.sort_new_with_model()
|
||||
# a short term Gtk introspection means we need to try both ways:
|
||||
if hasattr(self.real_model, "sort_new_with_model"):
|
||||
self.sort_model = self.real_model.sort_new_with_model()
|
||||
else:
|
||||
self.sort_model = Gtk.TreeModelSort.new_with_model(self.real_model)
|
||||
self.warn_tree.set_model(self.sort_model)
|
||||
|
||||
self.renderer = Gtk.CellRendererText()
|
||||
|
||||
@@ -542,7 +542,10 @@ class VerifyResults(ManagedWindow):
|
||||
GObject.TYPE_BOOLEAN)
|
||||
self.filt_model = self.real_model.filter_new()
|
||||
self.filt_model.set_visible_column(VerifyResults.TRUE_COL)
|
||||
self.sort_model = self.filt_model.sort_new_with_model()
|
||||
if hasattr(self.filt_model, "sort_new_with_model"):
|
||||
self.sort_model = self.filt_model.sort_new_with_model()
|
||||
else:
|
||||
self.sort_model = Gtk.TreeModelSort.new_with_model(self.filt_model)
|
||||
self.warn_tree.set_model(self.sort_model)
|
||||
|
||||
self.renderer = Gtk.CellRendererText()
|
||||
@@ -659,18 +662,19 @@ class VerifyResults(ManagedWindow):
|
||||
self.closeall()
|
||||
|
||||
def hide_toggled(self, button):
|
||||
self.filt_model = self.real_model.filter_new()
|
||||
if button.get_active():
|
||||
button.set_label(_("_Show all"))
|
||||
self.filt_model = self.real_model.filter_new()
|
||||
self.filt_model.set_visible_column(VerifyResults.SHOW_COL)
|
||||
self.sort_model = self.filt_model.sort_new_with_model()
|
||||
self.warn_tree.set_model(self.sort_model)
|
||||
else:
|
||||
self.filt_model = self.real_model.filter_new()
|
||||
self.filt_model.set_visible_column(VerifyResults.TRUE_COL)
|
||||
self.sort_model = self.filt_model.sort_new_with_model()
|
||||
self.warn_tree.set_model(self.sort_model)
|
||||
button.set_label(_("_Hide marked"))
|
||||
self.filt_model.set_visible_column(VerifyResults.TRUE_COL)
|
||||
if hasattr(self.filt_model, "sort_new_with_model"):
|
||||
self.sort_model = self.filt_model.sort_new_with_model()
|
||||
else:
|
||||
self.sort_model = Gtk.TreeModelSort.new_with_model(
|
||||
self.filt_model)
|
||||
self.warn_tree.set_model(self.sort_model)
|
||||
|
||||
def selection_toggled(self, cell, path_string):
|
||||
sort_path = tuple(map(int, path_string.split(':')))
|
||||
@@ -1788,7 +1792,7 @@ class OldAgeButNoDeath(PersonRule):
|
||||
class BirthEqualsDeath(PersonRule):
|
||||
""" test if a person's birth date is the same as their death date """
|
||||
ID = 33
|
||||
SEVERITY = Rule.ERROR
|
||||
SEVERITY = Rule.WARNING
|
||||
def broken(self):
|
||||
""" return boolean indicating whether this rule is violated """
|
||||
birth_date = get_birth_date(self.db, self.obj)
|
||||
|
||||
@@ -214,7 +214,7 @@ class FanChartView(fanchart.FanChartGrampsGUI, NavigationView):
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -141,7 +141,7 @@ _UI_DEF = [
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -139,7 +139,7 @@ _UI_DEF = [
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -138,7 +138,7 @@ _UI_DEF = [
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -139,7 +139,7 @@ _UI_DEF = [
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -723,7 +723,7 @@ class PedigreeView(NavigationView):
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -466,7 +466,7 @@ class RelationshipView(NavigationView):
|
||||
<property name="icon-name">go-home</property>
|
||||
<property name="action-name">win.HomePerson</property>
|
||||
<property name="tooltip_text" translatable="yes">'''
|
||||
'''Go to the default person</property>
|
||||
'''Go to the home person</property>
|
||||
<property name="label" translatable="yes">_Home</property>
|
||||
<property name="use-underline">True</property>
|
||||
</object>
|
||||
|
||||
@@ -1840,7 +1840,7 @@ class BasePage: # pylint: disable=C1001
|
||||
_linkurl = self.report.build_url_fname_html(_obj.handle,
|
||||
"ppl",
|
||||
linkurl)
|
||||
elif classname == "Family":
|
||||
elif classname == "Family" and self.inc_families:
|
||||
_obj = self.r_db.get_family_from_handle(newhandle)
|
||||
partner1_handle = _obj.get_father_handle()
|
||||
partner2_handle = _obj.get_mother_handle()
|
||||
@@ -1866,7 +1866,7 @@ class BasePage: # pylint: disable=C1001
|
||||
"ppl", True)
|
||||
if not _name:
|
||||
_name = self._("Unknown")
|
||||
elif classname == "Event":
|
||||
elif classname == "Event" and self.inc_events:
|
||||
_obj = self.r_db.get_event_from_handle(newhandle)
|
||||
_name = _obj.get_description()
|
||||
if not _name:
|
||||
@@ -1952,57 +1952,16 @@ class BasePage: # pylint: disable=C1001
|
||||
# make a thumbnail of this region
|
||||
newpath = self.copy_thumbnail(photo_handle, photo, region)
|
||||
newpath = self.report.build_url_fname(newpath, uplink=True)
|
||||
|
||||
snapshot += self.media_link(photo_handle, newpath, descr,
|
||||
uplink=self.uplink,
|
||||
usedescr=False)
|
||||
else:
|
||||
|
||||
dummy_rpath, newpath = self.report.prepare_copy_media(photo)
|
||||
newpath = self.report.build_url_fname(newpath, uplink=True)
|
||||
|
||||
# FIXME: There doesn't seem to be any point in highlighting
|
||||
# a sub-region in the thumbnail and linking back to the
|
||||
# person or whatever. First it is confusing when the link
|
||||
# probably has nothing to do with the page on which the
|
||||
# thumbnail is displayed, and second on a thumbnail it is
|
||||
# probably too small to see, and third, on the thumbnail,
|
||||
# the link is shown above the image (which is pretty
|
||||
# useless!)
|
||||
_region_items = self.media_ref_rect_regions(photo_handle,
|
||||
linkurl=False)
|
||||
if _region_items:
|
||||
with Html("div", id="GalleryDisplay") as mediadisplay:
|
||||
snapshot += mediadisplay
|
||||
|
||||
ordered = Html("ol", class_="RegionBox")
|
||||
mediadisplay += ordered
|
||||
while _region_items:
|
||||
(name, coord_x, coord_y,
|
||||
width, height, linkurl) = _region_items.pop()
|
||||
ordered += Html("li",
|
||||
style="left:%d%%; top:%d%%; "
|
||||
"width:%d%%; height:%d%%;" % (
|
||||
coord_x, coord_y,
|
||||
width, height))
|
||||
ordered += Html("a", name, href=linkurl)
|
||||
# Need to add link to mediadisplay to get the links:
|
||||
mediadisplay += self.media_link(photo_handle,
|
||||
newpath, descr,
|
||||
self.uplink, False)
|
||||
else:
|
||||
try:
|
||||
|
||||
# Begin hyperlink. Description is given only for
|
||||
# the purpose of the alt tag in img element
|
||||
snapshot += self.media_link(photo_handle, newpath,
|
||||
descr,
|
||||
uplink=self.uplink,
|
||||
usedescr=False)
|
||||
|
||||
except (IOError, OSError) as msg:
|
||||
self.r_user.warn(_("Could not add photo to page"),
|
||||
str(msg))
|
||||
snapshot += self.media_link(photo_handle, newpath,
|
||||
descr,
|
||||
uplink=self.uplink,
|
||||
usedescr=False)
|
||||
else:
|
||||
# begin hyperlink
|
||||
snapshot += self.doc_link(photo_handle, descr,
|
||||
@@ -2030,12 +1989,6 @@ class BasePage: # pylint: disable=C1001
|
||||
if photoref.ref in photolist_handles:
|
||||
photo = photolist_handles[photoref.ref]
|
||||
photolist_ordered.append(photo)
|
||||
try:
|
||||
if photo in photolist:
|
||||
photolist.remove(photo)
|
||||
except ValueError:
|
||||
LOG.warning("Error trying to remove '%s' from photolist",
|
||||
photo)
|
||||
# and add any that are left (should there be any?)
|
||||
photolist_ordered += photolist
|
||||
|
||||
@@ -2440,9 +2393,6 @@ class BasePage: # pylint: disable=C1001
|
||||
# not necessarily mean that a page has been generated
|
||||
(link, name, gid) = result
|
||||
|
||||
if name_style == _NAME_STYLE_FIRST and person:
|
||||
name = _get_short_name(person.get_gender(),
|
||||
person.get_primary_name())
|
||||
name = html_escape(name)
|
||||
# construct the result
|
||||
if not self.noid and gid != "":
|
||||
@@ -2593,6 +2543,7 @@ class BasePage: # pylint: disable=C1001
|
||||
(self._("State/ Province"),
|
||||
mlocation.get(PlaceType.STATE, '')),
|
||||
(self._("Postal Code"), place.get_code()),
|
||||
(self._("Province"), mlocation.get(PlaceType.PROVINCE, '')),
|
||||
(self._("Country"), mlocation.get(PlaceType.COUNTRY, ''))]:
|
||||
if data:
|
||||
trow = Html("tr") + (
|
||||
|
||||
@@ -126,10 +126,11 @@ class ContactPage(BasePage):
|
||||
note_id = report.options['contactnote']
|
||||
if note_id:
|
||||
note = self.r_db.get_note_from_gramps_id(note_id)
|
||||
note_text = self.get_note_format(note, False)
|
||||
if note:
|
||||
note_text = self.get_note_format(note, False)
|
||||
|
||||
# attach note
|
||||
summaryarea += note_text
|
||||
# attach note
|
||||
summaryarea += note_text
|
||||
|
||||
# add clearline for proper styling
|
||||
# add footer section
|
||||
|
||||
@@ -87,15 +87,17 @@ class HomePage(BasePage):
|
||||
section += homeimg
|
||||
|
||||
note_id = report.options['homenote']
|
||||
ldatec = None
|
||||
if note_id:
|
||||
note = self.r_db.get_note_from_gramps_id(note_id)
|
||||
note_text = self.get_note_format(note, False)
|
||||
if note:
|
||||
note_text = self.get_note_format(note, False)
|
||||
|
||||
# attach note
|
||||
section += note_text
|
||||
# attach note
|
||||
section += note_text
|
||||
|
||||
# last modification of this note
|
||||
ldatec = note.get_change_time()
|
||||
# last modification of this note
|
||||
ldatec = note.get_change_time()
|
||||
|
||||
# create clear line for proper styling
|
||||
# create footer section
|
||||
|
||||
@@ -87,15 +87,17 @@ class IntroductionPage(BasePage):
|
||||
section += introimg
|
||||
|
||||
note_id = report.options['intronote']
|
||||
ldatec = None
|
||||
if note_id:
|
||||
note = self.r_db.get_note_from_gramps_id(note_id)
|
||||
note_text = self.get_note_format(note, False)
|
||||
if note:
|
||||
note_text = self.get_note_format(note, False)
|
||||
|
||||
# attach note
|
||||
section += note_text
|
||||
# attach note
|
||||
section += note_text
|
||||
|
||||
# last modification of this note
|
||||
ldatec = note.get_change_time()
|
||||
# last modification of this note
|
||||
ldatec = note.get_change_time()
|
||||
|
||||
# add clearline for proper styling
|
||||
# create footer section
|
||||
|
||||
@@ -1453,7 +1453,7 @@ class NavWebReport(Report):
|
||||
output_file.close()
|
||||
else:
|
||||
output_file.close()
|
||||
if date > 0:
|
||||
if date is not None and date > 0:
|
||||
os.utime(output_file.name, (date, date))
|
||||
|
||||
def prepare_copy_media(self, photo):
|
||||
@@ -1687,7 +1687,7 @@ class NavWebOptions(MenuReportOptions):
|
||||
cright.set_help(_("The copyright to be used for the web files"))
|
||||
addopt("cright", cright)
|
||||
|
||||
self.__css = EnumeratedListOption(('StyleSheet'), CSS["default"]["id"])
|
||||
self.__css = EnumeratedListOption(_('StyleSheet'), CSS["default"]["id"])
|
||||
for (dummy_fname, gid) in sorted(
|
||||
[(CSS[key]["translation"], CSS[key]["id"])
|
||||
for key in list(CSS.keys())]):
|
||||
@@ -1891,7 +1891,7 @@ class NavWebOptions(MenuReportOptions):
|
||||
_("Max width of initial image"), _DEFAULT_MAX_IMG_WIDTH, 0, 2000)
|
||||
self.__maxinitialimagewidth.set_help(
|
||||
_("This allows you to set the maximum width "
|
||||
"of the image shown on the media page. Set to 0 for no limit."))
|
||||
"of the image shown on the media page."))
|
||||
addopt("maxinitialimagewidth", self.__maxinitialimagewidth)
|
||||
|
||||
self.__maxinitialimageheight = NumberOption(
|
||||
|
||||