website.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import openerp
  2. from openerp import SUPERUSER_ID
  3. from openerp.osv import orm, fields, osv
  4. from openerp.addons.website.models.website import slugify
  5. from openerp.addons.web.http import request
  6. from werkzeug.exceptions import NotFound
  7. import werkzeug
  8. class website(orm.Model):
  9. _inherit = "website"
  10. def _get_menu_website(self, cr, uid, ids, context=None):
  11. res = []
  12. for menu in self.pool.get('website.menu').browse(cr, uid, ids, context=context):
  13. if menu.website_id:
  14. res.append(menu.website_id.id)
  15. # IF a menu is changed, update all websites
  16. return res
  17. def _get_menu(self, cr, uid, ids, name, arg, context=None):
  18. result = {}
  19. menu_obj = self.pool['website.menu']
  20. for website_id in ids:
  21. menu_ids = menu_obj.search(cr, uid, [
  22. ('parent_id', '=', False),
  23. ('website_id', '=', website_id),
  24. ], order='id', context=context)
  25. result[website_id] = menu_ids and menu_ids[0] or False
  26. return result
  27. _columns = {
  28. 'menu_id': fields.function(
  29. _get_menu,
  30. relation='website.menu',
  31. type='many2one',
  32. string='Main Menu',
  33. store={
  34. 'website.menu': (_get_menu_website, ['sequence', 'parent_id', 'website_id'], 10)
  35. }
  36. )
  37. }
  38. _defaults = {
  39. 'user_id': lambda s, c, u, x: s.pool['ir.model.data'].xmlid_to_res_id(c, SUPERUSER_ID, 'base.public_user'),
  40. 'company_id': lambda s, c, u, x: s.pool['ir.model.data'].xmlid_to_res_id(c, SUPERUSER_ID, 'base.main_company'),
  41. }
  42. def new_page(self, cr, uid, name, template='website.default_page', ispage=True, context=None):
  43. context = context or {}
  44. imd = self.pool['ir.model.data']
  45. view = self.pool['ir.ui.view']
  46. template_module, template_name = template.split('.')
  47. # completely arbitrary max_length
  48. page_name = slugify(name, max_length=50)
  49. page_xmlid = "%s.%s" % (template_module, page_name)
  50. try:
  51. # existing page
  52. imd.get_object_reference(cr, uid, template_module, page_name)
  53. except ValueError:
  54. # new page
  55. _, template_id = imd.get_object_reference(cr, uid, template_module, template_name)
  56. page_id = view.copy(cr, uid, template_id, {
  57. 'website_id': context.get('website_id'),
  58. 'key': page_xmlid
  59. }, context=context)
  60. page = view.browse(cr, uid, page_id, context=context)
  61. page.write({
  62. 'arch': page.arch.replace(template, page_xmlid),
  63. 'name': page_name,
  64. 'page': ispage,
  65. })
  66. return page_xmlid
  67. @openerp.tools.ormcache(skiparg=4)
  68. def _get_current_website_id(self, cr, uid, domain_name, context=None):
  69. ids = self.search(cr, uid, [('name', '=', domain_name)], context=context)
  70. return ids and ids[0] or None
  71. def get_current_website(self, cr, uid, context=None):
  72. domain_name = request.httprequest.environ.get('HTTP_HOST', '').split(':')[0]
  73. website_id = self._get_current_website_id(cr, uid, domain_name, context=context)
  74. request.context['website_id'] = website_id or 1
  75. return self.browse(cr, uid, website_id or 1, context=context)
  76. def get_template(self, cr, uid, ids, template, context=None):
  77. if not isinstance(template, (int, long)) and '.' not in template:
  78. template = 'website.%s' % template
  79. View = self.pool['ir.ui.view']
  80. view_id = View.get_view_id(cr, uid, template, context=context)
  81. if not view_id:
  82. raise NotFound
  83. return View.browse(cr, uid, view_id, context=context)
  84. class ir_http(osv.AbstractModel):
  85. _inherit = 'ir.http'
  86. def _auth_method_public(self):
  87. if not request.session.uid:
  88. domain_name = request.httprequest.environ.get('HTTP_HOST', '').split(':')[0]
  89. website_id = self.pool['website']._get_current_website_id(request.cr, openerp.SUPERUSER_ID, domain_name, context=request.context)
  90. if website_id:
  91. request.uid = self.pool['website'].browse(request.cr, openerp.SUPERUSER_ID, website_id, request.context).user_id.id
  92. else:
  93. dummy, request.uid = self.pool['ir.model.data'].get_object_reference(request.cr, openerp.SUPERUSER_ID, 'base', 'public_user')
  94. else:
  95. request.uid = request.session.uid
  96. def _get_converters(self):
  97. converters = super(ir_http, self)._get_converters()
  98. converters['page'] = PageMultiWebsiteConverter
  99. return converters
  100. class PageMultiWebsiteConverter(werkzeug.routing.PathConverter):
  101. def generate(self, cr, uid, query=None, args={}, context=None):
  102. View = request.registry['ir.ui.view']
  103. dom = [('page', '=', True), '|', ('website_id', '=', request.website.id), ('website_id', '=', False)]
  104. views = View.search_read(cr, uid, dom, fields=['key', 'xml_id', 'priority','write_date'], order='name', context=context)
  105. for view in views:
  106. key = view['key'] or view['xml_id'] or ''
  107. xid = key.startswith('website.') and key[8:] or key
  108. if xid=='homepage': continue
  109. if query and query.lower() not in xid.lower(): continue
  110. record = {'loc': xid}
  111. if view['priority'] != 16:
  112. record['__priority'] = min(round(view['priority'] / 32.0, 1), 1)
  113. if view['write_date']:
  114. record['__lastmod'] = view['write_date'][:10]
  115. yield record