Compare commits
96 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4d7d108ea9 | |||
| 9e1e197460 | |||
| 351b010e7a | |||
| 71a93fe08e | |||
| 75787c8478 | |||
| ae2534b2cd | |||
| d3212fe5b5 | |||
| 5e06dce821 | |||
| 077c0dff10 | |||
| 3e00cd60ca | |||
| ee65c280aa | |||
| 65ed064538 | |||
| 481b842ecd | |||
| d68636b1d1 | |||
| d4a681bac2 | |||
| 3f4eb22ef3 | |||
| ceaa2bc6c8 | |||
| 047ea2a185 | |||
| f0baf7963f | |||
| d3982cbeeb | |||
| cd847db1d6 | |||
| 26fa2a0fd0 | |||
| a83dd4be75 | |||
| 412a0c690f | |||
| e8dc0804b3 | |||
| d200ba839a | |||
| 73f0e769f7 | |||
| 386c0b8089 | |||
| 9ca071b619 | |||
| 03a2ba2312 | |||
| 3e14d594ec | |||
| 02786a4dce | |||
| 6b99247d57 | |||
| fd9940ad53 | |||
| c7c32adb15 | |||
| 6c42489b2c | |||
| f21cadcd61 | |||
| 68f5670972 | |||
| 70db887bd4 | |||
| c695f4b2c3 | |||
| e23f96e655 | |||
| bc7aab8cbb | |||
| 8123f5e692 | |||
| ccf3d05cd0 | |||
| 6559d3f49d | |||
| ef74039d1d | |||
| 37f51ac7b1 | |||
| 116591894b | |||
| c333394216 | |||
| 799f7579a9 | |||
| 75ae290e6d | |||
| 74255967a5 | |||
| e41a64e62a | |||
| 7798bf78b8 | |||
| 6de1c5d177 | |||
| 8fd1eae385 | |||
| f1aee137f6 | |||
| 7d6da4fedb | |||
| a581f9a704 | |||
| 99357fdd0e | |||
| a964f7983b | |||
| 9c5cd62f8e | |||
| 20058bc120 | |||
| bdb824f7f7 | |||
| bba639ba79 | |||
| e014eecf5b | |||
| 1b25cd8b47 | |||
| d5177c4b8c | |||
| 4a13dd9e55 | |||
| 2456d317a6 | |||
| 3c722ffb5d | |||
| a518a48140 | |||
| fb724c63a8 | |||
| 49e2720891 | |||
| 6c25bf079a | |||
| 2803b912d1 | |||
| a73d866fa3 | |||
| a357dcd749 | |||
| 9571022f45 | |||
| f23838d954 | |||
| 2b192f64b6 | |||
| 1ee0e7fb86 | |||
| c3ef7bfa4c | |||
| dacdf1d50e | |||
| 1eeac8c624 | |||
| 61f5f0f0fb | |||
| a0cc7005df | |||
| 22d2b3a3e5 | |||
| 1cc60935eb | |||
| ba8bada3ff | |||
| 3b70c6f716 | |||
| bbd951b9bb | |||
| aadc0009af | |||
| 567315931e | |||
| 646977caf4 | |||
| 2928384624 |
@@ -4,6 +4,22 @@ This file contains some useful details on the installation from source code
|
||||
for GRAMPS. It does not cover installation of a pre-built binary package.
|
||||
For that use your package manager, the rest is already done by the packager.
|
||||
|
||||
uninstall old version
|
||||
---------------------
|
||||
If you do a source install in the same place of an existing install,
|
||||
you need to remove the old version first. You can delete the old
|
||||
version by:
|
||||
|
||||
* deleting the installed directories (for example,
|
||||
/usr/share/gramps)
|
||||
* OR by running "make uninstall" from the old directory where you
|
||||
ran "make install" (not the new GRAMPS directory)
|
||||
|
||||
GRAMPS is a python application, so loading happens on reading the
|
||||
files, meaning that files of a previous version that are no longer
|
||||
present in the new version can still be loaded, making the new install
|
||||
unstable.
|
||||
|
||||
|
||||
configure vs autogen scripts
|
||||
----------------------------
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ dnl May need to run automake && aclocal first
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
dnl NOTE: 1st arg to macro below becomes the "VERSION"
|
||||
AC_INIT(gramps, 3.0.4, [gramps-bugs@lists.sourceforge.net])
|
||||
AC_INIT(gramps, 3.0.5, [gramps-bugs@lists.sourceforge.net])
|
||||
AC_CONFIG_SRCDIR(configure.in)
|
||||
AM_INIT_AUTOMAKE([1.6.3 foreign])
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ src/gramps_main.py
|
||||
src/gramps.py
|
||||
src/GrampsWidgets.py
|
||||
src/ImgManip.py
|
||||
src/LdsUtils.py
|
||||
src/ListModel.py
|
||||
src/ManagedWindow.py
|
||||
src/MarkupText.py
|
||||
@@ -113,6 +114,7 @@ src/docgen/LaTeXDoc.py
|
||||
src/docgen/ODSDoc.py
|
||||
src/docgen/ODFDoc.py
|
||||
src/docgen/ODSTab.py
|
||||
src/docgen/PdfDoc.py
|
||||
src/docgen/PSDrawDoc.py
|
||||
src/docgen/RTFDoc.py
|
||||
src/docgen/SpreadSheetDoc.py
|
||||
@@ -229,6 +231,7 @@ src/GrampsLogger/_RotateHandler.py
|
||||
# Mime package
|
||||
src/Mime/_GnomeMime.py
|
||||
src/Mime/__init__.py
|
||||
src/Mime/_WinMime.py
|
||||
src/Mime/_PythonMime.py
|
||||
|
||||
# Selectors package
|
||||
|
||||
@@ -1,6 +1,2 @@
|
||||
src/gen/lib/styledtext.py
|
||||
src/gen/lib/styledtexttagtype.py
|
||||
src/LdsUtils.py
|
||||
src/Mime/_WinMime.py
|
||||
src/ReportBase/_DocReportDialog.py
|
||||
src/docgen/PdfDoc.py
|
||||
|
||||
@@ -16,6 +16,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -14,6 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -18,6 +18,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.4\n"
|
||||
"X-Generator: KBabel 1.0.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
+405
-376
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -15,6 +15,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.4\n"
|
||||
"X-Generator: KBabel 0.9.6\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -20,6 +20,7 @@ msgstr ""
|
||||
"X-Generator: KBabel 1.11.4\n"
|
||||
"X-Poedit-Language: Russian\n"
|
||||
"X-Poedit-Country: RUSSIAN FEDERATION\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10< =4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -14,6 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.4\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -14,6 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.4\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../src/ArgHandler.py:404 ../src/DbLoader.py:167 ../src/DbLoader.py:188
|
||||
#: ../src/DbLoader.py:276
|
||||
|
||||
@@ -29,21 +29,4 @@ It provides the choice between different storage backends.
|
||||
from _GrampsConfigKeys import *
|
||||
from _GrampsIniKeys import *
|
||||
|
||||
import os
|
||||
|
||||
def __upgrade_gconf():
|
||||
import _GrampsGconfKeys as GconfKeys
|
||||
print "Upgrading INI file"
|
||||
for key in default_value.keys():
|
||||
data = GconfKeys.get(key)
|
||||
set(key, data)
|
||||
|
||||
if not os.path.exists(INIFILE):
|
||||
try:
|
||||
__upgrade_gconf()
|
||||
except ImportError:
|
||||
print "Cannot upgrade GCONF settings"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ class PersonView(PageView.PersonNavView):
|
||||
_("Remove the Selected Person"), self.remove),
|
||||
('ColumnEdit', gtk.STOCK_PROPERTIES, _('_Column Editor...'), None,
|
||||
None, self._column_editor),
|
||||
('CmpMerge', None, _('_Compare and Merge...'), None, None,
|
||||
('CmpMerge', None, _('Compare and _Merge...'), None, None,
|
||||
self.cmp_merge),
|
||||
('FastMerge', None, _('_Fast Merge...'), None, None,
|
||||
self.fast_merge),
|
||||
|
||||
@@ -162,12 +162,12 @@ class DateDisplay:
|
||||
val = - val
|
||||
|
||||
if slash:
|
||||
if val % 100 == 99:
|
||||
year = "%d/%d" % (val, (val%1000)+1)
|
||||
elif val % 10 == 9:
|
||||
year = "%d/%d" % (val, (val%100)+1)
|
||||
if (val-1) % 100 == 99:
|
||||
year = "%d/%d" % (val - 1, (val%1000))
|
||||
elif (val-1) % 10 == 9:
|
||||
year = "%d/%d" % (val - 1, (val%100))
|
||||
else:
|
||||
year = "%d/%d" % (val, (val%10)+1)
|
||||
year = "%d/%d" % (val - 1, (val%10))
|
||||
else:
|
||||
year = "%d" % (val)
|
||||
|
||||
|
||||
@@ -75,6 +75,23 @@ def gregorian_valid(date_tuple):
|
||||
valid = False
|
||||
return valid
|
||||
|
||||
def julian_valid(date_tuple):
|
||||
day = date_tuple[0]
|
||||
month = date_tuple[1]
|
||||
valid = True
|
||||
try:
|
||||
if month > 12:
|
||||
valid = False
|
||||
elif (date_tuple[2]) % 4 == 0:
|
||||
# julian always have leapyear every 4 year
|
||||
if day > _leap_days[month-1]:
|
||||
valid = False
|
||||
elif day > _max_days[month-1]:
|
||||
valid = False
|
||||
except:
|
||||
valid = False
|
||||
return valid
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Parser class
|
||||
@@ -186,8 +203,8 @@ class DateParser:
|
||||
def __init__(self):
|
||||
self.init_strings()
|
||||
self.parser = {
|
||||
Date.CAL_GREGORIAN : self._parse_greg_julian,
|
||||
Date.CAL_JULIAN : self._parse_greg_julian,
|
||||
Date.CAL_GREGORIAN : self._parse_gregorian,
|
||||
Date.CAL_JULIAN : self._parse_julian,
|
||||
Date.CAL_FRENCH : self._parse_french,
|
||||
Date.CAL_PERSIAN : self._parse_persian,
|
||||
Date.CAL_HEBREW : self._parse_hebrew,
|
||||
@@ -311,10 +328,14 @@ class DateParser:
|
||||
return self._parse_calendar(text, self._ftext, self._ftext2,
|
||||
self.french_to_int)
|
||||
|
||||
def _parse_greg_julian(self, text):
|
||||
def _parse_gregorian(self, text):
|
||||
return self._parse_calendar(text, self._text, self._text2,
|
||||
self.month_to_int, gregorian_valid)
|
||||
|
||||
def _parse_julian(self, text):
|
||||
return self._parse_calendar(text, self._text, self._text2,
|
||||
self.month_to_int, julian_valid)
|
||||
|
||||
def _parse_calendar(self, text, regex1, regex2, mmap, check=None):
|
||||
match = regex1.match(text.lower())
|
||||
if match:
|
||||
@@ -330,8 +351,12 @@ class DateParser:
|
||||
s = False
|
||||
else:
|
||||
d = self._get_int(groups[1])
|
||||
y = int(groups[3])
|
||||
s = groups[4] != None
|
||||
if groups[4] is not None: # slash year "/80"
|
||||
y = int(groups[3]) + 1 # fullyear + 1
|
||||
s = True
|
||||
else: # regular, non-slash date
|
||||
y = int(groups[3])
|
||||
s = False
|
||||
value = (d, m, y, s)
|
||||
if check and not check((d, m, y)):
|
||||
value = Date.EMPTY
|
||||
@@ -351,8 +376,12 @@ class DateParser:
|
||||
y = None
|
||||
s = False
|
||||
else:
|
||||
y = int(groups[3])
|
||||
s = groups[4] != None
|
||||
if groups[4] is not None: # slash year digit
|
||||
y = int(groups[3]) + 1 # fullyear + 1
|
||||
s = True
|
||||
else: # regular year
|
||||
y = int(groups[3])
|
||||
s = False
|
||||
value = (d, m, y, s)
|
||||
if check and not check((d, m, y)):
|
||||
value = Date.EMPTY
|
||||
@@ -365,17 +394,21 @@ class DateParser:
|
||||
Convert only the date portion of a date.
|
||||
"""
|
||||
if subparser == None:
|
||||
subparser = self._parse_greg_julian
|
||||
subparser = self._parse_gregorian
|
||||
|
||||
if subparser == self._parse_greg_julian:
|
||||
if subparser == self._parse_gregorian:
|
||||
check = gregorian_valid
|
||||
|
||||
elif subparser == self._parse_julian:
|
||||
check = julian_valid
|
||||
|
||||
else:
|
||||
check = None
|
||||
|
||||
value = subparser(text)
|
||||
if value != Date.EMPTY:
|
||||
return value
|
||||
|
||||
|
||||
match = self._iso.match(text)
|
||||
if match:
|
||||
groups = match.groups()
|
||||
@@ -384,8 +417,8 @@ class DateParser:
|
||||
d = self._get_int(groups[4])
|
||||
if check and not check((d, m, y)):
|
||||
return Date.EMPTY
|
||||
if groups[2]:
|
||||
return (d, m, y, True)
|
||||
if groups[2]: # slash year digit
|
||||
return (d, m, y + 1, True)
|
||||
else:
|
||||
return (d, m, y, False)
|
||||
|
||||
@@ -511,7 +544,7 @@ class DateParser:
|
||||
try:
|
||||
text = match.group(1) + match.group(3)
|
||||
except:
|
||||
print "MATCH:", match.groups()
|
||||
print "ERROR MATCH:", match.groups()
|
||||
bc = True
|
||||
return (text, bc)
|
||||
|
||||
@@ -564,7 +597,7 @@ class DateParser:
|
||||
"""
|
||||
Parses the text and sets the date according to the parsing.
|
||||
"""
|
||||
|
||||
text = text.strip() # otherwise spaces can make it a bad date
|
||||
date.set_text_value(text)
|
||||
qual = Date.QUAL_NONE
|
||||
cal = Date.CAL_GREGORIAN
|
||||
@@ -595,10 +628,6 @@ class DateParser:
|
||||
else:
|
||||
date.set(qual, Date.MOD_NONE, cal, subdate)
|
||||
|
||||
if date.get_slash():
|
||||
date.set_calendar(Date.CAL_JULIAN)
|
||||
date.set_year(date.get_year() + 1) # year++ and forces recalc
|
||||
|
||||
def invert_year(self, subdate):
|
||||
return (subdate[0], subdate[1], -subdate[2], subdate[3])
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2007 Donald N. Allingham
|
||||
# 2009 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
|
||||
@@ -572,7 +573,7 @@ class EditFamily(EditPrimary):
|
||||
self.obj.set_relationship,
|
||||
self.obj.get_relationship,
|
||||
self.db.readonly,
|
||||
self.db.get_marker_types(),
|
||||
self.db.get_family_relation_types(),
|
||||
)
|
||||
|
||||
def load_data(self):
|
||||
|
||||
@@ -117,7 +117,9 @@ class ExportAssistant(gtk.Assistant, ManagedWindow.ManagedWindow) :
|
||||
self.top_title = _("Export Assistant")
|
||||
ManagedWindow.ManagedWindow.__init__(self,uistate,[],
|
||||
self.__class__)
|
||||
self.set_window(self, None, self.top_title, isWindow=True)
|
||||
#set_window is present in both parent classes
|
||||
ManagedWindow.ManagedWindow.set_window(self, self, None,
|
||||
self.top_title, isWindow=True)
|
||||
|
||||
#set up callback method for the export plugins
|
||||
self.callback = self.pulse_progressbar
|
||||
|
||||
@@ -49,6 +49,10 @@ class NoBirthdate(Rule):
|
||||
if not birth_ref:
|
||||
return True
|
||||
birth = db.get_event_from_handle(birth_ref.ref)
|
||||
if not birth.get_date_object():
|
||||
return True
|
||||
if birth:
|
||||
birth_obj = birth.get_date_object()
|
||||
if not birth_obj:
|
||||
return True
|
||||
if birth_obj.sortval == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
@@ -79,7 +79,7 @@ class GrampsAboutDialog(gtk.AboutDialog):
|
||||
_("Much of GRAMPS' artwork is either from\n"
|
||||
"the Tango Project or derived from the Tango\n"
|
||||
"Project. This artwork is released under the\n"
|
||||
"Create Commons Attribution-ShareAlike 2.5\n"
|
||||
"Creative Commons Attribution-ShareAlike 2.5\n"
|
||||
"license.")
|
||||
])
|
||||
|
||||
|
||||
+31
-4
@@ -360,14 +360,37 @@ class GrampsPreferences(ManagedWindow.ManagedWindow):
|
||||
"%s %s, %s" % (_("Given"), _("SURNAME"), _("Suffix")),
|
||||
"%s /%s/" % (_("Given"), _("SURNAME")),
|
||||
]
|
||||
f = lyst[int(random.random() * len(lyst))]
|
||||
i = _nd.add_name_format(f, f.lower())
|
||||
node = self.fmt_model.append(row=[i, f, f.lower(),
|
||||
_nd.format_str(self.examplename, f)])
|
||||
fmtlyst = ["%s, %s %s (%s)" % ("Surname", "Given", "Suffix",
|
||||
"Common"),
|
||||
"%s, %s %s (%s)" % ("Surname", "Given", "Suffix",
|
||||
"Call"),
|
||||
"%s, %s %s (%s)" % ("SURNAME", "Given", "Suffix",
|
||||
"Call"),
|
||||
"%s, %s (%s)" % ("Surname", "Given", "Common"),
|
||||
"%s, %s (%s)" % ("Surname", "Given", "Call"),
|
||||
"%s %s" % ("Given", "Surname"),
|
||||
"%s %s, %s" % ("Given", "Surname", "Suffix"),
|
||||
"%s %s %s" % ("Given", "Surname", "Patronymic"),
|
||||
"%s, %s %s (%s)" % ("SURNAME", "Given", "Suffix",
|
||||
"Common"),
|
||||
"%s, %s (%s)" % ("SURNAME", "Given", "Common"),
|
||||
"%s, %s (%s)" % ("SURNAME", "Given", "Call"),
|
||||
"%s %s" % ("Given", "SURNAME"),
|
||||
"%s %s, %s" % ("Given", "SURNAME", "Suffix"),
|
||||
"%s /%s/" % ("Given", "SURNAME"),
|
||||
]
|
||||
rand = int(random.random() * len(lyst))
|
||||
f = lyst[rand]
|
||||
fmt = fmtlyst[rand]
|
||||
i = _nd.add_name_format(f, fmt)
|
||||
node = self.fmt_model.append(row=[i, f, fmt,
|
||||
_nd.format_str(self.examplename, fmt)])
|
||||
path = self.fmt_model.get_path(node)
|
||||
self.format_list.set_cursor(path,
|
||||
focus_column=self.name_column,
|
||||
start_editing=True)
|
||||
self.__current_path = path
|
||||
self.__current_text = f
|
||||
|
||||
def __edit_name(self, obj):
|
||||
store, node = self.format_list.get_selection().get_selected()
|
||||
@@ -395,6 +418,9 @@ class GrampsPreferences(ManagedWindow.ManagedWindow):
|
||||
iter = model.iter_next(iter)
|
||||
return False
|
||||
|
||||
def __cancel_change(self, obj):
|
||||
self.__change_name("", self.__current_path, self.__current_text)
|
||||
|
||||
def __change_name(self, text, path, new_text):
|
||||
"""
|
||||
If the new string is empty, do nothing. Otherwise, renaming the
|
||||
@@ -457,6 +483,7 @@ class GrampsPreferences(ManagedWindow.ManagedWindow):
|
||||
text=COL_NAME)
|
||||
name_renderer.set_property('editable', False)
|
||||
name_renderer.connect('edited', self.__change_name)
|
||||
name_renderer.connect('editing-canceled', self.__cancel_change)
|
||||
self.name_renderer = name_renderer
|
||||
format_tree.append_column(name_column)
|
||||
example_renderer = gtk.CellRendererText()
|
||||
|
||||
@@ -255,7 +255,10 @@ def extract_date(text):
|
||||
"""
|
||||
dateobj = gen.lib.Date()
|
||||
|
||||
text = text.replace('BET ABT','EST BET') # Horrible hack for Tim Lyons
|
||||
text = text.replace('BET ABT','EST BET') # Horrible hack for importing
|
||||
# illegal GEDCOM from
|
||||
# Apple Macintosh Classic
|
||||
# 'Gene' program
|
||||
|
||||
try:
|
||||
# extract out the MOD line
|
||||
@@ -352,9 +355,13 @@ class Reader:
|
||||
def __fix_token_conc(self, data):
|
||||
line = self.current_list[0]
|
||||
if len(line[2]) == 4:
|
||||
# This deals with lines of the form
|
||||
# 0 @<XREF:NOTE>@ NOTE
|
||||
# 1 CONC <SUBMITTER TEXT>
|
||||
# The previous line contains only a tag and no data so concat a
|
||||
# space to separate the new line from the tag. This prevents the
|
||||
# first letter of the new line being lost later.
|
||||
# first letter of the new line being lost later
|
||||
# in _GedcomParse.__parse_record
|
||||
new_value = line[2] + ' ' + data[2]
|
||||
else:
|
||||
new_value = line[2] + data[2]
|
||||
@@ -362,24 +369,34 @@ class Reader:
|
||||
|
||||
def __readahead(self):
|
||||
while len(self.current_list) < 5:
|
||||
linetmp = self.ifile.readline()
|
||||
line = self.ifile.readline()
|
||||
self.index += 1
|
||||
if not linetmp:
|
||||
if not line:
|
||||
self.eof = True
|
||||
return
|
||||
|
||||
try:
|
||||
# the space ensures no trailing whitespace on last parm
|
||||
line = linetmp.strip(' \n\r').split(None, 2) + ['']
|
||||
# however keep trailing whitespace on notes only
|
||||
if line[1] in ['CONT', 'CONC'] or line[2].startswith('NOTE'):
|
||||
line = linetmp.strip('\n\r').split(None, 2) + ['']
|
||||
# According to the GEDCOM 5.5 standard,
|
||||
# Chapter 1 subsection Grammar
|
||||
#"leading whitespace preceeding a GEDCOM line should be ignored"
|
||||
# We will also strip the terminator which is any combination
|
||||
# of carriage_return and line_feed
|
||||
line = line.lstrip(' ').rstrip('\n\r')
|
||||
# split into level+delim+rest
|
||||
line = line.partition(' ')
|
||||
level = int(line[0])
|
||||
# there should only be one space after the level,
|
||||
# but we can ignore more,
|
||||
# then split into tag+delim+line_value
|
||||
# or xfef_id+delim+rest
|
||||
line = line[2].lstrip(' ').partition(' ')
|
||||
tag = line[0]
|
||||
line_value = line[2]
|
||||
except:
|
||||
continue
|
||||
|
||||
token = GedcomTokens.TOKENS.get(line[1], GedcomTokens.TOKEN_UNKNOWN)
|
||||
data = (level, token, line[2], line[1], self.index)
|
||||
token = GedcomTokens.TOKENS.get(tag, GedcomTokens.TOKEN_UNKNOWN)
|
||||
data = (level, token, line_value, tag, self.index)
|
||||
|
||||
func = self.func_map.get(data[1])
|
||||
if func:
|
||||
|
||||
@@ -329,7 +329,6 @@ class GedcomParser(UpdateCallback):
|
||||
TOKEN_RELI : self.__person_reli,
|
||||
TOKEN_ADOP : self.__person_adop,
|
||||
TOKEN_DEAT : self.__person_deat,
|
||||
TOKEN_RESI : self.__person_resi,
|
||||
# +1 <<INDIVIDUAL_ATTRIBUTE_STRUCTURE>> {0:M}
|
||||
# +1 AFN <ANCESTRAL_FILE_NUMBER> {0:1}
|
||||
TOKEN_ATTR : self.__person_std_attr,
|
||||
@@ -410,6 +409,8 @@ class GedcomParser(UpdateCallback):
|
||||
TOKEN_NAME : self.__repo_name,
|
||||
TOKEN_ADDR : self.__repo_addr,
|
||||
TOKEN_RIN : self.__ignore,
|
||||
TOKEN_NOTE : self.__repo_note,
|
||||
TOKEN_RNOTE : self.__repo_note,
|
||||
}
|
||||
|
||||
self.event_parse_tbl = {
|
||||
@@ -498,22 +499,6 @@ class GedcomParser(UpdateCallback):
|
||||
TOKEN_STAT : self.__ignore,
|
||||
}
|
||||
|
||||
self.resi_parse_tbl = {
|
||||
TOKEN_DATE : self.__person_resi_date,
|
||||
TOKEN_ADDR : self.__person_resi_addr,
|
||||
TOKEN_SOUR : self.__person_resi_sour,
|
||||
TOKEN_PLAC : self.__person_resi_plac,
|
||||
TOKEN_PHON : self.__person_resi_phon,
|
||||
TOKEN_NOTE : self.__person_resi_note,
|
||||
TOKEN_RNOTE : self.__person_resi_note,
|
||||
TOKEN_IGNORE : self.__ignore,
|
||||
TOKEN_CAUS : self.__ignore,
|
||||
TOKEN_STAT : self.__ignore,
|
||||
TOKEN_TEMP : self.__ignore,
|
||||
TOKEN_OBJE : self.__ignore,
|
||||
TOKEN_TYPE : self.__ignore,
|
||||
}
|
||||
|
||||
self.person_fact_parse_tbl = {
|
||||
TOKEN_TYPE : self.__person_fact_type,
|
||||
}
|
||||
@@ -1153,7 +1138,6 @@ class GedcomParser(UpdateCallback):
|
||||
elif key in ("REPO", "REPOSITORY"):
|
||||
self.__parse_repo(line)
|
||||
elif key in ("SUBM", "SUBN", "SUBMITTER"):
|
||||
print line
|
||||
self.__skip_subordinate_levels(1)
|
||||
elif line.token in (TOKEN_SUBM, TOKEN_SUBN, TOKEN_IGNORE):
|
||||
self.__skip_subordinate_levels(1)
|
||||
@@ -1161,7 +1145,6 @@ class GedcomParser(UpdateCallback):
|
||||
self.__parse_source(line.token_text, 1)
|
||||
elif line.data.startswith("SOUR ") or \
|
||||
line.data.startswith("SOURCE "):
|
||||
print line
|
||||
# A source formatted in a single line, for example:
|
||||
# 0 @S62@ SOUR This is the title of the source
|
||||
source = self.__find_or_create_source(self.sid_map[line[3]])
|
||||
@@ -1816,115 +1799,6 @@ class GedcomParser(UpdateCallback):
|
||||
sref = self.handle_source(line, state.level)
|
||||
state.name.add_source_reference(sref)
|
||||
|
||||
def __person_resi(self, line, state):
|
||||
"""
|
||||
The RESI tag follows the EVENT_DETAIL structure, which is:
|
||||
|
||||
n TYPE <EVENT_DESCRIPTOR> {0:1}
|
||||
n DATE <DATE_VALUE> {0:1}
|
||||
n <<PLACE_STRUCTURE>> {0:1}
|
||||
n <<ADDRESS_STRUCTURE>> {0:1}
|
||||
n AGE <AGE_AT_EVENT> {0:1}
|
||||
n AGNC <RESPONSIBLE_AGENCY> {0:1}
|
||||
n CAUS <CAUSE_OF_EVENT> {0:1}
|
||||
n <<SOURCE_CITATION>> {0:M}
|
||||
n <<MULTIMEDIA_LINK>> {0:M}
|
||||
n <<NOTE_STRUCTURE>> {0:M}
|
||||
|
||||
Currently, the TYPE, AGE, CAUSE, STAT, and other tags which
|
||||
do not apply to an address are ignored.
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
|
||||
addr = gen.lib.Address()
|
||||
|
||||
sub_state = GedcomUtils.CurrentState()
|
||||
sub_state.person = state.person
|
||||
sub_state.level = state.level+1
|
||||
sub_state.addr = addr
|
||||
sub_state.person.add_address(addr)
|
||||
|
||||
self.__parse_level(sub_state, self.resi_parse_tbl, self.__undefined)
|
||||
|
||||
def __person_resi_date(self, line, state):
|
||||
"""
|
||||
Set the date on the address associated with and Address.
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
state.addr.set_date_object(line.data)
|
||||
|
||||
def __person_resi_addr(self, line, state):
|
||||
"""
|
||||
Parses the ADDR line of a RESI tag
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
state.addr.set_street(line.data)
|
||||
|
||||
sub_state = GedcomUtils.CurrentState()
|
||||
sub_state.addr = state.addr
|
||||
sub_state.level = state.level + 1
|
||||
sub_state.person = state.person
|
||||
self.__parse_level(sub_state, self.parse_addr_tbl, self.__ignore)
|
||||
|
||||
def __person_resi_sour(self, line, state):
|
||||
"""
|
||||
Parses the source connected to a RESI tag
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
state.addr.add_source_reference(self.handle_source(line, state.level))
|
||||
|
||||
def __person_resi_plac(self, line, state):
|
||||
"""
|
||||
Parses the PLAC tag connected to a RESI tag
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
state.addr.set_street(line.data)
|
||||
self.__parse_level(state, self.parse_addr_tbl, self.__ignore)
|
||||
|
||||
def __person_resi_phon(self, line, state):
|
||||
"""
|
||||
Parses the source connected to a PHON tag
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
if state.addr.get_street() == "":
|
||||
state.addr.set_street("Unknown")
|
||||
state.addr.set_phone(line.data)
|
||||
|
||||
def __person_resi_note(self, line, state):
|
||||
"""
|
||||
Parses the NOTE connected to a RESI tag
|
||||
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
self.__parse_note(line, state.addr, state.level+1)
|
||||
|
||||
def __ignore(self, line, state):
|
||||
"""
|
||||
Ignores an unsupported tag
|
||||
@@ -3876,6 +3750,15 @@ class GedcomParser(UpdateCallback):
|
||||
"""
|
||||
state.repo.set_name(line.data)
|
||||
|
||||
def __repo_note(self, line, state):
|
||||
"""
|
||||
@param line: The current line in GedLine format
|
||||
@type line: GedLine
|
||||
@param state: The current state
|
||||
@type state: CurrentState
|
||||
"""
|
||||
self.__parse_note(line, state.repo, state.level+1)
|
||||
|
||||
def __repo_addr(self, line, state):
|
||||
"""
|
||||
n ADDR <ADDRESS_LINE> {0:1}
|
||||
@@ -4301,7 +4184,8 @@ class GedcomParser(UpdateCallback):
|
||||
photo = self.dbase.get_object_from_handle(photo_handle)
|
||||
oref = gen.lib.MediaRef()
|
||||
oref.set_reference_handle(photo.handle)
|
||||
oref.add_note(note)
|
||||
if note:
|
||||
oref.add_note(self.__find_note_handle(self.nid_map[note]))
|
||||
obj.add_media_reference(oref)
|
||||
|
||||
def __build_event_pair(self, state, event_type, event_map, description):
|
||||
|
||||
@@ -206,8 +206,7 @@ TOKENS = {
|
||||
"QUALITY_OF_DATA": TOKEN_QUAY, "REFN" : TOKEN_REFN,
|
||||
"REFERENCE" : TOKEN_REFN, "RELI" : TOKEN_RELI,
|
||||
"RELIGION" : TOKEN_RELI, "REPO" : TOKEN_REPO,
|
||||
"REPOSITORY" : TOKEN_REPO, "RESI" : TOKEN_RESI,
|
||||
"RESIDENCE" : TOKEN_RESI, "RFN" : TOKEN_RFN,
|
||||
"REPOSITORY" : TOKEN_REPO, "RFN" : TOKEN_RFN,
|
||||
"RIN" : TOKEN_RIN, "_SCHEMA" : TOKEN__SCHEMA,
|
||||
"SEX" : TOKEN_SEX, "SCHEMA" : TOKEN__SCHEMA,
|
||||
"SLGC" : TOKEN_SLGC, "SLGS" : TOKEN_SLGS,
|
||||
|
||||
@@ -417,7 +417,7 @@ class GrampsBSDDB(GrampsDbBase, UpdateCallback):
|
||||
# These env settings are only needed for Txn environment
|
||||
self.env.set_lk_max_locks(25000)
|
||||
self.env.set_lk_max_objects(25000)
|
||||
self.env.set_flags(db.DB_LOG_AUTOREMOVE, 1) # clean up unused logs
|
||||
self.set_auto_remove() # clean up unused logs
|
||||
|
||||
# The DB_PRIVATE flag must go if we ever move to multi-user setup
|
||||
env_flags = db.DB_CREATE | db.DB_PRIVATE | \
|
||||
@@ -2378,7 +2378,30 @@ class GrampsBSDDB(GrampsDbBase, UpdateCallback):
|
||||
print name, obj
|
||||
# Return the required tuple
|
||||
return (new_obj, note_handles)
|
||||
|
||||
|
||||
def set_auto_remove(self):
|
||||
"""
|
||||
BSDDB change log settings using new method with renamed attributes
|
||||
"""
|
||||
if db.version() < (4, 7):
|
||||
# by the book: old method with old attribute
|
||||
self.env.set_flags(db.DB_LOG_AUTOREMOVE, 1)
|
||||
else: # look at python interface
|
||||
# TODO test with new version of pybsddb
|
||||
try:
|
||||
# try numeric compare, just first 2 digits
|
||||
# this won't work with something like "4.10a", but
|
||||
# hopefully they won't do that
|
||||
old_version = map(int, db.__version__.split(".",2)[:2]) < (4, 7)
|
||||
except:
|
||||
# fallback, weak string compare
|
||||
old_version = db.__version__ < "4.7"
|
||||
if old_version:
|
||||
# undocumented: old method with new attribute
|
||||
self.env.set_flags(db.DB_LOG_AUTO_REMOVE, 1)
|
||||
else:
|
||||
# by the book: new method with new attribute
|
||||
self.env.log_set_config(db.DB_LOG_AUTO_REMOVE, 1)
|
||||
|
||||
class BdbTransaction(Transaction):
|
||||
def __init__(self, msg, db, batch=False, no_magic=False):
|
||||
|
||||
@@ -377,7 +377,7 @@ class GrampsDbXmlWriter(UpdateCallback):
|
||||
for number, name,fmt_str,active in self.db.name_formats:
|
||||
self.g.write('%s<format number="%d" name="%s" '
|
||||
'fmt_str="%s" active="%d"/>\n'
|
||||
% (' ', number, name,fmt_str,int(active)) )
|
||||
% (' ', number, name, fmt_str, int(active)))
|
||||
self.g.write(" </name-formats>\n")
|
||||
|
||||
def fix(self,line):
|
||||
@@ -1113,4 +1113,4 @@ def conf_priv(obj):
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
# Don't export a writer for plugins, that is the task of _WriteXML.py
|
||||
# Don't export a writer for plugins, that is the task of _WriteXML.py
|
||||
|
||||
@@ -1330,6 +1330,10 @@ class GrampsParser(UpdateCallback):
|
||||
self.info.add('merge-overwrite', NOTE_KEY, self.note)
|
||||
self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED))
|
||||
self.note.type.set_from_xml_str(attrs['type'])
|
||||
if attrs.get('complete'): # this is only true for complete=1
|
||||
self.note.marker.set(gen.lib.MarkerType.COMPLETE)
|
||||
else:
|
||||
self.note.marker.set_from_xml_str(attrs.get("marker", ''))
|
||||
else:
|
||||
# GRAMPS LEGACY: old notes that were written inside other objects
|
||||
# We need to create a top-level note, it's type depends on
|
||||
|
||||
@@ -945,12 +945,9 @@ class GedcomWriter(BasicUtils.UpdateCallback):
|
||||
self.__writeln(1, val, 'Y')
|
||||
|
||||
if event.get_type() == gen.lib.EventType.MARRIAGE:
|
||||
ftype = family.get_relationship()
|
||||
if ftype != gen.lib.FamilyRelType.MARRIED and str(ftype):
|
||||
self.__writeln(2, 'TYPE', str(ftype))
|
||||
|
||||
self.__family_event_attrs(event.get_attribute_list(), 2)
|
||||
elif event.get_description().strip() != "":
|
||||
|
||||
if event.get_description().strip() != "":
|
||||
self.__writeln(2, 'TYPE', event.get_description())
|
||||
else:
|
||||
self.__writeln(1, 'EVEN')
|
||||
|
||||
@@ -141,6 +141,9 @@ def conv_lat_lon(latitude, longitude, format="D.D4"):
|
||||
if len(l) < 2 or len(l) > 3:
|
||||
error = True
|
||||
l[0]=l[0].strip()
|
||||
# if no characters to the left of ':', nothing useful is input
|
||||
if len(l[0]) == 0:
|
||||
return None
|
||||
if l[0][0] == '-':
|
||||
sign = '-'
|
||||
l[0]=l[0][1:]
|
||||
|
||||
+1
-1
@@ -1252,7 +1252,7 @@ class ScratchPadWindow(ManagedWindow.ManagedWindow):
|
||||
|
||||
def on_help_clicked(self, obj):
|
||||
"""Display the relevant portion of GRAMPS manual"""
|
||||
GrampsDisplay.help(webpage=WIKI_HELP_PAGE, section=WIKI_HELP_SEC)
|
||||
GrampsDisplay.help('scratchpad', webpage=WIKI_HELP_PAGE, section=WIKI_HELP_SEC)
|
||||
|
||||
def on_clear_clicked(self, obj):
|
||||
"""Deletes the selected object from the object list"""
|
||||
|
||||
+35
-8
@@ -29,6 +29,7 @@
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from math import radians
|
||||
from xml.sax.saxutils import escape
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@@ -1083,16 +1084,16 @@ class CairoDoc(BaseDoc.BaseDoc, BaseDoc.TextDoc, BaseDoc.DrawDoc):
|
||||
self._active_element.add_child(GtkDocPagebreak())
|
||||
|
||||
def start_bold(self):
|
||||
self.write_text('<b>')
|
||||
self.__write_text('<b>', markup=True)
|
||||
|
||||
def end_bold(self):
|
||||
self.write_text('</b>')
|
||||
self.__write_text('</b>', markup=True)
|
||||
|
||||
def start_superscript(self):
|
||||
self.write_text('<small><sup>')
|
||||
self.__write_text('<small><sup>', markup=True)
|
||||
|
||||
def end_superscript(self):
|
||||
self.write_text('</sup></small>')
|
||||
self.__write_text('</sup></small>', markup=True)
|
||||
|
||||
def start_paragraph(self, style_name, leader=None):
|
||||
style_sheet = self.get_style_sheet()
|
||||
@@ -1142,6 +1143,10 @@ class CairoDoc(BaseDoc.BaseDoc, BaseDoc.TextDoc, BaseDoc.DrawDoc):
|
||||
self._active_element = self._active_element.get_parent()
|
||||
|
||||
def write_note(self, text, format, style_name):
|
||||
"""
|
||||
Method to write the note objects text on a
|
||||
Document
|
||||
"""
|
||||
if format == 1:
|
||||
for line in text.split('\n'):
|
||||
self.start_paragraph(style_name)
|
||||
@@ -1155,11 +1160,30 @@ class CairoDoc(BaseDoc.BaseDoc, BaseDoc.TextDoc, BaseDoc.DrawDoc):
|
||||
self.write_text(line)
|
||||
self.end_paragraph()
|
||||
|
||||
def write_text(self, text, mark=None):
|
||||
# FIXME this is ugly, do we really need it?
|
||||
text = text.replace('<super>', '<small><sup>')
|
||||
text = text.replace('</super>', '</sup></small>')
|
||||
def __write_text(self, text, mark=None, markup=False):
|
||||
"""
|
||||
@param text: text to write.
|
||||
@param mark: IndexMark to use for indexing (if supported)
|
||||
@param markup: True if text already contains markup info.
|
||||
Then text will no longer be escaped
|
||||
Private method: reports should not add markup in text to override
|
||||
the style
|
||||
"""
|
||||
if not markup:
|
||||
# We need to escape the text here for later pango.Layout.set_markup
|
||||
# calls. This way we save the markup created by the report
|
||||
# The markup in the note editor is not in the text so is not
|
||||
# considered. It must be added by pango too
|
||||
text = escape(text)
|
||||
self._active_element.add_text(text)
|
||||
|
||||
def write_text(self, text, mark=None):
|
||||
"""Write a normal piece of text according to the
|
||||
present style
|
||||
@param text: text to write.
|
||||
@param mark: IndexMark to use for indexing (if supported)
|
||||
"""
|
||||
self. __write_text(text, mark)
|
||||
|
||||
def add_media_object(self, name, pos, x_cm, y_cm):
|
||||
new_image = GtkDocPicture(pos, name, x_cm, y_cm)
|
||||
@@ -1277,6 +1301,9 @@ class CairoDoc(BaseDoc.BaseDoc, BaseDoc.TextDoc, BaseDoc.DrawDoc):
|
||||
self._available_height = page_height
|
||||
|
||||
# try to fit the next element to current page, divide it if needed
|
||||
if not self._elements_to_paginate:
|
||||
#this is a self._doc where nothing has been added. Empty page.
|
||||
return True
|
||||
elem = self._elements_to_paginate.pop(0)
|
||||
(e1, e2), e1_h = elem.divide(layout,
|
||||
page_width,
|
||||
|
||||
@@ -595,8 +595,14 @@ class GtkPrint(CairoDoc):
|
||||
|
||||
# give a dummy cairo context to gtk.PrintContext,
|
||||
# PrintPreview will update it with the real one
|
||||
width = int(round(context.get_width()))
|
||||
height = int(round(context.get_height()))
|
||||
try:
|
||||
width = int(round(context.get_width()))
|
||||
except ValueError:
|
||||
width = 0
|
||||
try:
|
||||
height = int(round(context.get_height()))
|
||||
except ValueError:
|
||||
height = 0
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
|
||||
cr = cairo.Context(surface)
|
||||
context.set_cairo_context(cr, PRINTER_DPI, PRINTER_DPI)
|
||||
|
||||
@@ -23,11 +23,9 @@ docgen_PYTHON = \
|
||||
TextBufDoc.py \
|
||||
GtkPrint.py
|
||||
|
||||
docgen_DATA = \
|
||||
dist_docgen_DATA = \
|
||||
gtkprintpreview.glade
|
||||
|
||||
dist_docgen_DATA = $(docgen_DATA)
|
||||
|
||||
# Clean up all the byte-compiled files
|
||||
MOSTLYCLEANFILES = *pyc *pyo
|
||||
|
||||
|
||||
@@ -100,12 +100,22 @@ class Attribute(SecondaryObject, PrivacyBase, SourceBase, NoteBase):
|
||||
"""
|
||||
return self.source_list
|
||||
|
||||
def get_note_child_list(self):
|
||||
"""
|
||||
Return the list of child secondary objects that may refer notes.
|
||||
|
||||
@return: Returns the list of child secondary child objects that may
|
||||
refer notes.
|
||||
@rtype: list
|
||||
"""
|
||||
return self.source_list
|
||||
|
||||
def get_handle_referents(self):
|
||||
"""
|
||||
Return the list of child objects which may, directly or through
|
||||
their children, reference primary objects.
|
||||
|
||||
@return: Returns the list of objects refereincing primary objects.
|
||||
@return: Returns the list of objects referencing primary objects.
|
||||
@rtype: list
|
||||
"""
|
||||
return self.source_list
|
||||
|
||||
@@ -895,14 +895,28 @@ class Date:
|
||||
year = max(value[Date._POS_YR], 1)
|
||||
month = max(value[Date._POS_MON], 1)
|
||||
day = max(value[Date._POS_DAY], 1)
|
||||
|
||||
if year == 0 and month == 0 and day == 0:
|
||||
self.sortval = 0
|
||||
else:
|
||||
func = Date._calendar_convert[calendar]
|
||||
self.sortval = func(year, month, day)
|
||||
|
||||
if self.get_slash() and self.get_calendar() != Date.CAL_JULIAN:
|
||||
self.set_calendar(Date.CAL_JULIAN)
|
||||
self.recalc_sort_value()
|
||||
|
||||
if text:
|
||||
self.text = text
|
||||
|
||||
def recalc_sort_value(self):
|
||||
"""
|
||||
Recalculates the numerical sort value associated with the date
|
||||
and returns it. Public method.
|
||||
"""
|
||||
self._calc_sort_value()
|
||||
return self.sortval
|
||||
|
||||
def _calc_sort_value(self):
|
||||
"""
|
||||
Calculate the numerical sort value associated with the date.
|
||||
|
||||
@@ -259,7 +259,8 @@ class Family(SourceBase, NoteBase, MediaBase, AttributeBase, LdsOrdBase,
|
||||
@rtype: list
|
||||
"""
|
||||
check_list = self.media_list + self.attribute_list + \
|
||||
self.lds_ord_list + self.child_ref_list
|
||||
self.lds_ord_list + self.child_ref_list + \
|
||||
self.event_ref_list
|
||||
return check_list
|
||||
|
||||
def get_note_child_list(self):
|
||||
@@ -271,7 +272,8 @@ class Family(SourceBase, NoteBase, MediaBase, AttributeBase, LdsOrdBase,
|
||||
@rtype: list
|
||||
"""
|
||||
check_list = self.media_list + self.attribute_list + \
|
||||
self.lds_ord_list + self.child_ref_list + self.source_list
|
||||
self.lds_ord_list + self.child_ref_list + self.source_list + \
|
||||
self.event_ref_list
|
||||
return check_list
|
||||
|
||||
def get_referenced_handles(self):
|
||||
@@ -283,7 +285,6 @@ class Family(SourceBase, NoteBase, MediaBase, AttributeBase, LdsOrdBase,
|
||||
@rtype: list
|
||||
"""
|
||||
ret = self.get_referenced_note_handles()
|
||||
ret += [('Event', ref.ref) for ref in self.event_ref_list]
|
||||
ret += [('Person', handle) for handle
|
||||
in ([ref.ref for ref in self.child_ref_list] +
|
||||
[self.father_handle, self.mother_handle])
|
||||
@@ -298,7 +299,7 @@ class Family(SourceBase, NoteBase, MediaBase, AttributeBase, LdsOrdBase,
|
||||
@return: Returns the list of objects refereincing primary objects.
|
||||
@rtype: list
|
||||
"""
|
||||
return self.get_sourcref_child_list() + self.source_list
|
||||
return self.get_sourcref_child_list() + self.source_list
|
||||
|
||||
def set_relationship(self, relationship_type):
|
||||
"""
|
||||
|
||||
@@ -153,7 +153,7 @@ class LivingProxyDb(ProxyDbBase):
|
||||
If no such Person exists, None is returned.
|
||||
"""
|
||||
person = self.db.get_person_from_gramps_id(val)
|
||||
if self.__is_living(person):
|
||||
if person and self.__is_living(person):
|
||||
if self.mode == self.MODE_EXCLUDE_ALL:
|
||||
return None
|
||||
else:
|
||||
|
||||
@@ -66,8 +66,8 @@ def delete_person_from_database(db, person, trans):
|
||||
|
||||
for phandle in person_list:
|
||||
p = db.get_person_from_handle(phandle)
|
||||
p.remove_handle_references('Person', handle)
|
||||
db.commit_person(person, trans)
|
||||
p.remove_handle_references('Person', [handle])
|
||||
db.commit_person(p, trans)
|
||||
db.remove_person(handle, trans)
|
||||
|
||||
def remove_family_relationships(db, family_handle, trans=None):
|
||||
|
||||
+15
-16
@@ -1847,7 +1847,6 @@
|
||||
<widget class="GtkEntry" id="street">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="editable">True</property>
|
||||
<property name="visibility">True</property>
|
||||
<property name="max_length">0</property>
|
||||
@@ -3061,7 +3060,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 100 1 10 10</property>
|
||||
<property name="adjustment">0 0 100 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
@@ -3806,7 +3805,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 10</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -3827,7 +3826,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">2 -100 100 0.1 1 10</property>
|
||||
<property name="adjustment">2 -100 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -3848,7 +3847,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 10</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -3869,7 +3868,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 10</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -3890,7 +3889,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 10</property>
|
||||
<property name="adjustment">0 -100 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -4006,7 +4005,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0.2 0 100 0.1 1 10</property>
|
||||
<property name="adjustment">0.2 0 100 0.1 1 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -4691,7 +4690,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 100 1 10 10</property>
|
||||
<property name="adjustment">0 0 100 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">4</property>
|
||||
@@ -4713,7 +4712,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 100 1 10 10</property>
|
||||
<property name="adjustment">0 0 100 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -4823,7 +4822,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 100 1 10 10</property>
|
||||
<property name="adjustment">0 0 100 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">2</property>
|
||||
@@ -4845,7 +4844,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 100 1 10 10</property>
|
||||
<property name="adjustment">0 0 100 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">4</property>
|
||||
@@ -6718,7 +6717,7 @@
|
||||
<child>
|
||||
<widget class="GtkCheckButton" id="use_always">
|
||||
<property name="visible">True</property>
|
||||
<property name="tooltip" translatable="yes">If you check this button, all the missing media files will be automatically treated according to the currently selected option. No further dialogs will be presented for any missing medial files.</property>
|
||||
<property name="tooltip" translatable="yes">If you check this button, all the missing media files will be automatically treated according to the currently selected option. No further dialogs will be presented for any missing media files.</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="label" translatable="yes">_Use this selection for all missing media files</property>
|
||||
<property name="use_underline">True</property>
|
||||
@@ -9584,7 +9583,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 31 1 10 10</property>
|
||||
<property name="adjustment">0 0 31 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
@@ -9623,7 +9622,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 -9999 99999 1 10 10</property>
|
||||
<property name="adjustment">0 -9999 99999 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">3</property>
|
||||
@@ -9760,7 +9759,7 @@
|
||||
<property name="update_policy">GTK_UPDATE_ALWAYS</property>
|
||||
<property name="snap_to_ticks">False</property>
|
||||
<property name="wrap">False</property>
|
||||
<property name="adjustment">0 0 31 1 10 10</property>
|
||||
<property name="adjustment">0 0 31 1 10 0</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="left_attach">5</property>
|
||||
|
||||
+109
-21
@@ -20,6 +20,7 @@ import sys
|
||||
import re
|
||||
import urllib
|
||||
import posixpath
|
||||
import cgi
|
||||
|
||||
from BasicUtils import name_displayer
|
||||
from DataViews import register, Gramplet
|
||||
@@ -467,9 +468,22 @@ class PedigreeGramplet(Gramplet):
|
||||
_("Right-click name to edit person")
|
||||
self.set_use_markup(True)
|
||||
self.max_generations = 100
|
||||
#self.set_option("max_generations",
|
||||
# NumberOption(_("Maximum generations"),
|
||||
# 100, -1, 500))
|
||||
self.show_dates = 1
|
||||
self.box_mode = "ASCII"
|
||||
|
||||
def on_load(self):
|
||||
if len(self.gui.data) > 0:
|
||||
self.max_generations = int(self.gui.data[0])
|
||||
if len(self.gui.data) > 1:
|
||||
self.show_dates = int(self.gui.data[1])
|
||||
if len(self.gui.data) > 2:
|
||||
self.box_mode = self.gui.data[2] # ASCII or UTF
|
||||
# in case we need it:
|
||||
tag = self.gui.buffer.create_tag("fixed")
|
||||
tag.set_property("font", "Courier 9")
|
||||
|
||||
def on_save(self):
|
||||
self.gui.data = [self.max_generations, self.show_dates, self.box_mode]
|
||||
|
||||
def db_changed(self):
|
||||
"""
|
||||
@@ -487,20 +501,33 @@ class PedigreeGramplet(Gramplet):
|
||||
self.update()
|
||||
|
||||
def get_boxes(self, generation, what):
|
||||
retval = ""
|
||||
retval = u""
|
||||
if self.box_mode == "UTF":
|
||||
space = u" "
|
||||
elif self.box_mode == "ASCII":
|
||||
space = u" "
|
||||
space_len = len(space) + 2
|
||||
for i in range(generation+1):
|
||||
if self._boxes[i]:
|
||||
retval += " |"
|
||||
retval += space + u"|"
|
||||
else:
|
||||
retval += " "
|
||||
if retval[-1] == ' ':
|
||||
retval += space + u" "
|
||||
if retval[-1] == u' ':
|
||||
if what == 'sf':
|
||||
retval = retval[:-6] + " /"
|
||||
retval = retval[:-space_len] + u"/"
|
||||
elif what == 'sm':
|
||||
retval = retval[:-6] + " \\"
|
||||
elif retval.endswith("| |"):
|
||||
retval = retval[:-6] + "+"
|
||||
return retval + "---"
|
||||
retval = retval[:-space_len] + u"\\"
|
||||
elif retval.endswith(u"|" + space + u"|"):
|
||||
retval = retval[:-space_len] + u"+"
|
||||
if self.box_mode == "UTF":
|
||||
retval += u"-"
|
||||
retval = retval.replace(u"\\", u"\u2514")
|
||||
retval = retval.replace(u"-", u"\u2500")
|
||||
retval = retval.replace(u"|", u"\u2502")
|
||||
retval = retval.replace(u"/", u"\u250c")
|
||||
elif self.box_mode == "ASCII":
|
||||
retval += u"--"
|
||||
return retval
|
||||
|
||||
def set_box(self, pos, value):
|
||||
self._boxes[pos] = value
|
||||
@@ -525,19 +552,35 @@ class PedigreeGramplet(Gramplet):
|
||||
elif what[0] == "s":
|
||||
boxes = self.get_boxes(generation, what)
|
||||
if what[-1] == 'f':
|
||||
boxes = boxes.replace("+", "/")
|
||||
if self.box_mode == "UTF":
|
||||
boxes = boxes.replace("+", u"\u250c")
|
||||
else:
|
||||
boxes = boxes.replace("+", u"/")
|
||||
else:
|
||||
boxes = boxes.replace("+", "\\")
|
||||
if self.box_mode == "UTF":
|
||||
boxes = boxes.replace("+", u"\u2514")
|
||||
else:
|
||||
boxes = boxes.replace("+", u"\\")
|
||||
self.append_text(boxes)
|
||||
self.link(name_displayer.display_name(person.get_primary_name()),
|
||||
'Person', person.handle)
|
||||
'Person', person.handle,
|
||||
tooltip=_("Click to make active\n") + \
|
||||
_("Right-click to edit"))
|
||||
if self.show_dates:
|
||||
self.append_text(" ")
|
||||
self.render_text(self.info_string(person))
|
||||
self.append_text("\n")
|
||||
if generation not in self._generations:
|
||||
self._generations[generation] = []
|
||||
self._generations[generation].append(handle)
|
||||
elif what == "a":
|
||||
self.append_text("o------")
|
||||
self.render_text("<b>%s</b>" % name_displayer.display_name(person.get_primary_name()))
|
||||
if self.box_mode == "UTF":
|
||||
self.append_text(u"o" + (u"\u2500" * 3))
|
||||
elif self.box_mode == "ASCII":
|
||||
self.append_text(u"o---")
|
||||
self.append_text("%s " % name_displayer.display_name(person.get_primary_name()))
|
||||
if self.show_dates:
|
||||
self.render_text(self.info_string(person))
|
||||
self.append_text("\n")
|
||||
if generation not in self._generations:
|
||||
self._generations[generation] = []
|
||||
@@ -553,11 +596,49 @@ class PedigreeGramplet(Gramplet):
|
||||
self.process_person(mother, generation + 1, "m")
|
||||
self.set_box(generation, 0) # regardless, turn off line if on
|
||||
|
||||
def info_string(self, person):
|
||||
birth = ReportUtils.get_birth_or_fallback(self.dbstate.db, person)
|
||||
if birth and birth.get_type != gen.lib.EventType.BIRTH:
|
||||
sdate = DateHandler.get_date(birth)
|
||||
if sdate:
|
||||
bdate = "<i>%s</i>" % cgi.escape(sdate)
|
||||
else:
|
||||
bdate = ""
|
||||
elif birth:
|
||||
bdate = cgi.escape(DateHandler.get_date(birth))
|
||||
else:
|
||||
bdate = ""
|
||||
|
||||
death = ReportUtils.get_death_or_fallback(self.dbstate.db, person)
|
||||
if death and death.get_type != gen.lib.EventType.DEATH:
|
||||
sdate = DateHandler.get_date(death)
|
||||
if sdate:
|
||||
ddate = "<i>%s</i>" % cgi.escape(sdate)
|
||||
else:
|
||||
ddate = ""
|
||||
elif death:
|
||||
ddate = cgi.escape(DateHandler.get_date(death))
|
||||
else:
|
||||
ddate = ""
|
||||
|
||||
if bdate and ddate:
|
||||
value = _("(b. %(birthdate)s, d. %(deathdate)s)") % {
|
||||
'birthdate' : bdate,
|
||||
'deathdate' : ddate
|
||||
}
|
||||
elif bdate:
|
||||
value = _("(b. %s)") % (bdate)
|
||||
elif ddate:
|
||||
value = _("(d. %s)") % (ddate)
|
||||
else:
|
||||
value = ""
|
||||
return value
|
||||
|
||||
def main(self): # return false finishes
|
||||
"""
|
||||
Generator which will be run in the background.
|
||||
"""
|
||||
self._boxes = [0] * self.max_generations
|
||||
self._boxes = [0] * (self.max_generations + 1)
|
||||
self._generations = {}
|
||||
self.gui.buffer.set_text("")
|
||||
active_person = self.dbstate.get_active_person()
|
||||
@@ -577,15 +658,22 @@ class PedigreeGramplet(Gramplet):
|
||||
handles = self._generations[g]
|
||||
self.append_text(" ")
|
||||
if g == 0:
|
||||
self.link(_("Generation 1"), 'PersonList', handles)
|
||||
self.link(_("Generation 1"), 'PersonList', handles,
|
||||
tooltip=_("Double-click to see people in generation"))
|
||||
self.append_text(_(" has 1 of 1 individual (100.00% complete)\n"))
|
||||
else:
|
||||
all.extend(handles)
|
||||
self.link(_("Generation %d") % g, 'PersonList', handles)
|
||||
self.link(_("Generation %d") % g, 'PersonList', handles,
|
||||
tooltip=_("Double-click to see people in generation"))
|
||||
self.append_text(_(" has %d of %d individuals (%.2f%% complete)\n") %
|
||||
(count, 2**(g-1), float(count)/2**(g-1) * 100))
|
||||
self.link(_("All generations"), 'PersonList', all)
|
||||
self.link(_("All generations"), 'PersonList', all,
|
||||
tooltip=_("Double-click to see all generations"))
|
||||
self.append_text(_(" have %d individuals\n") % len(all))
|
||||
# Set to a fixed font
|
||||
if self.box_mode == "UTF":
|
||||
start, end = self.gui.buffer.get_bounds()
|
||||
self.gui.buffer.apply_tag_by_name("fixed", start, end)
|
||||
self.append_text("", scroll_to="begin")
|
||||
|
||||
class StatsGramplet(Gramplet):
|
||||
|
||||
@@ -227,7 +227,10 @@ class DescendTree(Report):
|
||||
def write_report(self):
|
||||
|
||||
(maxy,maxx) = self.genchart.dimensions()
|
||||
maxx = (maxx-1)*2
|
||||
if maxx <> 1:
|
||||
maxx = (maxx-1)*2
|
||||
else:
|
||||
maxx = 1
|
||||
maxh = int((self.uh-0.75)/(self.box_height*1.25))
|
||||
|
||||
if self.force_fit:
|
||||
|
||||
@@ -164,12 +164,12 @@ class DetAncestorReport(Report):
|
||||
self.doc.page_break()
|
||||
self.doc.start_paragraph("DAR-Generation")
|
||||
text = _("Generation %d") % (generation+1)
|
||||
mark = BaseDoc.IndexMark(text,BaseDoc.INDEX_TYPE_TOC,2)
|
||||
self.doc.write_text(text,mark)
|
||||
mark = BaseDoc.IndexMark(text, BaseDoc.INDEX_TYPE_TOC, 2)
|
||||
self.doc.write_text(text, mark)
|
||||
self.doc.end_paragraph()
|
||||
generation = generation + 1
|
||||
if self.childref:
|
||||
self.prev_gen_handles= self.gen_handles.copy()
|
||||
self.prev_gen_handles = self.gen_handles.copy()
|
||||
self.gen_handles.clear()
|
||||
|
||||
person_handle = self.map[key]
|
||||
@@ -181,7 +181,8 @@ class DetAncestorReport(Report):
|
||||
for family_handle in person.get_family_handle_list():
|
||||
family = self.database.get_family_from_handle(family_handle)
|
||||
mother_handle = family.get_mother_handle()
|
||||
if mother_handle == None or \
|
||||
if mother_handle == None or \
|
||||
mother_handle not in self.map.values() or \
|
||||
person.get_gender() == gen.lib.Person.FEMALE:
|
||||
if self.listchildren:
|
||||
self.write_children(family)
|
||||
@@ -376,28 +377,26 @@ class DetAncestorReport(Report):
|
||||
self.doc.start_paragraph('DAR-MoreDetails')
|
||||
evtName = str( event.get_type() )
|
||||
if date and place:
|
||||
text += _('%(event_name)s: %(date)s, %(place)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'date' : date,
|
||||
'place' : place }
|
||||
text += _('%(date)s, %(place)s') % {
|
||||
'date' : date, 'place' : place }
|
||||
elif date:
|
||||
text += _('%(event_name)s: %(date)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'date' : date}
|
||||
text += _('%(date)s') % {'date' : date}
|
||||
elif place:
|
||||
text += _('%(event_name)s: %(place)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'place' : place }
|
||||
else:
|
||||
text += _('%(event_name)s: ') % {'event_name' : _(evtName)}
|
||||
text += _('%(place)s') % { 'place' : place }
|
||||
|
||||
if event.get_description():
|
||||
if text:
|
||||
text += ". "
|
||||
text += event.get_description()
|
||||
|
||||
text += self.endnotes(event)
|
||||
|
||||
if text:
|
||||
text += _('%(endnotes)s.') % { 'endnotes' : self.endnotes(event) }
|
||||
text += ". "
|
||||
|
||||
text = _('%(event_name)s: %(event_text)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'event_text' : text }
|
||||
|
||||
self.doc.write_text(text)
|
||||
|
||||
|
||||
@@ -276,30 +276,29 @@ class DetDescendantReport(Report):
|
||||
self.doc.start_paragraph('DDR-MoreDetails')
|
||||
evtName = str( event.get_type() )
|
||||
if date and place:
|
||||
text += _('%(event_name)s: %(date)s, %(place)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'date' : date,
|
||||
'place' : place }
|
||||
text += _('%(date)s, %(place)s') % {
|
||||
'date' : date, 'place' : place }
|
||||
elif date:
|
||||
text += _('%(event_name)s: %(date)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'date' : date}
|
||||
text += _('%(date)s') % {'date' : date}
|
||||
elif place:
|
||||
text += _('%(event_name)s: %(place)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'place' : place }
|
||||
else:
|
||||
text += _('%(event_name)s: ') % {'event_name' : _(evtName)}
|
||||
text += _('%(place)s') % { 'place' : place }
|
||||
|
||||
if event.get_description():
|
||||
if text and (date or place):
|
||||
if text:
|
||||
text += ". "
|
||||
text += event.get_description()
|
||||
|
||||
text += "%s. " % self.endnotes(event)
|
||||
|
||||
|
||||
text += self.endnotes(event)
|
||||
|
||||
if text:
|
||||
text += ". "
|
||||
|
||||
text = _('%(event_name)s: %(event_text)s') % {
|
||||
'event_name' : _(evtName),
|
||||
'event_text' : text }
|
||||
|
||||
self.doc.write_text(text)
|
||||
|
||||
|
||||
if self.inc_attrs:
|
||||
text = ""
|
||||
attr_list = event.get_attribute_list()
|
||||
|
||||
@@ -367,7 +367,7 @@ class FanChartOptions(MenuReportOptions):
|
||||
RADIAL_UPRIGHT )
|
||||
radial.add_item(RADIAL_UPRIGHT,_('upright'))
|
||||
radial.add_item(RADIAL_ROUNDABOUT,_('roundabout'))
|
||||
radial.set_help(_("Print raidal texts upright or roundabout"))
|
||||
radial.set_help(_("Print radial texts upright or roundabout"))
|
||||
menu.add_option(category_name,"radial",radial)
|
||||
|
||||
def make_default_style(self,default_style):
|
||||
|
||||
@@ -187,6 +187,11 @@ class RelGraphReport(Report):
|
||||
style = 'solid'
|
||||
adopted = ((int(frel) != gen.lib.ChildRefType.BIRTH) or
|
||||
(int(mrel) != gen.lib.ChildRefType.BIRTH))
|
||||
# If birth relation to father is NONE, mening there is no father and
|
||||
# if birth relation to mother is BIRTH then solid line
|
||||
if ((int(frel) == gen.lib.ChildRefType.NONE) and
|
||||
(int(mrel) == gen.lib.ChildRefType.BIRTH)):
|
||||
adopted = False
|
||||
if adopted and self.adoptionsdashed:
|
||||
style = 'dotted'
|
||||
self.doc.add_link( p_id, family.get_gramps_id(), style,
|
||||
|
||||
@@ -503,9 +503,9 @@ class CSVParser:
|
||||
if gender:
|
||||
# replace
|
||||
gender = gender.lower()
|
||||
if gender == gender_map[gen.lib.Person.MALE]:
|
||||
if gender == gender_map[gen.lib.Person.MALE].lower():
|
||||
gender = gen.lib.Person.MALE
|
||||
elif gender == gender_map[gen.lib.Person.FEMALE]:
|
||||
elif gender == gender_map[gen.lib.Person.FEMALE].lower():
|
||||
gender = gen.lib.Person.FEMALE
|
||||
else:
|
||||
gender = gen.lib.Person.UNKNOWN
|
||||
@@ -627,9 +627,9 @@ class CSVParser:
|
||||
person.gramps_id = person_ref[1:-1]
|
||||
if person.get_gender() == gen.lib.Person.UNKNOWN and gender != None:
|
||||
gender = gender.lower()
|
||||
if gender == gender_map[gen.lib.Person.MALE]:
|
||||
if gender == gender_map[gen.lib.Person.MALE].lower():
|
||||
gender = gen.lib.Person.MALE
|
||||
elif gender == gender_map[gen.lib.Person.FEMALE]:
|
||||
elif gender == gender_map[gen.lib.Person.FEMALE].lower():
|
||||
gender = gen.lib.Person.FEMALE
|
||||
else:
|
||||
gender = gen.lib.Person.UNKNOWN
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -523,7 +523,7 @@ class Convert2Abs(BatchOp):
|
||||
class Convert2Rel(BatchOp):
|
||||
title = _('Convert paths from absolute to r_elative')
|
||||
description = _('This tool allows converting absolute media paths '
|
||||
'to the a relative path. The relative path is relative '
|
||||
'to a relative path. The relative path is relative '
|
||||
'viz-a-viz the base path as given in the Preferences, '
|
||||
'or if that is not set, your home directory. '
|
||||
'A relative path allows to tie the file location to a '
|
||||
|
||||
@@ -410,7 +410,7 @@ class BasePage:
|
||||
|
||||
of.write('<div id="Header">\n')
|
||||
|
||||
value = _dp.parse(time.strftime('%b %d %Y'))
|
||||
value = _dp.parse(time.strftime('%Y-%m-%d'))
|
||||
value = _dd.display(value)
|
||||
|
||||
msg = _('Generated by <a href="http://gramps-project.org">'
|
||||
@@ -975,19 +975,19 @@ class IndividualListPage(BasePage):
|
||||
#------------------------------------------------------------------------
|
||||
class SurnamePage(BasePage):
|
||||
|
||||
def __init__(self, db, title, person_handle_list, options, archive, media_list):
|
||||
def __init__(self, db, title, surname, person_handle_list, options, archive, media_list):
|
||||
|
||||
BasePage.__init__(self, title, options, archive, media_list, "")
|
||||
|
||||
of = self.create_link_file(md5(title).hexdigest(),'srn')
|
||||
self.display_header(of,db,title,get_researcher().get_name(),True)
|
||||
of = self.create_link_file(md5(surname).hexdigest(),'srn')
|
||||
self.display_header(of, db, "%s - %s" % (_('Surname'), surname), get_researcher().get_name(), True)
|
||||
|
||||
msg = _("This page contains an index of all the individuals in the "
|
||||
"database with the surname of %s. Selecting the person’s name "
|
||||
"will take you to that person’s individual page.") % title
|
||||
"will take you to that person’s individual page.") % surname
|
||||
|
||||
of.write('\t<h2>Surnames:</h2>\n')
|
||||
of.write('\t<h3>%s</h3>\n' % html_escape(title))
|
||||
of.write('\t<h3>%s</h3>\n' % html_escape(surname))
|
||||
of.write('\t<p id="description">%s</p>\n' % msg)
|
||||
of.write('\t<table class="infolist surname">\n')
|
||||
of.write('\t<thead>\n')
|
||||
@@ -2816,7 +2816,7 @@ class NavWebReport(Report):
|
||||
self.photo_list, SurnameListPage.ORDER_BY_COUNT,"surnames_count")
|
||||
|
||||
for (surname, handle_list) in local_list:
|
||||
SurnamePage(self.database, surname, handle_list,
|
||||
SurnamePage(self.database, self.title, surname, handle_list,
|
||||
self.opts, archive, self.photo_list)
|
||||
self.progress.step()
|
||||
|
||||
|
||||
@@ -219,7 +219,7 @@ class PatchNames(Tool.BatchTool, ManagedWindow.ManagedWindow):
|
||||
self.prefix1_hash = {}
|
||||
self.prefix2_hash = {}
|
||||
|
||||
self.progress.set_pass(_('Bulding display'),
|
||||
self.progress.set_pass(_('Building display'),
|
||||
len(self.nick_list)+len(self.title_list)
|
||||
+len(self.prefix1_list)+len(self.prefix2_list))
|
||||
|
||||
|
||||
@@ -329,7 +329,7 @@ class AllRelReport():
|
||||
else:
|
||||
sdoc.header1(_("Remarks"))
|
||||
sdoc.paragraph("")
|
||||
sdoc.paragraph(_("The following problems where encountered:"))
|
||||
sdoc.paragraph(_("The following problems were encountered:"))
|
||||
|
||||
for msg in msg_list :
|
||||
sdoc.paragraph(msg)
|
||||
|
||||
Reference in New Issue
Block a user