Compare commits

...

19 Commits

Author SHA1 Message Date
Alex Roitman
07bc49c44b * Release: Version 2.0.5 "It's certainly uncontaminated by cheese"
released.
* configure.in: Bump up the version number.


svn: r4907
2005-07-06 03:49:11 +00:00
Alex Roitman
c21c0a2328 * NEWS: Update.
* configure.in: Bump up the release number.


svn: r4905
2005-07-06 03:16:57 +00:00
Martin Hawlisch
d45d5a0afe * src/gramps_main.py: Add new filters
svn: r4904
2005-07-05 21:21:01 +00:00
Martin Hawlisch
47922e7be9 * src/PeopleModel.py (calculate_data): Fix invert of search result
* src/Date.py (is_equal): Only compare text value for TEXTONLY dates.
* src/GenericFilter.py: Add new filters to search for notes


svn: r4903
2005-07-05 21:15:05 +00:00
Alex Roitman
139ae5c305 * src/EditPerson.py (__init__): Refresh person object from handle,
if handle exists.
* src/Marriage.py (__init__): Refresh family object from handle,
if handle exists.


svn: r4902
2005-07-05 14:42:51 +00:00
Alex Roitman
5de8d6b2ec * src/system_filters.xml: Remove testing contents.
svn: r4901
2005-07-05 14:21:21 +00:00
Alex Roitman
2bdf0bb220 * src/plugins/GraphViz.py (dump_person): Correctly test for birth
relations.


svn: r4900
2005-07-03 21:12:43 +00:00
Eero Tamminen
3469687010 updated fi.po to v2.0.4 template.po changes
svn: r4899
2005-07-02 21:30:37 +00:00
Alex Roitman
8f392ded30 * configure.in: Bump up the version number.
svn: r4898
2005-07-02 21:15:53 +00:00
Eero Tamminen
9bf1fb62b5 update from new template
svn: r4897
2005-07-02 20:47:52 +00:00
Alex Roitman
5c9df14f97 * src/RelLib.py (Family.get_handle_referents): Typo;
(Event.get_handle_referents): Work around possible None for
witness.
* src/plugins/Check.py (check_source_references): Add checking
routine to detect and remove dangling source references.


svn: r4896
2005-07-02 20:16:26 +00:00
Alex Roitman
6469396669 * src/NEWS: Update.
svn: r4895
2005-07-02 04:18:10 +00:00
Alex Roitman
3bf07bf96f * src/plugins/WebPage.py (write_sibling): Apply patch from bug #
1230430 at sf.net with minor tweaks.


svn: r4894
2005-07-01 22:30:32 +00:00
Don Allingham
8179e66d0b * src/GrampsDbBase.py: don't count_person for gender stats on
add_person, since already done it commit_person


svn: r4893
2005-06-29 21:32:19 +00:00
Martin Hawlisch
b34f6acb50 * src/plugins/DumpGenderStats.py: New plugin for debugging
svn: r4892
2005-06-29 21:24:31 +00:00
Don Allingham
f740ba4cf0 * src/GrampsBSDDB.py: provide an upgrade task to rebuild gender stats
svn: r4891
2005-06-29 20:24:42 +00:00
Don Allingham
f1b13b49c5 * src/GrampsDbBase.py: move gender stats handling to the commit_person
task, instead of trying to handle it in the Person() class
* src/RelLib.py: removal of genderstats handling


svn: r4890
2005-06-29 15:23:15 +00:00
Matthieu Pupate
5191d6bd11 Updated French translation
svn: r4889
2005-06-28 19:50:10 +00:00
Don Allingham
2464adf714 GEDCOM place fix, EditPerson date parsing
svn: r4888
2005-06-28 15:39:39 +00:00
20 changed files with 1561 additions and 1322 deletions

@@ -1,3 +1,60 @@
2005-07-05 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/PeopleModel.py (calculate_data): Fix invert of search result
* src/Date.py (is_equal): Only compare text value for TEXTONLY dates.
* src/GenericFilter.py: Add new filters to search for notes
* src/gramps_main.py: Add new filters
2005-07-05 Alex Roitman <shura@gramps-project.org>
* src/system_filters.xml: Remove testing contents.
* src/EditPerson.py (__init__): Refresh person object from handle,
if handle exists.
* src/Marriage.py (__init__): Refresh family object from handle,
if handle exists.
* NEWS: Update.
* configure.in: Bump up the release number.
* Release: Version 2.0.5 "It's certainly uncontaminated by cheese"
released.
* configure.in: Bump up the version number.
2005-07-03 Alex Roitman <shura@gramps-project.org>
* src/plugins/GraphViz.py (dump_person): Correctly test for birth
relations.
2005-07-03 Eero Tamminen <eerot@sf>
* src/po/fi.po: Updated translated to latest template
2005-07-02 Alexander Roitman <shura@gramps-project.org>
* src/RelLib.py (Family.get_handle_referents): Typo;
(Event.get_handle_referents): Work around possible None for
witness.
* src/plugins/Check.py (check_source_references): Add checking
routine to detect and remove dangling source references.
* configure.in: Bump up the version number.
2005-07-01 Alex Roitman <shura@gramps-project.org>
* src/plugins/WebPage.py (write_sibling): Apply patch from bug #
1230430 at sf.net with minor tweaks.
* src/NEWS: Update.
2005-06-29 Don Allingham <don@gramps-project.org>
* src/GrampsDbBase.py: don't count_person for gender stats on
add_person, since already done it commit_person
2005-06-29 Martin Hawlisch <Martin.Hawlisch@gmx.de>
* src/plugins/DumpGenderStats.py: New plugin for debugging
2005-06-29 Don Allingham <don@gramps-project.org>
* src/GrampsBSDDB.py: provide an upgrade task to rebuild gender stats
* src/GrampsDbBase.py: move gender stats handling to the commit_person
task, instead of trying to handle it in the Person() class
* src/RelLib.py: removal of genderstats handling
2005-06-28 Don Allingham <don@gramps-project.org>
* src/EditPerson.py: parse date correctly on edit
* src/ReadGedcom.py: load previously used title properly into
the dictionary to prevent traceback
2005-06-27 Don Allingham <don@gramps-project.org>
* src/PeopleView.py: fix on_get_iter on delete person

