Search code examples
odooodoo-9

Thread when confirming invoice


when creating invoice I want to add it to the thread if there is more than 17 invoice_lines

        @api.multi
        def _run_threaded_invoice(self, ):
            with Environment.manage():
                new_cr = self.pool.cursor()
                self = self.with_env(self.env(cr=new_cr))
                self.action_invoice_open()
                new_cr.commit()
                new_cr.close()


    @api.multi
    def action_invoice_open(self):
        thread = False
        if self.type == 'in_invoice' and len(self.invoice_line_ids) > 17 and thread == False:
            thread = True
            threaded_calculation = threading.Thread(
                target=self._run_threaded_invoice)
            threaded_calculation.start()



           #and other logic that i have added to this method 

but i do get errors

TransactionRollbackError: could not serialize access due to concurrent update

PoolError: The Connection Pool Is Full

this looks very familiar to me as recursion error...

how do i set up thread correctly?


Solution

  • If it's recursive use context to prevent from repeating the same operation

    @api.multi
    def _run_threaded_invoice(self, ):
        with Environment.manage():
            new_cr = self.pool.cursor()
            self = self.with_env(self.env(cr=new_cr))
            # add the key to the context
            self.with_context(is_in_thread=True).action_invoice_open()
            new_cr.commit()
            new_cr.close()
    
    
    
    
    @api.multi
    def action_invoice_open(self):
        is_in_thread = self.env.context('is_in_thread', False)
        if not is_in_thread and self.type == 'in_invoice' and len(self.invoice_line_ids) > 17:
            threaded_calculation = threading.Thread(
                target=self._run_threaded_invoice)
            threaded_calculation.start()
            return True # Let the thread do the job
    
        # this logic is execute by the new thread if > 17 or the main thread  <17   
        .......
        .......
        ......