Merge branch 'gramps50'

This commit is contained in:
Nick Hall 2017-06-22 17:47:33 +01:00
commit f6a2199f68
23 changed files with 319 additions and 241 deletions

View File

@ -43,6 +43,15 @@
2 NOTE @N0018@
1 OBJE @M7@
1 OBJE @M8@
1 OBJE
2 FORM URL
2 FILE http:\\obje.form.on_person.org
1 BIRT
2 TYPE Birth of the Tester
2 DATE 2 OCT 1864
2 OBJE
3 FORM URL
3 FILE http:\\obje.form.on_event.org
0 @M1@ OBJE
1 FORM jpeg
1 TITL Multimedia link to linked form v5.5 blob

View File

@ -3,17 +3,26 @@
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
<database xmlns="http://gramps-project.org/xml/1.7.1/">
<header>
<created date="2016-08-29" version="5.0.0-alpha1"/>
<created date="2017-05-30" version="5.0.0-alpha1"/>
<researcher>
</researcher>
</header>
<events>
<event handle="_0000000f0000000f" change="1" id="E0000">
<type>Birth</type>
<dateval val="1864-10-02"/>
<description>Birth of the Tester</description>
<noteref hlink="_0000001000000010"/>
</event>
</events>
<people>
<person handle="_0000000100000001" change="1472500307" id="I0001">
<person handle="_0000000100000001" change="1" id="I0001">
<gender>U</gender>
<name type="Birth Name">
<first>The</first>
<surname>Tester</surname>
</name>
<eventref hlink="_0000000f0000000f" role="Primary"/>
<objref hlink="_0000000300000003"/>
<objref hlink="_0000000400000004"/>
<objref hlink="_0000000500000005"/>
@ -25,106 +34,107 @@
<objref hlink="_0000000c0000000c"/>
<objref hlink="_0000000d0000000d"/>
<objref hlink="_0000000e0000000e"/>
<noteref hlink="_0000000f0000000f"/>
<url href="http:\\obje.form.on_person.org" type="Web Home"/>
<noteref hlink="_0000001100000011"/>
</person>
</people>
<citations>
<citation handle="_0000001b0000001b" change="1472500307" id="C0000">
<citation handle="_0000001d0000001d" change="1" id="C0000">
<confidence>0</confidence>
<noteref hlink="_0000001a0000001a"/>
<sourceref hlink="_0000001900000019"/>
<noteref hlink="_0000001c0000001c"/>
<sourceref hlink="_0000001b0000001b"/>
</citation>
<citation handle="_0000002500000025" change="1472500307" id="C0001">
<citation handle="_0000002700000027" change="1" id="C0001">
<dateval val="2014-06-07"/>
<page>77, 78 discussion of multimedia link with two files</page>
<confidence>4</confidence>
<noteref hlink="_0000002400000024"/>
<sourceref hlink="_0000002300000023"/>
<noteref hlink="_0000002600000026"/>
<sourceref hlink="_0000002500000025"/>
</citation>
</citations>
<sources>
<source handle="_0000001900000019" change="1472500307" id="S0002">
<source handle="_0000001b0000001b" change="1" id="S0002">
<stitle>A Great Photographer</stitle>
</source>
<source handle="_0000002300000023" change="1472500307" id="S0001">
<source handle="_0000002500000025" change="1" id="S0001">
<stitle>The Testers personal files</stitle>
<sauthor>The Tester</sauthor>
<spubinfo>Name: Tester Publishing Operations, Inc.; Location: OSF world</spubinfo>
</source>
</sources>
<objects>
<object handle="_0000000300000003" change="1472500307" id="O0000">
<object handle="_0000000300000003" change="1" id="O0000">
<file src="test_emb_55.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5"/>
<noteref hlink="_0000000200000002"/>
</object>
<object handle="_0000000400000004" change="548708291" id="M1">
<file src="" mime="" description="Multimedia link to linked form v5.5 blob"/>
<attribute type="REFN" value="Ref12345M1">
<noteref hlink="_0000001000000010"/>
<noteref hlink="_0000001200000012"/>
</attribute>
<attribute type="RIN" value="ID09876M1"/>
<noteref hlink="_0000001100000011"/>
<noteref hlink="_0000001200000012"/>
<noteref hlink="_0000001300000013"/>
<noteref hlink="_0000001400000014"/>
</object>
<object handle="_0000000500000005" change="548797681" id="M3">
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form Gramps style v5.5ish file"/>
<noteref hlink="_0000001500000015"/>
<noteref hlink="_0000001600000016"/>
<noteref hlink="_0000001700000017"/>
<noteref hlink="_0000001800000018"/>
</object>
<object handle="_0000000600000006" change="548883481" id="M4">
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form v5.5.1 file"/>
<attribute type="Media-Type" value="Photo"/>
<attribute type="REFN" value="Ref1234567M4">
<noteref hlink="_0000001700000017"/>
<noteref hlink="_0000001900000019"/>
</attribute>
<attribute type="RIN" value="ID098765M4"/>
<noteref hlink="_0000001800000018"/>
<noteref hlink="_0000001c0000001c"/>
<citationref hlink="_0000001b0000001b"/>
<noteref hlink="_0000001a0000001a"/>
<noteref hlink="_0000001e0000001e"/>
<citationref hlink="_0000001d0000001d"/>
</object>
<object handle="_0000000800000008" change="1472500307" id="O0001">
<object handle="_0000000800000008" change="1" id="O0001">
<file src="test_emb_551.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5.1"/>
<attribute type="Media-Type" value="Photo"/>
<noteref hlink="_0000000700000007"/>
</object>
<object handle="_0000000900000009" change="1472500307" id="M5">
<object handle="_0000000900000009" change="1" id="M5">
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form FTM style file"/>
<datestr val="6/4/2016 9:33:57 AM"/>
<noteref hlink="_0000001d0000001d"/>
<noteref hlink="_0000001e0000001e"/>
<noteref hlink="_0000001f0000001f"/>
<noteref hlink="_0000002000000020"/>
<noteref hlink="_0000002100000021"/>
<noteref hlink="_0000002200000022"/>
<datestr val="6/4/2016 9:33:57 AM"/>
</object>
<object handle="_0000000a0000000a" change="549056401" id="M6">
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form v5.5.1 with two files(1)"/>
<attribute type="Media-Type" value="Photo"/>
<attribute type="REFN" value="Ref1234567M6">
<noteref hlink="_0000002100000021"/>
<noteref hlink="_0000002300000023"/>
</attribute>
<attribute type="RIN" value="ID098765M6"/>
<noteref hlink="_0000002200000022"/>
<noteref hlink="_0000002600000026"/>
<citationref hlink="_0000002500000025"/>
<noteref hlink="_0000002400000024"/>
<noteref hlink="_0000002800000028"/>
<citationref hlink="_0000002700000027"/>
</object>
<object handle="_0000000c0000000c" change="1472500307" id="O0002">
<object handle="_0000000c0000000c" change="1" id="O0002">
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="unknown" description="Multimedia link embedded form v5.5 URL"/>
<noteref hlink="_0000000b0000000b"/>
</object>
<object handle="_0000000d0000000d" change="1472500307" id="M7">
<object handle="_0000000d0000000d" change="1" id="M7">
<file src="http://s6.postimg.org/8i2erq27l/Preserve_Record_Numbers_Option.png" mime="image/png" description="Multimedia link to linked form v5.5.1 with URL"/>
<attribute type="Media-Type" value="Photo"/>
</object>
<object handle="_0000000e0000000e" change="1472500307" id="M8">
<object handle="_0000000e0000000e" change="1" id="M8">
<file src="No_path_No_Title_NoForm.jpg" mime="image/jpeg" description="No_path_No_Title_NoForm.jpg"/>
<noteref hlink="_0000002700000027"/>
<noteref hlink="_0000002900000029"/>
</object>
<object handle="_0000001300000013" change="1472500307" id="M2">
<object handle="_0000001500000015" change="1" id="M2">
<file src="" mime="" description="2nd blob Multimedia link to linked form v5.5 blob"/>
<noteref hlink="_0000001400000014"/>
<noteref hlink="_0000001600000016"/>
</object>
</objects>
<notes>
<note handle="_0000000200000002" change="1472500307" id="N0010" type="Media Note">
<note handle="_0000000200000002" change="1" id="N0010" type="Media Note">
<text>Media note test: Multimedia link embedded form v5.5
n OBJE {1:1} p.55
+1 FORM &lt;MULTIMEDIA_FORMAT&gt; {1:1} p.48
@ -132,7 +142,7 @@ n OBJE {1:1} p.55
+1 FILE &lt;MULTIMEDIA_FILE_REFERENCE&gt; {1:1} p.47
+1 &lt;&lt;NOTE_STRUCTURE&gt;&gt; {0:M} p.33</text>
</note>
<note handle="_0000000700000007" change="1472500307" id="N0014" type="Media Note">
<note handle="_0000000700000007" change="1" id="N0014" type="Media Note">
<text>Media note test: Multimedia link embedded form v5.5.1
This note is not in the 5.5.1 spec, but is an obvious extrapolation from 5.5.
n OBJE
@ -141,23 +151,27 @@ n OBJE
+3 MEDI &lt;SOURCE_MEDIA_TYPE&gt; {0:1} p.62
+1 TITL &lt;DESCRIPTIVE_TITLE&gt; {0:1} p.48</text>
</note>
<note handle="_0000000b0000000b" change="1472500307" id="N0018" type="Media Note">
<note handle="_0000000b0000000b" change="1" id="N0018" type="Media Note">
<text>Multimedia embedded 2nd copy v5.5</text>
</note>
<note handle="_0000000f0000000f" change="1472500307" id="N0000" type="GEDCOM import">
<note handle="_0000001000000010" change="1" id="N0000" type="Event Note">
<text>http:\\obje.form.on_event.org</text>
</note>
<note handle="_0000001100000011" change="1" id="N0001" type="GEDCOM import">
<text>Records not imported into INDI (individual) Gramps ID I0001:
Could not import test_emb_55.jpg Line 18: 1 OBJE
Could not import test_emb_551.jpg Line 26: 1 OBJE
Could not import test_emb_55.jpg Line 34: 1 OBJE</text>
Could not import test_emb_55.jpg Line 34: 1 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="326"/>
</style>
</note>
<note handle="_0000001000000010" change="1472500307" id="N0001" type="REFN-TYPE">
<note handle="_0000001200000012" change="1" id="N0002" type="REFN-TYPE">
<text>SOMETEXT</text>
</note>
<note handle="_0000001100000011" change="1472500307" id="N0011" type="Media Note">
<note handle="_0000001300000013" change="1" id="N0011" type="Media Note">
<text>Media note test: Multimedia link to linked form v5.5 blob
n @XREF:OBJE@ OBJE {1:1}
+1 FORM &lt;MULTIMEDIA_FORMAT&gt; {1:1} p.48
@ -171,10 +185,10 @@ n @XREF:OBJE@ OBJE {1:1}
+1 RIN &lt;AUTOMATED_RECORD_ID&gt; {0:1} p.38
+1 &lt;&lt;CHANGE_DATE&gt;&gt; {0:1} p.29</text>
</note>
<note handle="_0000001200000012" change="1472500307" id="N0002" type="GEDCOM import">
<note handle="_0000001400000014" change="1" id="N0003" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M1:
Tag recognized but not supported Line 49: 1 BLOB
Tag recognized but not supported Line 58: 1 BLOB
.HM.......k.1..F.jwA.Dzzzzw............A....1.........0U.66..E.8
.......A..k.a6.A.......A..k.........../6....G.......0../..U.....
.w1/m........HC0..../...zzzzzzzz..5zzk..AnA..U..W6U....2rRrRrRrR
@ -182,23 +196,25 @@ Tag recognized but not supported Line 49:
/Dw/.Tvz.E5zzUE9/kHz.Tw2/DzzzEEA.kE2zk5yzk2/zzs21.U2/Dw/.Tw/.Tzy
/.fy/.HzzkHzzzo21Ds00.E2.UE2.U62/.k./Ds0.UE0/Do0..E8/UE2.U62.U9w
/.Tx/.20.jg2/jo2..9u/.0U.6A.zk
Line ignored as not understood Line 57: 1 OBJE @M2@
Filename omitted Line 46: 0 M1 OBJE</text>
Line ignored as not understood Line 66: 1 OBJE @M2@
Filename omitted Line 55: 0 M1 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="1367"/>
</style>
</note>
<note handle="_0000001400000014" change="1472500307" id="N0003" type="GEDCOM import">
<note handle="_0000001600000016" change="1" id="N0004" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M2:
Tag recognized but not supported Line 68: 1 BLOB
Tag recognized but not supported Line 77: 1 BLOB
67890gramps doesn't do this anyway, so don't bother doing it right.
Filename omitted Line 65: 0 M2 OBJE</text>
Filename omitted Line 74: 0 M2 OBJE
</text>
<style name="fontface" value="Monospace">
<range start="0" end="400"/>
</style>
</note>
<note handle="_0000001500000015" change="1472500307" id="N0012" type="Media Note">
<note handle="_0000001700000017" change="1" id="N0012" type="Media Note">
<text>Media note test: Multimedia link to linked form Gramps style v5.5ish file
n @XREF:OBJE@ OBJE {1:1}
+1 FORM &lt;MULTIMEDIA_FORMAT&gt; {1:1} p.48
@ -206,18 +222,19 @@ n @XREF:OBJE@ OBJE {1:1}
+1 FILE &lt;MULTIMEDIA_FILE_REFERENCE&gt; {1:1} p.47
+1 &lt;&lt;NOTE_STRUCTURE&gt;&gt; {0:M} p.33</text>
</note>
<note handle="_0000001600000016" change="1472500307" id="N0004" type="GEDCOM import">
<note handle="_0000001800000018" change="1" id="N0005" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M3:
Could not import test.jpg Line 73: 1 FILE test.jpg</text>
Could not import test.jpg Line 82: 1 FILE test.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="163"/>
</style>
</note>
<note handle="_0000001700000017" change="1472500307" id="N0005" type="REFN-TYPE">
<note handle="_0000001900000019" change="1" id="N0006" type="REFN-TYPE">
<text>SOMETEXT</text>
</note>
<note handle="_0000001800000018" change="1472500307" id="N0013" type="Media Note">
<note handle="_0000001a0000001a" change="1" id="N0013" type="Media Note">
<text>Media note test: Multimedia link to linked form v5.5.1 file
n @XREF:OBJE@ OBJE {1:1}
+1 FILE &lt;MULTIMEDIA_FILE_REFN&gt; {1:M} p.54
@ -231,25 +248,26 @@ n @XREF:OBJE@ OBJE {1:1}
+1 &lt;&lt;SOURCE_CITATION&gt;&gt; {0:M} p.39
+1 &lt;&lt;CHANGE_DATE&gt;&gt; {0:1} p.31</text>
</note>
<note handle="_0000001a0000001a" change="1472500307" id="N0006" type="Source text">
<note handle="_0000001c0000001c" change="1" id="N0007" type="Source text">
<text>who shall remain un-named</text>
</note>
<note handle="_0000001c0000001c" change="1472500307" id="N0007" type="GEDCOM import">
<note handle="_0000001e0000001e" change="1" id="N0008" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M4:
Could not import test.jpg Line 79: 1 FILE test.jpg</text>
Could not import test.jpg Line 88: 1 FILE test.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="163"/>
</style>
</note>
<note handle="_0000001d0000001d" change="1472500307" id="N0008" type="Media Note">
<note handle="_0000001f0000001f" change="1" id="N0009" type="Media Note">
<text>A fine gentelman was he, upstanding in his community and a great believer in the testing of open source software.</text>
</note>
<note handle="_0000001e0000001e" change="1472500307" id="N0015" type="Media Note">
<note handle="_0000002000000020" change="1" id="N0015" type="Media Note">
<text>A note on the FTM media, to see how this integrates... The DATE line is bad; it doesnt follow Gedcom standard at all, and includes the time.
The TEXT line comes from the FTM media description. This is the media Note.</text>
</note>
<note handle="_0000001f0000001f" change="1472500307" id="N0016" type="Media Note">
<note handle="_0000002100000021" change="1" id="N0016" type="Media Note">
<text>Multimedia link to linked form FTM style
n @XREF:OBJE@ OBJE {1:1}
+1 FILE &lt;MULTIMEDIA_FILE_REFN&gt; {1:M} p.54
@ -258,39 +276,42 @@ n @XREF:OBJE@ OBJE {1:1}
+2 TEXT text string from FTM media description sometimes populated from exif comments
+1 &lt;&lt;NOTE_STRUCTURE&gt;&gt; {0:M} p.33</text>
</note>
<note handle="_0000002000000020" change="1472500307" id="N0009" type="GEDCOM import">
<note handle="_0000002200000022" change="1" id="N0017" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M5:
Could not import test.jpg Line 94: 1 FILE test.jpg</text>
Could not import test.jpg Line 103: 1 FILE test.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="163"/>
</style>
</note>
<note handle="_0000002100000021" change="1472500307" id="N0017" type="REFN-TYPE">
<note handle="_0000002300000023" change="1" id="N0019" type="REFN-TYPE">
<text>SOMETEXT</text>
</note>
<note handle="_0000002200000022" change="1472500307" id="N0019" type="Media Note">
<note handle="_0000002400000024" change="1" id="N0020" type="Media Note">
<text>Multimedia link to linked form v5.5.1 with two files</text>
</note>
<note handle="_0000002400000024" change="1472500307" id="N0020" type="Source text">
<note handle="_0000002600000026" change="1" id="N0021" type="Source text">
<text>A source who shall remain un-named</text>
</note>
<note handle="_0000002600000026" change="1472500307" id="N0021" type="GEDCOM import">
<note handle="_0000002800000028" change="1" id="N0022" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M6:
Could not import test.jpg Line 102: 1 FILE test.jpg
Multiple FILE in a single OBJE ignored Line 106: 1 FILE test1.jpg
Skipped subordinate line Line 107: 2 FORM jpeg
Skipped subordinate line Line 108: 3 TYPE photo
Skipped subordinate line Line 109: 2 TITL Multimedia link to linked form v5.5.1 with two files(2)</text>
Could not import test.jpg Line 111: 1 FILE test.jpg
Multiple FILE in a single OBJE ignored Line 115: 1 FILE test1.jpg
Skipped subordinate line Line 116: 2 FORM jpeg
Skipped subordinate line Line 117: 3 TYPE photo
Skipped subordinate line Line 118: 2 TITL Multimedia link to linked form v5.5.1 with two files(2)
</text>
<style name="fontface" value="Monospace">
<range start="0" end="588"/>
</style>
</note>
<note handle="_0000002700000027" change="1472500307" id="N0022" type="GEDCOM import">
<note handle="_0000002900000029" change="1" id="N0023" type="GEDCOM import">
<text>Records not imported into OBJE (multi-media object) Gramps ID M8:
Could not import No_path_No_Title_NoForm.jpg Line 129: 1 FILE No_path_No_Title_NoForm.jpg</text>
Could not import No_path_No_Title_NoForm.jpg Line 138: 1 FILE No_path_No_Title_NoForm.jpg
</text>
<style name="fontface" value="Monospace">
<range start="0" end="182"/>
</style>