@@ -1,3 +1,9 @@
Version 2.0.5 -- the "It's certainly uncontaminated by cheese" release
* New filters based on personal notes.
* New routine for checking and removing corrupted source references in
the Check and Repair tool.
* Bug fixes.
Version 2.0.4 -- the "That's enough music for now, lads." release
* Speedups for "select" dialogs in Family View.
* Filters are working in reports again.

@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
dnl May need to run automake && aclocal first
AC_PREREQ(2.57)
AC_INIT(gramps, 2.0.4, gramps-bugs@lists.sourceforge.net)
AC_INIT(gramps, 2.0.6, gramps-bugs@lists.sourceforge.net)
AC_CONFIG_SRCDIR(src/gramps.py)
AM_INIT_AUTOMAKE(1.6.3)
RELEASE=0.CVS$(head -c 10 ${srcdir}/ChangeLog | tr -d '-')

@@ -156,12 +156,12 @@ class Date:
instance IN ALL REGARDS. Needed, because the __cmp__ only looks
at the sorting value, and ignores the modifiers/comments.
"""
if self.modifier == other.modifier and self.modifier == MOD_TEXTONLY:
return self.text == other.text
return (self.calendar == other.calendar and
self.modifier == other.modifier and
self.quality == other.quality and
self.dateval == other.dateval and
self.text == other.text and
self.sortval == other.sortval)
def __str__(self):

@@ -99,12 +99,17 @@ class EditPerson:
self.dp = DateHandler.parser
self.dd = DateHandler.displayer
self.orig_handle = person.get_handle()
# UGLY HACK to refresh person object from handle if that exists
# done to ensure that the person object is not stale, as it could
# have been changed by something external (merge, tool, etc).
if self.orig_handle:
person = db.get_person_from_handle(self.orig_handle)
self.person = person
self.orig_surname = person.get_primary_name().get_group_name()
self.orig_surname = self.person.get_primary_name().get_group_name()
self.parent = parent
self.orig_handle = self.person.get_handle()
if self.parent.child_windows.has_key(self.orig_handle):
self.parent.child_windows[self.person.get_handle()].present(None)
self.parent.child_windows[self.orig_handle].present(None)
return
self.db = db
self.callback = callback
@@ -1323,6 +1328,9 @@ class EditPerson:
orig record"""
surname = unicode(self.surname.get_text())
self.birth_date_object = self.dp.parse(self.bdate.get_text())
self.death_date_object = self.dp.parse(self.ddate.get_text())
self.birth.set_date_object(self.birth_date_object)
self.death.set_date_object(self.death_date_object)
@@ -1718,6 +1726,9 @@ class EditPerson:
name = self.pname
self.birth_date_object = self.dp.parse(self.bdate.get_text())
self.death_date_object = self.dp.parse(self.ddate.get_text())
self.birth.set_date_object(self.birth_date_object)
self.birth.set_place_handle(self.get_place(self.bplace,1))

@@ -1813,6 +1813,36 @@ class HasSourceOf(Rule):
return False
return person.has_source_reference( self.source_handle)
#-------------------------------------------------------------------------
# "People having notes"
#-------------------------------------------------------------------------
class HasNote(Rule):
"""People having notes"""
name = _('People having notes')
description = _("Matches people that have a note")
category = _('General filters')
def apply(self,db,person):
return bool(person.get_note())
#-------------------------------------------------------------------------
# "People having notes that contain a substring"
#-------------------------------------------------------------------------
class HasNoteMatchingSubstringOf(Rule):
"""People having notes containing <subtring>"""
labels = [ _('Substring:')]
name = _('People having notes containing <subtring>')
description = _("Matches people whose notes contain text matching a substring")
category = _('General filters')
def apply(self,db,person):
n = person.get_note()
if n:
return n.find(self.list[0]) != -1
return False
#-------------------------------------------------------------------------
#
# GenericFilter
@@ -2086,6 +2116,8 @@ editor_rule_list = [
IsSiblingOfFilterMatch,
RelationshipPathBetween,
HasTextMatchingSubstringOf,
HasNote,
HasNoteMatchingSubstringOf
]
#-------------------------------------------------------------------------

