From c19ac9e30a8455266d4843ba8957f4290d91a824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Voet=20=28ryv=29?= Date: Mon, 11 Jan 2021 10:36:44 +0000 Subject: [PATCH] [FIX] purchase: fix forbidden access of partner Issue: For purchase user, which doesn't have the "Contact Creation" can't create a purchase, get a AccessError. The fields `receipt_reminder_email` and `reminder_date_before_receipt` should be writable also for purchase user which doesn't have access to write and create `res.partner`. close odoo/odoo#64135 closes odoo/odoo#73131 X-original-commit: f29b1e81e6adf8532ecf90f9ecb675ec56eb4c61 Signed-off-by: William Henrotin --- addons/purchase/models/purchase.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 3e8de6c93e5..32c6a94b076 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -202,6 +202,13 @@ class PurchaseOrder(models.Model): if self.date_planned: self.order_line.filtered(lambda line: not line.display_type).date_planned = self.date_planned + def write(self, vals): + vals, partner_vals = self._write_partner_values(vals) + res = super().write(vals) + if partner_vals: + self.partner_id.sudo().write(partner_vals) # Because the purchase user doesn't have write on `res.partner` + return res + @api.model def create(self, vals): company_id = vals.get('company_id', self.default_get(['company_id'])['company_id']) @@ -212,7 +219,11 @@ class PurchaseOrder(models.Model): if 'date_order' in vals: seq_date = fields.Datetime.context_timestamp(self, fields.Datetime.to_datetime(vals['date_order'])) vals['name'] = self_comp.env['ir.sequence'].next_by_code('purchase.order', sequence_date=seq_date) or '/' - return super(PurchaseOrder, self_comp).create(vals) + vals, partner_vals = self._write_partner_values(vals) + res = super(PurchaseOrder, self_comp).create(vals) + if partner_vals: + res.sudo().write(partner_vals) # Because the purchase user doesn't have write on `res.partner` + return res @api.ondelete(at_uninstall=False) def _unlink_if_cancelled(self): @@ -841,6 +852,14 @@ class PurchaseOrder(models.Model): new_receipt_date=date.date() ) + def _write_partner_values(self, vals): + partner_values = {} + if 'receipt_reminder_email' in vals: + partner_values['receipt_reminder_email'] = vals.pop('receipt_reminder_email') + if 'reminder_date_before_receipt' in vals: + partner_values['reminder_date_before_receipt'] = vals.pop('reminder_date_before_receipt') + return vals, partner_values + class PurchaseOrderLine(models.Model): _name = 'purchase.order.line'