View File

@ -59,8 +59,8 @@ PROGRAM_NAME = "Gramps"
#-------------------------------------------------------------------------
URL_HOMEPAGE = "http://gramps-project.org/"
URL_MAILINGLIST = "http://sourceforge.net/mail/?group_id=25770"
URL_BUGHOME = "http://bugs.gramps-project.org"
URL_BUGTRACKER = "http://bugs.gramps-project.org/bug_report_page.php"
URL_BUGHOME = "http://gramps-project.org/bugs"
URL_BUGTRACKER = "http://gramps-project.org/bugs/bug_report_page.php"
URL_WIKISTRING = "http://gramps-project.org/wiki/index.php?title="
URL_MANUAL_PAGE = "Gramps_%s_Wiki_Manual" % major_version
URL_MANUAL_DATA = '%s_-_Entering_and_editing_data:_detailed' % URL_MANUAL_PAGE

View File

@ -44,7 +44,7 @@ import glob
from . import (DbReadBase, DbWriteBase, DbUndo, DBLOGNAME, DBUNDOFN,
KEY_TO_CLASS_MAP, REFERENCE_KEY, PERSON_KEY, FAMILY_KEY,
CITATION_KEY, SOURCE_KEY, EVENT_KEY, MEDIA_KEY, PLACE_KEY,
REPOSITORY_KEY, NOTE_KEY, TAG_KEY)
REPOSITORY_KEY, NOTE_KEY, TAG_KEY, TXNADD, TXNDEL)
from ..errors import HandleError
from ..utils.callback import Callback
from ..updatecallback import UpdateCallback
@ -147,11 +147,11 @@ class DbGenericUndo(DbUndo):
# now emit the signals
for record_id in subitems:
(key, trans_type, handle, old_data, new_data) = \
pickle.loads(self.undodb[record_id])
pickle.loads(self.undodb[record_id])
if key != REFERENCE_KEY:
self.undo_signals(new_data, handle, key,
db.emit, SIGBASE[key])
self.undo_signals(trans_type, handle,
db.emit, SIGBASE[key], False)
self.db._txn_commit()
except:
self.db._txn_abort()
@ -201,8 +201,8 @@ class DbGenericUndo(DbUndo):
pickle.loads(self.undodb[record_id])
if key != REFERENCE_KEY:
self.undo_signals(old_data, handle, key,
db.emit, SIGBASE[key])
self.undo_signals(trans_type, handle,
db.emit, SIGBASE[key], True)
self.db._txn_commit()
except:
self.db._txn_abort()
@ -257,20 +257,19 @@ class DbGenericUndo(DbUndo):
obj = self.db._get_table_func(cls)["class_func"].create(data)
self.db._update_secondary_values(obj)
def undo_signals(self, data, handle, obj_key, emit, signal_root):
def undo_signals(self, trans_type, handle, emit, signal_root, reverse):
"""
Helper method to undo/redo the changes made
"""
cls = KEY_TO_CLASS_MAP[obj_key]
table = cls.lower()
if data is None:
emit(signal_root + '-delete', ([handle],))
else:
if self.db.has_handle(obj_key, handle):
signal = signal_root + '-update'
else:
signal = signal_root + '-add'
emit(signal, ([handle],))
if ((not reverse) and trans_type == TXNADD) \
or (reverse and trans_type == TXNDEL):
typ = '-add'
elif not reverse and trans_type == TXNDEL \
or reverse and trans_type == TXNADD:
typ = '-delete'
else: # TXNUPD
typ = '-update'
emit(signal_root + typ, ([handle],))
class Cursor:
def __init__(self, iterator):