@@ -43,7 +43,7 @@ from bsddb import dbshelve, db
from RelLib import *
from GrampsDbBase import *
_DBVERSION = 6
_DBVERSION = 7
def find_surname(key,data):
return str(data[3].get_surname())
@@ -421,6 +421,8 @@ class GrampsBSDDB(GrampsDbBase):
self.upgrade_5()
if version < 6:
self.upgrade_6()
if version < 7:
self.upgrade_7()
self.metadata['version'] = _DBVERSION
print 'Successfully finished all upgrades'
@@ -737,3 +739,16 @@ class GrampsBSDDB(GrampsDbBase):
if val[1] != 6:
order.append(val)
self.set_media_column_order(order)
def upgrade_7(self):
print "Upgrading to DB version 7"
self.genderStats = GenderStats()
cursor = self.get_person_cursor()
data = cursor.first()
while data:
handle,val = data
p = Person(val)
self.genderStats.count_person(p,self)
data = cursor.next()
cursor.close()

@@ -279,6 +279,16 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
old_data = self.person_map.get(handle)
if transaction != None:
transaction.add(PERSON_KEY,handle,old_data)
if old_data:
old_person = Person(old_data)
if (old_data[2] != person.gender or
old_data[3].first_name != person.primary_name.first_name):
self.genderStats.uncount_person(old_person)
self.genderStats.count_person(person,self)
else:
self.genderStats.count_person(person,self)
self.person_map[handle] = person.serialize()
if old_data:
self.emit('person-update',([handle],))
@@ -462,8 +472,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
data = self.person_map.get(str(val))
if data:
person = Person()
person.unserialize(data)
person = Person(data)
return person
return None
@@ -536,7 +545,6 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
transaction.add(PERSON_KEY, val, None)
self.person_map[str(val)] = person.serialize()
self.emit('person-add', ([str(val)],))
self.genderStats.count_person (person, self)
return person
def find_source_from_handle(self,val,transaction):
@@ -658,7 +666,6 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
if not person.get_handle():
person.set_handle(self.create_id())
self.commit_person(person,transaction)
self.genderStats.count_person (person, self)
return person.get_handle()
def add_family(self,family,transaction):

@@ -79,10 +79,16 @@ class Marriage:
def __init__(self,parent,family,db):
"""Initializes the Marriage class, and displays the window"""
family_handle = family.get_handle()
# UGLY HACK to refresh faimly object from handle if that exists
# done to ensure that the family object is not stale, as it could
# have been changed by something external (merge, tool, etc).
if family_handle:
family = db.get_family_from_handle(family_handle)
self.family = family
self.parent = parent
if self.parent.child_windows.has_key(family.get_handle()):
self.parent.child_windows[family.get_handle()].present(None)
if self.parent.child_windows.has_key(family_handle):
self.parent.child_windows[family_handle].present(None)
return
self.child_windows = {}
self.db = db

@@ -107,7 +107,10 @@ class PeopleModel(gtk.GenericTreeModel):
if data_filter:
keys = data_filter.apply(self.db)
if self.invert_result:
handle_list = self.db.get_person_handles(sort_handles=False)
#TODO: Could be optimized by using a cursor
keys = [k for k in handle_list if k not in keys]
del handle_list
else:
keys = self.db.get_person_handles(sort_handles=False)

@@ -782,7 +782,7 @@ class GedcomParser:
place.set_title(pname)
place.set_gramps_id(new_id)
self.db.add_place(place,self.trans)
self.lid2id[gramps_id] = intid
self.lid2id[title] = intid
return place
def parse_cause(self,event,level):

