You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.5 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
  3. # Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
  4. # Copyright 2016 Tecnativa - Vicent Cubells
  5. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  6. from openerp import models, api, exceptions, _
  7. class ResPartner(models.Model):
  8. """Assigns 'ref' from a sequence on creation and copying"""
  9. _inherit = 'res.partner'
  10. @api.model
  11. def _needsRef(self, partner_id=None, vals=None):
  12. """
  13. Checks whether a sequence value should be assigned to a partner's 'ref'
  14. :param partner_id: id of the partner object
  15. :param vals: known field values of the partner object
  16. :return: true if a sequence value should be assigned to the
  17. partner's 'ref'
  18. """
  19. if not vals and not partner_id:
  20. raise exceptions.Warning(
  21. _('Either field values or an id must be provided.')
  22. )
  23. if vals is None:
  24. vals = {}
  25. values = vals.copy()
  26. # only assign a 'ref' to commercial partners
  27. if partner_id:
  28. partner = self.browse(partner_id)
  29. values.setdefault('is_company', partner.is_company)
  30. values.setdefault('parent_id', partner.parent_id.id)
  31. return values.get('is_company') or not values.get('parent_id')
  32. @api.model
  33. def _commercial_fields(self):
  34. """
  35. Make the partner reference a field that is propagated
  36. to the partner's contacts
  37. """
  38. return super(ResPartner, self)._commercial_fields() + ['ref']
  39. @api.model
  40. def _get_next_ref(self, partner=None, vals=None):
  41. return self.env['ir.sequence'].next_by_code('res.partner')
  42. @api.model
  43. def create(self, vals):
  44. if not vals.get('ref') and self._needsRef(vals=vals):
  45. vals['ref'] = self._get_next_ref(vals=vals)
  46. return super(ResPartner, self).create(vals)
  47. @api.multi
  48. def write(self, vals):
  49. for partner in self:
  50. ref = vals.get('ref') if 'ref' in vals else partner.ref
  51. if not ref and self._needsRef(partner.id, vals):
  52. vals['ref'] = self._get_next_ref(partner, vals)
  53. super(ResPartner, partner).write(vals)
  54. return True
  55. @api.multi
  56. def copy(self, default=None):
  57. for partner in self:
  58. default = default or {}
  59. if self._needsRef(self.id):
  60. default.update({
  61. 'ref': self._get_next_ref(),
  62. })
  63. return super(ResPartner, self).copy(default)