View File

@ -51,36 +51,34 @@ class IsLessThanNthGenerationAncestorOf(Rule):
def prepare(self, db, user):
self.db = db
self.map = set()
try:
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
self.init_ancestor_list(root_handle,0)
except:
pass
person = db.get_person_from_gramps_id(self.list[0])
if person:
root_handle = person.get_handle()
if root_handle:
self.init_ancestor_list(root_handle)
def init_ancestor_list(self, root_handle):
queue = [(root_handle, 1)] # generation 1 is root
while queue:
handle, gen = queue.pop(0) # pop off front of queue
self.map.add(handle)
gen += 1
if gen <= int(self.list[1]):
p = self.db.get_person_from_handle(handle)
fam_id = p.get_main_parents_family_handle()
if fam_id:
fam = self.db.get_family_from_handle(fam_id)
if fam:
f_id = fam.get_father_handle()
m_id = fam.get_mother_handle()
# append to back of queue:
if f_id:
queue.append((f_id, gen))
if m_id:
queue.append((m_id, gen))
def reset(self):
self.map.clear()
def apply(self,db,person):
return person.handle in self.map
def init_ancestor_list(self, handle,gen):
# if p.get_handle() in self.map:
# loop_error(self.orig,p)
if not handle:
return
if gen:
self.map.add(handle)
if gen >= int(self.list[1]):
return
p = self.db.get_person_from_handle(handle)
fam_id = p.get_main_parents_family_handle()
fam = self.db.get_family_from_handle(fam_id)
if fam:
f_id = fam.get_father_handle()
m_id = fam.get_mother_handle()
if f_id:
self.init_ancestor_list(f_id,gen+1)
if m_id:
self.init_ancestor_list(m_id,gen+1)

