Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switching from Persons to Events category throws an error #22

Open
emyoulation opened this issue Oct 6, 2022 · 6 comments
Open

Switching from Persons to Events category throws an error #22

emyoulation opened this issue Oct 6, 2022 · 6 comments

Comments

@emyoulation
Copy link

emyoulation commented Oct 6, 2022

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
Copy link
Author

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
Copy link
Owner

kkujansuu commented Oct 8, 2022

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
Copy link
Author

emyoulation commented Oct 8, 2022

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
Copy link
Author

Cross-posted to Discourse forum

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

  • a Custom Filter references an add-on query rule that is not installed
  • a multi-stage (or multi-rule) Custom Filter references another Custom Filter that has been deleted or renamed.

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

  • books.xml and report_options.xml (by an option name="filter", a VERY fragile index)
  • tool_options.xml (by type and name)

This problem is similar to link rot for URLs.

The project probably needs to:

  • define the methods for gracefully handling the 2 variants of degraded Custom Filters
  • harmonize the XML reference to filters

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
Copy link
Owner

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
Copy link
Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants