kkujansuu / gramps

MIT License
1 stars 1 forks source link

Switching from Persons to Events category throws an error #22

Open emyoulation opened 1 year ago

emyoulation commented 1 year ago

Switching from Persons to Events category throws an error

Switching to any of the other categories did not throw any errors Id: FilterParams Description: Display custom filters and allow changing their parameters Version: 1.1.0

1722318: ERROR: grampsapp.py: line 174: Unhandled exception
Traceback (most recent call last):
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 739, in on_filter_changed
    frame2 = self.add_frame_and_filter(None, self.current_category, filtername, 0)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 592, in add_frame_and_filter
    self.addfilter(grid2, category, filtername, level+1)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 665, in addfilter
    self.add_frame_and_filter(grid, matchcategory, filtername, level)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 587, in add_frame_and_filter
    if filter.comment.strip():
AttributeError: 'NoneType' object has no attribute 'comment'
emyoulation commented 1 year ago

Retested with v 1.1.2 changing the Category menu from Family to Event. error still occurs.

Note: the Status bar warns "No active object" so I selected a record in the Events view and tried switching FilterParams to Family & then back to Events. Same problem recurs.

421067: ERROR: grampsapp.py: line 174: Unhandled exception
Traceback (most recent call last):
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 751, in on_filter_changed
    frame2 = self.add_frame_and_filter(None, self.current_category, filtername, 0)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 604, in add_frame_and_filter
    self.addfilter(grid2, category, filtername, level+1)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 677, in addfilter
    self.add_frame_and_filter(grid, matchcategory, filtername, level)
  File "C:\Users\DistrictSupport\AppData\Roaming\gramps\gramps51\plugins\FilterParams\FilterParams.py", line 599, in add_frame_and_filter
    if filter.comment.strip():
AttributeError: 'NoneType' object has no attribute 'comment'
kkujansuu commented 1 year ago

Most probably you have an Event filter that refers to a nonexistent filter in another category. That situation was not properly handled after the recent changes. The latest version 1.1.3 fixes this by displaying an error message like "filter not found in namespace " in that case.

emyoulation commented 1 year ago

Version 1.1.3 handled the error more gracefully.

The 1st Filter was damaged somehow. It now displays the fault in bold, red: "Error" filter '1 degree' not found in namespace". (The Filter pop-up and label reference an Event Custom filter "1degree", with the space after the number. But the error message and the filter definition reference th missing Person Custom Filter "1 degree", which still HAS that space.) image

But clicking the delete button seems to resolve the problem:

the custom_filters.xml file:

