Uh oh!
There was an error while loading. Please reload this page.
[FIX] queue_job: repoint default_env to SUPERUSER in runjob - #923
Conversation
OCA-git-bot
commented
Apr 22, 2026
runjob is declared auth="none", so _auth_method_none pins request.env and transaction.default_env to a uid=None env. `env = http.request.env( user=SUPERUSER_ID)` only creates a local superuser env, leaving the default_env as uid=None. Any flush that goes through Transaction.flush() -> default_env.flush_all() then recomputes stored fields as uid=None and fails on anything dereferencing self.env.user. `http.request.update_env(user=SUPERUSER_ID)` additionally sets transaction.default_env to the superuser env. ClosesOCA#922
4a36fc9 to
415420fComparedannyadair
commented
Jun 29, 2026
Rebased after #924 was merged. |
There was a problem hiding this comment.
Seems reasonable after reading the source here and https://github.com/odoo/odoo/blob/19.0/odoo/http.py#L1856-L1867:
defupdate_env(self, user=None, context=None, su=None):
""" Update the environment of the current request. :param user: optional user/user id to change the current user :type user: int or :class:`res.users record<~odoo.addons.base.models.res_users.ResUsers>` :param dict context: optional context dictionary to change the current context :param bool su: optional boolean to change the superuser mode """cr=None# None is a sentinel, it keeps the same cursorself.env=self.env(cr, user, context, su)
self.env.transaction.default_env=self.envthreading.current_thread().uid=self.env.uidThat said, why make the change? What problem does this avoid? ☕ Unit test that problem?
dannyadair
commented
Jun 29, 2026
The problem is described in #922 and solved by this PR. |
amh-mw
commented
Jun 29, 2026
Yep, sorry! Struck through much of my comment already! Still desire a unit test. |
dannyadair
commented
Jul 1, 2026
ok with the existing tests this one would be weak and almost meaningless. (test_run_job_controller just calling class methods so we'd be mocking and verify that our two line change calls the two-line change), I 'll add something using HttpCase. |
588919a to
eeea3eeComparedannyadair
commented
Jul 1, 2026
ugh, sorry for the noise. _acquire_job commits which is forbidden in tests. Have to get tricky. |
Adds test_run_job_controller_http.py covering OCA#922: - test_runjob_pins_default_env_to_superuser asserts that when _acquire_job is entered, env.transaction.default_env.uid is SUPERUSER_ID -- the state a job would inherit at perform time. - test_runjob_without_updating_default_env_leaves_uid_none patches Request.update_env to a no-op and verifies default_env.uid stays None, isolating default_env repointing as the load-bearing behavior of runjob. Tests use HttpCase so _auth_method_none, session handling, and update_env run for real. _acquire_job is patched to return None so the endpoint exits cleanly without performing DB work (its internal commit is forbidden inside tests).
eeea3ee to
fd214cbComparedannyadair
commented
Jul 1, 2026
added test |
Uh oh!
There was an error while loading. Please reload this page.
guewen
left a comment
There was a problem hiding this comment.
Thanks @dannyadair, can you fix the license to match the one of the module please?
OCA-git-bot
commented
Jul 15, 2026
This PR has the |
Co-authored-by: Guewen Baconnier <guewen@baconnier.me>
sbidoul
commented
Jul 20, 2026
/ocabot merge patch |
OCA-git-bot
commented
Jul 20, 2026
Hey, thanks for contributing! Proceeding to merge this for you. |
Uh oh!
There was an error while loading. Please reload this page.
OCA-git-bot
commented
Jul 20, 2026
Congratulations, your PR was merged at d2c1759. Thanks a lot for contributing to OCA. ❤️ |
runjob is declared auth="none", so _auth_method_none pins request.env and transaction.default_env to a uid=None env.
env = http.request.env( user=SUPERUSER_ID)only creates a local superuser env, leaving the default_env as uid=None. Any flush that goes through Transaction.flush() -> default_env.flush_all() then recomputes stored fields as uid=None and fails on anything dereferencing self.env.user.http.request.update_env(user=SUPERUSER_ID)additionally sets transaction.default_env to the superuser env.Closes#922