1#
2# Gramps - a GTK+/GNOME based genealogy program
3#
4# Copyright (C) 2002-2006  Donald N. Allingham
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19#
20
21#-------------------------------------------------------------------------
22#
23# Standard Python modules
24#
25#-------------------------------------------------------------------------
26from ....const import GRAMPS_LOCALE as glocale
27_ = glocale.translation.gettext
28
29#-------------------------------------------------------------------------
30#
31# Gramps modules
32#
33#-------------------------------------------------------------------------
34from ....datehandler import parser
35from ....display.place import displayer as place_displayer
36from ....lib.eventroletype import EventRoleType
37from ....lib.eventtype import EventType
38from .. import Rule
39
40#-------------------------------------------------------------------------
41#
42# HasDeath
43#
44#-------------------------------------------------------------------------
45class HasDeath(Rule):
46    """Rule that checks for a person with a death of a particular value"""
47
48    labels = [ _('Date:'), _('Place:'), _('Description:') ]
49    name = _('People with the <death data>')
50    description = _("Matches people with death data of a particular value")
51    category = _('Event filters')
52    allow_regex = True
53
54    def prepare(self, db, user):
55        if self.list[0]:
56            self.date = parser.parse(self.list[0])
57        else:
58            self.date = None
59
60    def apply(self,db,person):
61        for event_ref in person.get_event_ref_list():
62            if not event_ref:
63                continue
64            elif event_ref.role != EventRoleType.PRIMARY:
65                # Only match primaries, no witnesses
66                continue
67            event = db.get_event_from_handle(event_ref.ref)
68            if event.get_type() != EventType.DEATH:
69                # No match: wrong type
70                continue
71            if not self.match_substring(2, event.get_description()):
72                # No match: wrong description
73                continue
74            if self.date:
75                if not event.get_date_object().match(self.date):
76                    # No match: wrong date
77                    continue
78            if self.list[1]:
79                place_id = event.get_place_handle()
80                if place_id:
81                    place = db.get_place_from_handle(place_id)
82                    place_title = place_displayer.display(db, place)
83                    if not self.match_substring(1, place_title):
84                        # No match: wrong place
85                        continue
86                else:
87                    # No match: event has no place, but place specified
88                    continue
89            # This event matched: exit positive
90            return True
91        # Nothing matched: exit negative
92        return False
93