From 828b7aef2f66fbc15ed28e39e7adc9068e9c4fa7 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 15 May 2014 16:58:16 +0200 Subject: [PATCH 1/4] [WIP] sitemap --- addons/website/controllers/main.py | 44 +++++++++++++++++----- addons/website/views/website_templates.xml | 2 +- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index be13b5c7f1f..fc8dca6d07f 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import cStringIO +from itertools import islice import json import logging +import math import re from sys import maxint @@ -22,6 +24,24 @@ logger = logging.getLogger(__name__) MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT = IMAGE_LIMITS = (1024, 768) LOC_PER_SITEMAP = 45000 +import time + +from functools import wraps + +def timeit(f): + @wraps(f) + def wrapper(*args, **kw): + ts = time.time() + result = f(*args, **kw) + te = time.time() + + print 'func:%r args:[%r, %r] took: %2.4f sec' % \ + (f.__name__, args, kw, te-ts) + return result + return wrapper + + + class Website(openerp.addons.web.controllers.main.Home): #------------------------------------------------------ # View @@ -67,15 +87,17 @@ class Website(openerp.addons.web.controllers.main.Home): def robots(self): return request.render('website.robots', {'url_root': request.httprequest.url_root}, mimetype='text/plain') + @timeit @http.route('/sitemap.xml', type='http', auth="public", website=True) def sitemap_xml_index(self): - return request.not_found() # Temporary disable sitemap - pages = list(request.website.enumerate_pages()) - if len(pages)<=LOC_PER_SITEMAP: - return self.__sitemap_xml(pages, 0) + count = 0 + for loc in request.website.enumerate_pages(): + count += 1 + if count <= LOC_PER_SITEMAP: + return self.__sitemap_xml(0) # Sitemaps must be split in several smaller files with a sitemap index values = { - 'pages': range(len(pages)/LOC_PER_SITEMAP+1), + 'pages': range(int(math.ceil(float(count) / LOC_PER_SITEMAP))), 'url_root': request.httprequest.url_root } headers = { @@ -85,18 +107,20 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route('/sitemap-.xml', type='http', auth="public", website=True) def sitemap_xml(self, page): - pages = list(request.website.enumerate_pages()) - return self.__sitemap_xml(pages, page) + return self.__sitemap_xml(page) - def __sitemap_xml(self, pages, index=0): + @timeit + def __sitemap_xml(self, index=0): + start = index * LOC_PER_SITEMAP + locs = islice(request.website.enumerate_pages(), start , start + LOC_PER_SITEMAP) values = { - 'pages': pages[index*LOC_PER_SITEMAP:(index+1)*LOC_PER_SITEMAP], + 'locs': locs, 'url_root': request.httprequest.url_root.rstrip('/') } headers = { 'Content-Type': 'application/xml;charset=utf-8', } - return request.render('website.sitemap_xml', values, headers=headers) + return request.render('website.sitemap_xml', values, headers=headers).flatten() #------------------------------------------------------ # Edit diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index b9f33ef1c6b..3611645cbf5 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -699,7 +699,7 @@ Sitemap: sitemap.xml + + From 42d8a90afd38f1bb0ed5b527e73321256ee702d7 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 19 May 2014 13:59:38 +0200 Subject: [PATCH 4/4] [IMP] minor changes to sitemap --- addons/website/controllers/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index df958d969dd..460f64147e8 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) # Completely arbitrary limits MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT = IMAGE_LIMITS = (1024, 768) LOC_PER_SITEMAP = 45000 -SITEMAP_CACHE_TIME = datetime.timedelta(hours=6) +SITEMAP_CACHE_TIME = datetime.timedelta(hours=12) class Website(openerp.addons.web.controllers.main.Home): #------------------------------------------------------ @@ -76,7 +76,7 @@ class Website(openerp.addons.web.controllers.main.Home): mimetype ='application/xml;charset=utf-8' content = None - def create_map(url, content): + def create_sitemap(url, content): ira.create(cr, uid, dict( datas=content.encode('base64'), mimetype=mimetype, @@ -112,7 +112,7 @@ class Website(openerp.addons.web.controllers.main.Home): if not first_page: first_page = page pages += 1 - create_map('/sitemap-%d.xml' % pages, page) + create_sitemap('/sitemap-%d.xml' % pages, page) else: break if not pages: @@ -125,7 +125,7 @@ class Website(openerp.addons.web.controllers.main.Home): pages=range(1, pages + 1), url_root=request.httprequest.url_root, ), context=context) - create_map('/sitemap.xml', content) + create_sitemap('/sitemap.xml', content) return request.make_response(content, [('Content-Type', mimetype)])