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