40 lines
2.2 KiB
Python
40 lines
2.2 KiB
Python
|
from odoo import models, api
|
||
|
|
||
|
|
||
|
class IrAttachment(models.Model):
|
||
|
_inherit = 'ir.attachment'
|
||
|
|
||
|
@api.model_create_multi
|
||
|
def create(self, vals_list):
|
||
|
attachments = super().create(vals_list)
|
||
|
if self.env.context.get('sync_attachment', True):
|
||
|
expenses_attachments = attachments.filtered(lambda att: att.res_model == 'hr.expense')
|
||
|
if expenses_attachments:
|
||
|
expenses = self.env['hr.expense'].browse(expenses_attachments.mapped('res_id'))
|
||
|
for expense in expenses.filtered('sheet_id'):
|
||
|
checksums = set(expense.sheet_id.attachment_ids.mapped('checksum'))
|
||
|
for attachment in expense.attachment_ids.filtered(lambda att: att.checksum not in checksums):
|
||
|
attachment.copy({
|
||
|
'res_model': 'hr.expense.sheet',
|
||
|
'res_id': expense.sheet_id.id,
|
||
|
})
|
||
|
return attachments
|
||
|
|
||
|
def unlink(self):
|
||
|
if self.env.context.get('sync_attachment', True):
|
||
|
attachments_to_unlink = self.env['ir.attachment']
|
||
|
expenses_attachments = self.filtered(lambda att: att.res_model == 'hr.expense')
|
||
|
if expenses_attachments:
|
||
|
expenses = self.env['hr.expense'].browse(expenses_attachments.mapped('res_id'))
|
||
|
for expense in expenses.exists().filtered('sheet_id'):
|
||
|
checksums = set(expense.attachment_ids.mapped('checksum'))
|
||
|
attachments_to_unlink += expense.sheet_id.attachment_ids.filtered(lambda att: att.checksum in checksums)
|
||
|
sheets_attachments = self.filtered(lambda att: att.res_model == 'hr.expense.sheet')
|
||
|
if sheets_attachments:
|
||
|
sheets = self.env['hr.expense.sheet'].browse(sheets_attachments.mapped('res_id'))
|
||
|
for sheet in sheets.exists():
|
||
|
checksums = set((sheet.attachment_ids & sheets_attachments).mapped('checksum'))
|
||
|
attachments_to_unlink += sheet.expense_line_ids.attachment_ids.filtered(lambda att: att.checksum in checksums)
|
||
|
super(IrAttachment, attachments_to_unlink).unlink()
|
||
|
return super().unlink()
|