2017-02-03 2 views
2

В odoo 10 у меня есть поток, вызывающий метод, который использует self.env для вызова модели. Но когда система не позволяет мне занимать это и бросает исключение, как это:Odoo: Call self.env или другая модель в Thread

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, у него есть тот же самый объект self.env, у которого есть thread_method, поэтому я не понимаю, почему он не работает.

Как я могу запросить другую модель в потоке?

Благодаря

+0

Поделитесь полной трассировкой стека пожалуйста –

+0

@GeorgeDaramouskas полная трассировка стека обновляется –

ответ

3

Для древовидного метода вы должны создать свою собственную среду

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

+0

Это работает, мой метод работает в потоке. Но у меня проблема, когда я добавляю записи в свои модели, добавление не вызывает ошибку, но когда я вижу, что модуль продажи в котировках не показывает добавлений, которые должны быть созданы. –

+0

odoo создает среду только для одной транзакции, поэтому, когда вы запускаете метод в отдельном потоке, обычный процесс будет выполнять свою работу и уничтожать окружающую среду. пока ваш многопоточный метод все еще запущен –

3

вы можете найти пример того, как начать нить в procurement_orderpoint_compute.py файл из Odoo аддонов.

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 {} 

Или, может быть, лучше, если вы считаете, использовать ОСА queue

+0

Это работает, мой метод работает в потоке. Но у меня проблема, когда я добавляю записи в свои модели, добавление не вызывает ошибку, но когда я вижу, что модуль продажи в котировках не показывает добавлений, которые должны быть созданы. –

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() для фиксации нового cur sor

Смежные вопросы