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.

122 lines
4.3 KiB

  1. # -*- coding: utf-8 -*-
  2. # © 2015 Antiun Ingeniería S.L. - Antonio Espinosa
  3. # © 2015 Antiun Ingeniería S.L. - Jairo Llopis
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  5. from openerp import models, fields, api
  6. class ResPartner(models.Model):
  7. _inherit = 'res.partner'
  8. nuts1_id = fields.Many2one(
  9. comodel_name='res.partner.nuts', domain=[('level', '=', 1)],
  10. string="NUTS L1")
  11. nuts2_id = fields.Many2one(
  12. comodel_name='res.partner.nuts', domain=[('level', '=', 2)],
  13. string="NUTS L2", oldname="region")
  14. nuts3_id = fields.Many2one(
  15. comodel_name='res.partner.nuts', domain=[('level', '=', 3)],
  16. string="NUTS L3", oldname="substate")
  17. nuts4_id = fields.Many2one(
  18. comodel_name='res.partner.nuts', domain=[('level', '=', 4)],
  19. string="NUTS L4")
  20. @api.multi
  21. def _onchange_nuts(self, level):
  22. field = self["nuts%d_id" % level]
  23. country_id = field.country_id.id
  24. state_id = field.state_id.id
  25. if country_id and self.country_id.id != country_id:
  26. self.country_id = country_id
  27. if state_id and self.state_id.id != state_id:
  28. self.state_id = state_id
  29. if (level - 1) > 0:
  30. parent_id = field.parent_id.id
  31. if parent_id:
  32. parent_field = 'nuts%d_id' % (level - 1)
  33. if self[parent_field].id != parent_id:
  34. self[parent_field] = parent_id
  35. result = dict()
  36. if country_id and level < 4:
  37. result['domain'] = dict()
  38. while level < 4:
  39. parent_field = 'nuts%d_id' % level
  40. domain_field = 'nuts%d_id' % (level + 1)
  41. parent_id = self[parent_field].id
  42. if parent_id:
  43. result['domain'][domain_field] = [
  44. ('parent_id', '=', parent_id),
  45. ]
  46. level += 1
  47. return result
  48. @api.multi
  49. @api.onchange('nuts4_id')
  50. def _onchange_nuts4_id(self):
  51. return self._onchange_nuts(4)
  52. @api.multi
  53. @api.onchange('nuts3_id')
  54. def _onchange_nuts3_id(self):
  55. return self._onchange_nuts(3)
  56. @api.multi
  57. @api.onchange('nuts2_id')
  58. def _onchange_nuts2_id(self):
  59. return self._onchange_nuts(2)
  60. @api.multi
  61. @api.onchange('nuts1_id')
  62. def _onchange_nuts1_id(self):
  63. return self._onchange_nuts(1)
  64. @api.multi
  65. @api.onchange('country_id')
  66. def _onchange_country_id(self):
  67. """Sensible values and domains for related fields."""
  68. fields = ['state_id', 'nuts1_id', 'nuts2_id', 'nuts3_id', 'nuts4_id']
  69. country_domain = ([('country_id', '=', self.country_id.id)]
  70. if self.country_id else [])
  71. domain = dict()
  72. for field in fields:
  73. if self.country_id and self[field].country_id != self.country_id:
  74. self[field] = False
  75. domain[field] = list(country_domain) # Using list() to copy
  76. fields.remove('state_id')
  77. for field in fields:
  78. level = int(field[:5][-1])
  79. if level:
  80. domain[field].append(('level', '=', level))
  81. if self.country_id:
  82. nuts1 = self.env['res.partner.nuts'].search([
  83. ('level', '=', 1),
  84. ('country_id', '=', self.country_id.id),
  85. ], limit=1)
  86. if self.nuts1_id.id != nuts1.id:
  87. self.nuts1_id = nuts1.id
  88. return {
  89. 'domain': domain,
  90. }
  91. @api.multi
  92. def onchange_state(self, state_id):
  93. result = super(ResPartner, self).onchange_state(state_id)
  94. state = self.env['res.country.state'].browse(state_id)
  95. if state.country_id.state_level:
  96. nuts_state = self.env['res.partner.nuts'].search([
  97. ('level', '=', state.country_id.state_level),
  98. ('state_id', '=', state.id)
  99. ], limit=1)
  100. if nuts_state:
  101. field = 'nuts%d_id' % state.country_id.state_level
  102. result.setdefault("value", dict())
  103. result['value'][field] = nuts_state.id
  104. return result
  105. @api.model
  106. def _address_fields(self):
  107. fields = super(ResPartner, self)._address_fields()
  108. if fields:
  109. fields += ['nuts1_id', 'nuts2_id', 'nuts3_id', 'nuts4_id']
  110. return fields