7e397d32bbf009be9e616067f579505c7269fb46
[odoo/odoo.git] / addons / website_mail_group / controllers / main.py
1 # -*- coding: utf-8 -*-
2
3 import datetime
4
5 from openerp import tools
6 from openerp.addons.web import http
7 from openerp.addons.website.models.website import slug
8 from openerp.addons.web.http import request
9
10
11 class MailGroup(http.Controller):
12     _thread_per_page = 20
13     _replies_per_page = 10
14
15     def _get_archives(self, group_id):
16         MailMessage = request.registry['mail.message']
17         groups = MailMessage.read_group(
18             request.cr, request.uid, [('model', '=', 'mail.group'), ('res_id', '=', group_id)], ['subject', 'date'],
19             groupby="date", orderby="date desc", context=request.context)
20         for group in groups:
21             begin_date = datetime.datetime.strptime(group['__domain'][0][2], tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
22             end_date = datetime.datetime.strptime(group['__domain'][1][2], tools.DEFAULT_SERVER_DATETIME_FORMAT).date()
23             group['date_begin'] = '%s' % datetime.date.strftime(begin_date, tools.DEFAULT_SERVER_DATE_FORMAT)
24             group['date_end'] = '%s' % datetime.date.strftime(end_date, tools.DEFAULT_SERVER_DATE_FORMAT)
25         return groups
26
27     @http.route("/groups", type='http', auth="public", website=True)
28     def view(self, **post):
29         cr, uid, context = request.cr, request.uid, request.context
30         group_obj = request.registry.get('mail.group')
31         group_ids = group_obj.search(cr, uid, [('alias_id', '!=', False), ('alias_id.alias_name', '!=', False)], context=context)
32         values = {'groups': group_obj.browse(cr, uid, group_ids, context)}
33         return request.website.render('website_mail_group.mail_groups', values)
34
35     @http.route(["/groups/subscription/"], type='json', auth="user")
36     def subscription(self, group_id=0, action=False, **post):
37         cr, uid, context = request.cr, request.uid, request.context
38         group_obj = request.registry.get('mail.group')
39         if action:
40             group_obj.message_subscribe_users(cr, uid, [group_id], context=context)
41         else:
42             group_obj.message_unsubscribe_users(cr, uid, [group_id], context=context)
43         return []
44
45     @http.route([
46         "/groups/<model('mail.group'):group>",
47         "/groups/<model('mail.group'):group>/page/<int:page>"
48     ], type='http', auth="public", website=True)
49     def thread_headers(self, group, page=1, mode='thread', date_begin=None, date_end=None, **post):
50         cr, uid, context = request.cr, request.uid, request.context
51         thread_obj = request.registry.get('mail.message')
52
53         domain = [('model', '=', 'mail.group'), ('res_id', '=', group.id)]
54         if mode == 'thread':
55             domain += [('parent_id', '=', False)]
56         if date_begin and date_end:
57             domain += [('date', '>=', date_begin), ('date', '<=', date_end)]
58
59         thread_count = thread_obj.search_count(cr, uid, domain, context=context)
60         pager = request.website.pager(
61             url='/groups/%s' % slug(group),
62             total=thread_count,
63             page=page,
64             step=self._thread_per_page,
65             url_args={'mode': mode, 'date_begin': date_begin or '', 'date_end': date_end or ''},
66         )
67         thread_ids = thread_obj.search(cr, uid, domain, limit=self._thread_per_page, offset=pager['offset'])
68         messages = thread_obj.browse(cr, uid, thread_ids, context)
69         values = {
70             'messages': messages,
71             'group': group,
72             'pager': pager,
73             'mode': mode,
74             'archives': self._get_archives(group.id),
75             'date_begin': date_begin,
76             'date_end': date_end,
77             'replies_per_page': self._replies_per_page,
78         }
79         return request.website.render('website_mail_group.group_messages', values)
80
81     @http.route([
82         '''/groups/<model('mail.group'):group>/<model('mail.message', "[('model','=','mail.group'), ('res_id','=',group[0])]"):message>''',
83     ], type='http', auth="public", website=True)
84     def thread_discussion(self, group, message, mode='thread', date_begin=None, date_end=None, **post):
85         cr, uid, context = request.cr, request.uid, request.context
86         values = {
87             'message': message,
88             'group': group,
89             'mode': mode,
90             'archives': self._get_archives(group.id),
91             'date_begin': date_begin,
92             'date_end': date_end,
93             'replies_per_page': self._replies_per_page,
94         }
95         return request.website.render('website_mail_group.group_message', values)
96
97     @http.route(
98         '''/groups/<model('mail.group'):group>/<model('mail.message', "[('model','=','mail.group'), ('res_id','=',group[0])]"):message>/get_replies''',
99         type='json', auth="public", methods=['POST'], website=True)
100     def render_messages(self, group, message, **post):
101         last_displayed_id = post.get('last_displayed_id')
102         if not last_displayed_id:
103             return False
104         Message = request.registry['mail.message']
105         replies_domain = [('id', '<', int(last_displayed_id)), ('parent_id', '=', message.id)]
106         msg_ids = Message.search(request.cr, request.uid, replies_domain, limit=self._replies_per_page, context=request.context)
107         msg_count = Message.search(request.cr, request.uid, replies_domain, count=True, context=request.context)
108         messages = Message.browse(request.cr, request.uid, msg_ids, context=request.context)
109         values = {
110             'group': group,
111             'thread_header': message,
112             'messages': messages,
113             'msg_more_count': msg_count - self._replies_per_page,
114         }
115         return request.registry['ir.ui.view'].render(request.cr, request.uid, 'website_mail_group.messages_short', values, engine='ir.qweb', context=request.context)