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.

84 lines
2.9 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014-2018 Therp BV <https://therp.nl>.
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. import logging
  5. from lxml import etree
  6. from odoo import _
  7. from odoo.osv.orm import transfer_modifiers_to_node
  8. _logger = logging.getLogger(__name__) # pylint: disable=invalid-name
  9. NAME_PREFIX = 'relation_ids_tab'
  10. class Tab(object):
  11. """Encapsulate the information on a tab in the database."""
  12. def __init__(self, tab_record):
  13. """Create tab from tab_record.
  14. In this version tab_record can be assumed to be a partner.relation.tab.
  15. """
  16. self.tab_record = tab_record
  17. self.name = tab_record.code
  18. def get_fieldname(self):
  19. return '%s_%s' % (NAME_PREFIX, self.tab_record.id)
  20. def get_visible_fieldname(self):
  21. return '%s_visible' % self.get_fieldname()
  22. def create_page(self):
  23. tab_page = etree.Element('page')
  24. self._set_page_attrs(tab_page)
  25. field = etree.Element(
  26. 'field',
  27. name=self.get_fieldname(),
  28. context='{'
  29. '"default_this_partner_id": id,'
  30. '"default_tab_id": %d,'
  31. '"active_test": False}' % self.tab_record.id)
  32. tab_page.append(field)
  33. tree = etree.Element('tree', editable='bottom')
  34. field.append(tree)
  35. # Now add fields for the editable tree view in the tab.
  36. type_field = etree.Element(
  37. 'field',
  38. name='type_selection_id',
  39. widget='many2one_clickable')
  40. type_field.set('domain', repr([('tab_id', '=', self.tab_record.id)]))
  41. type_field.set('options', repr({'no_create': True}))
  42. tree.append(type_field)
  43. other_partner_field = etree.Element(
  44. 'field',
  45. string=_('Partner'),
  46. name='other_partner_id',
  47. widget='many2one_clickable')
  48. other_partner_field.set('options', repr({'no_create': True}))
  49. tree.append(other_partner_field)
  50. tree.append(etree.Element('field', name='date_start'))
  51. tree.append(etree.Element('field', name='date_end'))
  52. return tab_page
  53. def _set_page_attrs(self, tab_page):
  54. tab_page.set('string', self.tab_record.name)
  55. attrs = {'invisible': [(self.get_visible_fieldname(), '=', False)]}
  56. tab_page.set('attrs', repr(attrs))
  57. transfer_modifiers_to_node(attrs, tab_page)
  58. def compute_visibility(self, partner):
  59. """Compute visibility, dependent on partner and conditions."""
  60. tab = self.tab_record
  61. if tab.partner_ids:
  62. return partner in tab.partner_ids
  63. if tab.contact_type:
  64. is_company_tab = tab.contact_type == 'c'
  65. if partner.is_company != is_company_tab:
  66. return False
  67. if tab.partner_category_id:
  68. if tab.partner_category_id not in partner.category_id:
  69. return False
  70. return True