Skip to content

Add deserialization_exception field for programmatic error handling#316

Open
bjester wants to merge 2 commits intolearningequality:release-v0.8.xfrom
bjester:des-exc
Open

Add deserialization_exception field for programmatic error handling#316
bjester wants to merge 2 commits intolearningequality:release-v0.8.xfrom
bjester:des-exc

Conversation

@bjester
Copy link
Copy Markdown
Member

@bjester bjester commented Apr 14, 2026

Summary

This allows programmatic handling of deserialization errors instead of parsing error messages

  • Adds a new deserialization_exception nullable field to Store model that stores the fully-qualified exception class path when deserialization fails
  • Updates existing deserialization_error field to be nullable
  • Updates handling of deserialization errors to set both fields, or otherwise null both of them
  • Adds tests for changes
  • Removes migration tests that verified the squash migration, which now cause issues with new migrations

References

Followup to #306
Closes #315

AI Usage

Directed an AI agent to tackle the issue, iterated on its work for a loop, then did a small refactor myself. Had the AI agent add test coverage, then reviewed.

Comment thread morango/sync/operations.py
Copy link
Copy Markdown
Member

@ozer550 ozer550 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be wrong but it seems like we are doing opposite of "skip rows that previously failed deserialization" ? Was this change in behavior intended? Also adding some tests to verify the null string change for skipping would be useful!

Comment thread morango/sync/operations.py
Copy link
Copy Markdown
Member

@ozer550 ozer550 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did a grep on places where we had "deserialization_exception" and found a place where we might need to add the execution path as well?

Comment thread morango/sync/operations.py Outdated
@bjester
Copy link
Copy Markdown
Member Author

bjester commented Apr 24, 2026

@ozer550 I've updated it to set the exception in the code you found. I also grepped and found some backend code setting to empty string. We probably didn't to set it there, but I updated the code anyway, to be have parity with deserialization_error handling.

Copy link
Copy Markdown
Member

@ozer550 ozer550 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a small suggestion not a blocker regarding the Interity Error. Otherwise looks good to me.

to_pk=to_pk_field.to_python(to_pk),
)
}
err = IntegrityError(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason we are specifically choosing IntegrityError here? This is validation issue rather than DB integrity one? Might lead to misinterpretations? Would it be better to have a special dedicated Morango error class?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nominally the function "validates", but it validates FKs. The previous implementation was trying to emulate a validation error, but in reality, a missing FK is an integrity issue. Continuing to have it be represented as a validation error, which isn't entirely specific, doesn't benefit the ability to analyze the errors (i.e. new deserialization_exception). So this is an improvement by being more specific, which wasn't really necessary before without deserialization_exception

Copy link
Copy Markdown
Member

@ozer550 ozer550 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lgtm! Thanks Blaine.

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

Successfully merging this pull request may close these issues.

2 participants