Compare commits
184 Commits
v5.1.3
...
v3.2.0-beta2
| Author | SHA1 | Date | |
|---|---|---|---|
| 1af6e6cf63 | |||
| c54a3cc0d4 | |||
| dff7c4a8b5 | |||
| d4d71670e8 | |||
| 1b4f86ad2d | |||
| 47f4566a9c | |||
| 1c58e1c7b2 | |||
| 12714fd6f1 | |||
| 57e2ee81d4 | |||
| 6ca4f6b84f | |||
| 9150d59c1b | |||
| 3696ea6dd4 | |||
| a8da4bf460 | |||
| 4c28226a3f | |||
| d6d386520c | |||
| d162eca43d | |||
| f9e3d068d3 | |||
| 397809cd7b | |||
| 728c6f3c3b | |||
| 99160920f1 | |||
| 4bd50c6749 | |||
| c7ec7125f7 | |||
| e5c53f3734 | |||
| 6e64cd02bc | |||
| 4dad6d00db | |||
| 438793abf5 | |||
| a8506d868a | |||
| ed7f937da2 | |||
| 3f8586fed9 | |||
| c6c6307318 | |||
| 0d7398c09b | |||
| 949c1494e0 | |||
| cb7227f692 | |||
| 9da1431b6c | |||
| bf0a1cc434 | |||
| 137bc788c5 | |||
| c88c876e38 | |||
| 41c786cc18 | |||
| 6aeba201a4 | |||
| 56c898064d | |||
| e0b0b14c2d | |||
| 129d6e6fbd | |||
| f658139fb4 | |||
| bf00316be0 | |||
| 8bb52bb0d9 | |||
| 6a7594b95f | |||
| 2f52deae58 | |||
| 677ad44e44 | |||
| ae58e5a8d4 | |||
| 23d80230a9 | |||
| 3511390a52 | |||
| 842432b71d | |||
| 25ac9a4f20 | |||
| 011ff47007 | |||
| 10028218eb | |||
| 235180132c | |||
| 4ff82a7581 | |||
| 01f264fa8b | |||
| 571c6305ea | |||
| 9ad6dbef8f | |||
| 17b0fa4fc9 | |||
| 8b4b8da242 | |||
| 046d0fc897 | |||
| 1c58f0f0ba | |||
| 7b40ee1aea | |||
| b1c33334d2 | |||
| b84716e1e9 | |||
| c134937e9d | |||
| 5647b44801 | |||
| 7e01ef0f6b | |||
| 11437b7c27 | |||
| 23bad21b29 | |||
| 8546dc91e5 | |||
| cd0d479ec1 | |||
| 6fe4cff9e2 | |||
| 5a76e262c6 | |||
| acb3371b72 | |||
| adfc952c02 | |||
| 82b1c17360 | |||
| 16d631bbb3 | |||
| 3e4b3f69a9 | |||
| f9415e8fd1 | |||
| f6d9997204 | |||
| f21fb8d6d8 | |||
| 9efe53787d | |||
| 5c11bc6f09 | |||
| 027b333860 | |||
| 0a2d52a5a0 | |||
| 3dcc74a173 | |||
| fe337c21cd | |||
| b2d58a27e4 | |||
| c9cef9e4da | |||
| 7fdf47ac3c | |||
| 1e70d474f6 | |||
| 2169c8ab4f | |||
| 17f7e5f6fd | |||
| afd9b2f40f | |||
| 33b209eed7 | |||
| 90dc718dd0 | |||
| c79c29ec9a | |||
| 605f9d0f24 | |||
| 01c80b19db | |||
| 049698426e | |||
| cba3502131 | |||
| dfa9118384 | |||
| 2e84a2457b | |||
| ee8559dd69 | |||
| e984e15c9d | |||
| 393a2d9748 | |||
| 96fbb98733 | |||
| 9b30450f33 | |||
| 92b0b99e25 | |||
| 755807436a | |||
| 155aea5d72 | |||
| 3c80aaa2b0 | |||
| e91cdcbd8b | |||
| 38a90e201f | |||
| 61bff1a65c | |||
| 91281166c1 | |||
| 17e9750bb5 | |||
| 33414b0c78 | |||
| ec43a7122c | |||
| 76c1044a64 | |||
| d91cbd91bf | |||
| 644d0ac540 | |||
| 99c8ae9181 | |||
| 57f66d842f | |||
| 83c19420b4 | |||
| d1c4c853bb | |||
| 6f90f1cb46 | |||
| b69ee2b401 | |||
| ab0021c02b | |||
| f4fb59aefe | |||
| f660795ce1 | |||
| fe1d2530b1 | |||
| 81ad0c8602 | |||
| fbc6543ea7 | |||
| c639654f9b | |||
| ac8bc209e1 | |||
| 2e9066a6cf | |||
| d99f6eac3f | |||
| 9dbf20d795 | |||
| c0cc2ff7ba | |||
| 66639dd2cb | |||
| 38290f7c57 | |||
| 43dc1d299b | |||
| 9710e7adcf | |||
| d719751914 | |||
| 96c80a44e2 | |||
| 9dfa170293 | |||
| f3b7e35c69 | |||
| 4c9197b403 | |||
| 3ed392bab0 | |||
| edd6fc6ee7 | |||
| ae81cbc6ee | |||
| c9d41950eb | |||
| 8b0b4a3785 | |||
| 4989c9e5d4 | |||
| 78c286fce2 | |||
| ec7001837a | |||
| 4bf6ab292d | |||
| 6f6c74ae8b | |||
| 8440ccbf87 | |||
| 6cbe9e3c0d | |||
| f99b1ac371 | |||
| 848eb99bb7 | |||
| d1f26d9f7a | |||
| 51ff6e4569 | |||
| 69e08ceafb | |||
| fc080a686b | |||
| bb5428d725 | |||
| 5604a27bf4 | |||
| 63430a1ce3 | |||
| 7496974691 | |||
| 3a2af65bc0 | |||
| 26c80611b2 | |||
| 641b7e5e07 | |||
| f6af0cb380 | |||
| a5e4bf8637 | |||
| 077d0ded1f | |||
| 7b1eae9a5b | |||
| 5a46c30439 | |||
| 9e742feac4 | |||
| eb4e5ddc1f |
@@ -1,3 +1,28 @@
|
||||
Version 3.2.0 (beta1) -- the "I am your father" release.
|
||||
* New Plugin System:
|
||||
-> In the Help Menu -> Menu Status, all available plugins are visible. All
|
||||
plugins can be hidden, saving resources and hiding options you do not need.
|
||||
* Faster:
|
||||
-> Many under the hood improvements have occurred that should improve
|
||||
performance enormously. New features are implemented as plugins that can
|
||||
be hidden.
|
||||
-> Performance improvement example: Insertion of a new person in a family
|
||||
tree with 30000 people previously took 4 seconds on a 1.4GHz PC running
|
||||
Gramps 3.1, but now takes milliseconds.
|
||||
* New Views:
|
||||
-> There are new views, and some existing views have been greatly improved
|
||||
-> People view can now be sorted on the columns
|
||||
-> A Place treeview is present, nicely grouping your places under country
|
||||
groups
|
||||
-> GeoView has left it's beta status behind and shows your data on an online
|
||||
map (OpenStreetMap or Google Maps, a fast internet connection is required)
|
||||
-> Help Menu -> Extra Reports/Tools open a webpage with downloadable views
|
||||
* Other Improvements:
|
||||
-> Styled Notes now in most output formats that support styles
|
||||
-> New languages
|
||||
-> Select language in which report should be created (not yet available in
|
||||
all reports)
|
||||
|
||||
Version 3.1.3 -- the "What name?" release.
|
||||
* contains translation updates, crash fixes, bug fixes, and minor updates.
|
||||
* fixes and updates to:
|
||||
|
||||
+3
-3
@@ -11,8 +11,8 @@ AM_INIT_AUTOMAKE([1.6.3 foreign])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
RELEASE=0.SVN$(svnversion -n .)
|
||||
dnl RELEASE=0beta
|
||||
RELEASE=0beta.SVN$(svnversion -n .)
|
||||
dnl RELEASE=0beta3
|
||||
dnl RELEASE=0rc1
|
||||
dnl RELEASE=1
|
||||
|
||||
@@ -33,7 +33,7 @@ AC_SUBST(RELEASE)
|
||||
AC_SUBST(VERSIONSTRING)
|
||||
|
||||
dnl Add the languages which your application supports here.
|
||||
ALL_LINGUAS="hu zh_CN cs da de es fr it nb nl nn pl pt_BR ro ru sv eo fi lt sk tr bg hr sl ca mk sq he"
|
||||
ALL_LINGUAS="hu zh_CN cs da de es fr it nb nl nn pl pt_BR ru sv eo fi lt sk bg hr sl ca sq"
|
||||
GETTEXT_PACKAGE=gramps
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the Gettext package name.])
|
||||
|
||||
Vendored
+12
-5
@@ -3,9 +3,16 @@ gramps for Debian
|
||||
|
||||
This is the Debian package of GRAMPS.
|
||||
|
||||
If you do not install python-reportlab (gramps Recommends it be
|
||||
installed) then you will be able to create usable PDF files only if
|
||||
your database contains solely latin (iso-8859-1) characters. Reportlab
|
||||
will generate PDF files containing non-latin characters although they
|
||||
are quite large as the font must be included in the file.
|
||||
Regarding the extra dependencies:
|
||||
|
||||
Recommends: graphviz
|
||||
Enable creation of graphs
|
||||
Recommends: python-gtkmozembed
|
||||
Recommends: python-webkit
|
||||
Enable html rendering for Geographic view and Web view. If both
|
||||
are installed webkit will be used. python-gtkmozembed may be more
|
||||
stable.
|
||||
Suggests: ttf-freefont
|
||||
Allows more fonts in reports
|
||||
Suggests: python-gtkspell python-enchant
|
||||
allows spell checking in the notes. Both need to be installed.
|
||||
|
||||
Vendored
+251
-6
@@ -1,20 +1,265 @@
|
||||
gramps (3.0.0-1) gutsy; urgency=low
|
||||
gramps (3.2.0-0beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* works with gtk 2.19. Closes: #566958
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Fri, 05 Mar 2010 14:05:39 -0500
|
||||
|
||||
gramps (3.1.3-2) unstable; urgency=low
|
||||
|
||||
* Switch to dpkg-source 3.0 (quilt) format
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 05 Jan 2010 20:04:30 -0500
|
||||
|
||||
gramps (3.1.3-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Stephane Charette <stephanecharette@gmail.com> Mon, 31 Mar 2008 19:42:05 -0700
|
||||
-- James A. Treacy <treacy@debian.org> Sun, 06 Dec 2009 13:46:48 -0500
|
||||
|
||||
gramps (2.90.0-0beta) unstable; urgency=low
|
||||
gramps (3.1.2-2) unstable; urgency=low
|
||||
|
||||
* allow python >= 2.5. Closes: #547150
|
||||
* fix Relationship Graph to use new format for URLs. Closes: #532559
|
||||
* Web report creation fixed. Closes: #537355
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 17 Nov 2009 11:38:43 -0500
|
||||
|
||||
gramps (3.1.2-1.1) unstable; urgency=low
|
||||
|
||||
* Non-maintainer upload.
|
||||
* debian/control: drop Recommends on python-gnome2-desktop: it is now
|
||||
gone and none of its modules are used anyhow (Closes: #541560)
|
||||
|
||||
-- Stefano Zacchiroli <zack@debian.org> Thu, 08 Oct 2009 13:52:35 +0200
|
||||
|
||||
gramps (3.1.2-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* Replace Recommends on python-gnome2-extras with python-gtkspell
|
||||
* Do not create the directory /etc/gconf/schemas/. Closes: Bug#525683
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sun, 07 Jun 2009 14:01:16 -0400
|
||||
|
||||
gramps (3.1.1-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 10 Mar 2009 09:26:52 -0400
|
||||
|
||||
gramps (3.1.0-1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* link /usr/share/common-licenses/GPL-2 from /usr/share/gramps/COPYING
|
||||
so gramps can find the file.
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sat, 07 Mar 2009 22:03:09 -0500
|
||||
|
||||
gramps (3.0.4-1) unstable; urgency=low
|
||||
|
||||
* New upstream version. Closes: #506621, #506818
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sun, 07 Dec 2008 21:39:55 -0500
|
||||
|
||||
gramps (3.0.3-1) unstable; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 20 Oct 2008 20:43:35 -0400
|
||||
|
||||
gramps (3.0.2-1) unstable; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sat, 27 Sep 2008 17:25:09 -0400
|
||||
|
||||
gramps (3.0.1-2) unstable; urgency=low
|
||||
|
||||
* Remove dependency on gnome-doc-utils and scrollkeeper
|
||||
* Disable spell checking in src/Spell.py due to the spell checker
|
||||
crashing. Closes: #492212
|
||||
Spell checking will be reenabled once the offending package is
|
||||
identified and fixed.
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Fri, 29 Aug 2008 11:09:04 -0400
|
||||
|
||||
gramps (3.0.1-1) unstable; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 19 May 2008 09:38:28 -0400
|
||||
|
||||
gramps (3.0.0-6) unstable; urgency=low
|
||||
|
||||
* Fix typo in _EditChildRef.py which can cause gramps to crash. Closes: #476163
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 15 Apr 2008 23:37:04 -0400
|
||||
|
||||
gramps (3.0.0-5) unstable; urgency=low
|
||||
|
||||
* Remove gtkspell Recommends as it is now provided by python-gnome2-extras.
|
||||
Closes: Bug#474755
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 07 Apr 2008 17:25:18 -0400
|
||||
|
||||
gramps (3.0.0-4) unstable; urgency=low
|
||||
|
||||
* Fix the binary package python dependency properly. A recent python
|
||||
(>= 2.4.4-6) is needed to ensure python2.5 is supported properly.
|
||||
Closes: #474056
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Thu, 03 Apr 2008 09:46:28 -0400
|
||||
|
||||
gramps (3.0.0-3) unstable; urgency=low
|
||||
|
||||
* Build-Depends on Python2.5. Closes: Bug#473946, #474056
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 02 Apr 2008 08:28:27 -0400
|
||||
|
||||
gramps (3.0.0-2) unstable; urgency=low
|
||||
|
||||
* Explicitly require python version >= 2.5
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 26 Mar 2008 09:34:25 -0400
|
||||
|
||||
gramps (3.0.0-1) unstable; urgency=low
|
||||
|
||||
* New upstream release. Closes: #472681
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 25 Mar 2008 09:35:00 -0400
|
||||
|
||||
gramps (2.2.10-2) unstable; urgency=low
|
||||
|
||||
* Remove build dependency on python-xml. Closes: Bug#468625
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Fri, 29 Feb 2008 13:30:11 -0500
|
||||
|
||||
gramps (2.2.10-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* Added dh_icons to debian/rules. Closes: #454761
|
||||
* Remove version from scrollkeeper dependency. Closes: #456600
|
||||
* Fixed typos in description. Closes: #433559
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 14 Jan 2008 09:57:25 -0500
|
||||
|
||||
gramps (2.2.9-2) unstable; urgency=low
|
||||
|
||||
* Move debhelper to Build-Depends. Closes: #447948
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 24 Oct 2007 20:03:36 -0400
|
||||
|
||||
gramps (2.2.9-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Stephane Charette <stephanecharette@gmail.com> Wed, 16 Jan 2008 21:45:00 -0800
|
||||
-- James A. Treacy <treacy@debian.org> Thu, 18 Oct 2007 13:14:30 -0400
|
||||
|
||||
gramps (2.1.6-1) unstable; urgency=low
|
||||
gramps (2.2.8-2) unstable; urgency=low
|
||||
|
||||
* Work around a bug in gnome-python-extras which caused a deallocation
|
||||
of the TextView in the check if a spell checker is present.
|
||||
Closes: #445864
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 09 Oct 2007 17:26:54 -0400
|
||||
|
||||
gramps (2.2.8-1) unstable; urgency=low
|
||||
|
||||
* New Upstream version
|
||||
* Misleading error message changed. Closes: #418033
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 28 May 2007 21:00:51 -0400
|
||||
|
||||
gramps (2.2.7-2) unstable; urgency=low
|
||||
|
||||
* Added dependency on librsvg2-common
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 23 Apr 2007 19:32:00 -0400
|
||||
|
||||
gramps (2.2.7-1) unstable; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sun, 22 Apr 2007 20:08:55 -0400
|
||||
|
||||
gramps (2.2.6-1) unstable; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 29 Jan 2007 20:12:05 -0500
|
||||
|
||||
gramps (2.2.5-0rc1-1) unstable; urgency=low
|
||||
|
||||
* rc1 of 2.2.5
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Thu, 25 Jan 2007 23:04:24 -0500
|
||||
|
||||
gramps (2.2.4-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Alex Roitman <shura@gramps-project.org> Thu, 22 Jun 2006 13:28:14 -0700
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 27 Dec 2006 18:04:11 -0500
|
||||
|
||||
gramps (2.2.3-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 27 Nov 2006 00:27:23 -0500
|
||||
|
||||
gramps (2.2.2-2) unstable; urgency=low
|
||||
|
||||
* call dh_desktop in debian/rules so .desktop file is registered. Closes: Bug#398423
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 13 Nov 2006 20:26:00 -0500
|
||||
|
||||
gramps (2.2.2-1) unstable; urgency=low
|
||||
|
||||
* Bumped upstream version number. 2.2.1-3 and -4 should have been 2.2.2
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Sat, 4 Nov 2006 16:34:47 -0500
|
||||
|
||||
gramps (2.2.1-4) unstable; urgency=low
|
||||
|
||||
* add missing Build-Depends-Indep. Closes: #396874
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Fri, 3 Nov 2006 11:03:35 -0500
|
||||
|
||||
gramps (2.2.1-3) unstable; urgency=low
|
||||
|
||||
* New Upstream release
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Fri, 3 Nov 2006 08:07:38 -0500
|
||||
|
||||
gramps (2.2.1-2) unstable; urgency=low
|
||||
|
||||
* Upload to sid
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 1 Nov 2006 20:50:28 -0500
|
||||
|
||||
gramps (2.2.1-1) experimental; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Mon, 30 Oct 2006 10:32:43 -0500
|
||||
|
||||
gramps (2.1.95-1) experimental; urgency=low
|
||||
|
||||
* Beta release of version 2.2
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 29 Aug 2006 11:40:08 -0400
|
||||
|
||||
|
||||
gramps (2.1.90-1) experimental; urgency=low
|
||||
|
||||
* Beta release of version 2.2
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Tue, 25 Jul 2006 00:18:15 -0400
|
||||
|
||||
gramps (2.0.11-2) unstable; urgency=low
|
||||
|
||||
* Complies with new python policy
|
||||
|
||||
-- James A. Treacy <treacy@debian.org> Wed, 5 Jul 2006 14:47:56 -0400
|
||||
|
||||
gramps (2.0.11-1) unstable; urgency=low
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
4
|
||||
7
|
||||
|
||||
Vendored
+20
-16
@@ -1,23 +1,27 @@
|
||||
Source: gramps
|
||||
Section: gnome
|
||||
Priority: optional
|
||||
Maintainer: James A. Treacy <treacy@debian.org>
|
||||
Build-Depends-Indep: debhelper (>=5.0.37.2), python-xml, python-gnome2, python-glade2, scrollkeeper, libglib2.0-dev, build-essential, gnome-doc-utils, intltool, xsltproc, python-central (>= 0.4.17)
|
||||
Standards-Version: 3.6.2
|
||||
XS-Python-Version: current
|
||||
Maintainer: Stéphane Charette <stephanecharette@gmail.com>
|
||||
Build-Depends-Indep: libxml-parser-perl, python-gtk2, gettext, libgconf2-dev, python-central (>= 0.5.6), python, intltool
|
||||
Build-Depends: debhelper (>= 7)
|
||||
Standards-Version: 3.8.3
|
||||
Homepage: http://www.gramps-project.org/
|
||||
XS-Python-Version: >=2.5
|
||||
|
||||
Package: gramps
|
||||
Architecture: all
|
||||
Depends: ${python:Depends}, python-gnome2, python-glade2, ${misc:Depends}
|
||||
Replaces: gramps-manual, gramps-extending-doc, gramps-help
|
||||
Conflicts: gramps-manual, gramps-extending-doc, gramps-common
|
||||
Recommends: graphviz, ttf-freefont, python-reportlab, python-gnome2-extras
|
||||
Description: Genealogical Research and Analysis Management Program
|
||||
GRAMPS, the Genealogical Research and Analysis Management Programming
|
||||
System, is an Open Source genealogy program written in Python, using
|
||||
the GTK/GNOME interface.
|
||||
GRAMPS has the ability to import GEDCOM files that are used in such
|
||||
programs as FamilyTree Maker for Windows and can produce reports
|
||||
in various formats such as the popular ABIWord and OpenOffice.org
|
||||
formats as well as HTML and PDF.
|
||||
Depends: ${python:Depends}, librsvg2-common, python-gtk2, xdg-utils, ${misc:Depends}
|
||||
Replaces: gramps-manual, gramps-extending-doc
|
||||
Conflicts: gramps-manual, gramps-extending-doc, gramps-common, python-gtk-1.2
|
||||
Recommends: graphviz, python-webkit, python-gtkmozembed
|
||||
Suggests: ttf-freefont, python-enchant, python-gtkspell
|
||||
Description: Genealogical research program
|
||||
GRAMPS is an Open Source genealogy program written in Python, using
|
||||
the GTK/GNOME interface. It is an extremely flexible program fitting
|
||||
the needs for both the amateur genealogist and serious genealogical
|
||||
researcher.
|
||||
GRAMPS has the ability to import GEDCOM files exported from many
|
||||
proprietary genealogy programs and can produce a large number of
|
||||
reports in many popular formats.
|
||||
XB-Python-Version: ${python:Versions}
|
||||
|
||||
|
||||
Vendored
+1
@@ -1 +1,2 @@
|
||||
usr/share/pixmaps
|
||||
usr/share/mime/packages
|
||||
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
/usr/bin/
|
||||
/usr/share/
|
||||
/etc
|
||||
Vendored
+1
-1
@@ -1,3 +1,3 @@
|
||||
?package(gramps):needs="X11" section="Apps/Tools"\
|
||||
?package(gramps):needs="X11" section="Applications/Office"\
|
||||
title="gramps" command="/usr/bin/gramps"\
|
||||
icon="/usr/share/pixmaps/gramps.xpm"
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
2
|
||||
Vendored
+29
-32
@@ -4,71 +4,68 @@ build: build-stamp
|
||||
build-stamp:
|
||||
dh_testdir
|
||||
|
||||
./configure \
|
||||
--enable-packager-mode \
|
||||
--disable-scrollkeeper \
|
||||
--prefix=/usr \
|
||||
--mandir=\$${prefix}/share/man \
|
||||
--sysconfdir=/etc
|
||||
#./autogen.sh --prefix=/usr --mandir=\$${prefix}/share/man --sysconfdir=/etc
|
||||
./configure --enable-packager-mode --prefix=/usr --mandir=\$${prefix}/share/man --sysconfdir=/etc
|
||||
# ./configure --prefix=`pwd`/debian/tmp/usr --mandir=\$${prefix}/share/man
|
||||
$(MAKE)
|
||||
# $(MAKE) html
|
||||
|
||||
touch build-stamp
|
||||
|
||||
clean:
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
-rm -f build-stamp
|
||||
|
||||
-$(MAKE) clean
|
||||
-rm -f src/*.pyo src/*/*.pyo src/*/*/*.pyo src/*/*/*/*.pyo
|
||||
-rm -f config.status config.log
|
||||
# [ ! -f Makefile ] || $(MAKE) distclean
|
||||
# -rm -f src/*.pyo src/*/*.pyo
|
||||
# -rm -f config.status config.log
|
||||
|
||||
dh_auto_clean
|
||||
dh_clean
|
||||
|
||||
install: build
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_clean -k
|
||||
dh_prep
|
||||
dh_installdirs
|
||||
|
||||
GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
|
||||
# Add here commands to install the package into debian/tmp.
|
||||
# GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1
|
||||
$(MAKE) install DESTDIR=`pwd`/debian/gramps
|
||||
# Remove help-related dirs, they will go into gramps-help package
|
||||
-rm -rf debian/gramps/usr/share/gnome
|
||||
-rm -rf debian/gramps/usr/share/omf
|
||||
|
||||
# Remove byte-compiled python files
|
||||
-rm -f debian/gramps/usr/share/gramps/COPYING
|
||||
ln -s /usr/share/common-licenses/GPL-2 debian/gramps/usr/share/gramps/COPYING
|
||||
-rm -rf debian/gramps/usr/var
|
||||
# cp src/data/gramps.xml debian/gramps/usr/share/mime/packages
|
||||
-find debian/gramps/usr/share/ -name "*.pyo" -exec rm -f '{}' ';'
|
||||
|
||||
# Copy icon file
|
||||
cp debian/gramps.xpm debian/gramps/usr/share/pixmaps/
|
||||
# cp src/gramps.xpm debian/tmp/usr/share/pixmaps/
|
||||
#cp src/data/gramps.svg debian/gramps/usr/share/pixmaps/
|
||||
#chmod 644 debian/gramps/usr/share/pixmaps/gramps.svg
|
||||
|
||||
# Instal gramps-help things
|
||||
#$(MAKE) -C help install DESTDIR=`pwd`/debian/gramps-help
|
||||
# cp src/images/gramps.svg debian/gramps/usr/share/pixmaps/
|
||||
# chmod 644 debian/gramps/usr/share/pixmaps/gramps.svg
|
||||
|
||||
# Build architecture-independent files here.
|
||||
binary-indep: build install
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_installdocs
|
||||
dh_installmenu --package=gramps
|
||||
dh_installman --package=gramps
|
||||
dh_installdocs FAQ
|
||||
dh_installmenu
|
||||
# dh_installman
|
||||
dh_installmime -i
|
||||
dh_installchangelogs --package=gramps ChangeLog
|
||||
#dh_installchangelogs --package=gramps-help help/ChangeLog
|
||||
dh_gconf --package=gramps
|
||||
#dh_scrollkeeper --package=gramps-help
|
||||
# dh_installchangelogs ChangeLog
|
||||
dh_installchangelogs
|
||||
dh_icons
|
||||
# dh_movefiles -i
|
||||
# dh_gconf -i
|
||||
dh_link -i
|
||||
dh_compress -i
|
||||
dh_fixperms -i
|
||||
dh_python --package=gramps
|
||||
dh_installdeb -i
|
||||
dh_pycentral -i
|
||||
dh_installdeb -i
|
||||
dh_gencontrol -i
|
||||
dh_md5sums -i
|
||||
dh_builddeb -i
|
||||
|
||||
|
||||
# Build architecture-dependent files here.
|
||||
binary-arch: build install
|
||||
|
||||
|
||||
+4
-9
@@ -381,7 +381,6 @@ src/plugins/drawreport/TimeLine.py
|
||||
# plugins/export directory
|
||||
src/plugins/export/export.gpr.py
|
||||
src/plugins/export/ExportCsv.py
|
||||
src/plugins/export/ExportDjango.gpr.py
|
||||
src/plugins/export/ExportFtree.py
|
||||
src/plugins/export/ExportGedcom.py
|
||||
src/plugins/export/ExportGeneWeb.py
|
||||
@@ -398,6 +397,7 @@ src/plugins/gramplet/AttributesGramplet.py
|
||||
src/plugins/gramplet/CalendarGramplet.py
|
||||
src/plugins/gramplet/DescendGramplet.py
|
||||
src/plugins/gramplet/FanChartGramplet.py
|
||||
src/plugins/gramplet/FaqGramplet.py
|
||||
src/plugins/gramplet/GivenNameGramplet.py
|
||||
src/plugins/gramplet/gramplet.gpr.py
|
||||
src/plugins/gramplet/PedigreeGramplet.py
|
||||
@@ -420,8 +420,6 @@ src/plugins/graph/GVRelGraph.py
|
||||
# plugins/import directory
|
||||
src/plugins/import/import.gpr.py
|
||||
src/plugins/import/ImportCsv.py
|
||||
src/plugins/import/ImportDjango.gpr.py
|
||||
src/plugins/import/ImportDjango.py
|
||||
src/plugins/import/ImportGedcom.py
|
||||
src/plugins/import/ImportGeneWeb.py
|
||||
src/plugins/import/ImportGrdb.py
|
||||
@@ -506,7 +504,6 @@ src/plugins/textreport/Summary.py
|
||||
src/plugins/textreport/textplugins.gpr.py
|
||||
|
||||
# plugins/tool directory
|
||||
src/plugins/tool/CalculateEstimatedDates.py
|
||||
src/plugins/tool/ChangeNames.py
|
||||
src/plugins/tool/ChangeTypes.py
|
||||
src/plugins/tool/Check.py
|
||||
@@ -534,8 +531,8 @@ src/plugins/tool/Verify.py
|
||||
#plugins/view directory
|
||||
src/plugins/view/eventview.py
|
||||
src/plugins/view/familyview.py
|
||||
src/plugins/view/fanchartview.gpr.py
|
||||
src/plugins/view/fanchartview.py
|
||||
src/plugins/view/fanchartview.gpr.py
|
||||
src/plugins/view/geoview.py
|
||||
src/plugins/view/geoview.gpr.py
|
||||
src/plugins/view/grampletview.py
|
||||
@@ -543,8 +540,6 @@ src/plugins/view/htmlrenderer.py
|
||||
src/plugins/view/mediaview.py
|
||||
src/plugins/view/noteview.py
|
||||
src/plugins/view/pedigreeview.py
|
||||
src/plugins/view/pedigreeviewext.py
|
||||
src/plugins/view/pedigreeviewext.gpr.py
|
||||
src/plugins/view/personlistview.py
|
||||
src/plugins/view/persontreeview.py
|
||||
src/plugins/view/placelistview.py
|
||||
@@ -895,8 +890,8 @@ src/plugins/tool/verify.glade
|
||||
#
|
||||
# web
|
||||
#
|
||||
src/web/grampsdb/views.py
|
||||
src/web/utils.py
|
||||
#src/web/grampsdb/views.py
|
||||
#src/web/utils.py
|
||||
#
|
||||
# Files to extract from and then merge into
|
||||
#
|
||||
|
||||
+4
-1
@@ -11,6 +11,8 @@ src/gen/lib/styledtexttagtype.py
|
||||
src/LdsUtils.py
|
||||
src/Mime/_WinMime.py
|
||||
src/plugins/docgen/PdfDoc.py
|
||||
src/plugins/export/ExportDjango.gpr.py
|
||||
src/plugins/import/ImportDjango.gpr.py
|
||||
src/plugins/gramplet/DeepConnections.py
|
||||
src/plugins/gramplet/NoteGramplet.py
|
||||
src/plugins/gramplet/PluginManagerGramplet.py
|
||||
@@ -21,8 +23,9 @@ src/plugins/tool/DumpGenderStats.py
|
||||
src/plugins/tool/PHPGedViewConnector.py
|
||||
src/plugins/tool/TestcaseGenerator.py
|
||||
src/plugins/tool/phpgedview.glade
|
||||
src/plugins/gramplet/FaqGramplet.py
|
||||
src/plugins/gramplet/HeadlineNewsGramplet.py
|
||||
src/plugins/quickview/AllNames.py
|
||||
src/plugins/quickview/Query.py
|
||||
src/ReportBase/_DocReportDialog.py
|
||||
src/web/grampsdb/views.py
|
||||
src/web/utils.py
|
||||
|
||||
+1140
-1438
File diff suppressed because it is too large
Load Diff
+20901
-20843
File diff suppressed because it is too large
Load Diff
+5603
-5676
File diff suppressed because it is too large
Load Diff
+77
-17
@@ -56,27 +56,87 @@ class DateParserDE(DateParser):
|
||||
month_to_int[u"jan"] = 1
|
||||
month_to_int[u"jänner"] = 1
|
||||
month_to_int[u"jän"] = 1
|
||||
# Add other common latin, local and historical variants
|
||||
|
||||
# Add other common latin,
|
||||
|
||||
month_to_int[u"januaris"] = 1
|
||||
month_to_int[u"januarii"] = 1
|
||||
month_to_int[u"januarius"] = 1
|
||||
month_to_int[u"februaris"] = 2
|
||||
month_to_int[u"februarii"] = 2
|
||||
month_to_int[u"februarius"] = 2
|
||||
month_to_int[u"martii"] = 3
|
||||
month_to_int[u"martius"] = 3
|
||||
month_to_int[u"aprilis"] = 4
|
||||
month_to_int[u"maius"] = 5
|
||||
month_to_int[u"maii"] = 5
|
||||
month_to_int[u"junius"] = 6
|
||||
month_to_int[u"junii"] = 6
|
||||
month_to_int[u"julius"] = 7
|
||||
month_to_int[u"julii"] = 7
|
||||
month_to_int[u"augustus"] = 8
|
||||
month_to_int[u"augusti"] = 8
|
||||
month_to_int[u"septembris"] = 9
|
||||
month_to_int[u"7bris"] = 9
|
||||
month_to_int[u"september"] = 9
|
||||
month_to_int[u"october"] = 10
|
||||
month_to_int[u"octobris"] = 10
|
||||
month_to_int[u"8bris"] = 10
|
||||
month_to_int[u"novembris"] = 11
|
||||
month_to_int[u"9bris"] = 11
|
||||
month_to_int[u"november"] = 11
|
||||
month_to_int[u"decembris"] = 12
|
||||
month_to_int[u"10bris"] = 12
|
||||
month_to_int[u"xbris"] = 12
|
||||
month_to_int[u"december"] = 12
|
||||
|
||||
# local and historical variants
|
||||
|
||||
month_to_int[u"jenner"] = 1
|
||||
month_to_int[u"feber"] = 2
|
||||
month_to_int[u"februaris"] = 2
|
||||
month_to_int[u"merz"] = 3
|
||||
month_to_int[u"aprilis"] = 4
|
||||
month_to_int[u"maius"] = 5
|
||||
month_to_int[u"junius"] = 6
|
||||
month_to_int[u"julius"] = 7
|
||||
month_to_int[u"augst"] = 8
|
||||
month_to_int[u"7ber"] = 9
|
||||
month_to_int[u"7bris"] = 9
|
||||
month_to_int[u"8ber"] = 10
|
||||
month_to_int[u"8bris"] = 10
|
||||
month_to_int[u"9ber"] = 11
|
||||
month_to_int[u"9bris"] = 11
|
||||
month_to_int[u"10ber"] = 12
|
||||
month_to_int[u"10bris"] = 12
|
||||
month_to_int[u"xber"] = 12
|
||||
month_to_int[u"xbris"] = 12
|
||||
|
||||
# old german names
|
||||
|
||||
month_to_int[u"hartung"] = 1
|
||||
month_to_int[u"eismond"] = 1
|
||||
month_to_int[u"hornung"] = 2
|
||||
month_to_int[u"schmelzmond"] = 2
|
||||
month_to_int[u"taumond"] = 2
|
||||
month_to_int[u"narrenmond"] = 2
|
||||
month_to_int[u"rebmond"] = 2
|
||||
month_to_int[u"hintester"] = 2
|
||||
month_to_int[u"lenzing"] = 3
|
||||
month_to_int[u"lenzmond"] = 3
|
||||
month_to_int[u"launing"] = 4
|
||||
month_to_int[u"ostermond"] = 4
|
||||
month_to_int[u"winnemond"] = 5
|
||||
month_to_int[u"weidenmonat"] = 5
|
||||
month_to_int[u"blumenmond"] = 5
|
||||
month_to_int[u"brachet"] = 6
|
||||
month_to_int[u"brachmond"] = 6
|
||||
month_to_int[u"heuert"] = 7
|
||||
month_to_int[u"heumond"] = 7
|
||||
month_to_int[u"ernting"] = 8
|
||||
month_to_int[u"erntemond"] = 8
|
||||
month_to_int[u"bisemond"] = 8
|
||||
month_to_int[u"scheiding"] = 9
|
||||
month_to_int[u"herbstmond"] = 9
|
||||
month_to_int[u"gilbhard"] = 10
|
||||
month_to_int[u"gilbhart"] = 10
|
||||
month_to_int[u"windmond"] = 11
|
||||
month_to_int[u"nebelung"] = 11
|
||||
month_to_int[u"wintermond"] = 11
|
||||
month_to_int[u"julmond"] = 12
|
||||
month_to_int[u"heilmond"] = 12
|
||||
month_to_int[u"christmond"] = 12
|
||||
month_to_int[u"dustermond"] = 12
|
||||
|
||||
modifier_to_int = {
|
||||
u'vor' : Date.MOD_BEFORE,
|
||||
@@ -137,13 +197,13 @@ class DateDisplayDE(DateDisplay):
|
||||
"""
|
||||
German language date display class.
|
||||
"""
|
||||
# TODO: Translate these month strings:
|
||||
long_months = ( u"", u"January", u"February", u"March", u"April", u"May",
|
||||
u"June", u"July", u"August", u"September", u"October",
|
||||
u"November", u"December" )
|
||||
|
||||
short_months = ( u"", u"Jan", u"Feb", u"Mar", u"Apr", u"May", u"Jun",
|
||||
u"Jul", u"Aug", u"Sep", u"Oct", u"Nov", u"Dec" )
|
||||
long_months = ( u"", u"Januar", u"Februar", u"März", u"April", u"Mai",
|
||||
u"Juni", u"Juli", u"August", u"September", u"Oktober",
|
||||
u"November", u"Dezember" )
|
||||
|
||||
short_months = ( u"", u"Jan", u"Feb", u"Mär", u"Apr", u"Mai", u"Jun",
|
||||
u"Jul", u"Aug", u"Sep", u"Okt", u"Nov", u"Dez" )
|
||||
|
||||
calendar = (
|
||||
"", u" (julianisch)", u" (hebräisch)",
|
||||
|
||||
+31
-3
@@ -80,10 +80,22 @@ class History(gen.utils.Callback):
|
||||
'mru-changed' : (list, )
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, dbstate, nav_type):
|
||||
gen.utils.Callback.__init__(self)
|
||||
self.clear()
|
||||
|
||||
dbstate.connect('database-changed', self.connect_signals)
|
||||
self.signal_map = {}
|
||||
self.signal_map[nav_type.lower() + '-delete'] = self.handles_removed
|
||||
self.signal_map[nav_type.lower() + '-rebuild'] = self.history_changed
|
||||
|
||||
def connect_signals(self, dbstate):
|
||||
"""
|
||||
Connects database signals when the database has changed.
|
||||
"""
|
||||
for sig in self.signal_map:
|
||||
dbstate.connect(sig, self.signal_map[sig])
|
||||
|
||||
def clear(self):
|
||||
"""
|
||||
Clears the history, resetting the values back to their defaults
|
||||
@@ -191,6 +203,22 @@ class History(gen.utils.Callback):
|
||||
if not self.at_end():
|
||||
self.history = self.history[0:self.index+1]
|
||||
|
||||
def handles_removed(self, handle_list):
|
||||
"""
|
||||
Called in response to an object-delete signal.
|
||||
Removes a list of handles from the history.
|
||||
"""
|
||||
for handle in handle_list:
|
||||
self.remove(handle)
|
||||
|
||||
def history_changed(self):
|
||||
"""
|
||||
Called in response to an object-rebuild signal.
|
||||
Objects in the history list may have been deleted.
|
||||
"""
|
||||
self.clear()
|
||||
self.emit('mru-changed', (self.mru, ))
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Recent Docs Menu
|
||||
@@ -370,13 +398,13 @@ class DisplayState(gen.utils.Callback):
|
||||
"""
|
||||
return self.history_lookup.get((nav_type, nav_group))
|
||||
|
||||
def register(self, nav_type, nav_group):
|
||||
def register(self, dbstate, nav_type, nav_group):
|
||||
"""
|
||||
Create a history and navigation object for the specified
|
||||
navigation type and group, if they don't exist.
|
||||
"""
|
||||
if (nav_type, nav_group) not in self.history_lookup:
|
||||
history = History()
|
||||
history = History(dbstate, nav_type)
|
||||
self.history_lookup[(nav_type, nav_group)] = history
|
||||
|
||||
def get_active(self, nav_type, nav_group=0):
|
||||
|
||||
@@ -28,6 +28,7 @@ gdir_PYTHON = \
|
||||
Bookmarks.py\
|
||||
config.py\
|
||||
const.py\
|
||||
constfunc.py\
|
||||
DateEdit.py\
|
||||
Date.py\
|
||||
DbState.py\
|
||||
|
||||
@@ -536,16 +536,22 @@ class GuiFamilyOption(gtk.HBox):
|
||||
|
||||
def __initialize_family(self):
|
||||
"""
|
||||
Find a family to initialize the option with. Any family will do, but
|
||||
try to find a family that the user is likely interested in.
|
||||
Find a family to initialize the option with. If there is no active
|
||||
family, try to find a family that the user is likely interested in.
|
||||
"""
|
||||
family_list = []
|
||||
|
||||
# First try the family of the active person
|
||||
person_handle = self.__uistate.get_active('Person')
|
||||
person = self.__dbstate.db.get_person_from_handle(person_handle)
|
||||
if person:
|
||||
family_list = person.get_family_handle_list()
|
||||
# Use the active family if one is selected
|
||||
family = self.__uistate.get_active('Family')
|
||||
if family:
|
||||
family_list = [family]
|
||||
|
||||
if not family_list:
|
||||
# Next try the family of the active person
|
||||
person_handle = self.__uistate.get_active('Person')
|
||||
person = self.__dbstate.db.get_person_from_handle(person_handle)
|
||||
if person:
|
||||
family_list = person.get_family_handle_list()
|
||||
|
||||
if not family_list:
|
||||
# Next try the family of the default person in the database.
|
||||
@@ -558,6 +564,8 @@ class GuiFamilyOption(gtk.HBox):
|
||||
for family in self.__db.iter_family_handles():
|
||||
self.__update_family(family)
|
||||
break
|
||||
else:
|
||||
self.__update_family(family_list[0])
|
||||
|
||||
def __get_family_clicked(self, obj): # IGNORE:W0613 - obj is unused
|
||||
"""
|
||||
|
||||
@@ -569,6 +569,11 @@ class PluginStatus(ManagedWindow.ManagedWindow):
|
||||
# If this version is not installed, or > installed, install it
|
||||
good_gpr.add(gpr_file)
|
||||
callback(" " + (_("'%s' is for this version of Gramps.") % gpr_file) + "\n")
|
||||
else:
|
||||
# If the plugin is for another version; inform and do nothing
|
||||
callback(" " + (_("'%s' is for NOT this version of Gramps.") % gpr_file) + "\n")
|
||||
callback(" " + (_("It is for version %d.%d" % vtup) + "\n"))
|
||||
continue
|
||||
else:
|
||||
# another register function doesn't have gramps_target_version
|
||||
if gpr_file in good_gpr:
|
||||
@@ -659,7 +664,6 @@ class PluginStatus(ManagedWindow.ManagedWindow):
|
||||
# i = (filename, module, pdata)
|
||||
pdata = i[2]
|
||||
modname = i[1].__name__
|
||||
descr = self.__pmgr.get_module_description(modname)
|
||||
hidden = pdata.id in self.hidden
|
||||
if hidden:
|
||||
hiddenstr = self.HIDDEN
|
||||
@@ -667,7 +671,7 @@ class PluginStatus(ManagedWindow.ManagedWindow):
|
||||
hiddenstr = self.AVAILABLE
|
||||
self.model.append(row=[
|
||||
'<span weight="bold" color="#267726">%s</span>' % _("OK"),
|
||||
i[0], descr, None, pdata.id, hiddenstr])
|
||||
i[0], pdata.description, None, pdata.id, hiddenstr])
|
||||
|
||||
def __populate_reg_list(self):
|
||||
""" Build list of registered plugins"""
|
||||
|
||||
+4
-4
@@ -923,10 +923,10 @@ class RelationshipCalculator(object):
|
||||
rel1 == rel2[:len(rel1)]:
|
||||
#loop, keep one message in storage!
|
||||
self.__loopDetected = True
|
||||
self.__msg += [_("Relationship loop detected:") + \
|
||||
_("Person %s connects to himself via %s") % \
|
||||
(person.get_primary_name().get_name(),
|
||||
rel2[len(rel1):])]
|
||||
self.__msg += [_("Relationship loop detected:") + " " +
|
||||
_("Person %(person)s connects to himself via %(relation)s") %
|
||||
{'person' : person.get_primary_name().get_name(),
|
||||
'relation' : rel2[len(rel1):] }]
|
||||
return
|
||||
elif store:
|
||||
pmap[person.handle] = [[rel_str], [rel_fam]]
|
||||
|
||||
@@ -639,7 +639,10 @@ def report(dbstate, uistate, person, report_class, options_class,
|
||||
except:
|
||||
LOG.error("Failed to run report.", exc_info=True)
|
||||
break
|
||||
elif (response == gtk.RESPONSE_DELETE_EVENT or
|
||||
response == gtk.RESPONSE_CANCEL):
|
||||
elif response == gtk.RESPONSE_CANCEL:
|
||||
dialog.close()
|
||||
break
|
||||
elif response == gtk.RESPONSE_DELETE_EVENT:
|
||||
#just stop, in ManagedWindow, delete-event is already coupled to
|
||||
#correct action.
|
||||
break
|
||||
|
||||
@@ -88,12 +88,13 @@ class StyleListDisplay(object):
|
||||
_('Document Styles') )
|
||||
|
||||
self.top.connect_signals({
|
||||
"destroy_passed_object" : self.__close,
|
||||
"destroy_passed_object" : self.__close,
|
||||
"on_ok_clicked" : self.on_ok_clicked,
|
||||
"on_add_clicked" : self.on_add_clicked,
|
||||
"on_delete_clicked" : self.on_delete_clicked,
|
||||
"on_button_press" : self.on_button_press,
|
||||
"on_edit_clicked" : self.on_edit_clicked
|
||||
"on_edit_clicked" : self.on_edit_clicked,
|
||||
"on_save_style_clicked" : dummy_callback,
|
||||
})
|
||||
|
||||
title_label = self.top.get_object('title')
|
||||
@@ -198,7 +199,12 @@ class StyleEditor(object):
|
||||
|
||||
self.top.connect_signals({
|
||||
"on_save_style_clicked" : self.on_save_style_clicked,
|
||||
"destroy_passed_object" : self.__close,
|
||||
"destroy_passed_object" : self.__close,
|
||||
"on_ok_clicked" : dummy_callback,
|
||||
"on_add_clicked" : dummy_callback,
|
||||
"on_delete_clicked" : dummy_callback,
|
||||
"on_button_press" : dummy_callback,
|
||||
"on_edit_clicked" : dummy_callback,
|
||||
})
|
||||
|
||||
self.pname = self.top.get_object('pname')
|
||||
@@ -363,3 +369,10 @@ class StyleEditor(object):
|
||||
self.current_name = store.get_value(node, 0)
|
||||
self.current_p = objs[0]
|
||||
self.draw()
|
||||
|
||||
def dummy_callback(obj):
|
||||
"""Dummy callback to satisfy gtkbuilder on connect of signals.
|
||||
There are two widgets in the glade file, although only one is needed,
|
||||
the signals of the other must be connected too
|
||||
"""
|
||||
pass
|
||||
|
||||
+41
-9
@@ -948,33 +948,52 @@ class ScratchPadListView(object):
|
||||
|
||||
def database_changed(self,db):
|
||||
self._db = db
|
||||
# Note: delete event is emitted before the delete, so checking
|
||||
# if valid on this is useless !
|
||||
db_signals = (
|
||||
'person-update',
|
||||
'person-rebuild',
|
||||
'family-update',
|
||||
'family-delete',
|
||||
'family-rebuild',
|
||||
'source-update',
|
||||
'source-rebuild',
|
||||
'place-update',
|
||||
'place-delete',
|
||||
'place-rebuild',
|
||||
'media-update',
|
||||
'media-delete',
|
||||
'media-rebuild',
|
||||
'event-update',
|
||||
'event-rebuild',
|
||||
'repository-update',
|
||||
'repository-rebuild'
|
||||
'repository-rebuild',
|
||||
'note-rebuild'
|
||||
)
|
||||
|
||||
for signal in db_signals:
|
||||
self._db.connect(signal,self.remove_invalid_objects)
|
||||
|
||||
self._db.connect('person-delete', gen_del_obj(self.delete_object, 'person-link'))
|
||||
self._db.connect('source-delete', gen_del_obj(self.delete_object, 'source-link'))
|
||||
self._db.connect('repository-delete', gen_del_obj(self.delete_object, 'repo-link'))
|
||||
self._db.connect('event-delete', gen_del_obj(self.delete_object, 'pevent'))
|
||||
self._db.connect('person-delete',
|
||||
gen_del_obj(self.delete_object, 'person-link'))
|
||||
self._db.connect('person-delete',
|
||||
gen_del_obj(self.delete_object_ref, 'personref'))
|
||||
self._db.connect('source-delete',
|
||||
gen_del_obj(self.delete_object, 'source-link'))
|
||||
self._db.connect('source-delete',
|
||||
gen_del_obj(self.delete_object_ref, 'srcref'))
|
||||
self._db.connect('repository-delete',
|
||||
gen_del_obj(self.delete_object, 'repo-link'))
|
||||
self._db.connect('event-delete',
|
||||
gen_del_obj(self.delete_object, 'pevent'))
|
||||
self._db.connect('event-delete',
|
||||
gen_del_obj(self.delete_object_ref, 'eventref'))
|
||||
self._db.connect('media-delete',
|
||||
gen_del_obj(self.delete_object, 'mediaobj'))
|
||||
self._db.connect('media-delete',
|
||||
gen_del_obj(self.delete_object_ref, 'mediaref'))
|
||||
self._db.connect('place-delete',
|
||||
gen_del_obj(self.delete_object, 'place-link'))
|
||||
self._db.connect('note-delete',
|
||||
gen_del_obj(self.delete_object, 'note-link'))
|
||||
# family-delete not needed, cannot be dragged!
|
||||
|
||||
self.remove_invalid_objects()
|
||||
|
||||
@@ -996,6 +1015,16 @@ class ScratchPadListView(object):
|
||||
if data[2] in handle_list:
|
||||
model.remove(o.iter)
|
||||
|
||||
def delete_object_ref(self, handle_list, link_type):
|
||||
model = self._widget.get_model()
|
||||
|
||||
if model:
|
||||
for o in model:
|
||||
if o[0] == link_type:
|
||||
data = o[1]._obj.get_reference_handle()
|
||||
if data in handle_list:
|
||||
model.remove(o.iter)
|
||||
|
||||
# Method to manage the wrapper classes.
|
||||
|
||||
def register_wrapper_classes(self):
|
||||
@@ -1153,7 +1182,6 @@ class ScratchPadListView(object):
|
||||
# remember time for double drop workaround.
|
||||
self._previous_drop_time = realTime
|
||||
|
||||
|
||||
# proxy methods to provide access to the real widget functions.
|
||||
|
||||
def set_model(self,model=None):
|
||||
@@ -1237,6 +1265,10 @@ class ScratchPadWindow(ManagedWindow.ManagedWindow):
|
||||
|
||||
self.object_list.set_model(ScratchPadWindow.otree)
|
||||
|
||||
#Database might have changed, objects might have been removed,
|
||||
#we need to reevaluate if all data is valid
|
||||
self.object_list.remove_invalid_objects()
|
||||
|
||||
self.top.connect_signals({
|
||||
"on_close_scratchpad" : self.close,
|
||||
"on_clear_clicked": self.on_clear_clicked,
|
||||
|
||||
+10
-8
@@ -456,18 +456,20 @@ class ProbablyAlive(object):
|
||||
# If the recorded death year is before current year then
|
||||
# things are simple.
|
||||
if death_ref and death_ref.get_role().is_primary():
|
||||
death = self.db.get_event_from_handle(death_ref.ref)
|
||||
if death and death.get_date_object().get_start_date() != gen.lib.Date.EMPTY:
|
||||
death_date = death.get_date_object()
|
||||
if death_ref:
|
||||
death = self.db.get_event_from_handle(death_ref.ref)
|
||||
if death and death.get_date_object().get_start_date() != gen.lib.Date.EMPTY:
|
||||
death_date = death.get_date_object()
|
||||
|
||||
# Look for Cause Of Death, Burial or Cremation events.
|
||||
# These are fairly good indications that someone's not alive.
|
||||
if not death_date:
|
||||
for ev_ref in person.get_primary_event_ref_list():
|
||||
ev = self.db.get_event_from_handle(ev_ref.ref)
|
||||
if ev and ev.type.is_death_fallback():
|
||||
death_date = ev.get_date_object()
|
||||
explain = _("death-related evidence")
|
||||
if ev_ref:
|
||||
ev = self.db.get_event_from_handle(ev_ref.ref)
|
||||
if ev and ev.type.is_death_fallback():
|
||||
death_date = ev.get_date_object()
|
||||
explain = _("death-related evidence")
|
||||
|
||||
# If they were born within X years before current year then
|
||||
# assume they are alive (we already know they are not dead).
|
||||
@@ -838,7 +840,7 @@ def probably_alive(person, db,
|
||||
return False
|
||||
# FIXME: use match here:
|
||||
# if the current_date is before birth, not alive:
|
||||
if (birth - current_date)[0] >= 0:
|
||||
if (birth - current_date)[0] > 0:
|
||||
if return_range:
|
||||
return (False, birth, death, explain, relative)
|
||||
else:
|
||||
|
||||
@@ -52,6 +52,7 @@ LOG = logging.getLogger(".clidbman")
|
||||
import gen.db
|
||||
from gen.plug import BasePluginManager
|
||||
import config
|
||||
import constfunc
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -367,6 +368,13 @@ def time_val(dirpath):
|
||||
meta = os.path.join(dirpath, META_NAME)
|
||||
if os.path.isfile(meta):
|
||||
tval = os.stat(meta)[9]
|
||||
# This gives creation date in Windows, but correct date in Linux
|
||||
if constfunc.win():
|
||||
# Try to use last modified date instead in Windows
|
||||
# and check that it is later than the creation date.
|
||||
tval_mod = os.stat(meta)[8]
|
||||
if tval_mod > tval:
|
||||
tval = tval_mod
|
||||
last = time.strftime('%x %X', time.localtime(tval))
|
||||
else:
|
||||
tval = 0
|
||||
|
||||
@@ -205,13 +205,6 @@ register('interface.pedview-layout', 0)
|
||||
register('interface.pedview-show-images', True)
|
||||
register('interface.pedview-show-marriage', False)
|
||||
register('interface.pedview-tree-size', 0)
|
||||
register('interface.pedviewext-layout', 0)
|
||||
register('interface.pedviewext-show-images', True)
|
||||
register('interface.pedviewext-show-marriage', False)
|
||||
register('interface.pedviewext-tree-size', 5)
|
||||
register('interface.pedviewext-tree-direction', 2)
|
||||
register('interface.pedviewext-scroll-direction', False)
|
||||
register('interface.pedviewext-show-unknown-peoples', False)
|
||||
register('interface.person-height', 550)
|
||||
register('interface.person-ref-height', 350)
|
||||
register('interface.person-ref-width', 600)
|
||||
|
||||
+1
-1
@@ -190,7 +190,7 @@ else:
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
COPYRIGHT_MSG = u"\u00A9 2001-2006 Donald N. Allingham\n" \
|
||||
u"\u00A9 2007-2009 The Gramps Developers"
|
||||
u"\u00A9 2007-2010 The Gramps Developers"
|
||||
COMMENTS = _("Gramps (Genealogical Research and Analysis "
|
||||
"Management Programming System) is a personal "
|
||||
"genealogy program.")
|
||||
|
||||
@@ -1178,7 +1178,7 @@ div#Addresses {
|
||||
}
|
||||
div#Addresses table.infolist {
|
||||
font-size: 12px;
|
||||
background- color: #D8F3D6;
|
||||
background-color: #D8F3D6;
|
||||
}
|
||||
div#Addresses table.infolist tbody tr td {
|
||||
border-bottom: solid 1px #5D835F;
|
||||
@@ -1193,7 +1193,7 @@ div#Addresses table.infolist tbody tr td.ColumnCity {
|
||||
width: 8%;
|
||||
}
|
||||
div#Addresses table.infolist tbody tr td.ColumnCounty {
|
||||
with: 8%;
|
||||
width: 8%;
|
||||
}
|
||||
div#Addresses table.infolist tbody tr td.ColumnState {
|
||||
width: 12%;
|
||||
|
||||
+81
-75
@@ -1,124 +1,130 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- $Id$ -->
|
||||
<authors xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<author uid="rshura" title="author">
|
||||
Alex Roitman <<html:a href="mailto:shura@gramps-project.org">shura@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="asleinius" title="contributor">
|
||||
Arturas Sleinius <<html:a href="mailto:asleinius@users.sourceforge.net">asleinius@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="bmcage" title="author">
|
||||
Benny Malengier <<html:a href="mailto:benny.malengier@gramps-project.org">benny.malengier@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="borilg" title="contributor">
|
||||
Boril Gourinov <<html:a href="mailto:boril.gourinov@gmail.com">boril.gourinov@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="pez4brian" title="author">
|
||||
Brian Matherly <<html:a href="mailto:brian@gramps-project.org">brian@gramps-project.org</html:a>>
|
||||
<author uid="acraphae" title="contributor">
|
||||
Raphael Ackermann <<html:a href="mailto:raphael.ackermann@gmail.com">raphael.ackermann@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="dallingham" title="author">
|
||||
Don Allingham <<html:a href="mailto:don@gramps-project.org">don@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="dpeterso" title="author">
|
||||
Donald A. Peterson <<html:a href="mailto:"></html:a>>
|
||||
</author>
|
||||
<author uid="dsblank" title="author">
|
||||
Doug Blank <<html:a href="mailto:doug.blank@gmail.com">doug.blank@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="eerot" title="contributor">
|
||||
Eero Tamminen <<html:a href="mailto:eerot@users.sourceforge.net">eerot@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="erikdrgm" title="contributor">
|
||||
Erik De Richter <<html:a href="mailto:erikdrgm@users.sourceforge.net">erikdrgm@users.sourceforge.net</html:a>>
|
||||
<author uid="ander882" title="contributor">
|
||||
Craig J. Anderson <<html:a href="mailto:ander882@hotmail.com">ander882@hotmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="espenbe" title="contributor">
|
||||
Espen Berg <<html:a href="mailto:espenbe@gmail.com">espenbe@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="gburto01" title="contributor">
|
||||
Gary Burton <<html:a href="mailto:gary.burton@zen.co.uk">gary.burton@zen.co.uk</html:a>>
|
||||
<author uid="keesb" title="contributor">
|
||||
Kees Bakker <<html:a href="mailto:kees.bakker@xs4all.nl">kees.bakker@xs4all.nl</html:a>>
|
||||
</author>
|
||||
<author uid="betula" title="contributor">
|
||||
Stefan Bjork <<html:a href="mailto:betula@users.sourceforge.net">betula@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="dsblank" title="author">
|
||||
Doug Blank <<html:a href="mailto:doug.blank@gmail.com">doug.blank@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="gbritton" title="contributor">
|
||||
Gerald Britton <<html:a href="mailto:gerald.britton@gmail.com">gerald.britton@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="jgsack" title="contributor">
|
||||
James G Sack <<html:a href="mailto:jgsack@san.rr.com">jgsack@san.rr.com</html:a>>
|
||||
<author uid="gburto01" title="contributor">
|
||||
Gary Burton <<html:a href="mailto:gary.burton@zen.co.uk">gary.burton@zen.co.uk</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Janne Kovesjärvi <<html:a href="mailto:janne.kovesjarvi@gmail.com">janne.kovesjarvi@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Jason Simanek <<html:a href="mailto:jsimanek@gmail.com">jsimanek@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="romjerome" title="contributor">
|
||||
Jérôme Rapinat <<html:a href="mailto:romjerome@yahoo.fr">romjerome@yahoo.fr</html:a>>
|
||||
<author uid="s_charette" title="contributor">
|
||||
Stéphane Charette <<html:a href="mailto:stephanecharette@gmail.com">stephanecharette@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="jcreus" title="contributor">
|
||||
Joan Creus <<html:a href="mailto:joan.creus@gmail.com">joan.creus@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="josip" title="contributor">
|
||||
Josip Pisoj <<html:a href="mailto:josip@pisoj.com">josip@pisoj.com</html:a>>
|
||||
</author>
|
||||
<author uid="jsanchez" title="contributor">
|
||||
Julio Sánchez <<html:a href="mailto:julio.sanchez@gmail.com">julio.sanchez@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="keesb" title="contributor">
|
||||
Kees Bakker <<html:a href="mailto:kees.bakker@xs4all.nl">kees.bakker@xs4all.nl</html:a>>
|
||||
</author>
|
||||
<author uid="kdorichev" title="contributor">
|
||||
Konstantin Dorichev <<html:a href="mailto:kdorichev@gmail.com">kdorichev@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Lubo Vasko <<html:a href="mailto:pgval@inMail.sk">pgval@inMail.sk</html:a>>
|
||||
</author>
|
||||
<author uid="ltosky" title="contributor">
|
||||
Luigi Toscano <<html:a href="mailto:luigi.toscano@tiscali.it">luigi.toscano@tiscali.it</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Luiz Gonzaga dos Santos Filho <<html:a href="mailto:lfilho@gmail.com">lfilho@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="zfoldvar" title="contributor">
|
||||
Zsolt Foldvari <<html:a href="mailto:zfoldvar@users.sourceforge.net">zfoldvar@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="borilg" title="contributor">
|
||||
Boril Gourinov <<html:a href="mailto:boril.gourinov@gmail.com">boril.gourinov@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="nick-h" title="contributor">
|
||||
Nick Hall <<html:a href="mailto:nick__hall@hotmail.com">nick__hall@hotmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="matlas" title="contributor">
|
||||
Zdeněk Hataš <<html:a href="mailto:zdenek.hatas@gmail.com">zdenek.hatas@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="loshawlos" title="author">
|
||||
Martin Hawlisch <<html:a href="mailto:martin.hawlisch@gmx.de">martin.hawlisch@gmx.de</html:a>>
|
||||
</author>
|
||||
<author uid="robhealey1" title="author">
|
||||
Rob G. Healey <<html:a href="mailto:robhealey1@gmail.com">robhealey1@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Łukasz Rymarczyk <<html:a href="mailto:yenidai@poczta.onet.pl">yenidai@poczta.onet.pl</html:a>>
|
||||
Morten Bo Johansen <<html:a href="mailto:mbj@spamcop.net">mbj@spamcop.net</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Janne Kovesjärvi <<html:a href="mailto:janne.kovesjarvi@gmail.com">janne.kovesjarvi@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="leonhaeuser" title="contributor">
|
||||
Mirko Leonhäuser <<html:a href="mailto:mirko@leonhaeuser.de">mirko@leonhaeuser.de</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Morten Bo Johansen <<html:a href="mailto:mbj@spamcop.net">mbj@spamcop.net</html:a>>
|
||||
</author>
|
||||
<author uid="loshawlos" title="author">
|
||||
Martin Hawlisch <<html:a href="mailto:martin.hawlisch@gmx.de">martin.hawlisch@gmx.de</html:a>>
|
||||
Sigmund Lorentsen <<html:a href="mailto:sigmund.lorentsen@tele2.no">sigmund.lorentsen@tele2.no</html:a>>
|
||||
</author>
|
||||
<author uid="ldnp" title="contributor">
|
||||
Peter Landgren <<html:a href="mailto:peter.talken@telia.com">peter.talken@telia.com</html:a>>
|
||||
</author>
|
||||
<author uid="acraphae" title="contributor">
|
||||
Raphael Ackermann <<html:a href="mailto:raphael.ackermann@gmail.com">raphael.ackermann@gmail.com</html:a>>
|
||||
<author uid="bmcage" title="author">
|
||||
Benny Malengier <<html:a href="mailto:benny.malengier@gramps-project.org">benny.malengier@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="hippy" title="author">
|
||||
Richard Taylor <<html:a href="mailto:rjt-gramps@thegrindstone.me.uk">rjt-gramps@thegrindstone.me.uk</html:a>>
|
||||
<author uid="pez4brian" title="author">
|
||||
Brian Matherly <<html:a href="mailto:brian@gramps-project.org">brian@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="noirauds" title="contributor">
|
||||
Serge Noiraud <<html:a href="mailto:Serge.Noiraud@free.fr">Serge.Noiraud@free.fr</html:a>>
|
||||
</author>
|
||||
<author uid="dpeterso" title="author">
|
||||
Donald A. Peterson <<html:a href="mailto:"></html:a>>
|
||||
</author>
|
||||
<author uid="josip" title="contributor">
|
||||
Josip Pisoj <<html:a href="mailto:josip@pisoj.com">josip@pisoj.com</html:a>>
|
||||
</author>
|
||||
<author uid="romjerome" title="contributor">
|
||||
Jérôme Rapinat <<html:a href="mailto:romjerome@yahoo.fr">romjerome@yahoo.fr</html:a>>
|
||||
</author>
|
||||
<author uid="erikdrgm" title="contributor">
|
||||
Erik De Richter <<html:a href="mailto:erikdrgm@users.sourceforge.net">erikdrgm@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="rshura" title="author">
|
||||
Alex Roitman <<html:a href="mailto:shura@gramps-project.org">shura@gramps-project.org</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Sigmund Lorentsen <<html:a href="mailto:sigmund.lorentsen@tele2.no">sigmund.lorentsen@tele2.no</html:a>>
|
||||
Łukasz Rymarczyk <<html:a href="mailto:yenidai@poczta.onet.pl">yenidai@poczta.onet.pl</html:a>>
|
||||
</author>
|
||||
<author uid="betula" title="contributor">
|
||||
Stefan Bjork <<html:a href="mailto:betula@users.sourceforge.net">betula@users.sourceforge.net</html:a>>
|
||||
<author uid="jgsack" title="contributor">
|
||||
James G Sack <<html:a href="mailto:jgsack@san.rr.com">jgsack@san.rr.com</html:a>>
|
||||
</author>
|
||||
<author uid="s_charette" title="contributor">
|
||||
Stéphane Charette <<html:a href="mailto:stephanecharette@gmail.com">stephanecharette@gmail.com</html:a>>
|
||||
<author uid="jsanchez" title="contributor">
|
||||
Julio Sánchez <<html:a href="mailto:julio.sanchez@gmail.com">julio.sanchez@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="simanek" title="contributor">
|
||||
Jason Simanek <<html:a href="mailto:jsimanek@gmail.com">jsimanek@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="asleinius" title="contributor">
|
||||
Arturas Sleinius <<html:a href="mailto:asleinius@users.sourceforge.net">asleinius@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="eerot" title="contributor">
|
||||
Eero Tamminen <<html:a href="mailto:eerot@users.sourceforge.net">eerot@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
<author uid="hippy" title="author">
|
||||
Richard Taylor <<html:a href="mailto:rjt-gramps@thegrindstone.me.uk">rjt-gramps@thegrindstone.me.uk</html:a>>
|
||||
</author>
|
||||
<author uid="ltosky" title="contributor">
|
||||
Luigi Toscano <<html:a href="mailto:luigi.toscano@tiscali.it">luigi.toscano@tiscali.it</html:a>>
|
||||
</author>
|
||||
<author uid="has_no_svn_access" title="contributor">
|
||||
Lubo Vasko <<html:a href="mailto:pgval@inMail.sk">pgval@inMail.sk</html:a>>
|
||||
</author>
|
||||
<author uid="twaugh" title="author">
|
||||
Tim Waugh <<html:a href="mailto:twaugh@redhat.com">twaugh@redhat.com</html:a>>
|
||||
</author>
|
||||
<author uid="matlas" title="contributor">
|
||||
Zdeněk Hataš <<html:a href="mailto:zdenek.hatas@gmail.com">zdenek.hatas@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="robhealey1" title="author">
|
||||
Rob G. Healey <<html:a href="mailto:robhealey1@gmail.com">robhealey1@gmail.com</html:a>>
|
||||
</author>
|
||||
<author uid="zfoldvar" title="contributor">
|
||||
Zsolt Foldvari <<html:a href="mailto:zfoldvar@users.sourceforge.net">zfoldvar@users.sourceforge.net</html:a>>
|
||||
</author>
|
||||
</authors>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
<_tip number="10"><b>The Family View</b><br/>The Family View is used to display a typical family unit as two parents and their children.</_tip>
|
||||
|
||||
<_tip number="11"><b>Changing the Active Person</b><br/>Changing the Active Person in views is easy. In the Relationship view juct click on anyone. In the Ancestry View doubleclick on the person or right click to select any of their spouses, siblings, children or parents.</_tip>
|
||||
<_tip number="11"><b>Changing the Active Person</b><br/>Changing the Active Person in views is easy. In the Relationship view just click on anyone. In the Ancestry View doubleclick on the person or right click to select any of their spouses, siblings, children or parents.</_tip>
|
||||
|
||||
<_tip number="12"><b>Who Was Born When?</b><br/>Under "Tools > Analysis and exploration > Compare Individual Events..." you can compare the data of individuals in your database. This is useful, say, if you wish to list the birth dates of everyone in your database. You can use a custom filter to narrow the results.</_tip>
|
||||
|
||||
|
||||
+12
-5
@@ -193,6 +193,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
|
||||
# 3. Special signal for change in home person
|
||||
__signals__['home-person-changed'] = None
|
||||
|
||||
# 4. Signal for change in person group name, parameters are
|
||||
__signals__['person-groupname-rebuild'] = (unicode, unicode)
|
||||
|
||||
def __init__(self):
|
||||
"""Create a new GrampsDB."""
|
||||
@@ -1265,13 +1268,17 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
if not self.readonly:
|
||||
# Start transaction
|
||||
with BSDDBTxn(self.env, self.name_group) as txn:
|
||||
name = str(name)
|
||||
data = txn.get(name)
|
||||
sname = str(name)
|
||||
data = txn.get(sname)
|
||||
if data is not None:
|
||||
txn.delete(name)
|
||||
txn.delete(sname)
|
||||
if group is not None:
|
||||
txn.put(name, group)
|
||||
self.emit('person-rebuild')
|
||||
txn.put(sname, group)
|
||||
if group == None:
|
||||
grouppar = u''
|
||||
else:
|
||||
grouppar = group
|
||||
self.emit('person-groupname-rebuild', (name, grouppar))
|
||||
|
||||
def sort_surname_list(self):
|
||||
self.surname_list.sort(key=locale.strxfrm)
|
||||
|
||||
+7
-1
@@ -55,7 +55,13 @@ class Name(SecondaryObject, PrivacyBase, SourceBase, NoteBase, DateBase):
|
||||
FN = 4 # first name
|
||||
|
||||
def __init__(self, source=None, data=None):
|
||||
"""Create a new Name instance, copying from the source if provided."""
|
||||
"""Create a new Name instance, copying from the source if provided.
|
||||
We should connect here to 'person-groupname-rebuild' and do something
|
||||
correct when first parameter is the name, and second parameter is
|
||||
different from the group here. However, that would be complicated and
|
||||
no real errors that cannot be ammended can be done if group is
|
||||
saved differently.
|
||||
"""
|
||||
PrivacyBase.__init__(self, source)
|
||||
SourceBase.__init__(self, source)
|
||||
NoteBase.__init__(self, source)
|
||||
|
||||
@@ -68,7 +68,7 @@ class Gramplet(object):
|
||||
Connect the given method to the active-changed signal for the
|
||||
navigation type requested.
|
||||
"""
|
||||
self.uistate.register(nav_type, self.nav_group)
|
||||
self.uistate.register(self.dbstate, nav_type, self.nav_group)
|
||||
history = self.uistate.get_history(nav_type, self.nav_group)
|
||||
self.connect(history, "active-changed", method)
|
||||
|
||||
|
||||
@@ -10,10 +10,12 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="place_title">
|
||||
<property name="visible">True</property>
|
||||
@@ -242,10 +244,12 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="merge_title">
|
||||
<property name="visible">True</property>
|
||||
@@ -447,6 +451,7 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox4">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkTable" id="table8">
|
||||
<property name="visible">True</property>
|
||||
@@ -956,11 +961,13 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="vbox4">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox5">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">12</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="people_title">
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
<property name="default_width">500</property>
|
||||
<property name="default_height">300</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<signal name="delete_event" handler="on_scratch_pad_delete_event"/>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow86">
|
||||
<property name="visible">True</property>
|
||||
@@ -58,7 +58,6 @@
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="clicked" handler="on_clear_all_clicked"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
||||
@@ -10,9 +10,11 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="title">
|
||||
<property name="visible">True</property>
|
||||
@@ -53,6 +55,7 @@
|
||||
<child>
|
||||
<object class="GtkVButtonBox" id="vbuttonbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">10</property>
|
||||
<property name="layout_style">start</property>
|
||||
<child>
|
||||
@@ -185,9 +188,11 @@
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="title1">
|
||||
<property name="visible">True</property>
|
||||
@@ -277,6 +282,7 @@
|
||||
<object class="GtkVBox" id="vbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">12</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="pname">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2006 Donald N. Allingham
|
||||
# Copyright (C) 2009 Gary Burton
|
||||
# Copyright (C) 2009-2010 Gary Burton
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -38,6 +38,8 @@ import urlparse
|
||||
import gtk
|
||||
import pango
|
||||
import os
|
||||
import sys
|
||||
import urllib
|
||||
import gobject
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@@ -55,7 +57,7 @@ import Errors
|
||||
import gen.mime
|
||||
from DdTargets import DdTargets
|
||||
from buttontab import ButtonTab
|
||||
|
||||
import constfunc
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
#
|
||||
@@ -200,7 +202,6 @@ class GalleryTab(ButtonTab, DbGUIElement):
|
||||
self.iconlist.set_margin(12)
|
||||
self.iconlist.set_spacing(24)
|
||||
self.iconlist.set_reorderable(True)
|
||||
self.iconlist.set_item_width(item_width)
|
||||
self.iconlist.set_selection_mode(gtk.SELECTION_SINGLE)
|
||||
|
||||
# connect the signals
|
||||
@@ -366,7 +367,7 @@ class GalleryTab(ButtonTab, DbGUIElement):
|
||||
DdTargets.MEDIAOBJ.target()]
|
||||
|
||||
self.iconlist.enable_model_drag_dest(dnd_types,
|
||||
gtk.gdk.ACTION_COPY)
|
||||
gtk.gdk.ACTION_MOVE|gtk.gdk.ACTION_COPY)
|
||||
self.iconlist.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
|
||||
[self._DND_TYPE.target()],
|
||||
gtk.gdk.ACTION_COPY)
|
||||
@@ -454,28 +455,35 @@ class GalleryTab(ButtonTab, DbGUIElement):
|
||||
elif self._DND_EXTRA and mytype == self._DND_EXTRA.drag_type:
|
||||
self.handle_extra_type(mytype, obj)
|
||||
except pickle.UnpicklingError:
|
||||
d = Utils.fix_encoding(sel_data.data.replace('\0',' ').strip())
|
||||
protocol, site, mfile, j, k, l = urlparse.urlparse(d)
|
||||
if protocol == "file":
|
||||
name = Utils.fix_encoding(mfile)
|
||||
mime = gen.mime.get_type(name)
|
||||
if not gen.mime.is_valid_type(mime):
|
||||
return
|
||||
photo = gen.lib.MediaObject()
|
||||
photo.set_path(name)
|
||||
photo.set_mime_type(mime)
|
||||
basename = os.path.basename(name)
|
||||
(root, ext) = os.path.splitext(basename)
|
||||
photo.set_description(root)
|
||||
trans = self.dbstate.db.transaction_begin()
|
||||
self.dbstate.db.add_object(photo, trans)
|
||||
oref = gen.lib.MediaRef()
|
||||
oref.set_reference_handle(photo.get_handle())
|
||||
self.get_data().append(oref)
|
||||
self.changed = True
|
||||
# self.dataobj.add_media_reference(oref)
|
||||
self.dbstate.db.transaction_commit(trans,
|
||||
_("Drag Media Object"))
|
||||
#modern file managers provide URI_LIST. For Windows split sel_data.data
|
||||
if constfunc.win():
|
||||
files = sel_data.data.split('\n')
|
||||
else:
|
||||
files = sel_data.get_uris()
|
||||
for file in files:
|
||||
d = Utils.fix_encoding(file.replace('\0',' ').strip())
|
||||
protocol, site, mfile, j, k, l = urlparse.urlparse(d)
|
||||
if protocol == "file":
|
||||
name = Utils.fix_encoding(mfile)
|
||||
name = unicode(urllib.url2pathname(
|
||||
name.encode(sys.getfilesystemencoding())))
|
||||
mime = gen.mime.get_type(name)
|
||||
if not gen.mime.is_valid_type(mime):
|
||||
return
|
||||
photo = gen.lib.MediaObject()
|
||||
photo.set_path(name)
|
||||
photo.set_mime_type(mime)
|
||||
basename = os.path.basename(name)
|
||||
(root, ext) = os.path.splitext(basename)
|
||||
photo.set_description(root)
|
||||
trans = self.dbstate.db.transaction_begin()
|
||||
self.dbstate.db.add_object(photo, trans)
|
||||
oref = gen.lib.MediaRef()
|
||||
oref.set_reference_handle(photo.get_handle())
|
||||
self.get_data().append(oref)
|
||||
self.changed = True
|
||||
self.dbstate.db.transaction_commit(trans,
|
||||
_("Drag Media Object"))
|
||||
self.rebuild()
|
||||
|
||||
def handle_extra_type(self, objtype, obj):
|
||||
|
||||
@@ -166,7 +166,7 @@ class EditChildRef(EditSecondary):
|
||||
|
||||
def edit_child(self, obj,event):
|
||||
if button_activated(event, _LEFT_BUTTON):
|
||||
from _EditPerson import EditPerson
|
||||
from editperson import EditPerson
|
||||
handle = self.obj.ref
|
||||
try:
|
||||
person = self.db.get_person_from_handle(handle)
|
||||
|
||||
+53
-35
@@ -32,7 +32,6 @@ Manages the main window and the pluggable views
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import os
|
||||
|
||||
from gen.ggettext import gettext as _
|
||||
from cStringIO import StringIO
|
||||
from collections import defaultdict
|
||||
@@ -763,8 +762,6 @@ class ViewManager(CLIManager):
|
||||
"""
|
||||
try:
|
||||
GrampsPreferences(self.uistate, self.dbstate)
|
||||
self._key = self.uistate.connect('nameformat-changed',
|
||||
self.active_page.build_tree)
|
||||
except Errors.WindowActiveError:
|
||||
return
|
||||
|
||||
@@ -884,7 +881,13 @@ class ViewManager(CLIManager):
|
||||
self.pages.append([])
|
||||
nrpage = 0
|
||||
for pdata, page_def in cat_views:
|
||||
page = page_def(self.dbstate, self.uistate)
|
||||
try:
|
||||
page = page_def(self.dbstate, self.uistate)
|
||||
except:
|
||||
import traceback
|
||||
LOG.warn("View '%s' failed to load." % pdata.id)
|
||||
traceback.print_exc()
|
||||
continue
|
||||
# Category is (string, trans):
|
||||
page.set_category(pdata.category)
|
||||
page.set_ident(page.get_category() + '_' + pdata.id)
|
||||
@@ -960,12 +963,23 @@ class ViewManager(CLIManager):
|
||||
uitoolitems)
|
||||
#set view cat to last used in this category
|
||||
self.notebook_cat[-1].set_current_page(default_cat_views[indexcat])
|
||||
|
||||
if self.views:
|
||||
self.active_page = self.pages[current_cat][current_cat_view]
|
||||
self.buttons[current_cat].set_active(True)
|
||||
self.active_page.set_active()
|
||||
self.notebook.set_current_page(current_cat)
|
||||
self.notebook_cat[current_cat].set_current_page(current_cat_view)
|
||||
self._key = self.uistate.connect('nameformat-changed',
|
||||
self.active_page.build_tree)
|
||||
else:
|
||||
#not one single view loaded
|
||||
WarningDialog(
|
||||
_("No views loaded"),
|
||||
_("No view plugins are loaded. Go to Help->Plugin "
|
||||
"Manager, and make sure some plugins of type 'View' are "
|
||||
"enabled. Then restart Gramps"))
|
||||
|
||||
self.active_page = self.pages[current_cat][current_cat_view]
|
||||
self.buttons[current_cat].set_active(True)
|
||||
self.active_page.set_active()
|
||||
self.notebook.set_current_page(current_cat)
|
||||
self.notebook_cat[current_cat].set_current_page(current_cat_view)
|
||||
|
||||
def __views_to_show(self, use_last = True):
|
||||
"""
|
||||
@@ -1159,36 +1173,40 @@ class ViewManager(CLIManager):
|
||||
:Type view_page: integer >=0 to switch to a specific page, or -1 to
|
||||
switch to the active view in the category
|
||||
"""
|
||||
if view_page == -1:
|
||||
#just show active one
|
||||
view_page = self.notebook_cat[category_page].get_current_page()
|
||||
if self.dbstate.open:
|
||||
self.__disconnect_previous_page()
|
||||
if len(self.pages) > 0:
|
||||
self.active_page = self.pages[category_page][view_page]
|
||||
self.active_page.set_active()
|
||||
newcurpageid = self.views[category_page][view_page][0].id
|
||||
config.set('preferences.last-view', newcurpageid)
|
||||
olddefaults = config.get('preferences.last-views')
|
||||
if len(olddefaults) != len(self.pages):
|
||||
#number views changed, we cannot trust the old
|
||||
olddefaults = [''] * len(self.pages)
|
||||
olddefaults[category_page] = newcurpageid
|
||||
config.set('preferences.last-views', olddefaults)
|
||||
config.save()
|
||||
if self.notebook_cat:
|
||||
if view_page == -1:
|
||||
#just show active one
|
||||
view_page = self.notebook_cat[category_page].get_current_page()
|
||||
if self.dbstate.open:
|
||||
self.__disconnect_previous_page()
|
||||
if len(self.pages) > 0:
|
||||
self.active_page = self.pages[category_page][view_page]
|
||||
self.active_page.set_active()
|
||||
newcurpageid = self.views[category_page][view_page][0].id
|
||||
config.set('preferences.last-view', newcurpageid)
|
||||
olddefaults = config.get('preferences.last-views')
|
||||
if len(olddefaults) != len(self.pages):
|
||||
#number views changed, we cannot trust the old
|
||||
olddefaults = [''] * len(self.pages)
|
||||
olddefaults[category_page] = newcurpageid
|
||||
config.set('preferences.last-views', olddefaults)
|
||||
config.save()
|
||||
|
||||
self.__connect_active_page(category_page, view_page)
|
||||
self.__connect_active_page(category_page, view_page)
|
||||
|
||||
self.uimanager.ensure_update()
|
||||
self.uimanager.ensure_update()
|
||||
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
|
||||
self.active_page.change_page()
|
||||
if self._key:
|
||||
self.uistate.disconnect(self._key)
|
||||
self._key = self.uistate.connect(
|
||||
'nameformat-changed', self.active_page.build_tree)
|
||||
self.active_page.change_page()
|
||||
if self._key:
|
||||
self.uistate.disconnect(self._key)
|
||||
self._key = self.uistate.connect(
|
||||
'nameformat-changed', self.active_page.build_tree)
|
||||
else:
|
||||
#no views loaded
|
||||
pass
|
||||
|
||||
def import_data(self, obj):
|
||||
"""
|
||||
|
||||
@@ -708,7 +708,7 @@ class ListView(NavigationView):
|
||||
else:
|
||||
self.dirty = True
|
||||
|
||||
def object_build(self):
|
||||
def object_build(self, *args):
|
||||
"""
|
||||
Called when the tree must be rebuilt and bookmarks redrawn.
|
||||
"""
|
||||
|
||||
@@ -92,7 +92,7 @@ class NavigationView(PageView):
|
||||
self.nav_group = nav_group
|
||||
self.mru_active = DISABLED
|
||||
|
||||
self.uistate.register(self.navigation_type(), self.nav_group)
|
||||
self.uistate.register(state, self.navigation_type(), self.nav_group)
|
||||
|
||||
|
||||
def navigation_type(self):
|
||||
|
||||
@@ -435,13 +435,14 @@ class PageView(DbGUIElement):
|
||||
if not self.__configure_content:
|
||||
self.__configure_content = self._get_configure_page_funcs()
|
||||
title = _("Configure %(cat)s - %(view)s") % \
|
||||
{'cat': self.get_category(), 'view': self.get_title()}
|
||||
{'cat': self.get_translated_category(),
|
||||
'view': self.get_title()}
|
||||
try:
|
||||
ViewConfigureDialog(self.uistate, self.dbstate,
|
||||
self.__configure_content,
|
||||
self, self._config, dialogtitle=title,
|
||||
ident=_("%(cat)s - %(view)s") %
|
||||
{'cat': self.get_category(),
|
||||
{'cat': self.get_translated_category(),
|
||||
'view': self.get_title()})
|
||||
except Errors.WindowActiveError:
|
||||
return
|
||||
|
||||
@@ -516,8 +516,8 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
||||
# use cursor as a context manager
|
||||
with self.gen_cursor() as cursor:
|
||||
#loop over database and store the sort field, and the handle
|
||||
return sorted( (conv_unicode_tosrtkey_ongtk(self.sort_func(data)),
|
||||
key) for key, data in cursor )
|
||||
return sorted((map(conv_unicode_tosrtkey_ongtk,
|
||||
self.sort_func(data)), key) for key, data in cursor)
|
||||
|
||||
def _rebuild_search(self, ignore=None):
|
||||
""" function called when view must be build, given a search text
|
||||
@@ -584,7 +584,8 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
||||
Row is only added if search/filter data is such that it must be shown
|
||||
"""
|
||||
data = self.map(handle)
|
||||
insert_val = (conv_unicode_tosrtkey_ongtk(self.sort_func(data)), handle)
|
||||
insert_val = (map(conv_unicode_tosrtkey_ongtk, self.sort_func(data)),
|
||||
handle)
|
||||
if not self.search or \
|
||||
(self.search and self.search.match(handle, self.db)):
|
||||
#row needs to be added to the model
|
||||
@@ -602,7 +603,8 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
||||
"""
|
||||
self.clear_cache(handle)
|
||||
data = self.map(handle)
|
||||
delete_val = (conv_unicode_tosrtkey_ongtk(self.sort_func(data)), handle)
|
||||
delete_val = (map(conv_unicode_tosrtkey_ongtk, self.sort_func(data)),
|
||||
handle)
|
||||
delete_path = self.node_map.delete(delete_val)
|
||||
#delete_path is an integer from 0 to n-1
|
||||
if delete_path is not None:
|
||||
@@ -614,7 +616,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
||||
"""
|
||||
self.clear_cache(handle)
|
||||
oldsortkey = self.node_map.get_sortkey(handle)
|
||||
newsortkey = conv_unicode_tosrtkey_ongtk(self.sort_func(self.map(
|
||||
newsortkey = map(conv_unicode_tosrtkey_ongtk, self.sort_func(self.map(
|
||||
handle)))
|
||||
if oldsortkey is None or oldsortkey != newsortkey:
|
||||
#or the changed object is not present in the view due to filtering
|
||||
@@ -627,6 +629,13 @@ class FlatBaseModel(gtk.GenericTreeModel):
|
||||
node = self.get_iter(path)
|
||||
self.row_changed(path, node)
|
||||
|
||||
def handle2path(self, handle):
|
||||
"""
|
||||
Obtain from a handle, a path.
|
||||
Part of common api with flat/treebasemodel
|
||||
"""
|
||||
return self.on_get_path(handle)
|
||||
|
||||
def on_get_flags(self):
|
||||
"""
|
||||
Returns the GtkTreeModelFlags for this particular type of model
|
||||
|
||||
@@ -178,7 +178,7 @@ class PeopleBaseModel(object):
|
||||
def sort_name(self, data):
|
||||
n = Name()
|
||||
n.unserialize(data[COLUMN_NAME])
|
||||
return name_displayer.sort_string(n)
|
||||
return (n.get_group_name(), n.get_first_name())
|
||||
|
||||
def column_name(self, data):
|
||||
handle = data[0]
|
||||
|
||||
@@ -85,7 +85,7 @@ class Node(object):
|
||||
def __init__(self, ref, parent, sortkey, handle):
|
||||
self.name = sortkey
|
||||
if sortkey:
|
||||
self.sortkey = conv_unicode_tosrtkey_ongtk(sortkey)
|
||||
self.sortkey = map(conv_unicode_tosrtkey_ongtk, sortkey)
|
||||
else:
|
||||
self.sortkey = None
|
||||
self.ref = ref
|
||||
@@ -228,7 +228,7 @@ class TreeBaseModel(gtk.GenericTreeModel):
|
||||
the hierarchy. Each entry is a node object.
|
||||
handle2node A dictionary of gramps handles. Each entry is a node object.
|
||||
nodemap A NodeMap, mapping id's of the nodes to the node objects. Node
|
||||
refer to other notes via id's in a linked list form.
|
||||
refer to other nodes via id's in a linked list form.
|
||||
|
||||
The model obtains data from database as needed and holds a cache of most
|
||||
recently used data.
|
||||
@@ -577,8 +577,9 @@ class TreeBaseModel(gtk.GenericTreeModel):
|
||||
path = self.on_get_path(child_node)
|
||||
node = self.get_iter(path)
|
||||
self.row_inserted(path, node)
|
||||
self.__total += 1
|
||||
self.__displayed += 1
|
||||
if handle:
|
||||
self.__total += 1
|
||||
self.__displayed += 1
|
||||
|
||||
if handle:
|
||||
self.handle2node[handle] = child_node
|
||||
@@ -607,16 +608,16 @@ class TreeBaseModel(gtk.GenericTreeModel):
|
||||
node.set_handle(None)
|
||||
self.__displayed -= 1
|
||||
self.__total -= 1
|
||||
else:
|
||||
elif node.parent: # don't remove the hidden root node
|
||||
path = self.on_get_path(node)
|
||||
self.nodemap.node(node.parent).remove_child(node, self.nodemap)
|
||||
del self.tree[node.ref]
|
||||
if node.handle is not None:
|
||||
del self.handle2node[node.handle]
|
||||
self.__displayed -= 1
|
||||
self.__total -= 1
|
||||
self.nodemap.del_node(node)
|
||||
del node
|
||||
self.__displayed -= 1
|
||||
self.__total -= 1
|
||||
|
||||
# emit row_deleted signal
|
||||
self.row_deleted(path)
|
||||
@@ -724,6 +725,13 @@ class TreeBaseModel(gtk.GenericTreeModel):
|
||||
"""
|
||||
return self.handle2node.get(handle)
|
||||
|
||||
def handle2path(self, handle):
|
||||
"""
|
||||
Obtain from a handle, a path.
|
||||
Part of common api with flat/treebasemodel
|
||||
"""
|
||||
return self.on_get_path(self.get_node(handle))
|
||||
|
||||
# The following implement the public interface of gtk.GenericTreeModel
|
||||
|
||||
def on_get_flags(self):
|
||||
|
||||
@@ -5,6 +5,7 @@ SUBDIRS =
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/images/16x16
|
||||
|
||||
dist_pkgdata_DATA = \
|
||||
geo-fixed-zoom.png \
|
||||
gramps-address.png \
|
||||
gramps-attribute.png \
|
||||
gramps-bookmark-delete.png \
|
||||
|
||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 816 B |
@@ -19,10 +19,12 @@ dist_pkgdata_DATA = \
|
||||
gramps-bookmark-edit.png \
|
||||
gramps-bookmark-new.png \
|
||||
gramps-bookmark.png \
|
||||
gramps-config.png \
|
||||
gramps-date-edit.png \
|
||||
gramps-date.png \
|
||||
gramps-event.png \
|
||||
gramps-family.png \
|
||||
gramps-fanchart.png \
|
||||
gramps-font-bgcolor.png \
|
||||
gramps-font-color.png \
|
||||
gramps-font.png \
|
||||
@@ -50,6 +52,7 @@ dist_pkgdata_DATA = \
|
||||
gramps-tree-list.png \
|
||||
gramps-tree-select.png \
|
||||
gramps-unlock.png \
|
||||
gramps-view.png \
|
||||
gramps-viewmedia.png \
|
||||
gramps-zoom-best-fit.png \
|
||||
gramps-zoom-fit-width.png \
|
||||
|
||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 895 B |
@@ -5,7 +5,6 @@ SUBDIRS =
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/images/scalable
|
||||
|
||||
dist_pkgdata_DATA = \
|
||||
geo-place-add.svg
|
||||
geo-fixed-zoom.svg \
|
||||
geo-free-zoom.svg \
|
||||
geo-place-add.svg \
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@/mapstraction
|
||||
|
||||
dist_pkgdata_DATA = \
|
||||
mapstraction.js
|
||||
mapstraction.js \
|
||||
crosshairs.png
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -176,7 +176,8 @@ def _get_subject(options, dbase):
|
||||
else:
|
||||
mother_name = _("unknown mother")
|
||||
|
||||
name = _("%s and %s (%s)") % (father_name, mother_name, family_id)
|
||||
name = _("%(father)s and %(mother)s (%(id)s)") % {
|
||||
'father' : father_name, 'mother' : mother_name, 'id' : family_id }
|
||||
return name
|
||||
|
||||
return _("Not Applicable")
|
||||
@@ -898,12 +899,24 @@ class BookReportSelector(ManagedWindow.ManagedWindow):
|
||||
item.get_name(),
|
||||
item.get_translated_name(),
|
||||
self.track)
|
||||
response = item_dialog.window.run()
|
||||
if response == gtk.RESPONSE_OK:
|
||||
subject = _get_subject(option_class, self.db)
|
||||
self.book_model.model.set_value(the_iter, 2, subject)
|
||||
self.book.set_item(row, item)
|
||||
item_dialog.close()
|
||||
|
||||
while True:
|
||||
response = item_dialog.window.run()
|
||||
if response == gtk.RESPONSE_OK:
|
||||
# dialog will be closed by connect, now continue work while
|
||||
# rest of dialog is unresponsive, release when finished
|
||||
subject = _get_subject(option_class, self.db)
|
||||
self.book_model.model.set_value(the_iter, 2, subject)
|
||||
self.book.set_item(row, item)
|
||||
item_dialog.close()
|
||||
break
|
||||
elif response == gtk.RESPONSE_CANCEL:
|
||||
item_dialog.close()
|
||||
break
|
||||
elif response == gtk.RESPONSE_DELETE_EVENT:
|
||||
#just stop, in ManagedWindow, delete-event is already coupled to
|
||||
#correct action.
|
||||
break
|
||||
|
||||
def book_button_press(self, obj, event):
|
||||
"""
|
||||
|
||||
@@ -210,9 +210,9 @@ def _find_records(db, filter, callname):
|
||||
father = db.get_person_from_handle(father_handle)
|
||||
mother = db.get_person_from_handle(mother_handle)
|
||||
|
||||
name = _("%s and %s") % (
|
||||
_person_get_display_name(father, callname),
|
||||
_person_get_display_name(mother, callname))
|
||||
name = _("%(father)s and %(mother)s") % {
|
||||
'father' : _person_get_display_name(father, callname),
|
||||
'mother' : _person_get_display_name(mother, callname) }
|
||||
|
||||
_record(None, family_mostchildren,
|
||||
len(family.get_child_ref_list()),
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2008 - 2009 Douglas S. Blank <doug.blank@gmail.com>
|
||||
# Copyright (C) 2009 B. Malengier <benny.malengier@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
register(EXPORT,
|
||||
id = "export_django",
|
||||
name = _('Django Export'),
|
||||
description = _('Django is a web framework working on a '
|
||||
'configured database'),
|
||||
version = '1.0',
|
||||
gramps_target_version= '3.2',
|
||||
status = UNSTABLE,
|
||||
export_options_title = _('Django options'),
|
||||
export_options = 'NoFilenameOptions',
|
||||
export_function = 'export_all',
|
||||
extension = "django",
|
||||
fname = "ExportDjango.py",
|
||||
)
|
||||
|
||||
@@ -1,193 +0,0 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2008 - 2009 Douglas S. Blank <doug.blank@gmail.com>
|
||||
# Copyright (C) 2009 B. Malengier <benny.malengier@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
"""
|
||||
Export to the Django Models on the configured database backend
|
||||
|
||||
|
||||
"""
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Standard Python Modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Set up logging
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import logging
|
||||
LOG = logging.getLogger(".ExportDjango")
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import ExportOptions
|
||||
from Utils import create_id, probably_alive
|
||||
import const
|
||||
import gen.lib
|
||||
|
||||
from TransUtils import get_addon_translator
|
||||
translator = get_addon_translator(__file__)
|
||||
_ = translator.gettext
|
||||
ngettext = translator.ngettext
|
||||
|
||||
from django.conf import settings
|
||||
import web.settings as default_settings
|
||||
try:
|
||||
settings.configure(default_settings)
|
||||
except RuntimeError:
|
||||
# already configured; ignore
|
||||
pass
|
||||
|
||||
from web.libdjango import DjangoInterface
|
||||
|
||||
def export_all(database, filename, option_box=None, callback=None):
|
||||
if not callable(callback):
|
||||
callback = lambda (percent): None # dummy
|
||||
|
||||
start = time.time()
|
||||
total = (database.get_number_of_notes() +
|
||||
database.get_number_of_people() +
|
||||
database.get_number_of_events() +
|
||||
database.get_number_of_families() +
|
||||
database.get_number_of_repositories() +
|
||||
database.get_number_of_places() +
|
||||
database.get_number_of_media_objects() +
|
||||
database.get_number_of_sources()) * 2 # steps
|
||||
count = 0.0
|
||||
dji = DjangoInterface()
|
||||
dji.clear_tables("primary", "secondary", "ref")
|
||||
|
||||
for step in [0, 1]:
|
||||
LOG.debug("Exporting Step %d..." % (step + 1))
|
||||
# ---------------------------------
|
||||
# Person
|
||||
# ---------------------------------
|
||||
for person_handle in database.person_map.keys():
|
||||
data = database.person_map[person_handle]
|
||||
if step == 0:
|
||||
dji.add_person(data)
|
||||
elif step == 1:
|
||||
djperson = dji.add_person_detail(data)
|
||||
djperson.probably_alive = not bool(djperson.death)
|
||||
djperson.save()
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Notes
|
||||
# ---------------------------------
|
||||
for note_handle in database.note_map.keys():
|
||||
data = database.note_map[note_handle]
|
||||
if step == 0:
|
||||
dji.add_note(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Family
|
||||
# ---------------------------------
|
||||
for family_handle in database.family_map.keys():
|
||||
data = database.family_map[family_handle]
|
||||
if step == 0:
|
||||
dji.add_family(data)
|
||||
elif step == 1:
|
||||
dji.add_family_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Source
|
||||
# ---------------------------------
|
||||
for source_handle in database.source_map.keys():
|
||||
data = database.source_map[source_handle]
|
||||
if step == 0:
|
||||
dji.add_source(data)
|
||||
elif step == 1:
|
||||
dji.add_source_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Event
|
||||
# ---------------------------------
|
||||
for event_handle in database.event_map.keys():
|
||||
data = database.event_map[event_handle]
|
||||
if step == 0:
|
||||
dji.add_event(data)
|
||||
elif step == 1:
|
||||
dji.add_event_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Repository
|
||||
# ---------------------------------
|
||||
for repository_handle in database.repository_map.keys():
|
||||
data = database.repository_map[repository_handle]
|
||||
if step == 0:
|
||||
dji.add_repository(data)
|
||||
elif step == 1:
|
||||
dji.add_repository_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Place
|
||||
# ---------------------------------
|
||||
for place_handle in database.place_map.keys():
|
||||
data = database.place_map[place_handle]
|
||||
if step == 0:
|
||||
dji.add_place(data)
|
||||
elif step == 1:
|
||||
dji.add_place_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Media
|
||||
# ---------------------------------
|
||||
for media_handle in database.media_map.keys():
|
||||
data = database.media_map[media_handle]
|
||||
if step == 0:
|
||||
dji.add_media(data)
|
||||
elif step == 1:
|
||||
dji.add_media_detail(data)
|
||||
count += 1
|
||||
callback(100 * count/total)
|
||||
|
||||
total_time = time.time() - start
|
||||
msg = ngettext('Export Complete: %d second','Export Complete: %d seconds', total_time ) % total_time
|
||||
LOG.debug(msg)
|
||||
return True
|
||||
|
||||
class NoFilenameOptions(ExportOptions.WriterOptionBox):
|
||||
no_fileselect = True
|
||||
|
||||
@@ -542,6 +542,7 @@ class FanChartWidget(gtk.Widget):
|
||||
text, person, parents, child = self.data[generation][selected]
|
||||
if person and self.context_popup_callback:
|
||||
self.context_popup_callback(widget, event, person.handle)
|
||||
return True
|
||||
self.queue_draw()
|
||||
return True
|
||||
|
||||
|
||||
@@ -35,9 +35,19 @@ class FAQGramplet(Gramplet):
|
||||
def init(self):
|
||||
self.set_use_markup(True)
|
||||
self.clear_text()
|
||||
self.render_text("Draft of a <a wiki='FAQ'>Frequently Asked Questions</a> Gramplet\n\n")
|
||||
self.render_text(" 1. <a href='http://bugs.gramps-project.org/'>Test 1</a>\n")
|
||||
self.render_text(" 2. <a href='http://gramps-project.org//'>Test 2</a>\n")
|
||||
self.render_text(_("<a wiki='Gramps_3.2_Wiki_Manual_-_FAQ'>Frequently Asked Questions</a> (need connection to internet)\n\n"))
|
||||
self.render_text(_(" 1. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#How_do_I_change_the_order_of_spouses.3F'>How do I change the order of spouses?</a>\n"))
|
||||
self.render_text(_(" 2. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#How_do_I_upgrade_GRAMPS.3F'>Is it necessary to update Gramps every time an update is released?</a>\n"))
|
||||
self.render_text(_(" 3. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#How_do_I_keep_backups.3F'>How do I make backups safely?</a>\n"))
|
||||
self.render_text(_(" 4. <a wiki='Gramps_3.2_Wiki_Manual_-_Entering_and_Editing_Data:_Detailed_-_part_1#Editing_Information_About_Relationships'>How should information about marriages be entered?</a>\n"))
|
||||
self.render_text(_(" 5. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#What_is_the_difference_between_a_residence_and_an_address.3F'>What's the difference between a residence and an address?</a>\n"))
|
||||
self.render_text(_(" 6. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#How_can_I_publish_web_sites_generated_by_GRAMPS.3F'>How can I make a website with Gramps and my tree?</a>\n"))
|
||||
self.render_text(_(" 7. <a href='http://old.nabble.com/German-translation-of-%22occupation%22-ts21786114.html#a21786114'>How do I record one's occupation?</a>\n"))
|
||||
self.render_text(_(" 8. <a wiki='Gramps_3.2_Wiki_Manual_-_FAQ#What_do_I_do_if_I_have_found_a_bug.3F'>What do I do if I have found a bug?</a>\n"))
|
||||
self.render_text(_(" 9. <a wiki='Portal:Using_GRAMPS'>Is there a manual for Gramps?</a>\n"))
|
||||
self.render_text(_(" 10. <a wiki='Category:Tutorials'>Are there tutorials available?</a>\n"))
|
||||
self.render_text(_(" 11. <a wiki='Category:How_do_I...'>How do I ...?</a>\n"))
|
||||
self.render_text(_(" 12. <a wiki='How_you_can_help'>How can I help with Gramps?</a>\n"))
|
||||
|
||||
def post_init(self):
|
||||
self.disconnect("active-changed")
|
||||
|
||||
@@ -16,7 +16,7 @@ pkgdata_PYTHON = \
|
||||
GivenNameGramplet.py \
|
||||
gramplet.gpr.py \
|
||||
PedigreeGramplet.py \
|
||||
PluginManagerGramplet.py\
|
||||
PluginManagerGramplet.py\
|
||||
QuickViewGramplet.py \
|
||||
RelativeGramplet.py \
|
||||
SessionLogGramplet.py \
|
||||
|
||||
@@ -81,6 +81,6 @@ class LogGramplet(Gramplet):
|
||||
if mother_handle:
|
||||
mother = self.dbstate.db.get_person_from_handle(mother_handle)
|
||||
mother_name = name_displayer.display(mother)
|
||||
name = _("%s and %s") % (mother_name, father_name)
|
||||
name = _("%(mother)s and %(father)s") % { 'mother' : mother_name, 'father' : father_name }
|
||||
self.link(name, ltype, handle)
|
||||
self.append_text("\n")
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
register(GRAMPLET,
|
||||
id="Age on Date Gramplet",
|
||||
name=_("Age on Date Gramplet"),
|
||||
description = _("Gramplet showing ages of living people on a specific date"),
|
||||
version="2.0.0",
|
||||
gramps_target_version="3.2",
|
||||
status = STABLE,
|
||||
@@ -40,6 +41,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id = "Age Stats Gramplet",
|
||||
name = _("Age Stats Gramplet"),
|
||||
description = _("Gramplet showing graphs of various ages"),
|
||||
status = STABLE,
|
||||
fname="AgeStats.py",
|
||||
height=100,
|
||||
@@ -55,6 +57,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Attributes Gramplet",
|
||||
name=_("Attributes Gramplet"),
|
||||
description = _("Gramplet showing active person's attributes"),
|
||||
status = STABLE,
|
||||
fname="AttributesGramplet.py",
|
||||
height=150,
|
||||
@@ -70,6 +73,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Calendar Gramplet",
|
||||
name=_("Calendar Gramplet"),
|
||||
description = _("Gramplet showing calendar and events on specific dates in history"),
|
||||
status = STABLE,
|
||||
fname="CalendarGramplet.py",
|
||||
height=200,
|
||||
@@ -82,6 +86,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id = "Descendant Gramplet",
|
||||
name=_("Descendant Gramplet"),
|
||||
description = _("Gramplet showing active person's descendants"),
|
||||
status = STABLE,
|
||||
fname="DescendGramplet.py",
|
||||
height=100,
|
||||
@@ -97,6 +102,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id= "Fan Chart Gramplet",
|
||||
name=_("Fan Chart Gramplet"),
|
||||
description = _("Gramplet showing active person's direct ancestors as a fanchart"),
|
||||
status = STABLE,
|
||||
fname="FanChartGramplet.py",
|
||||
height=430,
|
||||
@@ -112,6 +118,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="FAQ Gramplet",
|
||||
name=_("FAQ Gramplet"),
|
||||
description = _("Gramplet showing frequently asked questions"),
|
||||
status = STABLE,
|
||||
fname="FaqGramplet.py",
|
||||
height=300,
|
||||
@@ -124,6 +131,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id= "Given Name Cloud Gramplet",
|
||||
name=_("Given Name Cloud Gramplet"),
|
||||
description = _("Gramplet showing all given names as a text cloud"),
|
||||
status = STABLE,
|
||||
fname="GivenNameGramplet.py",
|
||||
height=300,
|
||||
@@ -137,6 +145,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Pedigree Gramplet",
|
||||
name=_("Pedigree Gramplet"),
|
||||
description = _("Gramplet showing active person's ancestors"),
|
||||
status = STABLE,
|
||||
fname="PedigreeGramplet.py",
|
||||
height=300,
|
||||
@@ -152,6 +161,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Plugin Manager Gramplet",
|
||||
name=_("Plugin Manager Gramplet"),
|
||||
description = _("Gramplet showing available third-party plugins (addons)"),
|
||||
status = STABLE,
|
||||
fname="PluginManagerGramplet.py",
|
||||
height=300,
|
||||
@@ -165,6 +175,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Quick View Gramplet",
|
||||
name=_("Quick View Gramplet"),
|
||||
description = _("Gramplet showing an active item Quick View"),
|
||||
status = STABLE,
|
||||
fname="QuickViewGramplet.py",
|
||||
height=300,
|
||||
@@ -180,6 +191,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Relatives Gramplet",
|
||||
name=_("Relatives Gramplet"),
|
||||
description = _("Gramplet showing active person's relatives"),
|
||||
status = STABLE,
|
||||
fname="RelativeGramplet.py",
|
||||
height=200,
|
||||
@@ -194,6 +206,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Session Log Gramplet",
|
||||
name=_("Session Log Gramplet"),
|
||||
description = _("Gramplet showing all activity for this session"),
|
||||
status = STABLE,
|
||||
fname="SessionLogGramplet.py",
|
||||
height=230,
|
||||
@@ -207,6 +220,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Statistics Gramplet",
|
||||
name=_("Statistics Gramplet"),
|
||||
description = _("Gramplet showing summary data of the family tree"),
|
||||
status = STABLE,
|
||||
fname="StatsGramplet.py",
|
||||
height=230,
|
||||
@@ -220,6 +234,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id= "Surname Cloud Gramplet",
|
||||
name=_("Surname Cloud Gramplet"),
|
||||
description = _("Gramplet showing all surnames as a text cloud"),
|
||||
status = STABLE,
|
||||
fname="SurnameCloudGramplet.py",
|
||||
height=300,
|
||||
@@ -233,6 +248,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="TODO Gramplet",
|
||||
name=_("TODO Gramplet"),
|
||||
description = _("Gramplet for generic notes"),
|
||||
status = STABLE,
|
||||
fname="ToDoGramplet.py",
|
||||
height=300,
|
||||
@@ -246,6 +262,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id= "Top Surnames Gramplet",
|
||||
name=_("Top Surnames Gramplet"),
|
||||
description = _("Gramplet showing most frequent surnames in this tree"),
|
||||
status = STABLE,
|
||||
fname="TopSurnamesGramplet.py",
|
||||
height=230,
|
||||
@@ -258,6 +275,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id="Welcome Gramplet",
|
||||
name=_("Welcome Gramplet"),
|
||||
description = _("Gramplet showing a welcome message"),
|
||||
status = STABLE,
|
||||
fname="WelcomeGramplet.py",
|
||||
height=300,
|
||||
@@ -271,6 +289,7 @@ register(GRAMPLET,
|
||||
register(GRAMPLET,
|
||||
id = "What's Next Gramplet",
|
||||
name =_("What's Next Gramplet"),
|
||||
description = _("Gramplet suggesting items to research"),
|
||||
status = STABLE,
|
||||
fname="WhatsNext.py",
|
||||
height = 230,
|
||||
@@ -280,3 +299,4 @@ register(GRAMPLET,
|
||||
version="1.0.0",
|
||||
gramps_target_version="3.2",
|
||||
)
|
||||
|
||||
|
||||
@@ -330,8 +330,8 @@ class CSVParser(object):
|
||||
try:
|
||||
data = [[r.strip() for r in row] for row in reader]
|
||||
except csv.Error, e:
|
||||
ErrorDialog(_('format error: file %s, line %d: %s') %
|
||||
(self.filename, reader.line_num, e))
|
||||
ErrorDialog(_('format error: file %(fname)s, line %(line)d: %(zero)s') % {
|
||||
'fname' : self.filename, 'line' : reader.line_num, 'zero' : e })
|
||||
try:
|
||||
fp.close()
|
||||
except:
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2008 - 2009 Douglas S. Blank <doug.blank@gmail.com>
|
||||
# Copyright (C) 2009 B. Malengier <benny.malengier@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
register(IMPORT,
|
||||
id = "import_django",
|
||||
name = _('Django Import'),
|
||||
description = _('Django is a web framework working on a '
|
||||
'configured database'),
|
||||
version = '1.0',
|
||||
gramps_target_version = '3.2',
|
||||
status = UNSTABLE,
|
||||
import_function = 'import_data',
|
||||
extension = "django",
|
||||
fname = "ImportDjango.py",
|
||||
)
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2008 - 2009 Douglas S. Blank <doug.blank@gmail.com>
|
||||
# Copyright (C) 2009 B. Malengier <benny.malengier@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
"""
|
||||
Import from the Django dji on the configured database backend
|
||||
|
||||
"""
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Standard Python Modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Set up logging
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import logging
|
||||
LOG = logging.getLogger(".ImportDjango")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GRAMPS modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import gen.lib
|
||||
from QuestionDialog import ErrorDialog
|
||||
from Utils import create_id
|
||||
import const
|
||||
|
||||
from TransUtils import get_addon_translator
|
||||
translator = get_addon_translator(__file__)
|
||||
_ = translator.gettext
|
||||
ngettext = translator.ngettext
|
||||
|
||||
from django.conf import settings
|
||||
import web.settings as default_settings
|
||||
try:
|
||||
settings.configure(default_settings)
|
||||
except:
|
||||
pass
|
||||
|
||||
from web.libdjango import DjangoInterface
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Django Reader
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class DjangoReader(object):
|
||||
def __init__(self, db, filename, callback):
|
||||
if not callable(callback):
|
||||
callback = lambda (percent): None # dummy
|
||||
self.db = db
|
||||
self.dji = DjangoInterface()
|
||||
self.filename = filename
|
||||
self.callback = callback
|
||||
self.debug = 0
|
||||
|
||||
def process(self):
|
||||
sql = None
|
||||
total = (self.dji.Note.count() +
|
||||
self.dji.Person.count() +
|
||||
self.dji.Event.count() +
|
||||
self.dji.Family.count() +
|
||||
self.dji.Repository.count() +
|
||||
self.dji.Place.count() +
|
||||
self.dji.Media.count() +
|
||||
self.dji.Source.count())
|
||||
self.trans = self.db.transaction_begin("",batch=True)
|
||||
self.db.disable_signals()
|
||||
count = 0.0
|
||||
self.t = time.time()
|
||||
|
||||
# ---------------------------------
|
||||
# Process note
|
||||
# ---------------------------------
|
||||
notes = self.dji.Note.all()
|
||||
for note in notes:
|
||||
data = self.dji.get_note(note)
|
||||
self.db.note_map[str(note.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process event
|
||||
# ---------------------------------
|
||||
events = self.dji.Event.all()
|
||||
for event in events:
|
||||
data = self.dji.get_event(event)
|
||||
self.db.event_map[str(event.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process person
|
||||
# ---------------------------------
|
||||
## Do this after Events to get the birth/death data
|
||||
people = self.dji.Person.all()
|
||||
for person in people:
|
||||
data = self.dji.get_person(person)
|
||||
self.db.person_map[str(person.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process family
|
||||
# ---------------------------------
|
||||
families = self.dji.Family.all()
|
||||
for family in families:
|
||||
data = self.dji.get_family(family)
|
||||
self.db.family_map[str(family.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process repository
|
||||
# ---------------------------------
|
||||
repositories = self.dji.Repository.all()
|
||||
for repo in repositories:
|
||||
data = self.dji.get_repository(repo)
|
||||
self.db.repository_map[str(repo.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process place
|
||||
# ---------------------------------
|
||||
places = self.dji.Place.all()
|
||||
for place in places:
|
||||
data = self.dji.get_place(place)
|
||||
self.db.place_map[str(place.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process source
|
||||
# ---------------------------------
|
||||
sources = self.dji.Source.all()
|
||||
for source in sources:
|
||||
data = self.dji.get_source(source)
|
||||
self.db.source_map[str(source.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
# ---------------------------------
|
||||
# Process media
|
||||
# ---------------------------------
|
||||
media = self.dji.Media.all()
|
||||
for med in media:
|
||||
data = self.dji.get_media(med)
|
||||
self.db.media_map[str(med.handle)] = data
|
||||
count += 1
|
||||
self.callback(100 * count/total)
|
||||
|
||||
|
||||
return None
|
||||
|
||||
def cleanup(self):
|
||||
self.t = time.time() - self.t
|
||||
msg = ngettext('Import Complete: %d second','Import Complete: %d seconds', self.t ) % self.t
|
||||
self.db.transaction_commit(self.trans, _("Django import"))
|
||||
self.db.enable_signals()
|
||||
self.db.request_rebuild()
|
||||
LOG.debug(msg)
|
||||
|
||||
def import_data(db, filename, callback=None):
|
||||
g = DjangoReader(db, filename, callback)
|
||||
g.process()
|
||||
g.cleanup()
|
||||
|
||||
@@ -2825,9 +2825,9 @@ def importData(database, filename, callback=None, cl=0):
|
||||
if database.has_name_group_key(key) :
|
||||
present = database.get_name_group_mapping(key)
|
||||
if not value == present:
|
||||
msg = _("Your family tree groups name %s together"
|
||||
" with %s, did not change this grouping to %s") % (
|
||||
key, present, value)
|
||||
msg = _("Your family tree groups name %(key)s together"
|
||||
" with %(present)s, did not change this grouping to %(value)s") % {
|
||||
'key' : key, 'present' : present, 'value' : value }
|
||||
LOG.warn(msg)
|
||||
else:
|
||||
database.set_name_group_mapping(key, value)
|
||||
|
||||
@@ -688,7 +688,8 @@ class ProgenParser(object):
|
||||
date.set(gen.lib.Date.QUAL_NONE, gen.lib.Date.MOD_ABOUT, gen.lib.Date.CAL_GREGORIAN, (0, month, year, None))
|
||||
return date
|
||||
|
||||
log.warning(_("date did not match: '%s' (%s)") % (txt.encode('utf-8'), diag_msg or ''))
|
||||
log.warning(_("date did not match: '%(text)s' (%(msg)s)") % {
|
||||
'text' : txt.encode('utf-8'), 'msg' : diag_msg or '' } )
|
||||
# Hmmm. Just use the plain text.
|
||||
date.set_as_text(txt)
|
||||
return date
|
||||
@@ -1238,9 +1239,11 @@ class ProgenParser(object):
|
||||
father_handle = father > 0 and self.__find_person_handle("I%d" % father) or None
|
||||
mother_handle = mother > 0 and self.__find_person_handle("I%d" % mother) or None
|
||||
if father > 0 and not father_handle:
|
||||
log.warning(_("cannot find father for I%s (father=%d)") % (pers_id, father))
|
||||
log.warning(_("cannot find father for I%(person)s (father=%(id)d)") % {
|
||||
'person' : pers_id, 'id' : father } )
|
||||
elif mother > 0 and not mother_handle:
|
||||
log.warning(_("cannot find mother for I%s (mother=%d)") % (pers_id, mother))
|
||||
log.warning(_("cannot find mother for I%(person)s (mother=%(mother)d)") % {
|
||||
'person' : pers_id, 'mother' : mother } )
|
||||
else:
|
||||
fam = self.fm2fam.get((father_handle, mother_handle), None)
|
||||
if not fam:
|
||||
|
||||
@@ -1310,9 +1310,9 @@ class GrampsParser(UpdateCallback):
|
||||
if self.db.has_name_group_key(key) :
|
||||
present = self.db.get_name_group_mapping(key)
|
||||
if not value == present:
|
||||
msg = _("Your family tree groups name %s together"
|
||||
" with %s, did not change this grouping to %s") % (
|
||||
key, present, value)
|
||||
msg = _("Your family tree groups name %(key)s together"
|
||||
" with %(parent)s, did not change this grouping to %(value)s") % {
|
||||
'key' : key, 'parent' : present, 'value' : value }
|
||||
self.errmsg(msg)
|
||||
else:
|
||||
self.db.set_name_group_mapping(key, value)
|
||||
@@ -2479,11 +2479,11 @@ def version_is_valid(filename, cli):
|
||||
parser = VersionParser(filename)
|
||||
|
||||
if parser.get_xmlns_version() > libgrampsxml.GRAMPS_XML_VERSION:
|
||||
msg = _("The .gramps file you are importing was made by version %s of "
|
||||
"Gramps, while you are running an older version %s. "
|
||||
msg = _("The .gramps file you are importing was made by version %(newer)s of "
|
||||
"Gramps, while you are running an older version %(older)s. "
|
||||
"The file will not be imported. Please upgrade to the latest "
|
||||
"version of Gramps and try again."
|
||||
) % (parser.get_gramps_version(), const.VERSION)
|
||||
"version of Gramps and try again." ) % {
|
||||
'newer' : parser.get_gramps_version(), 'older' : const.VERSION }
|
||||
if cli:
|
||||
LOG.warn(msg)
|
||||
return False
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2007 Donald N. Allingham
|
||||
# Copyright (C) 2009 Gary Burton
|
||||
# Copyright (C) 2009-2010 Gary Burton
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -1814,6 +1814,7 @@ class GedcomParser(UpdateCallback):
|
||||
TOKEN_RIN : self.__ignore,
|
||||
TOKEN_NOTE : self.__repo_note,
|
||||
TOKEN_RNOTE : self.__repo_note,
|
||||
TOKEN_CHAN : self.__repo_chan,
|
||||
}
|
||||
|
||||
self.event_parse_tbl = {
|
||||
@@ -1904,6 +1905,9 @@ class GedcomParser(UpdateCallback):
|
||||
|
||||
self.person_fact_parse_tbl = {
|
||||
TOKEN_TYPE : self.__person_fact_type,
|
||||
TOKEN_SOUR : self.__person_attr_source,
|
||||
TOKEN_NOTE : self.__person_attr_note,
|
||||
TOKEN_RNOTE : self.__person_attr_note,
|
||||
}
|
||||
|
||||
self.person_attr_parse_tbl = {
|
||||
@@ -2640,11 +2644,7 @@ class GedcomParser(UpdateCallback):
|
||||
self.__add_default_source(person)
|
||||
|
||||
# commit the person to the database
|
||||
if person.change:
|
||||
self.dbase.commit_person(person, self.trans,
|
||||
change_time=state.person.change)
|
||||
else:
|
||||
self.dbase.commit_person(person, self.trans)
|
||||
self.dbase.commit_person(person, self.trans, state.person.change)
|
||||
|
||||
def __person_sour(self, line, state):
|
||||
"""
|
||||
@@ -3250,7 +3250,6 @@ class GedcomParser(UpdateCallback):
|
||||
|
||||
def __person_fact_type(self, line, state):
|
||||
state.attr.set_type(line.data)
|
||||
self.__skip_subordinate_levels(state.level)
|
||||
|
||||
def __person_bapl(self, line, state):
|
||||
"""
|
||||
@@ -3682,11 +3681,7 @@ class GedcomParser(UpdateCallback):
|
||||
self.__add_default_source(family)
|
||||
|
||||
# commit family to database
|
||||
if family.change:
|
||||
self.dbase.commit_family(family, self.trans,
|
||||
change_time=family.change)
|
||||
else:
|
||||
self.dbase.commit_family(family, self.trans)
|
||||
self.dbase.commit_family(family, self.trans, family.change)
|
||||
|
||||
def __family_husb(self, line, state):
|
||||
"""
|
||||
@@ -4795,7 +4790,7 @@ class GedcomParser(UpdateCallback):
|
||||
state.level = level
|
||||
|
||||
self.__parse_level(state, self.source_func, self.__undefined)
|
||||
self.dbase.commit_source(state.source, self.trans)
|
||||
self.dbase.commit_source(state.source, self.trans, state.source.change)
|
||||
|
||||
def __source_attr(self, line, state):
|
||||
"""
|
||||
@@ -4889,6 +4884,15 @@ class GedcomParser(UpdateCallback):
|
||||
"""
|
||||
self.__parse_note(line, state.repo_ref, state.level+1)
|
||||
|
||||
def __repo_chan(self, line, state):
|
||||
"""
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
self.__parse_change(line, state.repo, state.level+1)
|
||||
|
||||
def __source_abbr(self, line, state):
|
||||
"""
|
||||
@param line: The current line in GedLine format
|
||||
@@ -4984,11 +4988,7 @@ class GedcomParser(UpdateCallback):
|
||||
self.__add_default_source(media)
|
||||
|
||||
# commit the person to the database
|
||||
if media.change:
|
||||
self.dbase.commit_media_object(media, self.trans,
|
||||
change_time=media.change)
|
||||
else:
|
||||
self.dbase.commit_media_object(media, self.trans)
|
||||
self.dbase.commit_media_object(media, self.trans, media.change)
|
||||
|
||||
def __obje_form(self, line, state):
|
||||
"""
|
||||
@@ -5079,7 +5079,7 @@ class GedcomParser(UpdateCallback):
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
self.__skip_subordinate_levels(state.level+1)
|
||||
self.__parse_change(line, state.media, state.level+1)
|
||||
|
||||
def __person_attr_type(self, line, state):
|
||||
"""
|
||||
@@ -5152,7 +5152,7 @@ class GedcomParser(UpdateCallback):
|
||||
state.level = 1
|
||||
self.__parse_level(state, self.repo_parse_tbl, self.__ignore)
|
||||
|
||||
self.dbase.commit_repository(repo, self.trans)
|
||||
self.dbase.commit_repository(repo, self.trans, repo.change)
|
||||
|
||||
def __repo_name(self, line, state):
|
||||
"""
|
||||
@@ -5494,8 +5494,8 @@ class GedcomParser(UpdateCallback):
|
||||
line = self.__get_next_line()
|
||||
if self.__level_is_finished(line, level):
|
||||
if skips and self.want_parse_warnings:
|
||||
msg = _("skipped %d subordinate(s) at line %d")\
|
||||
% (skips, line.line - skips)
|
||||
msg = _("skipped %(skip)d subordinate(s) at line %(line)d") % {
|
||||
'skip' : skips, 'line' : line.line - skips }
|
||||
self.__warn(msg)
|
||||
return
|
||||
skips += 1
|
||||
@@ -5929,4 +5929,4 @@ def __build_date_string(day, mon, year, bce, mmap):
|
||||
retval = "(%d %s)" % (day, mmap[mon])
|
||||
else:
|
||||
retval = "%d %s %d%s" % (day, mmap[mon], year, bce)
|
||||
return retval
|
||||
return retval
|
||||
|
||||
@@ -120,6 +120,7 @@ class BasePersonView(ListView):
|
||||
'person-update' : self.row_update,
|
||||
'person-delete' : self.row_delete,
|
||||
'person-rebuild' : self.object_build,
|
||||
'person-groupname-rebuild' : self.object_build,
|
||||
}
|
||||
|
||||
ListView.__init__(
|
||||
@@ -290,31 +291,15 @@ class BasePersonView(ListView):
|
||||
active_name = _("Delete Person (%s)") % name_displayer.display(person)
|
||||
|
||||
# delete the person from the database
|
||||
# Above will emit person-delete, which removes the person via
|
||||
# callback to the model, so row delete is signaled
|
||||
self.dbstate.db.delete_person_from_database(person, trans)
|
||||
|
||||
# remove the person from the list
|
||||
self.remove_from_person_list(person)
|
||||
|
||||
# commit the transaction
|
||||
self.dbstate.db.transaction_commit(trans, active_name)
|
||||
|
||||
# select the previously active person, turn off the busy cursor
|
||||
history = self.uistate.get_history(self.navigation_type(),
|
||||
self.navigation_group())
|
||||
history.back()
|
||||
self.uistate.set_busy_cursor(False)
|
||||
|
||||
def remove_from_person_list(self, person):
|
||||
"""Remove the selected person from the list. A person object is
|
||||
expected, not an ID"""
|
||||
node = self.model.get_node(person.get_handle())
|
||||
path = self.model.on_get_path(node)
|
||||
(col, row) = path
|
||||
if row > 0:
|
||||
self.selection.select_path((col, row))
|
||||
elif row == 0 and self.model.on_get_iter(path):
|
||||
self.selection.select_path(path)
|
||||
|
||||
def dummy_report(self, obj):
|
||||
""" For the xml UI definition of popup to work, the submenu
|
||||
Quick Report must have an entry in the xml
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user