-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
[18.0][POC] base_exception: Rollback transaction triggering exception rule #3476
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
base: 18.0
Are you sure you want to change the base?
[18.0][POC] base_exception: Rollback transaction triggering exception rule #3476
Conversation
In case a implementation module, eg sale_exception, breaks a function override, ie does not call super on sale.order.action_confirm in case an exception rule applies, it is still possible that another module that is not in the implementation module's dependency, does modify existing the same object through the same function's override that is called before through MRO. As the exception rule is only written in base_exception module, such modifications would be still be committed although the exception was triggered. The only way to rollback everything that happened is to raise an exception that is going to rollback the transaction. However, we still want to commit the write of the exception rule and not to propagate the exception back to the webclient. Since we cannot alter the env in the retrying function (that handles rollback), we do not have any other choice than to use a dedicated cursor in the dispatching function to process the request, since it could trigger the exception rule, and to use the original env to write the exception rule, and have the webclient being refreshed to display the exception. This might break the latest feature to pop up the wizard, but since this is still a POC, we could fix that afterwards in case this POC is accepted.
|
Hi @sebastienbeau, @hparfr, |
base_exception/models/ir_http.py
Outdated
| for rule_id, (model, res_ids) in to_add.items(): | ||
| old_env[model].browse(res_ids).write({"exception_ids": [(4, rule_id)]}) | ||
| for rule_id, (model, res_ids) in to_remove.items(): | ||
| old_env[model].browse(res_ids).write({"exception_ids": [(4, rule_id)]}) |
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.
Beware:
- in the old behavior, old rules were removed before new ones got added, while in here you do the opposite: is this a wanted change?
- the command value should be
3when removing rules,4when adding them, while in here you're always using4: can you please switch toCommand.[un]link(ID)instead to make it easier to read and debug (and also, possibly add tests)?
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.
Good catch, I did focus on the transaction handling, but both are valid points 👍
|
So you want to use an Why not |
In case a implementation module, eg sale_exception, breaks a function override, ie does not call super on sale.order.action_confirm in case an exception rule applies, it is still possible that another module that is not in the implementation module's dependency, does modify existing the same object through the same function's override that is called before through MRO.
As the exception rule is only written in base_exception module, such modifications would be still be committed although the exception was triggered.
The only way to rollback everything that happened is to raise an exception that is going to rollback the transaction. However, we still want to commit the write of the exception rule and not to propagate the exception back to the webclient.
Since we cannot alter the env in the retrying function (that handles rollback), we do not have any other choice than to use a dedicated cursor in the dispatching function to process the request, since it could trigger the exception rule, and to use the original env to write the exception rule, and have the webclient being refreshed to display the exception.
This might break the latest feature to pop up the wizard, but since this is still a POC, we could fix that afterwards in case this POC is accepted.