[IMP] website_blog: replace search by date in js to search server side

bzr revid: chm@openerp.com-20131118103329-zarcgcdcyablsvtz
This commit is contained in:
Christophe Matthieu 2013-11-18 11:33:29 +01:00
parent 3a3f7fbc15
commit 46bcff4da6
3 changed files with 35 additions and 92 deletions

View File

@ -23,9 +23,7 @@ from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website.models import website
from openerp.tools.translate import _
from openerp.tools.safe_eval import safe_eval
import simplejson
import werkzeug
@ -35,16 +33,11 @@ class WebsiteBlog(http.Controller):
def nav_list(self):
blog_post_obj = request.registry['blog.post']
nav = {}
for group in blog_post_obj.read_group(request.cr, request.uid, [], ['name', 'create_date'],
groupby="create_date", orderby="create_date asc", context=request.context):
# FIXME: vietnamese month names contain spaces. Set sail for fail.
year = group['create_date'].split(" ")[1]
if not year in nav:
nav[year] = {'name': year, 'create_date_count': 0, 'months': []}
nav[year]['create_date_count'] += group['create_date_count']
nav[year]['months'].append(group)
return nav
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])
return groups
@website.route([
'/blog',
@ -63,24 +56,30 @@ class WebsiteBlog(http.Controller):
)
bids = blog_obj.search(cr, uid, [], offset=(page-1)*BYPAGE, limit=BYPAGE, context=context)
blogs = blog_obj.browse(cr, uid, bids, context=context)
return request.website.render("website_blog.blogs", {
return request.website.render("website_blog.latest_blogs", {
'blogs': blogs,
'pager': pager
})
@website.route([
'/blog',
'/blog/page/<int:page>/',
'/blog/cat/<model("blog.category"):category>/',
'/blog/cat/<model("blog.category"):category>/page/<int:page>/',
'/blog/tag/<model("blog.tag"):tag>/',
'/blog/tag/<model("blog.tag"):tag>/page/<int:page>/',
'/blog/cat/<model("blog.category"):category>/date/<string(length=21):date>/',
'/blog/tag/<model("blog.tag"):tag>/date/<string(length=21):date>/',
'/blog/tag/<model("blog.tag"):tag>/date/<string(length=21):date>/page/<int:page>/',
], type='http', auth="public", multilang=True)
def blog(self, category=None, tag=None, page=1):
def blog(self, category=None, tag=None, page=1, date=None):
""" Prepare all values to display the blog.
:param category: category currently browsed.
:param tag: tag that is currently used to filter blog posts
:param integer page: current page of the pager. Can be the category or
post pager.
:param date: date currently used to filter blog posts (dateBegin_dateEnd)
:return dict values: values for the templates, containing
@ -92,6 +91,8 @@ class WebsiteBlog(http.Controller):
- 'tag': current tag, if tag_id
- 'nav_list': a dict [year][month] for archives navigation
"""
BYPAGE = 10
cr, uid, context = request.cr, request.uid, request.context
blog_post_obj = request.registry['blog.post']
@ -101,23 +102,29 @@ class WebsiteBlog(http.Controller):
category_ids = category_obj.search(cr, uid, [], context=context)
categories = category_obj.browse(cr, uid, category_ids, context=context)
pager_url = "/blog/"
domain = []
if category:
pager_url = "/blog/cat/%s/" % category.id
blog_posts = category.blog_post_ids
elif tag:
pager_url = '/blog/tag/%s/' % tag.id
blog_posts = tag.blog_post_ids
else:
pager_url = '/blog/'
blog_post_ids = blog_post_obj.search(cr, uid, [], context=context)
blog_posts = blog_post_obj.browse(cr, uid, blog_post_ids, context=context)
pager_url += "cat/%s/" % category.id
domain += [("id", "=", [blog.id for blog in category.blog_post_ids])]
if tag:
pager_url += 'tag/%s/' % tag.id
domain += [("id", "=", [blog.id for blog in tag.blog_post_ids])]
if date:
pager_url += "date/%s/" % date
date = date.split("_")
domain = [("create_date", ">=", date[0]), ("create_date", "<=", date[1])]
blog_post_ids = blog_post_obj.search(cr, uid, domain, context=context)
blog_posts = blog_post_obj.browse(cr, uid, blog_post_ids, context=context)
pager = request.website.pager(
url=pager_url,
total=len(blog_posts),
page=page,
step=self._category_post_per_page,
scope=7
scope=BYPAGE
)
pager_begin = (page - 1) * self._category_post_per_page
pager_end = page * self._category_post_per_page
@ -189,29 +196,6 @@ class WebsiteBlog(http.Controller):
}
return request.website.render("website_blog.blog_post_complete", values)
# TODO: Refactor (used in website_blog.js for archive links)
# => the archive links should be generated server side
@website.route(['/blog/nav'], type='http', auth="public", multilang=True)
def nav(self, **post):
cr, uid, context = request.cr, request.uid, request.context
blog_post_ids = request.registry['blog.post'].search(
cr, uid, safe_eval(post.get('domain')),
order="create_date asc",
limit=None,
context=context
)
blog_post_data = [
{
'id': blog_post.id,
'website_published': blog_post.website_published,
'fragment': request.website.render("website_blog.blog_archive_link", {
'blog_post': blog_post
}),
}
for blog_post in request.registry['blog.post'].browse(cr, uid, blog_post_ids, context=context)
]
return simplejson.dumps(blog_post_data)
@website.route(['/blog/<int:blog_post_id>/comment'], type='http', auth="public")
def blog_post_comment(self, blog_post_id=None, **post):
cr, uid, context = request.cr, request.uid, request.context

View File

@ -1,23 +0,0 @@
$(document).ready(function () {
$('.js_nav_month a:first').on('click', function (e) {
e.preventDefault();
var $ul = $(this).next("ul");
if (!$ul.find('li').length) {
// TODO: Why POST? (to pass the domain) A GET would be more appropriate...
// This should be done server side anyway...
$.post('/blog/nav', {'domain': $(this).data("domain")}, function (result) {
var blog_id = +window.location.pathname.split("/").pop();
$(JSON.parse(result)).each(function () {
var $li = $($.parseHTML(this.fragment));
if (blog_id == this.id) $li.addClass("active");
if (!this.website_published) $li.find('a').css("color", "red");
$ul.append($li);
});
});
} else {
$ul.toggle();
}
});
});

View File

@ -15,7 +15,7 @@
</template>
<!-- Blog Post Summary -->
<template id="blogs" name="All Blogs">
<template id="latest_blogs" name="Latest Blogs">
<t t-call="website.layout">
<div id="wrap">
<div class="oe_structure"/>
@ -263,7 +263,6 @@
<template id="index" name="Blog Navigation">
<t t-call="website.layout">
<t t-set="head">
<script type="text/javascript" src="/website_blog/static/src/js/website_blog.js"></script>
<link rel='stylesheet' href='/website_blog/static/src/css/website_blog.css'/>
</t>
<div id="wrap">
@ -289,20 +288,9 @@
<section class="mt32">
<h4>Archives</h4>
<ul class="list-unstyled">
<li t-foreach="nav_list" t-as="year">
<t t-set="year" t-value="nav_list[year]"/>
<t t-esc="year['name']"/>
<ul class="css_nav_month">
<t t-foreach="year['months']">
<li class="js_nav_month">
<a href="#" t-att-data-domain="__domain">
<t t-esc="create_date"/>
<span class="pull-right badge" t-esc="create_date_count"/>
</a>
<ul class="list-unstyled"/>
</li>
</t>
</ul>
<li t-foreach="nav_list" t-as="months">
<a t-href="/blog/#{ category and 'cat/%s' % category.id or '' }/date/#{ months['date'] }"><t t-esc="months['create_date']"/></a>
<span class="pull-right badge" t-esc="months['create_date_count']"/>
</li>
</ul>
</section>
@ -381,11 +369,5 @@
</xpath>
</template>
<template id="blog_archive_link">
<li>
<a t-href="/blog/#{blog_post.id}"><t t-esc="blog_post.name"/></a>
</li>
</template>
</data>
</openerp>