ir_ui_view.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from lxml import etree
  2. from openerp import tools
  3. from openerp.osv import osv, fields, orm
  4. from openerp import SUPERUSER_ID
  5. class view(osv.osv):
  6. _inherit = "ir.ui.view"
  7. _columns = {
  8. 'website_id': fields.many2one('website', ondelete='cascade', string="Website", copy=False),
  9. 'key': fields.char('Key')
  10. }
  11. _sql_constraints = [(
  12. 'key_website_id_unique',
  13. 'unique(key, website_id)',
  14. 'Key must be unique per website.'
  15. )]
  16. def _view_obj(self, cr, uid, view_id, context=None):
  17. if isinstance(view_id, basestring):
  18. try:
  19. return self.pool['ir.model.data'].xmlid_to_object(
  20. cr, uid, view_id, raise_if_not_found=True, context=context
  21. )
  22. except:
  23. # Try to fallback on key instead of xml_id
  24. if self.search(cr, uid, [('key', '=', view_id),('website_id','=',context.get('website_id', False))], context=context):
  25. rec_id = self.search(cr, uid, [('key', '=', view_id),('website_id','=',context.get('website_id', False))], context=context)
  26. else:
  27. rec_id = self.search(cr, uid, [('key', '=', view_id)], context=context)
  28. if rec_id:
  29. return self.browse(cr, uid, rec_id, context=context)[0]
  30. else:
  31. raise
  32. elif isinstance(view_id, (int, long)):
  33. return self.browse(cr, uid, view_id, context=context)
  34. # assume it's already a view object (WTF?)
  35. return view_id
  36. @tools.ormcache_context(accepted_keys=('website_id',))
  37. def get_view_id(self, cr, uid, xml_id, context=None):
  38. if context and 'website_id' in context and not isinstance(xml_id, (int, long)):
  39. domain = [
  40. ('key', '=', xml_id),
  41. '|',
  42. ('website_id', '=', context['website_id']),
  43. ('website_id', '=', False)
  44. ]
  45. xml_ids = self.search(cr, uid, domain, order='website_id', limit=1, context=context)
  46. if not xml_ids:
  47. xml_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
  48. if self.read(cr, uid, xml_id, ['page'], context=context)['page']:
  49. raise ValueError('Invalid template id: %r' % (xml_id,))
  50. else:
  51. xml_id = xml_ids[0]
  52. else:
  53. xml_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
  54. return xml_id
  55. _read_template_cache = dict(accepted_keys=('lang', 'inherit_branding', 'editable', 'translatable', 'website_id'))
  56. @tools.ormcache_context(**_read_template_cache)
  57. def _read_template(self, cr, uid, view_id, context=None):
  58. arch = self.read_combined(cr, uid, view_id, fields=['arch'], context=context)['arch']
  59. arch_tree = etree.fromstring(arch)
  60. if 'lang' in context:
  61. arch_tree = self.translate_qweb(cr, uid, view_id, arch_tree, context['lang'], context)
  62. self.distribute_branding(arch_tree)
  63. root = etree.Element('templates')
  64. root.append(arch_tree)
  65. arch = etree.tostring(root, encoding='utf-8', xml_declaration=True)
  66. return arch
  67. @tools.ormcache(size=0)
  68. def read_template(self, cr, uid, xml_id, context=None):
  69. if isinstance(xml_id, (int, long)):
  70. view_id = xml_id
  71. else:
  72. if '.' not in xml_id:
  73. raise ValueError('Invalid template id: %r' % (xml_id,))
  74. view_id = self.get_view_id(cr, uid, xml_id, context=context)
  75. return self._read_template(cr, uid, view_id, context=context)
  76. def clear_cache(self):
  77. self._read_template.clear_cache(self)
  78. self.get_view_id.clear_cache(self)
  79. def get_inheriting_views_arch(self, cr, uid, view_id, model, context=None):
  80. arch = super(view, self).get_inheriting_views_arch(cr, uid, view_id, model, context=context)
  81. if not context or not 'website_id' in context:
  82. return arch
  83. view_ids = [v for _, v in arch]
  84. view_arch_to_add_per_key = {}
  85. keep_view_ids = []
  86. for view_rec in self.browse(cr, SUPERUSER_ID, view_ids, context):
  87. #case 1: there is no key, always keep the view
  88. if not view_rec.key:
  89. keep_view_ids.append(view_rec.id)
  90. #case 2: Correct website
  91. elif view_rec.website_id and view_rec.website_id.id == context['website_id']:
  92. view_arch_to_add_per_key[view_rec.key] = (view_rec.website_id.id, view_rec.id)
  93. #case 3: no website add it if no website
  94. if not view_rec.website_id:
  95. view_web_id, view_id = view_arch_to_add_per_key.get(view_rec.key, (False, False))
  96. if not view_web_id:
  97. view_arch_to_add_per_key[view_rec.key] = (False, view_rec.id)
  98. #else: do nothing, you already have the right view
  99. #case 4: website is wrong: do nothing
  100. #Put all the view_id we keep together
  101. keep_view_ids.extend([view_id for _, view_id in view_arch_to_add_per_key.values()])
  102. return [(arch, view_id) for arch, view_id in arch if view_id in keep_view_ids]