diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 67a7d613261..0cfba4d14ed 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -592,8 +592,57 @@
+
+
@@ -615,7 +664,7 @@
Template fallback
An error occured while rendering the template .
If this error is caused by a change of yours in the templates, you have the possibility to reset one or more templates to their factory settings.
-
diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py
index 2ce0a6a949e..7192d56cf67 100644
--- a/addons/website_blog/controllers/main.py
+++ b/addons/website_blog/controllers/main.py
@@ -19,14 +19,49 @@
#
##############################################################################
+import datetime
import werkzeug
+from openerp import tools
from openerp.addons.web import http
from openerp.addons.web.http import request
+from openerp.addons.website.models.website import slug
+from openerp.osv.orm import browse_record
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
from openerp.tools import html2plaintext
+
+class QueryURL(object):
+ def __init__(self, path='', path_args=None, **args):
+ self.path = path
+ self.args = args
+ self.path_args = set(path_args or [])
+
+ def __call__(self, path=None, path_args=None, **kw):
+ path = path or self.path
+ for k, v in self.args.items():
+ kw.setdefault(k, v)
+ path_args = set(path_args or []).union(self.path_args)
+ paths, fragments = [], []
+ for key, value in kw.items():
+ if value and key in path_args:
+ if isinstance(value, browse_record):
+ paths.append((key, slug(value)))
+ else:
+ paths.append((key, value))
+ elif value:
+ if isinstance(value, list) or isinstance(value, set):
+ fragments.append(werkzeug.url_encode([(key, item) for item in value]))
+ else:
+ fragments.append(werkzeug.url_encode([(key, value)]))
+ for key, value in paths:
+ path += '/' + key + '/%s' % value
+ if fragments:
+ path += '?' + '&'.join(fragments)
+ return path
+
+
class WebsiteBlog(http.Controller):
_blog_post_per_page = 20
_post_comment_per_page = 10
@@ -36,14 +71,17 @@ class WebsiteBlog(http.Controller):
groups = blog_post_obj.read_group(request.cr, request.uid, [], ['name', 'create_date'],
groupby="create_date", orderby="create_date asc", context=request.context)
for group in groups:
- group['date'] = "%s_%s" % (group['__domain'][0][2], group['__domain'][1][2])
+ begin_date = datetime.datetime.strptime(group['__domain'][0][2], tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
+ end_date = datetime.datetime.strptime(group['__domain'][1][2], tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
+ group['date_begin'] = '%s' % datetime.date.strftime(begin_date, tools.DEFAULT_SERVER_DATE_FORMAT)
+ group['date_end'] = '%s' % datetime.date.strftime(end_date, tools.DEFAULT_SERVER_DATE_FORMAT)
return groups
@http.route([
'/blog',
'/blog/page/
',
], type='http', auth="public", website=True, multilang=True)
- def blogs(self, page=1):
+ def blogs(self, page=1, **post):
cr, uid, context = request.cr, request.uid, request.context
blog_obj = request.registry['blog.post']
total = blog_obj.search(cr, uid, [], count=True, context=context)
@@ -53,11 +91,13 @@ class WebsiteBlog(http.Controller):
page=page,
step=self._blog_post_per_page,
)
- bids = blog_obj.search(cr, uid, [], offset=pager['offset'], limit=self._blog_post_per_page, context=context)
- blogs = blog_obj.browse(cr, uid, bids, context=context)
+ post_ids = blog_obj.search(cr, uid, [], offset=(page-1)*self._blog_post_per_page, limit=self._blog_post_per_page, context=context)
+ posts = blog_obj.browse(cr, uid, post_ids, context=context)
+ blog_url = QueryURL('', ['blog', 'tag'])
return request.website.render("website_blog.latest_blogs", {
- 'blogs': blogs,
- 'pager': pager
+ 'posts': posts,
+ 'pager': pager,
+ 'blog_url': blog_url,
})
@http.route([
@@ -66,7 +106,7 @@ class WebsiteBlog(http.Controller):
'/blog//tag/',
'/blog//tag//page/',
], type='http', auth="public", website=True, multilang=True)
- def blog(self, blog=None, tag=None, date=None, page=1, **opt):
+ def blog(self, blog=None, tag=None, page=1, **opt):
""" Prepare all values to display the blog.
:param blog: blog currently browsed.
@@ -85,6 +125,8 @@ class WebsiteBlog(http.Controller):
- 'tag': current tag, if tag_id
- 'nav_list': a dict [year][month] for archives navigation
"""
+ date_begin, date_end = opt.get('date_begin'), opt.get('date_end')
+
cr, uid, context = request.cr, request.uid, request.context
blog_post_obj = request.registry['blog.post']
@@ -92,29 +134,30 @@ class WebsiteBlog(http.Controller):
blog_ids = blog_obj.search(cr, uid, [], order="create_date asc", context=context)
blogs = blog_obj.browse(cr, uid, blog_ids, context=context)
- path_filter = ""
domain = []
if blog:
- path_filter += "%s" % blog.id
- domain += [("blog_id", "in", [blog.id])]
+ domain += [('blog_id', '=', blog.id)]
if tag:
- path_filter += 'tag/%s' % tag.id
- domain += [("tag_ids", "in", [tag.id])]
- if date:
- path_filter += "date/%s" % date
- domain += [("create_date", ">=", date.split("_")[0]), ("create_date", "<=", date.split("_")[1])]
+ domain += [('tag_ids', 'in', tag.id)]
+ if date_begin and date_end:
+ domain += [("create_date", ">=", date_begin), ("create_date", "<=", date_end)]
+
+ blog_url = QueryURL('', ['blog', 'tag'], blog=blog, tag=tag, date_begin=date_begin, date_end=date_end)
+ post_url = QueryURL('', ['blogpost'], tag_id=tag and tag.id or None, date_begin=date_begin, date_end=date_end)
- blog_post_count = blog_post_obj.search(cr, uid, domain, count=True, context=context)
- pager = request.website.pager(
- url="/blog/%s" % path_filter,
- total=blog_post_count,
- page=page,
- step=self._blog_post_per_page,
- scope=10
- )
blog_post_ids = blog_post_obj.search(cr, uid, domain, order="create_date asc", context=context)
blog_posts = blog_post_obj.browse(cr, uid, blog_post_ids, context=context)
+ pager = request.website.pager(
+ url=blog_url(),
+ total=len(blog_posts),
+ page=page,
+ step=self._blog_post_per_page,
+ )
+ pager_begin = (page - 1) * self._blog_post_per_page
+ pager_end = page * self._blog_post_per_page
+ blog_posts = blog_posts[pager_begin:pager_end]
+
tag_obj = request.registry['blog.tag']
tag_ids = tag_obj.search(cr, uid, [], context=context)
tags = tag_obj.browse(cr, uid, tag_ids, context=context)
@@ -127,8 +170,9 @@ class WebsiteBlog(http.Controller):
'blog_posts': blog_posts,
'pager': pager,
'nav_list': self.nav_list(),
- 'path_filter': path_filter,
- 'date': date,
+ 'blog_url': blog_url,
+ 'post_url': post_url,
+ 'date': date_begin,
}
response = request.website.render("website_blog.blog_post_short", values)
return response
@@ -136,7 +180,7 @@ class WebsiteBlog(http.Controller):
@http.route([
'/blog//post/',
], type='http', auth="public", website=True, multilang=True)
- def blog_post(self, blog, blog_post, enable_editor=None, **post):
+ def blog_post(self, blog, blog_post, tag_id=None, page=1, enable_editor=None, **post):
""" Prepare all values to display the blog.
:param blog_post: blog post currently browsed. If not set, the user is
@@ -161,11 +205,40 @@ class WebsiteBlog(http.Controller):
- 'nav_list': a dict [year][month] for archives navigation
- 'next_blog': next blog post , display in footer
"""
+ date_begin, date_end = post.get('date_begin'), post.get('date_end')
+
+ pager_url = "/blogpost/%s" % blog_post.id
+
+ pager = request.website.pager(
+ url=pager_url,
+ total=len(blog_post.website_message_ids),
+ page=page,
+ step=self._post_comment_per_page,
+ scope=7
+ )
+ pager_begin = (page - 1) * self._post_comment_per_page
+ pager_end = page * self._post_comment_per_page
+ blog_post.website_message_ids = blog_post.website_message_ids[pager_begin:pager_end]
+
+ tag = None
+ if tag_id:
+ tag = request.registry['blog.tag'].browse(request.cr, request.uid, int(tag_id), context=request.context)
+ post_url = QueryURL('', ['blogpost'], blogpost=blog_post, tag_id=tag_id, date_begin=date_begin, date_end=date_end)
+ blog_url = QueryURL('', ['blog', 'tag'], blog=blog_post.blog_id, tag=tag, date_begin=date_begin, date_end=date_end)
+
cr, uid, context = request.cr, request.uid, request.context
if not blog_post.blog_id.id==blog.id:
return request.redirect("/blog/%s/post/%s" % (blog_post.blog_id.id, blog_post.id))
blog_post_obj = request.registry.get('blog.post')
+ blog_obj = request.registry['blog.blog']
+ blog_ids = blog_obj.search(cr, uid, [], context=context)
+ blogs = blog_obj.browse(cr, uid, blog_ids, context=context)
+
+ tag_obj = request.registry['blog.tag']
+ tag_ids = tag_obj.search(cr, uid, [], context=context)
+ tags = tag_obj.browse(cr, uid, tag_ids, context=context)
+
# Find next Post
visited_blogs = request.httprequest.cookies.get('visited_blogs') or ''
visited_ids = filter(None, visited_blogs.split(','))
@@ -179,10 +252,17 @@ class WebsiteBlog(http.Controller):
values = {
'blog': blog,
+ 'blogs': blogs,
+ 'tags': tags,
+ 'tag': tag,
'blog_post': blog_post,
'main_object': blog_post,
+ 'nav_list': self.nav_list(),
'enable_editor': enable_editor,
'next_post' : next_post,
+ 'date': date_begin,
+ 'post_url': post_url,
+ 'blog_url': blog_url,
}
response = request.website.render("website_blog.blog_post_complete", values)
response.set_cookie('visited_blogs', ','.join(map(str, visited_ids)))
diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml
index 261619316a4..38486e30d5e 100644
--- a/addons/website_blog/views/website_blog_templates.xml
+++ b/addons/website_blog/views/website_blog_templates.xml
@@ -36,44 +36,48 @@
pull-right
-
- Latest Blogs
+
-
+
-
-
+
+
-
+
In
-
-
+
+
-
-
+
+
No keywords defined!
-
@@ -154,6 +158,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -184,6 +201,7 @@
+
@@ -196,7 +214,7 @@
-
-
-
-
-
+
+
+
+ +
+
+
+
+Tags
-
- -
-
+
+ -
+
@@ -345,8 +375,8 @@Archives
- -
-
+ -
+
@@ -407,7 +437,7 @@