main.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import re
  2. import werkzeug
  3. import openerp
  4. import datetime
  5. from itertools import islice
  6. from openerp.addons.web import http
  7. from openerp.http import request
  8. from openerp.addons.website.controllers.main import Website, SITEMAP_CACHE_TIME, LOC_PER_SITEMAP
  9. class website_multi(Website):
  10. @http.route('/', type='http', auth="public", website=True)
  11. def index(self, **kw):
  12. cr, uid, context = request.cr, request.uid, request.context
  13. page = 'homepage'
  14. main_menu = request.website.menu_id
  15. first_menu = main_menu.child_id and main_menu.child_id[0]
  16. if first_menu:
  17. if not (first_menu.url.startswith(('/page/', '/?', '/#')) or (first_menu.url == '/')):
  18. return request.redirect(first_menu.url)
  19. if first_menu.url.startswith('/page/'):
  20. return request.registry['ir.http'].reroute(first_menu.url)
  21. return self.page(page)
  22. @http.route('/website/add/<path:path>', type='http', auth="user", website=True)
  23. def pagenew(self, path, noredirect=False, add_menu=None):
  24. cr, uid, context = request.cr, request.uid, request.context
  25. xml_id = request.registry['website'].new_page(request.cr, request.uid, path, context=request.context)
  26. if add_menu:
  27. request.registry['website.menu'].create(cr, uid, {
  28. 'name': path,
  29. 'url': '/page/' + xml_id,
  30. 'parent_id': request.website.menu_id.id,
  31. 'website_id': request.website.id
  32. }, context=context)
  33. # Reverse action in order to allow shortcut for /page/<website_xml_id>
  34. url = "/page/" + re.sub(r"^website\.", '', xml_id)
  35. if noredirect:
  36. return werkzeug.wrappers.Response(url, mimetype='text/plain')
  37. return werkzeug.utils.redirect(url)
  38. @http.route()
  39. def sitemap_xml_index(self):
  40. cr, uid, context = request.cr, openerp.SUPERUSER_ID, request.context
  41. current_website = request.website
  42. ira = request.registry['ir.attachment']
  43. iuv = request.registry['ir.ui.view']
  44. mimetype ='application/xml;charset=utf-8'
  45. content = None
  46. def create_sitemap(url, content):
  47. ira.create(cr, uid, dict(
  48. datas=content.encode('base64'),
  49. mimetype=mimetype,
  50. type='binary',
  51. name=url,
  52. url=url,
  53. ), context=context)
  54. dom = [('url', '=' , '/sitemap-%d.xml' % current_website.id), ('type', '=', 'binary')]
  55. sitemap = ira.search_read(cr, uid, dom, ('datas', 'create_date'), limit=1, context=context)
  56. if sitemap:
  57. # Check if stored version is still valid
  58. server_format = openerp.tools.misc.DEFAULT_SERVER_DATETIME_FORMAT
  59. create_date = datetime.datetime.strptime(sitemap[0]['create_date'], server_format)
  60. delta = datetime.datetime.now() - create_date
  61. if delta < SITEMAP_CACHE_TIME:
  62. content = sitemap[0]['datas'].decode('base64')
  63. if not content:
  64. # Remove all sitemaps in ir.attachments as we're going to regenerated them
  65. dom = [('type', '=', 'binary'), '|', ('url', '=like' , '/sitemap-%d-%%.xml' % current_website.id),
  66. ('url', '=' , '/sitemap-%d.xml' % current_website.id)]
  67. sitemap_ids = ira.search(cr, uid, dom, context=context)
  68. if sitemap_ids:
  69. ira.unlink(cr, uid, sitemap_ids, context=context)
  70. pages = 0
  71. first_page = None
  72. locs = current_website.sudo(user=current_website.user_id.id).enumerate_pages()
  73. while True:
  74. values = {
  75. 'locs': islice(locs, 0, LOC_PER_SITEMAP),
  76. 'url_root': request.httprequest.url_root[:-1],
  77. }
  78. urls = iuv.render(cr, uid, 'website.sitemap_locs', values, context=context)
  79. if urls.strip():
  80. page = iuv.render(cr, uid, 'website.sitemap_xml', dict(content=urls), context=context)
  81. if not first_page:
  82. first_page = page
  83. pages += 1
  84. create_sitemap('/sitemap-%d-%d.xml' % (current_website.id, pages), page)
  85. else:
  86. break
  87. if not pages:
  88. return request.not_found()
  89. elif pages == 1:
  90. content = first_page
  91. else:
  92. # Sitemaps must be split in several smaller files with a sitemap index
  93. content = iuv.render(cr, uid, 'website.sitemap_index_xml', dict(
  94. pages=range(1, pages + 1),
  95. url_root=request.httprequest.url_root,
  96. ), context=context)
  97. create_sitemap('/sitemap-%d.xml' % current_website.id, content)
  98. return request.make_response(content, [('Content-Type', mimetype)])