Mejorando el uso de los attachments (o documentos) en Odoo

22 de enero de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Odoo tiene una genialidad que la comparte en todos los documentos que son los attachments. Un attachment es un archivo que se agrega a un documento (cualquier tipo de objeto, factura o partner por ejemplo) por medio de un widget muy funcional incorporado en el chatter


Y honestamente, es una funcionalidad que es genial. Tiene un pequeño problema. Por una parte no es del todo visible del modo formal (sería lindo que se administren los attachments como los documentos del módulo Document) y por otra parte estaría bueno que se agregue funcionalidad a los attachments; por ejemplo campos extras para categorizarlos, o incorporarlos al workflow del documento (no permitir la validación de un documento si no cuenta con los attachments necesarios). Como podemos hacer esto?

La gente de OCA lo demostró con el módulo contract_document y nosotros incorporamos esas ideas y desarrollamos un par de módulos: partner_document y lead_document que permiten la gestión de documentos a nivel contacto y oportunidad.  Estos módulos se instalan y agregan un smart-button que mejora la vista de los documentos relacionados


Y cuando se clickea se aprecia una vista tree donde se ve no solo el nombre del archivo anexado, sino también se pueden agregar atributos extras que caractericen el documento.


Al clickearse el documento se puede ver el anexo en modo formulario, el cual es un lugar ideal para agregar información extra acerca del attachment


Los módulos que hicimos son a modo de ejemplo, pero se pueden aplicar para cualquier modelo en Odoo (por ejemplo stock.picking o contract.contract en el caso de contratos). Sería ideal manejarlo como un mixin (lo cual se puede hacer), lo que va a ser complicado es agregar dicha funcionalidad en forma genérica para todas las vistas.

Notas técnicas

Ahora lo importante, como extendemos el uso de attachments. Primero agregamos un smart-button en el documento, en este caso extendemos la vista del contacto para agregar el smart-button;

    <record id="partner_document_view_form" model="ir.ui.view">
<field name="name">partner.document.view.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button
class="oe_stat_button"
icon="fa-book"
name="action_get_attachment_tree_view"
type="object"
>
<field
name="documents_count"
widget="statinfo"
string="Documents"
/>
</button>
</div>
<xpath expr="//div[hasclass('oe_chatter')]" position="before">
<div class="o_attachment_preview" />
</xpath>
</field>
</record>

Lo que hacemos es agregar dentro del div button_box, el botón que muestra el campo documents_count (que muestra la cantidad de attachments que tiene el documento) e invoca el método action_get_attachment_tree_view. Veamos como hacemos para calcular el campo documents_count

    documents_count = fields.Integer(
compute="_compute_document_ids",
string="Document Count",
)
    def _compute_document_ids(self):
IrAttachment = self.env["ir.attachment"]
attachments = IrAttachment.search(
[("res_model", "=", self._name), ("res_id", "in", self.ids)]
)

result = dict.fromkeys(self.ids, IrAttachment)
for attachment in attachments:
result[attachment.res_id] |= attachment

for employee in self:
employee.document_ids = result[employee.id]
employee.documents_count = len(employee.document_ids)

Como puede ver hace una búsqueda de los attachments relacionados con el documento, por medio de la clave res_model y res_id. Y luego hace un len del resultado.

El modelo ir.attachment es muy facil de extender, basicamente uno lo extiende como cualquier otro modelo. Se le pueden agregar todos los atributos que se necesiten. Y se lo relaciona con el documento original mediante los campos res_model y res_id. Luego se puede implementar el workflow de documentación necesario en el documento, por ejemplo solicitar que la oportunidad antes de ser confirmada tenga un documento del tipo Scope of Work. 

Gustavo Orrillo 22 de enero de 2024
Compartir
Categorías
Archivar
Identificarse dejar un comentario