From f120bee79216129eb217642c0816abfa996085eb Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Tue, 4 Aug 2026 15:08:10 +0200 Subject: [PATCH] Add HasNotAttributeBase filter Enable to look for persons that do NOT have a particular attribute (eg: looking for people w/o occupation in order to know which ones we need to find that info in eg: their mariage act) --- gramps/gen/filters/_filterparser.py | 1 + gramps/gen/filters/rules/__init__.py | 1 + .../gen/filters/rules/_hasnotattributebase.py | 82 +++++++++++++++++++ gramps/gen/filters/rules/citation/__init__.py | 2 + .../rules/citation/_hasnotattribute.py | 47 +++++++++++ gramps/gen/filters/rules/event/__init__.py | 2 + .../filters/rules/event/_hasnotattribute.py | 47 +++++++++++ gramps/gen/filters/rules/family/__init__.py | 2 + .../filters/rules/family/_hasnotattribute.py | 47 +++++++++++ gramps/gen/filters/rules/media/__init__.py | 2 + .../filters/rules/media/_hasnotattribute.py | 47 +++++++++++ gramps/gen/filters/rules/person/__init__.py | 2 + .../filters/rules/person/_hasnotattribute.py | 47 +++++++++++ .../gen/filters/rules/repository/__init__.py | 2 + .../rules/repository/_hasnotattribute.py | 47 +++++++++++ gramps/gen/filters/rules/source/__init__.py | 2 + .../filters/rules/source/_hasnotattribute.py | 47 +++++++++++ po/POTFILES.in | 8 ++ 18 files changed, 435 insertions(+) create mode 100644 gramps/gen/filters/rules/_hasnotattributebase.py create mode 100644 gramps/gen/filters/rules/citation/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/event/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/family/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/media/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/person/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/repository/_hasnotattribute.py create mode 100644 gramps/gen/filters/rules/source/_hasnotattribute.py diff --git a/gramps/gen/filters/_filterparser.py b/gramps/gen/filters/_filterparser.py index e1cbc4093d4..3ce6edf71ba 100644 --- a/gramps/gen/filters/_filterparser.py +++ b/gramps/gen/filters/_filterparser.py @@ -243,6 +243,7 @@ def __upgrade(self): "Has the personal event": rules.person.HasEvent, "Has the family event": rules.person.HasFamilyEvent, "Has the personal attribute": rules.person.HasAttribute, + "Has not the personal attribute": rules.person.HasNotAttribute, "Has the family attribute": rules.person.HasFamilyAttribute, "Has source of": rules.person.HasSourceOf, "Matches the filter named": rules.person.HasSourceOf, diff --git a/gramps/gen/filters/rules/__init__.py b/gramps/gen/filters/rules/__init__.py index fda6e6bb5d5..f15c42ed89b 100644 --- a/gramps/gen/filters/rules/__init__.py +++ b/gramps/gen/filters/rules/__init__.py @@ -37,6 +37,7 @@ Match on sub-objects _ChangedSinceBase Object changed since date _HasAttributeBase Object has particular attribute value +_HasNotAttributeBase _HasGrampsId Object has a specific Gramps Id _HasNoteRegexBase Object has notes matching regular expression _HasNoteSubstrBase Object has note containing substring diff --git a/gramps/gen/filters/rules/_hasnotattributebase.py b/gramps/gen/filters/rules/_hasnotattributebase.py new file mode 100644 index 00000000000..f2e5ecce31a --- /dev/null +++ b/gramps/gen/filters/rules/_hasnotattributebase.py @@ -0,0 +1,82 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2002-2006 Donald N. Allingham +# Copyright (C) 2019 Matthias Kemmer +# +# 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, see . +# + +""" +Rule that checks for an object with a particular attribute. +""" + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from ...const import GRAMPS_LOCALE as glocale +from ...lib.attrtype import AttributeType +from . import Rule + +_ = glocale.translation.gettext + + +# ------------------------------------------------------------------------- +# +# Typing modules +# +# ------------------------------------------------------------------------- +from ...lib.attrbase import AttributeBase +from ...db import Database + + +# ------------------------------------------------------------------------- +# +# HasNotAttributeBase +# +# ------------------------------------------------------------------------- +class HasNotAttributeBase(Rule): + """ + Rule that checks for an object without a particular attribute. + """ + + name = "Objects without the " + description = "Matches objects without the given attribute" + category = _("General filters") + allow_regex = True + + def __init__(self, arg, use_regex=False, use_case=False): + super().__init__(arg, use_regex, use_case) + self.attribute_type = None + + def prepare(self, db: Database, user): + """ + Prepare the rule. Things that should only be done once. + """ + if self.list[0]: + self.attribute_type = AttributeType() + self.attribute_type.set_from_xml_str(self.list[0]) + + def apply_to_one(self, db: Database, obj: AttributeBase) -> bool: + """ + Apply the rule. Return True if a match. + """ + if self.attribute_type: + for attribute in obj.attribute_list: + name_match = attribute.type == self.attribute_type + if name_match: + return False + return True diff --git a/gramps/gen/filters/rules/citation/__init__.py b/gramps/gen/filters/rules/citation/__init__.py index eb26bdb72ec..0c6d2a4281a 100644 --- a/gramps/gen/filters/rules/citation/__init__.py +++ b/gramps/gen/filters/rules/citation/__init__.py @@ -28,6 +28,7 @@ from ._changedsince import ChangedSince from ._citationprivate import CitationPrivate from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasgallery import HasGallery from ._hasidof import HasIdOf from ._hasnote import HasNote @@ -55,6 +56,7 @@ HasAttribute, HasGallery, HasIdOf, + HasNotAttribute, HasNote, HasNoteRegexp, HasNoteTag, diff --git a/gramps/gen/filters/rules/citation/_hasnotattribute.py b/gramps/gen/filters/rules/citation/_hasnotattribute.py new file mode 100644 index 00000000000..25e5d5af271 --- /dev/null +++ b/gramps/gen/filters/rules/citation/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a citation with a particular attribute""" + + labels = [_("Citation attribute:")] + name = _("Citations without the attribute ") + description = _("Matches citations without the attribute") diff --git a/gramps/gen/filters/rules/event/__init__.py b/gramps/gen/filters/rules/event/__init__.py index e74de889fc1..50f112308c3 100644 --- a/gramps/gen/filters/rules/event/__init__.py +++ b/gramps/gen/filters/rules/event/__init__.py @@ -43,6 +43,7 @@ from ._matchessourceconfidence import MatchesSourceConfidence from ._matchessourcefilter import MatchesSourceFilter from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasdata import HasData from ._changedsince import ChangedSince from ._hastag import HasTag @@ -68,6 +69,7 @@ MatchesSourceConfidence, MatchesSourceFilter, HasAttribute, + HasNotAttribute, HasData, ChangedSince, HasTag, diff --git a/gramps/gen/filters/rules/event/_hasnotattribute.py b/gramps/gen/filters/rules/event/_hasnotattribute.py new file mode 100644 index 00000000000..d409295f194 --- /dev/null +++ b/gramps/gen/filters/rules/event/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for an event with a particular event attribute""" + + labels = [_("Event attribute:")] + name = _("Events without the attribute ") + description = _("Matches events without the event attribute") diff --git a/gramps/gen/filters/rules/family/__init__.py b/gramps/gen/filters/rules/family/__init__.py index a694c5de761..fa4d158be2d 100644 --- a/gramps/gen/filters/rules/family/__init__.py +++ b/gramps/gen/filters/rules/family/__init__.py @@ -47,6 +47,7 @@ from ._hascitation import HasCitation from ._familyprivate import FamilyPrivate from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasevent import HasEvent from ._isbookmarked import IsBookmarked from ._matchesfilter import MatchesFilter @@ -81,6 +82,7 @@ FamilyPrivate, HasEvent, HasAttribute, + HasNotAttribute, IsBookmarked, MatchesFilter, MatchesSourceConfidence, diff --git a/gramps/gen/filters/rules/family/_hasnotattribute.py b/gramps/gen/filters/rules/family/_hasnotattribute.py new file mode 100644 index 00000000000..fa42b026507 --- /dev/null +++ b/gramps/gen/filters/rules/family/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a family with a particular family attribute""" + + labels = [_("Family attribute:")] + name = _("Families without the family ") + description = _("Matches families without the family attribute") diff --git a/gramps/gen/filters/rules/media/__init__.py b/gramps/gen/filters/rules/media/__init__.py index 972f4730d34..5ae2a718711 100644 --- a/gramps/gen/filters/rules/media/__init__.py +++ b/gramps/gen/filters/rules/media/__init__.py @@ -37,6 +37,7 @@ from ._matchessourceconfidence import MatchesSourceConfidence from ._hasmedia import HasMedia from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._changedsince import ChangedSince from ._hastag import HasTag @@ -56,6 +57,7 @@ MatchesSourceConfidence, HasMedia, HasAttribute, + HasNotAttribute, ChangedSince, HasTag, ] diff --git a/gramps/gen/filters/rules/media/_hasnotattribute.py b/gramps/gen/filters/rules/media/_hasnotattribute.py new file mode 100644 index 00000000000..fd97b5106c1 --- /dev/null +++ b/gramps/gen/filters/rules/media/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a media object with a particular attribute""" + + labels = [_("Media attribute:")] + name = _("Media objects without the attribute ") + description = _("Matches media objects without the attribute") diff --git a/gramps/gen/filters/rules/person/__init__.py b/gramps/gen/filters/rules/person/__init__.py index 48f95b91556..6dad5b377d8 100644 --- a/gramps/gen/filters/rules/person/__init__.py +++ b/gramps/gen/filters/rules/person/__init__.py @@ -32,6 +32,7 @@ from ._hasalternatename import HasAlternateName from ._hasassociation import HasAssociation from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasbirth import HasBirth from ._hascitation import HasCitation from ._hascommonancestorwith import HasCommonAncestorWith @@ -142,6 +143,7 @@ HasEvent, HasFamilyEvent, HasAttribute, + HasNotAttribute, HasFamilyAttribute, HasTag, HasSourceCount, diff --git a/gramps/gen/filters/rules/person/_hasnotattribute.py b/gramps/gen/filters/rules/person/_hasnotattribute.py new file mode 100644 index 00000000000..1b317a487eb --- /dev/null +++ b/gramps/gen/filters/rules/person/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a person with a particular personal attribute""" + + labels = [_("Personal attribute:")] + name = _("People without the personal ") + description = _("Matches people without the personal attribute") diff --git a/gramps/gen/filters/rules/repository/__init__.py b/gramps/gen/filters/rules/repository/__init__.py index fd05e7b5752..8e7a9d0814c 100644 --- a/gramps/gen/filters/rules/repository/__init__.py +++ b/gramps/gen/filters/rules/repository/__init__.py @@ -25,6 +25,7 @@ from ._hasidof import HasIdOf from ._regexpidof import RegExpIdOf from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasnoteregexp import HasNoteRegexp from ._hasnotematchingsubstringof import HasNoteMatchingSubstringOf from ._hasnotetype import HasNoteType @@ -40,6 +41,7 @@ editor_rule_list = [ AllRepos, HasAttribute, + HasNotAttribute, HasIdOf, RegExpIdOf, HasNoteRegexp, diff --git a/gramps/gen/filters/rules/repository/_hasnotattribute.py b/gramps/gen/filters/rules/repository/_hasnotattribute.py new file mode 100644 index 00000000000..50846bd50b0 --- /dev/null +++ b/gramps/gen/filters/rules/repository/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a repository with a particular attribute""" + + labels = [_("Repository attribute:")] + name = _("Repositories without the attribute ") + description = _("Matches repositories without the attribute") diff --git a/gramps/gen/filters/rules/source/__init__.py b/gramps/gen/filters/rules/source/__init__.py index a966a0364dc..a988ac54719 100644 --- a/gramps/gen/filters/rules/source/__init__.py +++ b/gramps/gen/filters/rules/source/__init__.py @@ -25,6 +25,7 @@ from ._allsources import AllSources from ._hasattribute import HasAttribute +from ._hasnotattribute import HasNotAttribute from ._hasgallery import HasGallery from ._hasidof import HasIdOf from ._regexpidof import RegExpIdOf @@ -47,6 +48,7 @@ editor_rule_list = [ AllSources, HasAttribute, + HasNotAttribute, HasGallery, HasIdOf, RegExpIdOf, diff --git a/gramps/gen/filters/rules/source/_hasnotattribute.py b/gramps/gen/filters/rules/source/_hasnotattribute.py new file mode 100644 index 00000000000..c6ff757c65d --- /dev/null +++ b/gramps/gen/filters/rules/source/_hasnotattribute.py @@ -0,0 +1,47 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2026 Thierry Vignaud +# +# 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, see . +# + +# ------------------------------------------------------------------------- +# +# Standard Python modules +# +# ------------------------------------------------------------------------- +from ....const import GRAMPS_LOCALE as glocale + +_ = glocale.translation.gettext + +# ------------------------------------------------------------------------- +# +# Gramps modules +# +# ------------------------------------------------------------------------- +from .._hasnotattributebase import HasNotAttributeBase + + +# ------------------------------------------------------------------------- +# +# HasNotAttribute +# +# ------------------------------------------------------------------------- +class HasNotAttribute(HasNotAttributeBase): + """Rule that checks for a source with a particular attribute""" + + labels = [_("Source attribute:")] + name = _("Sources without the attribute ") + description = _("Matches sources without the attribute") diff --git a/po/POTFILES.in b/po/POTFILES.in index 611eb3a3475..f4e35ab1c50 100755 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -29,6 +29,7 @@ gramps/gen/filters/rules/_haseventbase.py gramps/gen/filters/rules/_hasgallerybase.py gramps/gen/filters/rules/_hasgrampsid.py gramps/gen/filters/rules/_hasldsbase.py +gramps/gen/filters/rules/_hasnotattributebase.py gramps/gen/filters/rules/_hasnotebase.py gramps/gen/filters/rules/_hasnoteregexbase.py gramps/gen/filters/rules/_hasnotesubstrbase.py @@ -56,6 +57,7 @@ gramps/gen/filters/rules/citation/_hasattribute.py gramps/gen/filters/rules/citation/_hascitation.py gramps/gen/filters/rules/citation/_hasgallery.py gramps/gen/filters/rules/citation/_hasidof.py +gramps/gen/filters/rules/citation/_hasnotattribute.py gramps/gen/filters/rules/citation/_hasnote.py gramps/gen/filters/rules/citation/_hasnotematchingsubstringof.py gramps/gen/filters/rules/citation/_hasnoteregexp.py @@ -82,6 +84,7 @@ gramps/gen/filters/rules/event/_hasdayofweek.py gramps/gen/filters/rules/event/_hasevent.py gramps/gen/filters/rules/event/_hasgallery.py gramps/gen/filters/rules/event/_hasidof.py +gramps/gen/filters/rules/event/_hasnotattribute.py gramps/gen/filters/rules/event/_hasnote.py gramps/gen/filters/rules/event/_hasnotematchingsubstringof.py gramps/gen/filters/rules/event/_hasnoteregexp.py @@ -110,6 +113,7 @@ gramps/gen/filters/rules/family/_hasevent.py gramps/gen/filters/rules/family/_hasgallery.py gramps/gen/filters/rules/family/_hasidof.py gramps/gen/filters/rules/family/_haslds.py +gramps/gen/filters/rules/family/_hasnotattribute.py gramps/gen/filters/rules/family/_hasnote.py gramps/gen/filters/rules/family/_hasnotematchingsubstringof.py gramps/gen/filters/rules/family/_hasnoteregexp.py @@ -141,6 +145,7 @@ gramps/gen/filters/rules/media/_hasattribute.py gramps/gen/filters/rules/media/_hascitation.py gramps/gen/filters/rules/media/_hasidof.py gramps/gen/filters/rules/media/_hasmedia.py +gramps/gen/filters/rules/media/_hasnotattribute.py gramps/gen/filters/rules/media/_hasnotematchingsubstringof.py gramps/gen/filters/rules/media/_hasnoteregexp.py gramps/gen/filters/rules/media/_hasnotetag.py @@ -190,6 +195,7 @@ gramps/gen/filters/rules/person/_hasnameof.py gramps/gen/filters/rules/person/_hasnameorigintype.py gramps/gen/filters/rules/person/_hasnametype.py gramps/gen/filters/rules/person/_hasnickname.py +gramps/gen/filters/rules/person/_hasnotattribute.py gramps/gen/filters/rules/person/_hasnote.py gramps/gen/filters/rules/person/_hasnotematchingsubstringof.py gramps/gen/filters/rules/person/_hasnoteregexp.py @@ -277,6 +283,7 @@ gramps/gen/filters/rules/repository/_allrepos.py gramps/gen/filters/rules/repository/_changedsince.py gramps/gen/filters/rules/repository/_hasattribute.py gramps/gen/filters/rules/repository/_hasidof.py +gramps/gen/filters/rules/repository/_hasnotattribute.py gramps/gen/filters/rules/repository/_hasnotematchingsubstringof.py gramps/gen/filters/rules/repository/_hasnoteregexp.py gramps/gen/filters/rules/repository/_hasnotetag.py @@ -293,6 +300,7 @@ gramps/gen/filters/rules/source/_changedsince.py gramps/gen/filters/rules/source/_hasattribute.py gramps/gen/filters/rules/source/_hasgallery.py gramps/gen/filters/rules/source/_hasidof.py +gramps/gen/filters/rules/source/_hasnotattribute.py gramps/gen/filters/rules/source/_hasnote.py gramps/gen/filters/rules/source/_hasnotematchingsubstringof.py gramps/gen/filters/rules/source/_hasnoteregexp.py