Skip to content

Commit 038c334

Browse files
author
Milan Topuzov
committed
models(base), tests(test_queue_job): remove _patch_method; patch in _register_hook; fix auto-delay wrapper
- Remove unused `_patch_method` from Base per review - Update docstring example to patch methods in `_register_hook` - Adjust test models to patch using `functools.update_wrapper` - Fix auto-delay wrapper to store unbound origin and bind at call time Functional change limited to patching helper/tests; no manifest changes.
1 parent 9ea78c5 commit 038c334

File tree

2 files changed

+28
-34
lines changed

2 files changed

+28
-34
lines changed

queue_job/models/base.py

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,17 @@ def foo_job_options(self, arg1):
193193
}
194194
195195
def _register_hook(self):
196-
self._patch_method(
196+
# patch the method at registry time
197+
patched = self._patch_job_auto_delay(
198+
"foo", context_key="auto_delay_foo"
199+
)
200+
setattr(
201+
type(self),
197202
"foo",
198-
self._patch_job_auto_delay("foo", context_key="auto_delay_foo")
203+
functools.update_wrapper(
204+
patched,
205+
getattr(type(self), "foo"),
206+
),
199207
)
200208
return super()._register_hook()
201209
@@ -224,8 +232,9 @@ def auto_delay_wrapper(self, *args, **kwargs):
224232
delayed = self.with_delay(**job_options)
225233
return getattr(delayed, method_name)(*args, **kwargs)
226234

227-
origin = getattr(self, method_name)
228-
return functools.update_wrapper(auto_delay_wrapper, origin)
235+
origin_func = getattr(type(self), method_name)
236+
auto_delay_wrapper.origin = origin_func
237+
return functools.update_wrapper(auto_delay_wrapper, origin_func)
229238

230239
@api.model
231240
def _job_store_values(self, job):
@@ -260,26 +269,5 @@ def _job_prepare_context_before_enqueue(self):
260269
if key in self._job_prepare_context_before_enqueue_keys()
261270
}
262271

263-
@classmethod
264-
def _patch_method(cls, name, method):
265-
"""``api.propagate`` is no longer exposed. We emulate the
266-
propagation by using ``functools.update_wrapper`` and copying the
267-
decorator metadata which Odoo relies on (see orm.decorators).
268-
"""
269-
origin = getattr(cls, name)
270-
method.origin = origin
271-
# carry over wrapper attributes (name, doc, etc.)
272-
wrapped = functools.update_wrapper(method, origin)
273-
# propagate common decorator metadata used by the framework
274-
for attr in (
275-
"_constrains",
276-
"_depends",
277-
"_onchange",
278-
"_ondelete",
279-
"_api_model",
280-
"_api_private",
281-
):
282-
if hasattr(origin, attr):
283-
setattr(wrapped, attr, getattr(origin, attr))
284-
wrapped.origin = origin
285-
setattr(cls, name, wrapped)
272+
# Note: no local _patch_method helper; if needed, patch methods
273+
# directly in _register_hook as shown above.

test_queue_job/models/test_models.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright 2016 Camptocamp SA
22
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
33

4+
import functools
45
from datetime import datetime, timedelta
56

67
from odoo import api, fields, models
@@ -127,15 +128,20 @@ def delay_me_context_key(self):
127128
return "ok"
128129

129130
def _register_hook(self):
130-
self._patch_method("delay_me", self._patch_job_auto_delay("delay_me"))
131-
self._patch_method(
132-
"delay_me_options", self._patch_job_auto_delay("delay_me_options")
131+
patched = self._patch_job_auto_delay("delay_me")
132+
type(self).delay_me = functools.update_wrapper(patched, type(self).delay_me)
133+
134+
patched = self._patch_job_auto_delay("delay_me_options")
135+
type(self).delay_me_options = functools.update_wrapper(
136+
patched, type(self).delay_me_options
133137
)
134-
self._patch_method(
138+
139+
patched = self._patch_job_auto_delay(
135140
"delay_me_context_key",
136-
self._patch_job_auto_delay(
137-
"delay_me_context_key", context_key="auto_delay_delay_me_context_key"
138-
),
141+
context_key="auto_delay_delay_me_context_key",
142+
)
143+
type(self).delay_me_context_key = functools.update_wrapper(
144+
patched, type(self).delay_me_context_key
139145
)
140146
return super()._register_hook()
141147

0 commit comments

Comments
 (0)