1
1
import re
2
2
3
3
import werkzeug
4
-
4
+ import openerp
5
+ import datetime
6
+ from itertools import islice
5
7
from openerp .addons .web import http
6
8
from openerp .http import request
7
- from openerp .addons .website .controllers .main import Website
9
+ from openerp .addons .website .controllers .main import Website , SITEMAP_CACHE_TIME , LOC_PER_SITEMAP
8
10
9
11
10
12
class website_multi (Website ):
@@ -42,3 +44,71 @@ def pagenew(self, path, noredirect=False, add_menu=None):
42
44
return werkzeug .wrappers .Response (url , mimetype = 'text/plain' )
43
45
44
46
return werkzeug .utils .redirect (url )
47
+
48
+ @http .route ()
49
+ def sitemap_xml_index (self ):
50
+ cr , uid , context = request .cr , openerp .SUPERUSER_ID , request .context
51
+ current_website = request .website
52
+ ira = request .registry ['ir.attachment' ]
53
+ iuv = request .registry ['ir.ui.view' ]
54
+ mimetype = 'application/xml;charset=utf-8'
55
+ content = None
56
+
57
+ def create_sitemap (url , content ):
58
+ ira .create (cr , uid , dict (
59
+ datas = content .encode ('base64' ),
60
+ mimetype = mimetype ,
61
+ type = 'binary' ,
62
+ name = url ,
63
+ url = url ,
64
+ ), context = context )
65
+
66
+ dom = [('url' , '=' , '/sitemap-%d.xml' % current_website .id ), ('type' , '=' , 'binary' )]
67
+ sitemap = ira .search_read (cr , uid , dom , ('datas' , 'create_date' ), limit = 1 , context = context )
68
+
69
+ if sitemap :
70
+ # Check if stored version is still valid
71
+ server_format = openerp .tools .misc .DEFAULT_SERVER_DATETIME_FORMAT
72
+ create_date = datetime .datetime .strptime (sitemap [0 ]['create_date' ], server_format )
73
+ delta = datetime .datetime .now () - create_date
74
+ if delta < SITEMAP_CACHE_TIME :
75
+ content = sitemap [0 ]['datas' ].decode ('base64' )
76
+
77
+ if not content :
78
+ # Remove all sitemaps in ir.attachments as we're going to regenerated them
79
+ dom = [('type' , '=' , 'binary' ), '|' , ('url' , '=like' , '/sitemap-%d-%%.xml' % current_website .id ),
80
+ ('url' , '=' , '/sitemap-%d.xml' % current_website .id )]
81
+ sitemap_ids = ira .search (cr , uid , dom , context = context )
82
+ if sitemap_ids :
83
+ ira .unlink (cr , uid , sitemap_ids , context = context )
84
+
85
+ pages = 0
86
+ first_page = None
87
+ locs = current_website .sudo (user = current_website .user_id .id ).enumerate_pages ()
88
+ while True :
89
+ values = {
90
+ 'locs' : islice (locs , 0 , LOC_PER_SITEMAP ),
91
+ 'url_root' : request .httprequest .url_root [:- 1 ],
92
+ }
93
+ urls = iuv .render (cr , uid , 'website.sitemap_locs' , values , context = context )
94
+ if urls .strip ():
95
+ page = iuv .render (cr , uid , 'website.sitemap_xml' , dict (content = urls ), context = context )
96
+ if not first_page :
97
+ first_page = page
98
+ pages += 1
99
+ create_sitemap ('/sitemap-%d-%d.xml' % (current_website .id , pages ), page )
100
+ else :
101
+ break
102
+ if not pages :
103
+ return request .not_found ()
104
+ elif pages == 1 :
105
+ content = first_page
106
+ else :
107
+ # Sitemaps must be split in several smaller files with a sitemap index
108
+ content = iuv .render (cr , uid , 'website.sitemap_index_xml' , dict (
109
+ pages = range (1 , pages + 1 ),
110
+ url_root = request .httprequest .url_root ,
111
+ ), context = context )
112
+ create_sitemap ('/sitemap-%d.xml' % current_website .id , content )
113
+
114
+ return request .make_response (content , [('Content-Type' , mimetype )])
0 commit comments