diff options
| author | Christophe Matthieu <chm@openerp.com> | 2013-07-29 16:19:34 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@openerp.com> | 2013-07-29 16:19:34 +0200 |
| commit | 4dde39af8f4c06062cbd98bdf240f584e6b4fbde (patch) | |
| tree | c2b407e0c28a944e2f2549200ac1a814970e3d20 | |
| parent | 4ebaf63987aab5262ec0570b3b894552dcbeabd7 (diff) | |
[IMP] website_mail: blog archive, pager
bzr revid: chm@openerp.com-20130729141934-y45eofkxxjgya59u
| -rw-r--r-- | addons/website_mail/controllers/main.py | 41 | ||||
| -rw-r--r-- | addons/website_mail/mail_message.py | 11 | ||||
| -rw-r--r-- | addons/website_mail/static/src/css/blog.css | 6 | ||||
| -rw-r--r-- | addons/website_mail/static/src/css/blog.sass | 6 | ||||
| -rw-r--r-- | addons/website_mail/static/src/js/blog.js | 33 | ||||
| -rw-r--r-- | addons/website_mail/views/website_mail.xml | 25 |
6 files changed, 90 insertions, 32 deletions
diff --git a/addons/website_mail/controllers/main.py b/addons/website_mail/controllers/main.py index 1c189fd4497..f40a0d78e0e 100644 --- a/addons/website_mail/controllers/main.py +++ b/addons/website_mail/controllers/main.py @@ -1,38 +1,50 @@ # -*- coding: utf-8 -*- -import openerp -from datetime import datetime from openerp.addons.web.http import request from openerp.addons.website import website import werkzeug from openerp.tools.translate import _ +from openerp.tools.safe_eval import safe_eval +import simplejson _months = {1:_("January"), 2:_("February"), 3:_("March"), 4:_("April"), 5:_("May"), 6:_("June"), 7:_("July"), 8:_("August"), 9:_("September"), 10:_("October"), 11:_("November"), 12:_("December")} + class website_mail(website): @website.route(['/blog', '/blog/<int:mail_group_id>', '/blog/<int:mail_group_id>/<int:blog_id>'], type='http', auth="admin") def blog(self, cr, uid, mail_group_id=None, blog_id=None, **post): - mail_group_obj = request.registry['mail.group'] + group_obj = request.registry['mail.group'] message_obj = request.registry['mail.message'] values = { 'res_company': request.registry['res.company'].browse(cr, uid, 1), 'blog_ids': None, 'blog_id': None, + 'nav_list': dict(), + 'prev_date': None, + 'next_date': None, } + domain = mail_group_id and [("res_id", "=", mail_group_id)] or [] + + for group in message_obj.read_group(cr, uid, domain + group_obj.get_public_domain(cr, uid), ['subject', 'date'], groupby="date", orderby="create_date asc"): + year = group['date'].split(" ")[1] + if not values['nav_list'].get(year): + values['nav_list'][year] = {'name': year, 'date_count': 0, 'months': []} + values['nav_list'][year]['date_count'] += group['date_count'] + values['nav_list'][year]['months'].append(group) - values['nav_list'] = dict() - message_ids = mail_group_obj.get_public_message_ids(cr, uid, domain=mail_group_id and [("res_id", "=", mail_group_id)] or []) + if post.get('date'): + ids = group_obj.get_public_message_ids(cr, uid, domain=domain + [("date", ">", post.get('date'))], order="create_date asc", limit=10) + if ids: + values['prev_date'] = message_obj.browse(cr, uid, ids.pop()).date + domain += [("date", "<=", post.get('date'))] + + message_ids = group_obj.get_public_message_ids(cr, uid, domain=domain, order="create_date desc", limit=11) if message_ids: values['blog_ids'] = message_obj.browse(cr, uid, message_ids) - for blog in values['blog_ids']: - date = datetime.strptime(blog.date, "%Y-%m-%d %H:%M:%S") - if not values['nav_list'].get(date.year): - values['nav_list'][date.year] = {'name': date.year, 'months': {}} - if not values['nav_list'][date.year]['months'].get(date.month): - values['nav_list'][date.year]['months'][date.month] = {'name': _months[date.month], 'blog_ids': []} - values['nav_list'][date.year]['months'][date.month]['blog_ids'].append(blog) + if len(message_ids) > 10: + values['next_date'] = values['blog_ids'].pop().date if blog_id: values['blog_id'] = message_obj.browse(cr, uid, blog_id) @@ -42,6 +54,11 @@ class website_mail(website): html = self.render(cr, uid, "website_mail.index", values) return html + @website.route(['/blog/nav'], type='http', auth="admin") + def nav(self, cr, uid, **post): + comment_ids = request.registry['mail.group'].get_public_message_ids(cr, uid, domain=safe_eval(post.get('domain')), order="create_date asc", limit=None) + return simplejson.dumps(request.registry['mail.message'].read(cr, uid, comment_ids, ['website_published', 'subject', 'res_id'])) + @website.route(['/blog/publish'], type='http', auth="admin") def publish(self, cr, uid, **post): message_id = int(post['message_id']) diff --git a/addons/website_mail/mail_message.py b/addons/website_mail/mail_message.py index ab4ff6f278b..c3133f06f7e 100644 --- a/addons/website_mail/mail_message.py +++ b/addons/website_mail/mail_message.py @@ -32,9 +32,12 @@ class mail_message(osv.osv): class mail_group(osv.Model): _inherit = 'mail.group' - def get_public_message_ids(self, cr, uid, domain=[], context=None): - mail_group_ids = self.search(cr, uid, [('public', '=', 'public')], order="create_date", context=context) - domain += [ ("type", "in", ['comment']), + def get_public_domain(self, cr, uid, context=None): + mail_group_ids = self.search(cr, uid, [('public', '=', 'public')], context=context) + return [ ("type", "in", ['comment']), ("parent_id", "=", False), ("model", "=", 'mail.group'), ("res_id", "in", mail_group_ids)] - return self.pool.get('mail.message').search(cr, uid, domain, context=context) + + def get_public_message_ids(self, cr, uid, domain=[], order="create_date desc", limit=10, offset=0, context=None): + domain += self.get_public_domain(cr, uid, context=context) + return self.pool.get('mail.message').search(cr, uid, domain, order=order, limit=limit, offset=offset, context=context) diff --git a/addons/website_mail/static/src/css/blog.css b/addons/website_mail/static/src/css/blog.css index 4c5f53ec1c7..24a9eb4bc3f 100644 --- a/addons/website_mail/static/src/css/blog.css +++ b/addons/website_mail/static/src/css/blog.css @@ -25,3 +25,9 @@ .css_website_mail .has-error { border-color: red; } +.css_website_mail .css_older { + float: right; +} +.css_website_mail .css_newer { + float: left; +} diff --git a/addons/website_mail/static/src/css/blog.sass b/addons/website_mail/static/src/css/blog.sass index 3fdc5c42d10..60ab22d753d 100644 --- a/addons/website_mail/static/src/css/blog.sass +++ b/addons/website_mail/static/src/css/blog.sass @@ -21,4 +21,8 @@ .css_unpublish display: none .has-error - border-color: red
\ No newline at end of file + border-color: red + .css_older + float: right + .css_newer + float: left
\ No newline at end of file diff --git a/addons/website_mail/static/src/js/blog.js b/addons/website_mail/static/src/js/blog.js index fb10bcc9b4b..a9a349e5412 100644 --- a/addons/website_mail/static/src/js/blog.js +++ b/addons/website_mail/static/src/js/blog.js @@ -1,17 +1,45 @@ $(document).ready(function () { $('.js_website_mail').on('click', '.js_publish', function (e) { - var $link = $(e.currentTarget); + e.preventDefault(); var $media = $link.parent(); $media.toggleClass('css_published'); $.post('/blog/publish/', {'message_id': $link.data('id')}, function (result) { if (+result) $media.addClass('css_published'); else $media.removeClass('css_published'); }); - return false; + }); + + $form = $('.js_nav_year a:first').on('click', function (e) { + e.preventDefault(); + $(this).next("ul").toggle(); + }); + + $form = $('.js_nav_month a:first').on('click', function (e) { + e.preventDefault(); + var $ul = $(this).next("ul"); + if (!$ul.find('li').length) { + $.post('/blog/nav', {'domain': $(this).data("domain")}, function (result) { + var result = JSON.parse(result); + var blog_id = +window.location.pathname.split("/").pop(); + $(result).each(function () { + var $a = $('<a href="/blog/'+this.res_id+'/'+this.id+'"/>').text(this.subject); + var $li = $("<li/>").append($a); + if (blog_id == this.id) + $li.addClass("active"); + if (!this.website_published) + $a.css("color", "red"); + $ul.append($li); + }); + + }); + } else { + $ul.toggle(); + } }); $form = $('.js_website_mail form#post'); $form.submit(function (e) { + e.preventDefault(); var error = $form.find("textarea").val().length < 3; $form.find("textarea").toggleClass("has-error", error); if (!error) { @@ -20,6 +48,5 @@ $(document).ready(function () { window.location.href = url }); } - return false; }); });
\ No newline at end of file diff --git a/addons/website_mail/views/website_mail.xml b/addons/website_mail/views/website_mail.xml index af23e8ae4ea..b0774ccb8d9 100644 --- a/addons/website_mail/views/website_mail.xml +++ b/addons/website_mail/views/website_mail.xml @@ -34,16 +34,11 @@ <!-- TODO: check qweb iteration --> <t t-foreach="nav_list" t-as="year"> <t t-set="year" t-value="nav_list[year]"/> - <li><t t-esc="year['name']"/> - <ul class="nav nav-list"> - <t t-foreach="year['months']" t-as="month"> - <t t-set="month" t-value="year['months'][month]"/> - <li><t t-esc="month['name']"/> - <ul class="nav nav-list"> - <t t-foreach="month['blog_ids']" t-as="blog"> - <li t-att-class="blog.id == blog_id.id and 'active' or ''"><a t-att-href="'/blog/%%s/%%s' %% (blog.res_id, blog.id)"><t t-esc="blog.subject"/> </a></li> - </t> - </ul> + <li class="js_nav_year"><a href="#"><t t-esc="year['name']"/> <small>(<t t-esc="year['date_count']"/>)</small></a> + <ul class="nav nav-list" style="display: none"> + <t t-foreach="year['months']"> + <li class="js_nav_month"><a href="#" t-att-data-domain="__domain"><t t-esc="date"/> <small>(<t t-esc="date_count"/>)</small></a> + <ul class="nav nav-list"/> </li> </t> </ul> @@ -95,13 +90,17 @@ <ul class="media-list"> <t t-foreach="blog_ids" t-as="blog"> <li class="media well"> - <div class="media-body"> + <div t-att-class="'media-body %%s' %% (blog.website_published and 'css_published' or '')"> + <a href="#" title="Click to publish or unpublish this message" t-att-data-id="blog.id" class="js_publish css_button_publish" groups="group_website_mail_manager"> + <i class="icon-ok-circle css_publish"></i> + <i class="icon-remove-sign css_unpublish"></i> + </a> <h4 class="media-heading"><t t-esc="blog.subject"/></h4> <div class="media"> <t t-raw="blog.body"/> <small class="pull-right muted text-right"> <a t-att-href="'/blog/%%s/%%s' %% (blog.res_id, blog.id)">Read more </a> - <div><t t-esc="blog.author_id.name"/></div> + <div><t t-esc="blog.read(['author_id'])[0]['author_id'][1]"/></div> <div><t t-esc="blog.date"/></div> </small> </div> @@ -109,6 +108,8 @@ </li> </t> </ul> + <a t-if="prev_date" t-att-href="'?date=%%s' %% (prev_date)" class="css_newer">Newer</a> + <a t-if="next_date" t-att-href="'?date=%%s' %% (next_date)" class="css_older">Older</a> </div> </div> </div> |
