Odoo:在Thread中调用self.env或其他模型

时间:2017-02-03 14:11:56

标签: python multithreading model openerp

在odoo 10中,我有一个线程调用一个使用self.env来调用模型的方法。但是当系统不让我占用这个并抛出这样的异常时:

Exception in thread Thread-44:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
  File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 97, in update_quotations_thread
quotation_list = self.download_comercionet_docs();
  File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 370, in download_comercionet_docs
new_last_date_db = (self.env["ftp_orders.settings"]).search([])[0].last_date
  File "/home/kunder/proyectos/odoo/odoo/models.py", line 1508, in search
res = self._search(args, offset=offset, limit=limit, order=order, count=count)
  File "/home/kunder/proyectos/odoo/odoo/models.py", line 4193, in _search
self.sudo(access_rights_uid or self._uid).check_access_rights('read')
  File "/home/kunder/proyectos/odoo/odoo/models.py", line 4842, in sudo
return self.with_env(self.env(user=user))
  File "/home/kunder/proyectos/odoo/odoo/api.py", line 781, in __call__
return Environment(cr, uid, context)
  File "/home/kunder/proyectos/odoo/odoo/api.py", line 726, in __new__
env, envs = None, cls.envs
  File "/home/kunder/proyectos/odoo/odoo/tools/func.py", line 111, in __get__
return self.fget.__get__(None, owner)()
  File "/home/kunder/proyectos/odoo/odoo/api.py", line 699, in envs
return cls._local.environments
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 72, in __getattr__
    raise AttributeError(name)
  AttributeError: environments

我处理模型中的线程,我处理线程的方式是:

def thread_method(self):
     #This method call other model like this and do some other stuff
     self.env['sale.order'].search([])
def main_method(self):
     threading.Thread(target = self.method_thread).start()

我正在调试代码,如果我坐在main_method上,它有与thread_method相同的对象self.env,所以我不明白为什么它不起作用。

如何在线程中请求其他模型?

由于

3 个答案:

答案 0 :(得分:4)

对于线程方法,您需要创建自己的环境

from openerp import models, api
from openerp.modules.registry import Registry 

def threaded_method(self):
    with api.Environment.manage():

选中此项以获取更多https://github.com/odoo/odoo/blob/10.0/addons/stock/wizard/procurement_orderpoint_compute.py#L21

答案 1 :(得分:3)

你可以找一个如何在Odoo插件的procurement_orderpoint_compute.py文件中启动一个线程的例子。

def _procure_calculation_orderpoint(self):
    with api.Environment.manage():
        # As this function is in a new thread, I need to open a new cursor, because the old one may be closed
        new_cr = self.pool.cursor()
        self = self.with_env(self.env(cr=new_cr))
        scheduler_cron = self.sudo().env.ref('procurement.ir_cron_scheduler_action')
        # Avoid to run the scheduler multiple times in the same time
        try:
            with tools.mute_logger('odoo.sql_db'):
                self._cr.execute("SELECT id FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT", (scheduler_cron.id,))
        except Exception:
            _logger.info('Attempt to run procurement scheduler aborted, as already running')
            self._cr.rollback()
            self._cr.close()
            return {}

        self.env['procurement.order']._procure_orderpoint_confirm(
            use_new_cursor=new_cr.dbname,
            company_id=self.env.user.company_id.id)
        new_cr.close()
        return {}

或者如果您考虑使用OCA queue

,可能会更好

答案 2 :(得分:0)

new_cr = self.pool.cursor()
self = self.with_env(self.env(cr=new_cr))

pdb.set_trace()

id_data=self.env['cw.test.module'].create({'name':self.id})
id_data.master_data()
new_cr.commit()

new_cr.close()

使用new_cr.commit()提交新光标