代码之家  ›  专栏  ›  技术社区  ›  Stone

如何在另一个环境中运行odoo自动调度(cron作业)

  •  0
  • Stone  · 技术社区  · 6 年前

    所以我将有3个环境:

    1. 数据库环境
    2. 其他环境

    从生产环境复制“其他环境”以运行所有计划的操作。两个环境都将连接到数据库环境。

    我的问题是如何配置ir.cron,以便在生产环境中不运行调度器,而是在其他环境中运行?

    或者

    有没有其他方法来实现我的目标,在另一个环境下做重过程的建议??

    1 回复  |  直到 6 年前
        1
  •  0
  •   Stone    6 年前

    回答我自己的问题:

    threading & Odoo web service API 为了实现我的目标。

    # -*- coding: utf-8 -*-
    
    import xmlrpclib
    import logging
    from functools import partial
    
    from odoo import _, api, fields, models, registry, SUPERUSER_ID
    
    _logger = logging.getLogger(__name__)
    
    class BaseReport(models.TransientModel):
        _name = 'base.report'
        _description = 'Base Object for All Reports'
    
        @api.multi
        def action_print(self):
            qms_url = self.env['ir.config_parameter'].get_param('web.qms.url')
    
            import threading
            # call the maintainence_function here
            t = threading.Thread(target=self.execute_queue, args=[qms_url])
            # setDaemon=False to stop the thread after complete
            t.setDaemon(False)
            # starting the thread
            t.start()
    
            return True
    
        @api.multi
        def execute_queue(self, qms_url):
            try:
                _logger.info("Queue [{}] Execution Starting !".format(self.id))
    
                self.ensure_one()
    
                common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(qms_url))
                models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(qms_url))
                uid = common.authenticate(self.env.cr.dbname, '{your_username}', '{your_userpassword}', {})
    
                models.execute_kw(self.env.cr.dbname, uid, '{your_userpassword}', 'queue.management.line', 'execute_thread', [self.id])
    
                _logger.info("Queue [{}] Execution Done Successfully !".format(self.id))
    
            except Exception as Ex:
                _logger.exception("Queue [{}] Execution Failed !".format(self.id))
    
            finally:
                return True
    
        @api.model
        def execute_thread(self, queue_id):
            def run_queue(queue_id, dbname):
                db_registry = registry(dbname)
    
                with api.Environment.manage(), db_registry.cursor() as cr:
                    env = api.Environment(cr, SUPERUSER_ID, {})
    
                    try:
                        {do_your_action_here}
    
                    except Exception as Ex:
                        _logger.exception("Queue [{}] Execution Failed !".format(queue_id))
    
            self.env.cr.after("commit", partial(run_queue, queue_id, self.env.cr.dbname))
    
            return True
    

    希望对你也有帮助。