View File

@ -51,34 +51,34 @@ class IsMoreThanNthGenerationAncestorOf(Rule):
def prepare(self, db, user):
self.db = db
self.map = set()
try:
root_handle = db.get_person_from_gramps_id(self.list[0]).get_handle()
self.init_ancestor_list(root_handle,0)
except:
pass
person = db.get_person_from_gramps_id(self.list[0])
if person:
root_handle = person.get_handle()
if root_handle:
self.init_ancestor_list(root_handle)
def init_ancestor_list(self, root_handle):
queue = [(root_handle, 1)] # generation 1 is root
while queue:
handle, gen = queue.pop(0) # pop off front of queue
if gen > int(self.list[1]):
self.map.add(handle)
gen += 1
p = self.db.get_person_from_handle(handle)
fam_id = p.get_main_parents_family_handle()
if fam_id:
fam = self.db.get_family_from_handle(fam_id)
if fam:
f_id = fam.get_father_handle()
m_id = fam.get_mother_handle()
# append to back of queue:
if f_id:
queue.append((f_id, gen))
if m_id:
queue.append((m_id, gen))
def reset(self):
self.map.clear()
def apply(self,db,person):
return person.handle in self.map
def init_ancestor_list(self, handle, gen):
# if p.get_handle() in self.map:
# loop_error(self.orig,p)
if not handle:
return
if gen >= int(self.list[1]):
self.map.add(handle)
p = self.db.get_person_from_handle(handle)
fam_id = p.get_main_parents_family_handle()
fam = self.db.get_family_from_handle(fam_id)
if fam:
f_id = fam.get_father_handle()
m_id = fam.get_mother_handle()
if f_id:
self.init_ancestor_list(f_id, gen+1)
if m_id:
self.init_ancestor_list(m_id, gen+1)

