-
Notifications
You must be signed in to change notification settings - Fork 23
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
#3528: Fix error handling on new member form - [ZA] #3606
Changes from 6 commits
d4bcd03
88e8b2d
f4c48b5
330a246
4d77e29
9ded05f
b694a78
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -445,3 +445,28 @@ class PortfolioNewMemberForm(BasePortfolioMemberForm): | |
class Meta: | ||
model = PortfolioInvitation | ||
fields = ["portfolio", "email", "roles", "additional_permissions"] | ||
|
||
def _post_clean(self): | ||
""" | ||
Override _post_clean to customize model validation errors. | ||
This runs after form clean is complete, but before the errors are displayed. | ||
""" | ||
try: | ||
super()._post_clean() | ||
self.instance.clean() | ||
except forms.ValidationError as e: | ||
override_error = False | ||
if hasattr(e, "code"): | ||
field = "email" if "email" in self.fields else None | ||
if e.code == "has_existing_permissions": | ||
self.add_error(field, f"{self.instance.email} is already a member of another .gov organization.") | ||
override_error = True | ||
elif e.code == "has_existing_invitations": | ||
self.add_error( | ||
field, f"{self.instance.email} has already been invited to another .gov organization." | ||
) | ||
override_error = True | ||
|
||
# Errors denoted as "__all__" are special error types reserved for the model level clean function | ||
if override_error and "__all__" in self._errors: | ||
del self._errors["__all__"] | ||
zandercymatics marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this error be re-raised at the end here in case none of those conditionals hit? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nah, not needed. But good thoughts. One con of this approach is that The pro of this approach is that all other error types are "carried through" so even if the underlying clean changes, everything will work normally as it seems like post clean doesn't rely on try/catch. Only one error is raised at a time here, so we can get away with doing this. The problem I was facing is that _post_clean is not defined normally, its generated on the fly based off of rules I do not fully understand as of now. In other words, its very much an internal function that would require inheriting at a very low level |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
An alternative to this approach would be to modify the error itself in portfolio_helper. The reason why this is not done is because there is a separate AC which requires a certain message on django admin.
This is the earliest hook I could find to modify this, but if you know of something earlier let me know!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The only other place I can think to do this would be in the PortfolioAddMemberView before the form even submits. That said, I honestly don't know if that would be any better and I have no problem with this current approach.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah it's tricky, I spent a long time staring at Django's codebase trying to figure this one out. Thanks for the feedback here