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.

108 lines
4.2 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014-2018 Therp BV <https://therp.nl>.
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. # pylint: disable=no-member
  5. import logging
  6. from lxml import etree
  7. from odoo import api, fields, models
  8. _logger = logging.getLogger(__name__) # pylint: disable=invalid-name
  9. class ResPartner(models.Model):
  10. _inherit = 'res.partner'
  11. @api.model
  12. def fields_view_get(
  13. self, view_id=None, view_type='form', toolbar=False,
  14. submenu=False):
  15. """Override to add relation tabs to form."""
  16. result = super(ResPartner, self).fields_view_get(
  17. view_id=view_id, view_type=view_type, toolbar=toolbar,
  18. submenu=submenu)
  19. if view_type != 'form' or self.env.context.get('check_view_ids'):
  20. return result
  21. view = etree.fromstring(result['arch'])
  22. extra_fields = self._add_tab_pages(view)
  23. view_model = self.env['ir.ui.view']
  24. result['arch'], original_fields = view_model.postprocess_and_fields(
  25. self._name, view, result['view_id'])
  26. for fieldname in extra_fields:
  27. result['fields'][fieldname] = original_fields[fieldname]
  28. return result
  29. def mapped(self, func):
  30. """Handle situation where mapped refers to not yet added tab field."""
  31. try:
  32. return super(ResPartner, self).mapped(func)
  33. except KeyError:
  34. # Retry if error caused by tab field
  35. if isinstance(func, basestring) and 'tab' in func:
  36. for tab in self._get_tabs(): # get all tabs
  37. self.add_field(tab)
  38. return super(ResPartner, self).mapped(func)
  39. raise
  40. def _add_tab_pages(self, view):
  41. """Adds the relevant tabs to the partner's formview."""
  42. # pylint: disable=no-member
  43. def add_invisible_extra_field(view, extra_fields, fieldname):
  44. """Add invisible field to view."""
  45. view.append(
  46. etree.Element('field', name=fieldname, invisible='True'))
  47. extra_fields.append(fieldname)
  48. last_page_nodes = view.xpath('//page[last()]')
  49. if not last_page_nodes:
  50. # Nothing to do if form contains no pages/tabs.
  51. return []
  52. extra_fields = []
  53. if not view.xpath('//field[@name="id"]'):
  54. add_invisible_extra_field(view, extra_fields, 'id')
  55. last_page = last_page_nodes[0]
  56. for tab in self._get_tabs(): # get all tabs
  57. self.add_field(tab)
  58. add_invisible_extra_field(
  59. view, extra_fields, tab.get_visible_fieldname())
  60. extra_fields.append(tab.get_fieldname())
  61. tab_page = tab.create_page()
  62. last_page.addnext(tab_page)
  63. last_page = tab_page # Keep ordering of tabs
  64. return extra_fields
  65. @api.depends('is_company', 'category_id')
  66. def _compute_tabs_visibility(self):
  67. """Compute for all tabs wether they should be visible."""
  68. for tab in self._get_tabs(): # get all tabs
  69. fieldname = tab.get_fieldname()
  70. if fieldname not in self._fields:
  71. # Check this for performance reasons.
  72. self.add_field(tab)
  73. for this in self:
  74. this[tab.get_visible_fieldname()] = \
  75. tab.compute_visibility(this)
  76. def _get_tabs(self):
  77. tab_model = self.env['res.partner.tab']
  78. return tab_model.get_tabs()
  79. def add_field(self, tab):
  80. """Add tab field to model.
  81. Will replace existing field if already present.
  82. """
  83. # Visible field determines wether first field will be visible.
  84. # This is because domains on many2many no longer work in 9.0
  85. # and above.
  86. visible_field = fields.Boolean(compute='_compute_tabs_visibility')
  87. self._add_field(tab.get_visible_fieldname(), visible_field)
  88. if visible_field not in self._field_computed:
  89. self._field_computed[visible_field] = [visible_field]
  90. tab_field = fields.One2many(
  91. comodel_name='res.partner.relation.all',
  92. inverse_name='this_partner_id',
  93. domain=[('tab_id', '=', tab.tab_record.id)],
  94. string=tab.tab_record.name)
  95. self._add_field(tab.get_fieldname(), tab_field)