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 @@ + + +
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

+
+
+
+

Latest Posts

+
+
- +

- - + + &nbsp;

- &nbsp; + &nbsp; In - - + + &nbsp;
- - + + No keywords defined!
-
+ -
+
@@ -154,6 +158,19 @@ + + + + + +