diff --git a/addons/website/static/src/css/editor.css b/addons/website/static/src/css/editor.css
index 823a1d30f81..8aada166018 100644
--- a/addons/website/static/src/css/editor.css
+++ b/addons/website/static/src/css/editor.css
@@ -150,7 +150,7 @@ div.oe_menu_buttons {
ul.oe_menu_editor .icon-home {
display: none;
}
-ul.oe_menu_editor > li:first-child .icon-home {
+ul.oe_menu_editor > li:first-child > div > span > .icon-home {
display: block;
}
ul.oe_menu_editor .oe_menu_placeholder {
diff --git a/addons/website/static/src/css/editor.sass b/addons/website/static/src/css/editor.sass
index 918714ea92f..3896ced8648 100644
--- a/addons/website/static/src/css/editor.sass
+++ b/addons/website/static/src/css/editor.sass
@@ -132,7 +132,7 @@ div.oe_menu_buttons
ul.oe_menu_editor
.icon-home
display: none
- > li:first-child .icon-home
+ > li:first-child > div > span > .icon-home
display: block
.oe_menu_placeholder
outline: 1px dashed #4183C4
diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js
index 74cf6ab81c0..27dd8c8e2f4 100644
--- a/addons/website/static/src/js/website.editor.js
+++ b/addons/website/static/src/js/website.editor.js
@@ -416,7 +416,7 @@
menu.append('
');
menu.append('HTML Editor');
menu.append('Change Theme');
- menu.append('Install Apps');
+ menu.append('Install Apps');
self.trigger('rte:customize_menu_ready');
}
);
diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js
index b1ba9b801fc..6fef9532ab9 100644
--- a/addons/website/static/src/js/website.js
+++ b/addons/website/static/src/js/website.js
@@ -226,14 +226,14 @@
/* ----- PUBLISHING STUFF ---- */
$(document).on('click', '.js_publish_management .js_publish_btn', function () {
var $data = $(this).parent(".js_publish_management");
- var self=this;
+ var self=this;
openerp.jsonRpc($data.data('controller') || '/website/publish', 'call', {'id': +$data.data('id'), 'object': $data.data('object')})
.then(function (result) {
$data.toggleClass("css_unpublished css_published");
$(self).toggleClass("btn-success btn-danger");
$data.parents("[data-publish]").attr("data-publish", +result ? 'on' : 'off');
}).fail(function (err, data) {
- website.error(data, '/web#model='+$data.data('object')+'&id='+$data.data('id'));
+ website.error(data, '/web#return_label=Website&model='+$data.data('object')+'&id='+$data.data('id'));
});
});
diff --git a/addons/website/static/src/js/website.menu.js b/addons/website/static/src/js/website.menu.js
index d24c9024023..68612cfcc53 100644
--- a/addons/website/static/src/js/website.menu.js
+++ b/addons/website/static/src/js/website.menu.js
@@ -104,7 +104,7 @@
new_window: link[1],
});
var $menu = self.$('[data-menu-id="' + id + '"]');
- $menu.find('> div > span').text(menu_obj.name);
+ $menu.find('.js_menu_label').first().text(menu_obj.name);
});
dialog.appendTo(document.body);
} else {
diff --git a/addons/website/static/src/xml/website.menu.xml b/addons/website/static/src/xml/website.menu.xml
index ea505d94b28..2276076550a 100644
--- a/addons/website/static/src/xml/website.menu.xml
+++ b/addons/website/static/src/xml/website.menu.xml
@@ -4,16 +4,14 @@
-
+
-
-
+
+
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index ae0a4830ffb..7adee93ca1a 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -279,7 +279,7 @@
diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py
index d37ed48ec34..bf344a18eae 100644
--- a/addons/website_blog/controllers/main.py
+++ b/addons/website_blog/controllers/main.py
@@ -23,28 +23,26 @@ 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
+MONTHS = [None, _('January'), _('February'), _('March'), _('April'),
+ _('May'), _('June'), _('July'), _('August'), _('September'),
+ _('October'), _('November'), _('December')]
+
+
class WebsiteBlog(http.Controller):
_category_post_per_page = 6
_post_comment_per_page = 6
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,7 +61,7 @@ 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
})
@@ -71,16 +69,21 @@ class WebsiteBlog(http.Controller):
@website.route([
'/blog/cat//',
'/blog/cat//page//',
- '/blog/tag//',
- '/blog/tag//page//',
+ '/blog/cat//tag//',
+ '/blog/cat//tag//page//',
+ '/blog/cat//date//',
+ '/blog/cat//date//page//',
+ '/blog/cat//tag//date//',
+ '/blog/cat//tag//date//page//',
], type='http', auth="public", multilang=True)
- def blog(self, category=None, tag=None, page=1):
+ def blog(self, category=None, tag=None, date=None, page=1):
""" 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 +95,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,58 +106,65 @@ class WebsiteBlog(http.Controller):
category_ids = category_obj.search(cr, uid, [], context=context)
categories = category_obj.browse(cr, uid, category_ids, context=context)
+ path_filter = ""
+ 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)
+ path_filter += "cat/%s/" % category.id
+ domain += [("id", "in", [blog.id for blog in category.blog_post_ids])]
+ if tag:
+ path_filter += 'tag/%s/' % tag.id
+ domain += [("id", "in", [blog.id for blog in tag.blog_post_ids])]
+ if date:
+ path_filter += "date/%s/" % date
+ domain += [("create_date", ">=", date.split("_")[0]), ("create_date", "<=", date.split("_")[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,
+ url="/blog/%s" % path_filter,
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
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)
+
values = {
'category': category,
'categories': categories,
+ 'tags': tags,
'tag': tag,
'blog_posts': blog_posts,
'pager': pager,
'nav_list': self.nav_list(),
+ 'path_filter': path_filter,
+ 'date': date,
}
-
- if tag:
- values['main_object'] = tag
- elif category:
- values['main_object'] = category
-
return request.website.render("website_blog.blog_post_short", values)
@website.route([
'/blog//',
- '/blog//page//'
], type='http', auth="public", multilang=True)
- def blog_post(self, blog_post=None, page=1, enable_editor=None):
+ def blog_post(self, blog_post=None, tag=None, date=None, page=1, enable_editor=None):
""" Prepare all values to display the blog.
:param blog_post: blog post currently browsed. If not set, the user is
browsing the category and a post pager is calculated.
If set the user is reading the blog post and a
comments pager is calculated.
+ :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 dict post: kwargs, may contain
+ :param date: date currently used to filter blog posts (dateBegin_dateEnd)
- 'enable_editor': editor control
@@ -160,11 +172,16 @@ class WebsiteBlog(http.Controller):
- 'blog_post': browse of the current post, if blog_post_id
- 'category': browse of the current category, if category_id
+ - 'categories': list of browse records of categories
- 'pager': the pager to display comments pager in a blog post
+ - 'tag': current tag, if tag_id
- 'nav_list': a dict [year][month] for archives navigation
"""
+
+ pager_url = "/blog/%s" % blog_post.id
+
pager = request.website.pager(
- url="/blog/%s/" % blog_post.id,
+ url=pager_url,
total=len(blog_post.website_message_ids),
page=page,
step=self._post_comment_per_page,
@@ -179,39 +196,24 @@ class WebsiteBlog(http.Controller):
category_ids = category_obj.search(cr, uid, [], context=context)
categories = category_obj.browse(cr, uid, category_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)
+
values = {
'category': blog_post.category_id,
'categories': categories,
+ 'tags': tags,
+ 'tag': tag and request.registry['blog.tag'].browse(cr, uid, int(tag), context=context) or None,
'blog_post': blog_post,
'pager': pager,
'nav_list': self.nav_list(),
'enable_editor': enable_editor,
+ 'date': date,
+ 'date_name': date and "%s %s" % (MONTHS[int(date.split("-")[1])], date.split("-")[0]) or None
}
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//comment'], type='http', auth="public")
def blog_post_comment(self, blog_post_id=None, **post):
cr, uid, context = request.cr, request.uid, request.context
@@ -224,7 +226,7 @@ class WebsiteBlog(http.Controller):
context=dict(context, mail_create_nosubcribe=True))
return werkzeug.utils.redirect(request.httprequest.referrer + "#comments")
- @website.route(['/blog//new'], type='http', auth="public", multilang=True)
+ @website.route(['/blog/new'], type='http', auth="public", multilang=True)
def blog_post_create(self, category_id=None, **post):
cr, uid, context = request.cr, request.uid, request.context
create_context = dict(context, mail_create_nosubscribe=True)
@@ -235,11 +237,17 @@ class WebsiteBlog(http.Controller):
'content': '',
'website_published': False,
}, context=create_context)
- return werkzeug.utils.redirect("/blog/%s/?enable_editor=1" % (new_blog_post_id))
+ return werkzeug.utils.redirect("/blog/%s/?enable_editor=1" % new_blog_post_id)
- @website.route(['/blog//duplicate'], type='http', auth="public")
+ @website.route(['/blog/duplicate'], type='http', auth="public")
def blog_post_copy(self, blog_post_id=None, **post):
+ """ Duplicate a blog.
+
+ :param blog_post_id: id of the blog post currently browsed.
+
+ :return redirect to the new blog created
+ """
cr, uid, context = request.cr, request.uid, request.context
create_context = dict(context, mail_create_nosubscribe=True)
new_blog_post_id = request.registry['blog.post'].copy(cr, uid, blog_post_id, {}, context=create_context)
- return werkzeug.utils.redirect("/blog/%s/?enable_editor=1" % (new_blog_post_id))
+ return werkzeug.utils.redirect("/blog/%s/?enable_editor=1" % new_blog_post_id)
diff --git a/addons/website_blog/static/src/js/website_blog.editor.js b/addons/website_blog/static/src/js/website_blog.editor.js
index b0f1e604e62..6e9a5e0682b 100644
--- a/addons/website_blog/static/src/js/website_blog.editor.js
+++ b/addons/website_blog/static/src/js/website_blog.editor.js
@@ -16,7 +16,7 @@
.call('name_search', [], { context: website.get_context() });
},
}).then(function (cat_id) {
- document.location = '/blog/' + cat_id + '/new';
+ document.location = '/blog/new?category_id=' + cat_id;
});
}
}),
diff --git a/addons/website_blog/static/src/js/website_blog.js b/addons/website_blog/static/src/js/website_blog.js
deleted file mode 100644
index abacbb02781..00000000000
--- a/addons/website_blog/static/src/js/website_blog.js
+++ /dev/null
@@ -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();
- }
- });
-
-});
diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml
index 538cc914459..26fd8806422 100644
--- a/addons/website_blog/views/website_blog_templates.xml
+++ b/addons/website_blog/views/website_blog_templates.xml
@@ -15,7 +15,7 @@
-
+
@@ -51,7 +51,7 @@
-
+
@@ -73,7 +73,7 @@