View File

@ -108,11 +108,7 @@ class ProbablyAlive:
if death_ref:
death = self.db.get_event_from_handle(death_ref.ref)
if death:
if death.get_date_object().is_valid():
death_date = death.get_date_object()
else: # has a death event, but it is not valid:
death_date = Today() # before today
death_date.set_modifier(Date.MOD_BEFORE)
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.
@ -144,7 +140,8 @@ class ProbablyAlive:
if not birth_date and death_date:
# person died more than MAX after current year
birth_date = death_date.copy_offset_ymd(year=-self.MAX_AGE_PROB_ALIVE)
if death_date.is_valid():
birth_date = death_date.copy_offset_ymd(year=-self.MAX_AGE_PROB_ALIVE)
explain = _("death date")
if not death_date and birth_date:

View File

@ -716,7 +716,7 @@ class DbManager(CLIDbManager, ManagedWindow):
node = self.model.get_iter(path)
filename = self.model.get_value(node, FILE_COL)
try:
with open(filename, "r") as name_file:
with open(filename, "r", encoding='utf-8') as name_file:
file_name_to_delete = name_file.read()
remove_filename(file_name_to_delete)
directory = self.data_to_delete[1]

View File

@ -100,6 +100,7 @@ class EditMediaRef(EditReference):
tblref = self.top.get_object('table50')
self.notebook_ref = self.top.get_object('notebook_ref')
self.track_ref_for_deletion("notebook_ref")
self.expander = self.top.get_object('expander1')
#recreate start page as GrampsTab
self.notebook_ref.remove_page(0)
self.reftab = RefTab(self.dbstate, self.uistate, self.track,
@ -187,6 +188,7 @@ class EditMediaRef(EditReference):
self.selection.set_multiple_selection(False)
self.selection.connect("region-modified", self.region_modified)
self.selection.connect("region-created", self.region_modified)
self.expander.connect("activate", self.selection.expander)
frame = self.top.get_object("frame9")
frame.add(self.selection)
self.track_ref_for_deletion("selection")
@ -384,6 +386,7 @@ class EditMediaRef(EditReference):
real = self.selection.proportional_to_real_rect(self.rectangle)
region = Region(real[0], real[1], real[2], real[3])
self.selection.set_regions([region])
self.selection.select(region) # update the selection box shown
self.selection.refresh()
def region_modified(self, widget):

View File

@ -142,15 +142,7 @@ class CitationSidebarFilter(SidebarFilter):
gid = str(self.filter_id.get_text()).strip()
page = str(self.filter_page.get_text()).strip()
date = str(self.filter_date.get_text()).strip()
model = self.filter_conf.get_model()
node = self.filter_conf.get_active_iter()
conf_name = model.get_value(node, 0) # The value is actually the text
conf = Citation.CONF_NORMAL
for i in list(conf_strings.keys()):
if _(conf_strings[i]) == conf_name:
conf = i
break
# conf = self.citn.get_confidence_level()
conf = str(self.filter_conf.get_active())
note = str(self.filter_note.get_text()).strip()
regex = self.filter_regex.get_active()
tag = self.tag.get_active() > 0

View File

@ -119,7 +119,7 @@ class ErrorReportAssistant(ManagedWindow, Gtk.Assistant):
if self.parent_window is not None:
self._save_position(save_config=False) # the next line saves it
self._save_size()
self.hide()
self.destroy()
if self.ownthread:
Gtk.main_quit()
@ -174,26 +174,31 @@ class ErrorReportAssistant(ManagedWindow, Gtk.Assistant):
operatingsystem = sys.platform
distribution = " "
return "Python version: %s \n"\
sqlite = ''
if __debug__:
sqlite = "sqlite version: %s (%s) \n" % (sqlite3_version_str,
sqlite3_py_version_str)
return "Gramps version: %s \n"\
"Python version: %s \n"\
"BSDDB version: %s \n"\
"sqlite version: %s (%s) \n"\
"Gramps version: %s \n"\
"%s"\
"LANG: %s\n"\
"OS: %s\n"\
"Distribution: %s\n\n"\
"GTK version : %s\n"\
"gobject version: %s\n"\
"cairo version : %s"\
% (str(sys.version).replace('\n',''),
% (str(VERSION),
str(sys.version).replace('\n',''),
BSDDB_STR,
sqlite3_version_str,
sqlite3_py_version_str,
str(VERSION),
sqlite,
get_env_var('LANG',''),
operatingsystem,
distribution,
'%d.%d.%d' % (Gtk.get_major_version(),
Gtk.get_minor_version(), Gtk.get_micro_version()),
Gtk.get_minor_version(),
Gtk.get_micro_version()),
'%d.%d.%d' % GObject.pygobject_version,
cairo.version_info)

View File

@ -106,8 +106,13 @@ class ErrorView(ManagedWindow):
def draw_window(self):
title = "%s - Gramps" % _("Error Report")
self.top = Gtk.Dialog(title)
# look over the top level windows, it seems the oldest come first, so
# the most recent still visible window appears to be a good choice for
# a transient parent
for win in self.top.list_toplevels():
if win.is_active():
if win == self.top: # not interested if this is us...
continue
if win.is_toplevel() and win.is_visible():
self.parent_window = win # for ManagedWindow
if self.parent_window is None: # but it is on some screen
self.parent_window = self.top.get_screen()

View File

@ -1178,7 +1178,8 @@ class ViewManager(CLIManager):
self.dbstate.db.close(user=self.user)
(filename, title) = value
self.db_loader.read_file(filename)
self._post_load_newdb(filename, 'x-directory/normal', title)
if self.dbstate.db.is_open():
self._post_load_newdb(filename, 'x-directory/normal', title)
else:
if dialog.after_change != "":
# We change the title of the main window.

View File

@ -197,6 +197,7 @@ class SelectionWidget(Gtk.ScrolledWindow):
self.pixbuf = None
self.scaled_pixbuf = None
self.scale = 1.0
self.old_viewport_size = None
Gtk.ScrolledWindow.__init__(self)
self.add(self._build_gui())
@ -227,6 +228,7 @@ class SelectionWidget(Gtk.ScrolledWindow):
self.event_box.add(self.image)
self.viewport = Gtk.Viewport()
self.connect("size-allocate", self._resize)
self.viewport.add(self.event_box)
return self.viewport
@ -296,6 +298,7 @@ class SelectionWidget(Gtk.ScrolledWindow):
self.pixbuf.get_height())
viewport_size = self.viewport.get_allocation()
self.old_viewport_size = viewport_size
self.scale = scale_to_fit(self.pixbuf.get_width(),
self.pixbuf.get_height(),
viewport_size.width,
@ -313,6 +316,32 @@ class SelectionWidget(Gtk.ScrolledWindow):
self.image.set_from_icon_name('image-missing', Gtk.IconSize.DIALOG)
self.image.queue_draw()
def _resize(self, *dummy):
"""
Handles size-allocate' events from Gtk.
"""
if self.pixbuf:
viewport_size = self.viewport.get_allocation()
if viewport_size.height != self.old_viewport_size.height or \
viewport_size.width != self.old_viewport_size.width or \
not self.image.get_pixbuf():
self.scale = scale_to_fit(self.pixbuf.get_width(),
self.pixbuf.get_height(),
viewport_size.width,
viewport_size.height)
self._rescale()
self.old_viewport_size = viewport_size
return False
def expander(self, *dummy):
""" Handler for expander in caller; needed because Gtk doesn't handle
verticle expansion right
"""
self.image.clear()
self.image.set_size_request(2, 2)
self.event_box.set_size_request(2, 2)
return False
# ======================================================
# coordinate transformations (public methods)
# ======================================================
@ -531,14 +560,14 @@ class SelectionWidget(Gtk.ScrolledWindow):
# drawing and scaling the image
# ======================================================
def _expose_handler(self, widget, event):
def _expose_handler(self, widget, cr):
"""
Handles the expose-event signal of the underlying widget.
"""
if self.pixbuf:
self._draw_selection()
self._draw_selection(widget, cr)
def _draw_selection(self):
def _draw_selection(self, widget, cr):
"""
Draws the image, the selection boxes and does the necessary
shading.
@ -551,8 +580,6 @@ class SelectionWidget(Gtk.ScrolledWindow):
offset_x -= 1
offset_y -= 1
cr = self.image.get_window().cairo_create()
if self.selection:
x1, y1, x2, y2 = self._rect_image_to_screen(self.selection)
@ -667,7 +694,8 @@ class SelectionWidget(Gtk.ScrolledWindow):
return
if event.button == 1: # left button
self.start_point_screen = (event.x, event.y)
if self.current is not None and self.grabber is None:
if self.current is not None and self.grabber is None and \
self.multiple_selection:
self.current = None
self.selection = None
self.refresh()
@ -697,18 +725,23 @@ class SelectionWidget(Gtk.ScrolledWindow):
if self.start_point_screen:
if self.current is not None:
# a box is currently selected
if self.grabber is None:
# clicked outside of the grabbing area
self.current = None
self.selection = None
self.emit("selection-cleared")
elif self.grabber != INSIDE:
if self.grabber and self.grabber != INSIDE:
# clicked on one of the grabbers
dx, dy = (event.x - self.start_point_screen[0],
event.y - self.start_point_screen[1])
self.grabber_to_draw = self._modify_selection(dx, dy)
self.current.set_coords(*self.selection)
self.emit("region-modified")
elif self.grabber is None and self.multiple_selection:
# clicked outside of the grabbing area
self.current = None
self.selection = None
self.emit("selection-cleared")
else:
# update current selection
self.current.set_coords(*self.selection)
self.region = self.current
self.emit("region-modified")
else:
# nothing is currently selected
if (minimum_region(self.start_point_screen,
@ -747,10 +780,11 @@ class SelectionWidget(Gtk.ScrolledWindow):
dx, dy = (event.x - self.start_point_screen[0],
event.y - self.start_point_screen[1])
self.grabber_to_draw = self._modify_selection(dx, dy)
elif self._can_select():
else:
# making new selection
start_point = self._screen_to_truncated(self.start_point_screen)
self.selection = order_coordinates(start_point, end_point)
else:
# motion (mouse button is not pressed)
self.in_region = self._find_region(*end_point_orig)

View File

@ -244,8 +244,9 @@ class DbUndo:
pickle.loads(self.undodb[record_id])
if key != REFERENCE_KEY:
self.undo_signals(old_data, handle, self.mapbase[key],
db.emit, _SIGBASE[key])
self.undo_signals(trans_type, handle,
db.emit, _SIGBASE[key], True)
# Notify listeners
if db.undo_callback:
if self.undo_count > 0:
@ -289,8 +290,8 @@ class DbUndo:
pickle.loads(self.undodb[record_id])
if key != REFERENCE_KEY:
self.undo_signals(new_data, handle, self.mapbase[key],
db.emit, _SIGBASE[key])
self.undo_signals(trans_type, handle,
db.emit, _SIGBASE[key], False)
# Notify listeners
if db.undo_callback:
db.undo_callback(_("_Undo %s")
@ -336,24 +337,19 @@ class DbUndo:
self.db._log_error()
raise DbError(msg)
def undo_signals(self, data, handle, db_map, emit, signal_root):
def undo_signals(self, trans_type, handle, emit, signal_root, reverse):
"""
Helper method to undo/redo the changes made
"""
try:
if data is None:
emit(signal_root + '-delete', ([handle.decode('utf-8')],))
else:
ex_data = db_map.get(handle, txn=self.txn)
if ex_data:
signal = signal_root + '-update'
else:
signal = signal_root + '-add'
emit(signal, ([handle.decode('utf-8')],))
except DBERRS as msg:
self.db._log_error()
raise DbError(msg)
if ((not reverse) and trans_type == TXNADD) \
or (reverse and trans_type == TXNDEL):
typ = '-add'
elif not reverse and trans_type == TXNDEL \
or reverse and trans_type == TXNADD:
typ = '-delete'
else: # TXNUPD
typ = '-update'
emit(signal_root + typ, ([handle.decode('utf-8')],))
undo_count = property(lambda self:len(self.undoq))
redo_count = property(lambda self:len(self.redoq))

View File

@ -65,6 +65,7 @@ class Postgresql:
query = query.replace("?", "%s")
query = query.replace("REGEXP", "~")
query = query.replace("desc", "desc_")
query = query.replace("BLOB", "bytea")
## LIMIT offset, count
## count can be -1, for all
## LIMIT -1
@ -114,7 +115,7 @@ class Postgresql:
def table_exists(self, table):
self.__cursor.execute("SELECT COUNT(*) "
"FROM information_schema.tables "
"WHERE table_name=?;", [table])
"WHERE table_name=%s;", [table])
return self.fetchone()[0] != 0
def close(self):

View File

@ -57,8 +57,14 @@ class Citations(Gramplet, DbGUIElement):
"""
called on init of DbGUIElement, connect to db as required.
"""
self.callman.register_callbacks({'citation-update': self.changed})
self.callman.connect_all(keys=['citation'])
self.callman.register_callbacks({'citation-update': self.changed,
'person-update': self.changed,
'family-update': self.changed,
'event-update': self.changed,
'media-update': self.changed,
'place-update': self.changed})
self.callman.connect_all(keys=['citation', 'family', 'person', 'event',
'media', 'place'])
def changed(self, handle):
"""
@ -102,6 +108,7 @@ class Citations(Gramplet, DbGUIElement):
self.add_media_citations(media)
def add_media_citations(self, media):
self.callman.register_handles({'media': [media.handle]})
self.add_citations(media)
self.add_attribute_citations(media)
@ -112,6 +119,7 @@ class Citations(Gramplet, DbGUIElement):
self.add_event_citations(event)
def add_event_citations(self, event):
self.callman.register_handles({'event': [event.handle]})
self.add_citations(event)
self.add_attribute_citations(event)
self.add_mediaref_citations(event)
@ -122,6 +130,7 @@ class Citations(Gramplet, DbGUIElement):
self.add_place_citations(place)
def add_place_citations(self, place):
self.callman.register_handles({'place': [place.handle]})
self.add_citations(place)
self.add_mediaref_citations(place)
@ -133,9 +142,10 @@ class Citations(Gramplet, DbGUIElement):
for lds in obj.get_lds_ord_list():
self.add_citations(lds)
place_handle = lds.get_place_handle()
place = self.dbstate.db.get_place_from_handle(place_handle)
if place:
self.add_place_citations(place)
if place_handle:
place = self.dbstate.db.get_place_from_handle(place_handle)
if place:
self.add_place_citations(place)
def add_association_citations(self, obj):
for assoc in obj.get_person_ref_list():
@ -310,7 +320,6 @@ class PersonCitations(Citations):
if active_handle:
active = self.dbstate.db.get_person_from_handle(active_handle)
if active:
self.callman.register_obj(active)
self.display_citations(active)
else:
self.set_has_data(False)
@ -322,6 +331,7 @@ class PersonCitations(Citations):
Display the citations for the active person.
"""
self.source_nodes = {}
self.callman.register_handles({'person': [person.handle]})
self.add_citations(person)
self.add_eventref_citations(person)
for handle in person.get_family_handle_list():
@ -387,7 +397,6 @@ class EventCitations(Citations):
if active_handle:
active = self.dbstate.db.get_event_from_handle(active_handle)
if active:
self.callman.register_obj(active)
self.display_citations(active)
else:
self.set_has_data(False)
@ -435,7 +444,6 @@ class FamilyCitations(Citations):
if active_handle:
active = self.dbstate.db.get_family_from_handle(active_handle)
if active:
self.callman.register_obj(active)
self.display_citations(active)
else:
self.set_has_data(False)
@ -447,6 +455,7 @@ class FamilyCitations(Citations):
Display the citations for the active family.
"""
self.source_nodes = {}
self.callman.register_handles({'family': [family.handle]})
self.add_citations(family)
self.add_eventref_citations(family)
self.add_attribute_citations(family)
@ -496,7 +505,6 @@ class PlaceCitations(Citations):
if active_handle:
active = self.dbstate.db.get_place_from_handle(active_handle)
if active:
self.callman.register_obj(active)
self.display_citations(active)
else:
self.set_has_data(False)
@ -544,7 +552,6 @@ class MediaCitations(Citations):
if active_handle:
active = self.dbstate.db.get_media_from_handle(active_handle)
if active:
self.callman.register_obj(active)
self.display_citations(active)
else:
self.set_has_data(False)

View File

@ -57,6 +57,7 @@ class TopSurnamesGramplet(Gramplet):
self.dbstate.db.connect('person-update', self.update)
self.dbstate.db.connect('person-rebuild', self.update)
self.dbstate.db.connect('family-rebuild', self.update)
self.set_text(_("No Family Tree loaded."))
def on_load(self):
if len(self.gui.data) > 0:

View File

@ -895,6 +895,9 @@ class FamilyLinesReport(Report):
# see if we have a table that needs to be terminated
if image_path:
label += '</TD></TR></TABLE>'
else:
# non html label is enclosed by "" so escape other "
label = label.replace('"', '\\\"')
shape = "box"
style = "solid"

View File

@ -133,6 +133,7 @@ from gramps.gen.db.dbconst import EVENT_KEY
from gramps.gui.dialog import WarningDialog
from gramps.gen.lib.const import IDENTICAL, DIFFERENT
from gramps.gen.lib import (StyledText, StyledTextTag, StyledTextTagType)
from gramps.gen.lib.urlbase import UrlBase
from gramps.plugins.lib.libplaceimport import PlaceImport
from gramps.gen.display.place import displayer as _pd
from gramps.gen.utils.grampslocale import GrampsLocale
@ -5181,11 +5182,21 @@ class GedcomParser(UpdateCallback):
# The following code that detects URL is an older v5.5 usage; the
# modern option is to use the EMAIL tag.
if isinstance(sub_state.form, str) and sub_state.form == "url":
url = Url()
url.set_path(sub_state.filename)
url.set_description(sub_state.title)
url.set_type(UrlType.WEB_HOME)
pri_obj.add_url(url)
if isinstance(pri_obj, UrlBase):
url = Url()
url.set_path(sub_state.filename)
url.set_description(sub_state.title)
url.set_type(UrlType.WEB_HOME)
pri_obj.add_url(url)
else: # some primary objects (Event) son't have spot for URL
new_note = Note(sub_state.filename)
new_note.set_gramps_id(self.nid_map[""])
new_note.set_handle(create_id())
new_note.set_type(OBJ_NOTETYPE.get(type(pri_obj).__name__,
NoteType.GENERAL))
self.dbase.commit_note(new_note, self.trans, new_note.change)
pri_obj.add_note(new_note.get_handle())
else:
# to allow import of references to URLs (especially for import from
# geni.com), do not try to find the file if it is blatently a URL

View File

@ -201,12 +201,7 @@ class GeoPerson(GeoGraphyView):
Rebuild the tree with the given person handle as the root.
"""
active = self.get_active()
#if handle:
# self._createmap(handle)
#elif active:
# p1 = self.dbstate.db.get_person_from_handle(active)
# self._createmap(p1)
self._createmap()
self._createmap(None)
self.uistate.modify_statusbar(self.dbstate)
def build_tree(self):
@ -216,8 +211,7 @@ class GeoPerson(GeoGraphyView):
information.
"""
active = self.get_active()
#self._createmap(active)
self._createmap()
self._createmap(None)
self.uistate.modify_statusbar(self.dbstate)
def animate(self, menu, marks, index, stepyear):
@ -288,10 +282,11 @@ class GeoPerson(GeoGraphyView):
menu, marks, i, stepyear)
return False
def _createmap(self):
def _createmap(self, active):
"""
Create all markers for each people's event in the database which has
a lat/lon.
@param: active is mandatory but unused in this view. Fix : 10088
"""
dbstate = self.dbstate
self.cal = config.get('preferences.calendar-format-report')