@@ -939,7 +939,6 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
# We hold a reference to the GrampsDB so that we can maintain
# its genderStats. It doesn't get set here, but from
# GenderStats.count_person.
self.db = None
def serialize(self):
"""
@@ -1134,12 +1133,7 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
@param name: L{Name} to be assigned to the person
@type name: L{Name}
"""
db = self.db
if db:
db.genderStats.uncount_person (self)
self.primary_name = name
if db:
db.genderStats.count_person (self, db)
def get_primary_name(self):
"""
@@ -1233,13 +1227,7 @@ class Person(PrimaryObject,PrivateSourceNote,MediaBase,AttributeBase):
Person.UNKNOWN
@type gender: int
"""
# if the db object has been assigned, update the
# genderStats of the database
if self.db:
self.db.genderStats.uncount_person (self)
self.gender = gender
if self.db:
self.db.genderStats.count_person (self, self.db)
def get_gender(self) :
"""
@@ -1835,7 +1823,7 @@ class Family(PrimaryObject,SourceNote,MediaBase,AttributeBase):
@return: Returns the list of objects refereincing primary objects.
@rtype: list
"""
return get_sourcref_child_list() + self.source_list
return self.get_sourcref_child_list() + self.source_list
def set_complete_flag(self,val):
"""
@@ -2185,9 +2173,12 @@ class Event(PrimaryObject,PrivateSourceNote,MediaBase,DateBase,PlaceBase):
@return: Returns the list of objects refereincing primary objects.
@rtype: list
"""
return self.media_list + self.source_list + \
[witness for witness in self.witness
if witness.type == Event.ID]
ret = self.media_list + self.source_list
if self.witness:
ret += [witness for witness in self.witness
if witness.type == Event.ID]
return ret
def get_witness_list(self):
"""
Returns the list of L{Witness} instances associated with the Event.
@@ -4058,7 +4049,6 @@ class GenderStats:
if not person:
return
# Let the Person do their own counting later
person.db = db
name = self._get_key (person)
if not name:

@@ -1048,6 +1048,16 @@ class Gramps(GrampsDBCallback.GrampsDBCallback):
all.add_rule(GenericFilter.HasTextMatchingRegexpOf([]))
filter_list.append(all)
all = GenericFilter.GenericFilter()
all.set_name(_("People with notes"))
all.add_rule(GenericFilter.HasNote([]))
filter_list.append(all)
all = GenericFilter.ParamFilter()
all.set_name(_("People with notes containing..."))
all.add_rule(GenericFilter.HasNoteMatchingSubstringOf([]))
filter_list.append(all)
self.filter_model = GenericFilter.FilterStore(filter_list)
self.filter_list.set_model(self.filter_model)
self.filter_list.set_active(self.filter_model.default_index())

@@ -82,6 +82,7 @@ def runTool(database,active_person,callback,parent=None):
checker.check_events()
checker.check_place_references()
checker.check_source_references()
database.transaction_commit(trans, _("Check Integrity"))
database.enable_signals()
database.request_rebuild()
@@ -115,6 +116,7 @@ class CheckIntegrity:
self.invalid_birth_events = []
self.invalid_death_events = []
self.invalid_place_references = []
self.invalid_source_references = []
def family_errors(self):
return len(self.broken_parent_links) + len(self.broken_links) + len(self.empty_family)
@@ -429,6 +431,123 @@ class CheckIntegrity:
self.db.commit_event(event,self.trans)
self.invalid_place_references.append(key)
def check_source_references(self):
known_handles = self.db.get_source_handles()
cursor = self.db.get_person_cursor()
data = cursor.first()
while data:
handle,info = data
person = RelLib.Person()
person.unserialize(info)
handle_list = person.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
person.remove_source_references(bad_handles)
self.db.commit_person(person,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_family_cursor()
data = cursor.first()
while data:
handle,info = data
family = RelLib.Family()
family.unserialize(info)
handle_list = family.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
family.remove_source_references(bad_handles)
self.db.commit_family(family,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_place_cursor()
data = cursor.first()
while data:
handle,info = data
place = RelLib.Place()
place.unserialize(info)
handle_list = place.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
place.remove_source_references(bad_handles)
self.db.commit_family(place,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_source_cursor()
data = cursor.first()
while data:
handle,info = data
source = RelLib.Source()
source.unserialize(info)
handle_list = source.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
source.remove_source_references(bad_handles)
self.db.commit_source(source,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_media_cursor()
data = cursor.first()
while data:
handle,info = data
obj = RelLib.MediaObject()
obj.unserialize(info)
handle_list = obj.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
obj.remove_source_references(bad_handles)
self.db.commit_object(obj,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
cursor = self.db.get_event_cursor()
data = cursor.first()
while data:
handle,info = data
event = RelLib.Event()
event.unserialize(info)
handle_list = event.get_referenced_handles_recursively()
bad_handles = [ item[1] for item in handle_list
if item[0] == 'Source' and
item[1] not in known_handles ]
if bad_handles:
event.remove_source_references(bad_handles)
self.db.commit_event(event,self.trans)
new_bad_handles = [handle for handle in bad_handles if handle
not in self.invalid_source_references]
self.invalid_source_references += new_bad_handles
data = cursor.next()
cursor.close()
def build_report(self,cl=0):
bad_photos = len(self.bad_photo)
replaced_photos = len(self.replaced_photo)
@@ -443,8 +562,10 @@ class CheckIntegrity:
death_invalid = len(self.invalid_death_events)
person = birth_invalid + death_invalid
place_references = len(self.invalid_place_references)
source_references = len(self.invalid_source_references)
errors = blink + efam + photos + rel + person + event_invalid + place_references
errors = blink + efam + photos + rel + person \
+ event_invalid + place_references + source_references
if errors == 0:
if cl:
@@ -534,6 +655,10 @@ class CheckIntegrity:
self.text.write(_("1 place was referenced but not found\n"))
elif place_references > 1:
self.text.write(_("%d places were referenced, but not found\n") % place_references)
if source_references == 1:
self.text.write(_("1 source was referenced but not found\n"))
elif source_references > 1:
self.text.write(_("%d sources were referenced, but not found\n") % source_references)
return errors

@@ -0,0 +1,65 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2005 Martin Hawlisch, Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id$
"Dump gender stats"
import gtk
import ListModel
_GENDER = [ _(u'female'), _(u'male'), _(u'unknown') ]
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
def DumpGenderStatsPlugin(database,active_person,callback,parent=None):
stats_list = []
for name in database.genderStats.stats.keys():
stats_list.append((name,)+database.genderStats.stats[name]+(_GENDER[database.genderStats.guess_gender(name)],))
titles = [(_('Name'),1,100), (_('Male'),2,70),
(_('Female'),3,70), ('Unknown',4,70), (_('Guess'),5,70) ]
treeview = gtk.TreeView()
model = ListModel.ListModel(treeview,titles)
for entry in stats_list:
model.add(entry,entry[0])
w = gtk.Window()
w.set_position(gtk.WIN_POS_MOUSE)
w.set_default_size(400,300)
s=gtk.ScrolledWindow()
s.add(treeview)
w.add(s)
w.show_all()
#-------------------------------------------------------------------------
#
#
#
#-------------------------------------------------------------------------
from PluginMgr import register_tool
register_tool(
DumpGenderStatsPlugin,
_("Dumps gender statistics"),
category=_("Debug"),
description=_("Will dump the statistics for the gender guessing from the first name.")
)

@@ -48,6 +48,7 @@ import Report
import ReportOptions
import GenericFilter
import const
import RelLib
from BaseDoc import PAPER_LANDSCAPE
from latin_utf8 import utf8_to_latin
from QuestionDialog import ErrorDialog
@@ -233,8 +234,8 @@ class GraphViz:
family = self.database.get_family_from_handle(family_handle)
father_handle = family.get_father_handle()
mother_handle = family.get_mother_handle()
fadopted = frel != _("Birth")
madopted = mrel != _("Birth")
fadopted = frel != RelLib.Person.CHILD_REL_BIRTH
madopted = mrel != RelLib.Person.CHILD_REL_BIRTH
famid = family.get_gramps_id().replace('-','_')
if (self.show_families and
(father_handle and person_dict.has_key(father_handle) or

@@ -715,12 +715,24 @@ class IndividualPage:
self.doc.write_text(_("Siblings"))
self.doc.end_paragraph()
self.doc.start_table("three","IndTable")
self.doc.start_table("four","IndTable")
self.doc.start_row()
self.doc.start_cell("NormalCell")
self.doc.start_paragraph("Label")
self.doc.write_text(_("Siblings"))
self.doc.end_paragraph()
self.doc.end_cell()
self.doc.start_cell("NormalCell")
first = True
for child_handle in all_sisters:
child = self.db.get_person_from_handle(child_handle)
self.doc.start_paragraph("Data")
name = child.get_primary_name().get_regular_name()
if first:
self.doc.start_paragraph("Data")
first = False
else:
self.doc.write_text('\n')
if self.person.get_handle() == child_handle:
self.doc.write_text(name)
elif self.list.has_key(child_handle):
@@ -729,8 +741,12 @@ class IndividualPage:
self.doc.end_link()
else:
self.doc.write_text(name)
if not first:
self.doc.end_paragraph()
self.doc.end_cell()
self.doc.end_row()
self.doc.end_table()
#------------------------------------------------------------------------
#

File diff suppressed because it is too large Load Diff

@@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: fr\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: Thu Jun 23 14:11:42 2005\n"
"PO-Revision-Date: 2005-05-17 18:11+0200\n"
"PO-Revision-Date: 2005-06-28 21:48+0200\n"
"Last-Translator: Matthieu Pupat <tieum.tieum@free.fr>\n"
"Language-Team: Fran<61>ais <fr@li.org>\n"
"MIME-Version: 1.0\n"
@@ -79,28 +79,24 @@ msgid "A person cannot be linked as his/her spouse"
msgstr "Une personne ne peut <20>tre son propre conjoint"
#: AddSpouse.py:241
#, fuzzy
msgid "Spouse is a parent"
msgstr "<b>Parents de l'<27>p_oux(se)</b>"
msgstr "Le conjoint est un parent"
#: AddSpouse.py:242
#, fuzzy
msgid ""
"The person selected as a spouse is a parent of the active person. Usually, "
"this is a mistake. You may choose either to proceed with adding a spouse, or "
"to return to the Choose Spouse dialog to fix the problem."
msgstr ""
"Le sexe de la personne est inconnu. Habituellement, c'est une erreur. Vous "
"pouvez choisir de continuer la sauvegarde ou d'<27>diter la fiche pour corriger "
"le probl<62>me."
"La personne s<>lectionn<6E>e comme conjoint est un parent de la personne active. "
"Habituellement, c'est une erreur. Vous pouvez choisir de continuer la "
"sauvegarde ou d'<27>diter la fiche pour corriger le probl<62>me."
#: AddSpouse.py:246 AddSpouse.py:267
#, fuzzy
msgid "Proceed with adding"
msgstr "Fermer _sans sauvegarder"
msgstr "Forcer l'ajout"
#: AddSpouse.py:246 AddSpouse.py:267
#, fuzzy
msgid "Return to dialog"
msgstr "Retour <20> la fen<65>tre"
@@ -109,20 +105,18 @@ msgid "The spouse is already present in this family"
msgstr "Le conjoint est d<>j<EFBFBD> pr<70>sent dans la famille"
#: AddSpouse.py:262
#, fuzzy
msgid "Spouse is a child"
msgstr "Erreur lors de la s<>lection d'un enfant"
msgstr "Le conjoint est un enfant"
#: AddSpouse.py:263
#, fuzzy
msgid ""
"The person selected as a spouse is a child of the active person. Usually, "
"this is a mistake. You may choose either to proceed with adding a spouse, or "
"to return to the Choose Spouse dialog to fix the problem."
msgstr ""
"Le sexe de la personne est inconnu. Habituellement, c'est une erreur. Vous "
"pouvez choisir de continuer la sauvegarde ou d'<27>diter la fiche pour corriger "
"le probl<62>me."
"La personne choisie comme conjoint est un enfant de la personne active. "
"Habituellement, c'est une erreur. Vous pouvez choisir de continuer la "
"sauvegarde ou d'<27>diter la fiche pour corriger le probl<62>me."
#: AddSpouse.py:293 FamilyView.py:725
msgid "Add Spouse"
@@ -221,9 +215,8 @@ msgid "Edit Bookmarks"
msgstr "G<>rer les signets"
#: ChooseParents.py:129 ChooseParents.py:130
#, fuzzy
msgid "Loading..."
msgstr "Chargement de %s ..."
msgstr "Chargement ..."
#: ChooseParents.py:133
msgid "Choose the Parents of %s"
@@ -281,24 +274,20 @@ msgid "Father"
msgstr "P<>re"
#: ChooseParents.py:834
#, fuzzy
msgid "Likely Father"
msgstr "P<>re"
msgstr "P<>re suppos<6F>"
#: ChooseParents.py:835
#, fuzzy
msgid "Matches likely fathers"
msgstr "Corresponds <20> toutes les femmes de la base de donn<6E>es"
msgstr "Tous les p<>res suppos<6F>s"
#: ChooseParents.py:844
#, fuzzy
msgid "Likely Mother"
msgstr "M<>re"
msgstr "M<>re suppos<6F>e"
#: ChooseParents.py:845
#, fuzzy
msgid "Matches likely mothers"
msgstr "Corresponds <20> tous les hommes de la base de donn<EFBFBD>es"
msgstr "Toutes les m<>res suppos<EFBFBD>es"
#: ColumnOrder.py:40
msgid "Select Columns"
@@ -670,13 +659,15 @@ msgstr "Nouveau lieu"
#: EditPlace.py:391
msgid "Place title is already in use"
msgstr ""
msgstr "Le nom de lieu est d<>j<EFBFBD> utilis<69>"
#: EditPlace.py:392
msgid ""
"Each place must have a unique title, and title you have selected is already "
"used by another place"
msgstr ""
"Chaque lieu doit avoir un titre unique. Le titre s<>lectionn<6E> est utilis<69> "
"pour un autre lieu"
#: EditPlace.py:427
msgid "Edit Place (%s)"
@@ -1154,17 +1145,15 @@ msgid "Matches everyone in the database"
msgstr "Assortir tout un chacun dans la base"
#: GenericFilter.py:146
#, fuzzy
msgid "Disconnected people"
msgstr "Individus d<>connect<63>s"
#: GenericFilter.py:148
#, fuzzy
msgid ""
"Matches people that have no family relationships to any other person in the "
"database"
msgstr ""
"Assortir les individus ayant des ascendants commun aux r<>sultats du filtrage"
"Assortir les individus n'ayant de relation avec aucun individu de la base"
#: GenericFilter.py:164 GenericFilter.py:260 GenericFilter.py:368
#: GenericFilter.py:459 GenericFilter.py:502 GenericFilter.py:623
@@ -1175,16 +1164,14 @@ msgid "ID:"
msgstr "Id :"
#: GenericFilter.py:165
#, fuzzy
msgid "Relationship path between <persons>"
msgstr "Relation entre deux individus"
msgstr "Relation entre <persons>"
#: GenericFilter.py:166
msgid "Relationship filters"
msgstr "Filtres relationnels"
#: GenericFilter.py:167
#, fuzzy
msgid ""
"Matches the ancestors of two persons back to a common ancestor, producing "
"the relationship path between two persons."
@@ -1193,17 +1180,14 @@ msgstr ""
"relier ces deux personnes."
#: GenericFilter.py:261
#, fuzzy
msgid "People with <Id>"
msgstr "Individus ayant des enfants"
msgstr "Individus avec <id>"
#: GenericFilter.py:262
#, fuzzy
msgid "Matches people with a specified GRAMPS ID"
msgstr "Assortir l'individu <20> son identifiant GRAMPS"
msgstr "Assortir les individus avec l'identifiant GRAMPS"
#: GenericFilter.py:276
#, fuzzy
msgid "Default person"
msgstr "Individu par d<>faut"
@@ -1212,18 +1196,16 @@ msgid "Matches the default person"
msgstr "Trouver l'individu par d<>faut"
#: GenericFilter.py:299
#, fuzzy
msgid "Bookmarked people"
msgstr "Comparer des personnes"
msgstr "Personnes avec un marque-pages"
#: GenericFilter.py:301
msgid "Matches the people on the bookmark list"
msgstr "Trouver les personnes sur un marque-page"
#: GenericFilter.py:322
#, fuzzy
msgid "People with complete records"
msgstr "Individus ayant des noms incomplets"
msgstr "Individus ayant un enregistrement complet"
#: GenericFilter.py:324
msgid "Matches all people whose records are complete"
@@ -1238,14 +1220,12 @@ msgid "Matches all females"
msgstr "Corresponds <20> toutes les femmes de la base de donn<6E>es"
#: GenericFilter.py:352 gramps_main.py:967
#, fuzzy
msgid "People with unknown gender"
msgstr "Individus sans aucun mariage"
msgstr "Individus sans sexe connu"
#: GenericFilter.py:354
#, fuzzy
msgid "Matches all people with unknown gender"
msgstr "Rassemble les individus aux enregistrements complets"
msgstr "Rassemble les individus sans sexe connu"
#: GenericFilter.py:368 GenericFilter.py:416 GenericFilter.py:670
#: GenericFilter.py:724 plugins/FilterEditor.py:692
@@ -1253,9 +1233,8 @@ msgid "Inclusive:"
msgstr "Inclusif :"
#: GenericFilter.py:369
#, fuzzy
msgid "Descendants of <person>"
msgstr "Descendants de %s"
msgstr "Descendants de <person>"
#: GenericFilter.py:370 GenericFilter.py:418 GenericFilter.py:461
#: GenericFilter.py:504 GenericFilter.py:625
@@ -1273,14 +1252,12 @@ msgid "Filter name:"
msgstr "Filtre sur le nom :"
#: GenericFilter.py:417
#, fuzzy
msgid "Descendants of <filter> match"
msgstr "Est le descendant d'un individu r<>sultant du filtrage"
msgstr "Est le descendant du filtre <filter>"
#: GenericFilter.py:419
#, fuzzy
msgid "Matches people that are descendants of anybody matched by a filter"
msgstr "Assortir les descendants d'un individu aux r<>sultats du filtrage"
msgstr "Descendants des individus r<>sultant d'un filtre"
#: GenericFilter.py:459 GenericFilter.py:502 GenericFilter.py:768
#: GenericFilter.py:820 plugins/FilterEditor.py:678
@@ -1288,9 +1265,8 @@ msgid "Number of generations:"
msgstr "Nombre de g<>n<EFBFBD>rations :"
#: GenericFilter.py:460
#, fuzzy
msgid "Descendants of <person> not more than <N> generations away"
msgstr "Est le descendant d'un individu sur moins de N g<>n<EFBFBD>rations"
msgstr "Est le descendant de <person> sur moins de <N> g<>n<EFBFBD>rations"
#: GenericFilter.py:462
msgid ""
@@ -1299,9 +1275,8 @@ msgid ""
msgstr "Assortir les descendants d'un individu sur moins de N g<>n<EFBFBD>rations"
#: GenericFilter.py:503
#, fuzzy
msgid "Descendants of <person> at least <N> generations away"
msgstr "Est le descendant d'un individu sur au moins N g<>n<EFBFBD>rations"
msgstr "Est le descendant de <person> sur au moins <N> g<>n<EFBFBD>rations"
#: GenericFilter.py:505
msgid ""
@@ -1310,9 +1285,8 @@ msgid ""
msgstr "Assortir les descendants d'un individu sur au moins N g<>n<EFBFBD>rations"
#: GenericFilter.py:545
#, fuzzy
msgid "Children of <filter> match"
msgstr "Est un enfant d'un individu r<>sultant du filtrage"
msgstr "Enfants du filtre <filter>"
#: GenericFilter.py:546 GenericFilter.py:584 GenericFilter.py:872
#: GenericFilter.py:1096 GenericFilter.py:1389 GenericFilter.py:1412
@@ -1321,24 +1295,20 @@ msgid "Family filters"
msgstr "Filtres familiaux"
#: GenericFilter.py:547
#, fuzzy
msgid "Matches children of anybody matched by a filter"
msgstr "Assortir les enfants d'un individu aux r<>sultats du filtrage"
msgstr "Enfants des individus r<>sultant d'un filtre"
#: GenericFilter.py:583
#, fuzzy
msgid "Siblings of <filter> match"
msgstr "Est un fr<66>re ou une soeur d'un individu r<>sultant du filtrage"
msgstr "Est un fr<66>re ou une soeur du filtre <filter>"
#: GenericFilter.py:585
#, fuzzy
msgid "Matches siblings of anybody matched by a filter"
msgstr "Trouver les fr<EFBFBD>res et soeurs d'une personne gr<67>ce <20> un filtre"
msgstr "Fr<EFBFBD>res et soeurs des individus r<>sultant d'un filtre"
#: GenericFilter.py:624
#, fuzzy
msgid "Descendant family members of <person>"
msgstr "Est un membre de la famille descendant de"
msgstr "Est un membre de la famille descendant de <person>"
#: GenericFilter.py:626
msgid ""
@@ -1347,9 +1317,8 @@ msgid ""
msgstr "Assortir les descendants ou leurs <20>poux(se) <20> un individu"
#: GenericFilter.py:671
#, fuzzy
msgid "Ancestors of <person>"
msgstr "Anc<6E>tres de %s"
msgstr "Anc<6E>tres de <person>"
#: GenericFilter.py:672 GenericFilter.py:726 GenericFilter.py:770
#: GenericFilter.py:822 GenericFilter.py:909 GenericFilter.py:955
@@ -1361,9 +1330,8 @@ msgid "Matches people that are ancestors of a specified person"
msgstr "Assortir les ascendants <20> un individu"
#: GenericFilter.py:725
#, fuzzy
msgid "Ancestors of <filter> match"
msgstr "Est l'ascendant d'un individu r<>sultant du filtrage"
msgstr "Est l'ascendant du filtre <filter>"
#: GenericFilter.py:727
#, fuzzy
@@ -10381,149 +10349,3 @@ msgstr "<b>Crit
#: rule.glade:1186
msgid "<b>Values</b>"
msgstr "<b>Valeurs</b>"
#~ msgid "A person cannot be linked as his/her child's spouse"
#~ msgstr "Une personne ne peut <20>tre le conjoint de son enfant"
#~ msgid "A person cannot be linked as his/her parent's spouse"
#~ msgstr "Une personne ne peut <20>tre le conjoint de son p<>re ou de sa m<>re"
#~ msgid "Month Day, Year"
#~ msgstr "Mois Jour, Ann<6E>e"
#~ msgid "Numerical"
#~ msgstr "Num<75>rique"
#~ msgid "YYYY-MM-DD (ISO)"
#~ msgstr "AAAA-MM-JJ (ISO)"
#~ msgid "DAY MON YEAR"
#~ msgstr "JOUR MOIS ANNEE"
#~ msgid "Day Month Year"
#~ msgstr "Jour Mois Ann<6E>e"
#~ msgid "MON DAY, YEAR"
#~ msgstr "MOIS JOUR, ANNEE"
#~ msgid "Matches individuals that have no relationships"
#~ msgstr "Trouver les individus sans relations"
#~ msgid "Matches the person that is a parent of someone matched by a filter"
#~ msgstr "Assortir les parents d'un individu aux r<>sultats du filtrage"
#~ msgid "Is bookmarked person"
#~ msgstr "Individu avec un marque-page"
#~ msgid "Has the Id"
#~ msgstr "A l'identifiant"
#~ msgid "Has a name"
#~ msgstr "A un nom"
#~ msgid "Has the death"
#~ msgstr "A le d<>c<EFBFBD>s"
#~ msgid "Has the birth"
#~ msgstr "A la naissance"
#~ msgid "Is a descendant of"
#~ msgstr "Est le descendant de"
#~ msgid "Is an ancestor of"
#~ msgstr "Est l'anc<6E>tre de"
#~ msgid "Has a common ancestor with"
#~ msgstr "A un anc<6E>tre commun avec"
#~ msgid "Is a female"
#~ msgstr "Est une femme"
#~ msgid "Is a male"
#~ msgstr "Est un homme"
#~ msgid "Has complete record"
#~ msgstr "A un enregistrement complet"
#~ msgid "Has source of"
#~ msgstr "Contient la source"
#~ msgid "Matches the filter named"
#~ msgstr "Correspond au crit<69>re suivant"
#~ msgid "People who were adopted"
#~ msgstr "Individus ayant <20>t<EFBFBD> adopt<70>s"
#~ msgid "Has text matching substring of"
#~ msgstr "A du texte contenant"
#~ msgid "Name contains..."
#~ msgstr "Le nom contient ..."
#~ msgid "Index of individuals, sorted by last name."
#~ msgstr "Index des individus tri<72> par nom."
#~ msgid "Surname"
#~ msgstr "Nom de famille"
#~ msgid "Places"
#~ msgstr "Lieux"
#~ msgid "Index of all the places in the project."
#~ msgstr "Index de tous les lieux du projet."
#~ msgid "Letter"
#~ msgstr "Lettres"
#~ msgid ""
#~ "Index of all the surnames in the project. The links lead to a list of "
#~ "individuals in the database with this same surname."
#~ msgstr ""
#~ "Index des noms de famille du projet. Les liens m<>nent vers la liste des "
#~ "individus de la base ayant le m<>me nom de famille."
#~ msgid "Introduction"
#~ msgstr "Introduction"
#~ msgid "All sources cited in the project."
#~ msgstr "Toutes les sources cit<69>es dans le projet."
#~ msgid "Download"
#~ msgstr "T<>l<EFBFBD>charger"
#~ msgid "Contact"
#~ msgstr "Contact"
#~ msgid "Pedigree"
#~ msgstr "Arborescence"
#~ msgid "Narrative"
#~ msgstr "Narratif"
#~ msgid "Relationships"
#~ msgstr "Relations"
#~ msgid "Partner"
#~ msgstr "Partenaire"
#~ msgid ""
#~ "%(description)s, &nbsp;&nbsp; %(date)s &nbsp;&nbsp; at &nbsp&nbsp; %"
#~ "(place)s"
#~ msgstr ""
#~ "%(description)s, &nbsp;&nbsp; %(date)s &nbsp;&nbsp; <20> &nbsp&nbsp; %(place)"
#~ "s"
#~ msgid "%(description)s, &nbsp;&nbsp; %(date)s &nbsp;&nbsp;"
#~ msgstr "%(description)s, &nbsp;&nbsp; %(date)s &nbsp;&nbsp;"
#~ msgid "%(date)s &nbsp;&nbsp; at &nbsp&nbsp; %(place)s"
#~ msgstr "%(date)s &nbsp;&nbsp; <20> &nbsp&nbsp; %(place)s"
#~ msgid "Web site title"
#~ msgstr "Nom du site web"
#~ msgid "Narrative Web Site"
#~ msgstr "G<>n<EFBFBD>ration de site internet d<>taill<6C>"
#~ msgid "Min. bar char items"
#~ msgstr "Nombre minimum d'entr<74>es pour les diagrammes en barres"

@@ -1,9 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<filters>
<filter name="asfd" function="and">
<rule class="Is a male">
</rule>
</filter>
<filter name="asfasdfasdf" function="and">
</filter>
</filters>