<?xml version="1.0" encoding="utf-8"?>
<filters>
  <object type="Person">
    <filter name="1 Deficient records" function="and">
      <rule class="FamilyWithIncompleteEvent" use_regex="False">
      </rule>
      <rule class="PersonWithIncompleteEvent" use_regex="False">
      </rule>
      <rule class="HasUnknownGender" use_regex="False">
      </rule>
      <rule class="NoBirthdate" use_regex="False">
      </rule>
      <rule class="NoDeathdate" use_regex="False">
      </rule>
      <rule class="HasRelationship" use_regex="False">
        <arg value=""/>
        <arg value="Unknown"/>
        <arg value=""/>
      </rule>
    </filter>
    <filter name="8 Ancestor Generations of Home Person" function="and" comment="Direct Ancestors">
      <rule class="IsLessThanNthGenerationAncestorOfDefaultPerson" use_regex="False">
        <arg value="25"/>
      </rule>
    </filter>
    <filter name="Children of Filter" function="and">
      <rule class="IsChildOfFilterMatch" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
    <filter name="Clipboard" function="and" comment="Created on 2022/10/04">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^I0000603$|^I0000637$"/>
      </rule>
    </filter>
    <filter name="Connection" function="and">
      <rule class="RelationshipPathBetween" use_regex="False">
        <arg value="I0000104"/>
        <arg value="I0001050"/>
      </rule>
    </filter>
    <filter name="Cousin" function="and">
      <rule class="RelationshipPathBetween" use_regex="False">
        <arg value="HJS-4203-4"/>
        <arg value="I0047785"/>
      </rule>
    </filter>
    <filter name="Degree" function="and">
      <rule class="DegreesOfSeparation" use_regex="False">
        <arg value="I0002160"/>
        <arg value="10"/>
      </rule>
    </filter>
    <filter name="Descendants" function="and" comment="Created on 2022/09/01">
      <rule class="IsDescendantFamilyOf" use_regex="False">
        <arg value="I0000561"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="Direct" function="and">
      <rule class="IsAncestorOf" use_regex="False">
        <arg value="IS2022_02"/>
        <arg value="1"/>
      </rule>
    </filter>
  </object>
  <object type="Citation">
    <filter name="Citation (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="CID#"/>
      </rule>
      <rule class="HasCitation" use_regex="False">
        <arg value="Vol-page"/>
        <arg value="2007"/>
        <arg value="0"/>
      </rule>
      <rule class="RegExpSourceIdOf" use_regex="False">
        <arg value="SID#"/>
      </rule>
      <rule class="HasSource" use_regex="False">
        <arg value="STitle"/>
        <arg value="SAuthor"/>
        <arg value="SAbbr"/>
        <arg value="SPubl"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="aNote"/>
      </rule>
      <rule class="HasSourceNoteRegexp" use_regex="False">
        <arg value="SNote"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="complete"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^C000005$"/>
      </rule>
    </filter>
    <filter name="No notes" function="and">
      <rule class="HasNote" use_regex="False">
        <arg value="1"/>
        <arg value="less than"/>
      </rule>
    </filter>
  </object>
  <object type="Place">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^P001070$"/>
      </rule>
    </filter>
    <filter name="Default" function="and">
      <rule class="HasSourceCount" use_regex="False">
        <arg value="1"/>
        <arg value="less than"/>
      </rule>
    </filter>
    <filter name="IsEnclosedBy" function="and" comment="Places enclosed">
      <rule class="IsEnclosedBy" use_regex="False">
        <arg value="P0003"/>
        <arg value="0"/>
      </rule>
    </filter>
    <filter name="MatchesPlaceFilter" function="and">
      <rule class="MatchesFilter" use_regex="False">
        <arg value="IsEnclosedBy"/>
      </rule>
    </filter>
    <filter name="Place (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="IsEnclosedBy" use_regex="False">
        <arg value="P000957"/>
        <arg value="0"/>
      </rule>
      <rule class="HasData" use_regex="False">
        <arg value="aName"/>
        <arg value="Borough"/>
        <arg value="PostalCode"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="NoteTest"/>
      </rule>
      <rule class="WithinArea" use_regex="False">
        <arg value="P001070"/>
        <arg value="50"/>
        <arg value="1"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="complete"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
  </object>
  <object type="Family">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^F000003$"/>
      </rule>
    </filter>
    <filter name="Families" function="or">
      <rule class="ChildHasIdOf" use_regex="False">
        <arg value="I00000044"/>
      </rule>
      <rule class="FatherHasIdOf" use_regex="False">
        <arg value="I00000044"/>
      </rule>
      <rule class="MotherHasIdOf" use_regex="False">
        <arg value="I00000044"/>
      </rule>
    </filter>
    <filter name="Family (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="RegExpFatherName" use_regex="False">
        <arg value="Dad'sName"/>
      </rule>
      <rule class="RegExpMotherName" use_regex="False">
        <arg value="Mom'sName"/>
      </rule>
      <rule class="RegExpChildName" use_regex="False">
        <arg value="Child"/>
      </rule>
      <rule class="HasEvent" use_regex="False">
        <arg value="Marriage"/>
        <arg value=""/>
        <arg value=""/>
        <arg value=""/>
        <arg value=""/>
      </rule>
      <rule class="HasRelType" use_regex="False">
        <arg value="Married"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="note text"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="complete"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
    <filter name="Role" function="and">
      <rule class="HasFamilyEventRole" use_regex="False">
        <arg value="Unknown"/>
        <arg value="0"/>
      </rule>
    </filter>
  </object>
  <object type="Media">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^O000009$"/>
      </rule>
    </filter>
    <filter name="count" function="and">
      <rule class="HasReferenceCountOf" use_regex="False">
        <arg value="equal to"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="Media (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="HasMedia" use_regex="False">
        <arg value="mTitle"/>
        <arg value="mType"/>
        <arg value="mPath"/>
        <arg value="1700"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="aNote"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="ToDo"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
    <filter name="No References" function="and">
      <rule class="HasReferenceCountOf" use_regex="False">
        <arg value="less than"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="References" function="and">
      <rule class="HasReferenceCountOf" use_regex="False">
        <arg value="less than"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="Tag" function="and">
      <rule class="HasTag" use_regex="False">
        <arg value="Private"/>
      </rule>
    </filter>
  </object>
  <object type="Event">
    <filter name="1degree" function="and">
      <rule class="MatchesPersonFilter" use_regex="False">
        <arg value="1 degree"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="Birth or Death" function="one" comment="Finds only Birth or Death Events">
      <rule class="HasType" use_regex="False">
        <arg value="Birth"/>
      </rule>
      <rule class="HasType" use_regex="False">
        <arg value="Death"/>
      </rule>
    </filter>
    <filter name="Birth2 (scraped filter)" function="and">
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Event (scraped filter)"/>
      </rule>
    </filter>
    <filter name="BirthNoPlace" function="and" comment="Finds Birth and Death Events with no Place data">
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Birth or Death"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Missing Data"/>
      </rule>
    </filter>
    <filter name="Event (scraped filter)" function="and">
    </filter>
    <filter name="Events of Filter" function="and">
      <rule class="MatchesPersonFilter" use_regex="False">
        <arg value="Male"/>
        <arg value="1"/>
      </rule>
    </filter>
    <filter name="Invalid" function="and">
      <rule class="HasInValidDate" use_regex="False">
      </rule>
    </filter>
    <filter name="MatchesEventFilter" function="and" comment="Events in a Place">
      <rule class="MatchesPlaceFilter" use_regex="False">
        <arg value="IsEnclosedBy"/>
      </rule>
    </filter>
    <filter name="Missing Data" function="or" comment="Missing Filters">
      <rule class="MatchesFilter" use_regex="False">
        <arg value="No Place"/>
      </rule>
      <rule class="HasInValidDate" use_regex="False">
      </rule>
    </filter>
    <filter name="No Place" function="and" invert="1" comment="Finds Events without Place data">
      <rule class="HasData" use_regex="True">
        <arg value=""/>
        <arg value=""/>
        <arg value="*"/>
        <arg value=""/>
      </rule>
    </filter>
    <filter name="No References" function="and">
      <rule class="HasReferenceCountOf" use_regex="False">
        <arg value="equal to"/>
        <arg value="0"/>
      </rule>
    </filter>
  </object>
  <object type="Source">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^S000003$"/>
      </rule>
    </filter>
    <filter name="Source (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="HasSourceBase" use_regex="False">
        <arg value="aSourceTitle"/>
        <arg value="SourceAuthor"/>
        <arg value="Abbrev."/>
        <arg value="Publ."/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="SomeNoteText"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="complete"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
  </object>
  <object type="Repository">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^R0002$"/>
      </rule>
    </filter>
    <filter name="Repository (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="HasRepo" use_regex="False">
        <arg value="RepositoryName"/>
        <arg value="Bookstore"/>
        <arg value="anAddress"/>
        <arg value="aURL"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="aNote"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="ToDo"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
    <filter name="Repository (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="False">
        <arg value="ID#"/>
      </rule>
      <rule class="HasRepo" use_regex="False">
        <arg value="RepositoryName"/>
        <arg value="Bookstore"/>
        <arg value="anAddress"/>
        <arg value="aURL"/>
      </rule>
      <rule class="HasNoteRegexp" use_regex="False">
        <arg value="aNote"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="ToDo"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
  </object>
  <object type="Note">
    <filter name="Clipboard" function="and" comment="Created on 2022/10/06">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="^N000011$"/>
      </rule>
    </filter>
    <filter name="Note (scraped filter)" function="and">
      <rule class="RegExpIdOf" use_regex="True">
        <arg value="ID#"/>
      </rule>
      <rule class="HasNote" use_regex="True">
        <arg value="someText"/>
        <arg value="Attribute Note"/>
      </rule>
      <rule class="HasTag" use_regex="False">
        <arg value="ToDo"/>
      </rule>
      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
    </filter>
  </object>
</filters>
emyoulation commented 1 year ago

Cross-posted to Discourse forum

I can think of 2 specific ways that Custom Rules can decay:

Besides being referenced by name in the custom_filters.xml, bad Rules can be referenced in:

This problem is similar to link rot for URLs.

The project probably needs to:

Example reference by index: <option name="filter" value="5"/>

Example reference by type and index:

  <option name="media" value="True"/>
  <option name="media_filter" value="4"/>

Example of Custom Filter referenced from within another Custom Filter:


      <rule class="MatchesFilter" use_regex="False">
        <arg value="Clipboard"/>
      </rule>
kkujansuu commented 1 year ago

If "a Custom Filter references an add-on query rule that is not installed" then Gramps discards the rule when initially loading custom_filters.xml. So this tool never sees such a rule! Nothing it needs to do!?

emyoulation commented 1 year ago

That's good to know... but disturbing too.

Now I have to experiment to see what happens. Will I lose all my libraries of SuperTool custom filters when 5.2 is released? It won't have any of the generic rule add-ons installed when run the 1st time. And I'll have to run it to install the add-ons.