View File

@ -1541,10 +1541,11 @@ class RelationshipView(NavigationView):
name.add_surname(Surname())
name.set_primary_surname(0)
family = self.dbstate.db.get_family_from_handle(handle)
father = self.dbstate.db.get_person_from_handle(
family.get_father_handle())
if father:
preset_name(father, name)
father_h = family.get_father_handle()
if father_h:
father = self.dbstate.db.get_person_from_handle(father_h)
if father:
preset_name(father, name)
person.set_primary_name(name)
try:
EditPerson(self.dbstate, self.uistate, [], person,

View File

@ -9712,7 +9712,7 @@ msgstr ""
#: ../gramps/gen/relationship.py:1406
msgid "Relationship loop detected:"
msgstr "Detekována smyčka ve vztazích"
msgstr "Detekována smyčka ve vztazích:"
#: ../gramps/gen/relationship.py:1407
#, python-format
@ -10040,7 +10040,7 @@ msgstr "Makedonština"
#. Windows has no translation for Macedonian
#: ../gramps/gen/utils/grampslocale.py:93
msgid "Norwegian Bokmal"
msgstr "Norština Bokmål"
msgstr "Norský Bokmål"
#: ../gramps/gen/utils/grampslocale.py:94
msgid "Dutch"
@ -10048,7 +10048,7 @@ msgstr "Holandština"
#: ../gramps/gen/utils/grampslocale.py:95
msgid "Norwegian Nynorsk"
msgstr "Norština (Nynorsk)"
msgstr "Norský Nynorsk"
#: ../gramps/gen/utils/grampslocale.py:96
msgid "Polish"
@ -15559,8 +15559,7 @@ msgstr ""
msgid ""
"Field used to paste info from a web page like google, openstreetmap, ... "
msgstr ""
"Pole použité pro vložení informace z webové stránky jako google, "
"openstreetmap, ..."
"Pole použité pro vložení informace z webové stránky jako google, openstreetmap, ... "
#: ../gramps/gui/glade/editplace.glade:264
#: ../gramps/gui/glade/editplaceref.glade:495
@ -30103,12 +30102,12 @@ msgstr "Zda použít rozvité, nebo holé věty."
#: ../gramps/plugins/textreport/detancestralreport.py:869
#: ../gramps/plugins/textreport/detdescendantreport.py:1060
msgid "Use full dates instead of only the year"
msgstr "Používat plná data místo pouze let(roků)"
msgstr "Místo pouze roku používat plný datum"
#: ../gramps/plugins/textreport/detancestralreport.py:871
#: ../gramps/plugins/textreport/detdescendantreport.py:1062
msgid "Whether to use full dates instead of just year."
msgstr "Zda používat plná data místo pouze let(roků)."
msgstr "Zda používat plný datum místo pouze roku."
#: ../gramps/plugins/textreport/detancestralreport.py:874
#: ../gramps/plugins/textreport/detdescendantreport.py:1065
@ -32603,7 +32602,7 @@ msgstr "Množství použitých ID."
#: ../gramps/plugins/tool/reorderids.glade:1404
msgid " Quantity"
msgstr " Množství "
msgstr " Množství"
#: ../gramps/plugins/tool/reorderids.glade:1419
msgid "Actual / Upcoming ID format."