Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Delaying unlink or write on a model whose method was replaced raises AttributeError at enqueue time

Aberta
#996 0 comentários 1 reação 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Um pull request relacionado já foi integrado.

  • #998 de @akarazhev — integrado

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
backend

Direção de pesquisa

Start by tracing the delayed-call method lookup and job serialization path described in the report, especially queue_job/job.py methods func, description, and _store_values. Reproduce the issue with the provided res.partner.unlink replacement and verify the behavior for both delayable() and with_delay(). Done means the job records and resolves the originally requested method name; an open linked pull request already addresses this issue.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug

Module

queue_job (18.0.1.3.0).

Describe the bug

A delayed call (delayable() and with_delay()) is recorded by the __name__ of the function that the
attribute lookup happened to return, not by the name that was looked up

 recordset_method = getattr(self.recordset, name)
self._job_method = recordset_method 

This leads to:

  File "queue_job/job.py", in _store_values
      "name": self.description,
  File "queue_job/job.py", in description
      elif self.func.__doc__:
  File "queue_job/job.py", in func
      return getattr(recordset, self.method_name)
  AttributeError: 'res.partner' object has no attribute 'unlink_renamed'

To Reproduce

Affected Versions:
Occured on 18.0 but code is unchanged on newer versions.

  cls = type(env["res.partner"])
  original = cls.unlink

  def unlink_renamed(self):
      return unlink_renamed.origin(self)

  unlink_renamed.origin = original
  cls.unlink = unlink_renamed

  partner = env["res.partner"].create({"name": "test"})
  partner.delayable().unlink().delay()

Expected behavior
The job records the method under the name it was requested with, and resolves
that name again, independent of what the attribute currently points at.

Additional context
Where this shows up in practice

auditlog (https://github.com/OCA/server-tools) installs its replacements as write_full and unlink_full into
the write and unlink slots, so any delayed write or unlink on an
audited model fails this way.

Linguagem predominante
Python
Estrelas
271
Forks
602
Merge médio
4d 4h
PRs com merge (30d)
6

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de OCA/queue

Todas as issues de OCA/queue

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.