Merge lp:~openerp-dev/openobject-addons/trunk-scroll-load-chatter-aja into lp:openobject-addons

Proposed by ajay javiya (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-scroll-load-chatter-aja
Merge into: lp:openobject-addons
Diff against target: 254 lines (+66/-21)
5 files modified
mail/doc/mail_message.rst (+5/-1)
mail/mail_message.py (+21/-16)
mail/mail_thread.py (+0/-1)
mail/static/src/js/mail.js (+9/-3)
mail/tests/test_message_read.py (+31/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-scroll-load-chatter-aja
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+195907@code.launchpad.net

Description of the change

Hello,
 - ADD : load a chatter messages on scroll.
Thank You.

To post a comment you must log in.
8984. By ajay javiya (OpenERP)

[ADD]: change log and set default message_read_limit = 50

8985. By ajay javiya (OpenERP)

[MERGE]: sync with trunk

8986. By ajay javiya (OpenERP)

[MERGE] : with trunk

8987. By ajay javiya (OpenERP)

[ADD]: limit and offset from client

8988. By ajay javiya (OpenERP)

[REV]: unwanted code

Unmerged revisions

8988. By ajay javiya (OpenERP)

[REV]: unwanted code

8987. By ajay javiya (OpenERP)

[ADD]: limit and offset from client

8986. By ajay javiya (OpenERP)

[MERGE] : with trunk

8985. By ajay javiya (OpenERP)

[MERGE]: sync with trunk

8984. By ajay javiya (OpenERP)

[ADD]: change log and set default message_read_limit = 50

8983. By ajay javiya (OpenERP)

[ADD]: test case

8982. By ajay javiya (OpenERP)

[IMP]: add option display_reverse to show message from first to last sequence, true for chatter and false for wall

8981. By ajay javiya (OpenERP)

[IMP]: Display record on scroll in chatter

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'mail/doc/mail_message.rst'
2--- mail/doc/mail_message.rst 2013-02-05 15:55:56 +0000
3+++ mail/doc/mail_message.rst 2013-11-25 13:13:54 +0000
4@@ -103,9 +103,13 @@
5 +++++++
6
7 - ``message_read`` :
8- Value: ids, domain, message_unload_ids, thread_level, context, parent_id, limit
9+ Value: ids, domain, message_unload_ids, thread_level, context, parent_id, limit, offset
10 Return: List of dictinary of message. All message is sent with their parented messages and
11 sort by id. The messages that the user can read but not in his search, are group in
12 expandable messages. The expandable messages contain the domain to expand.
13 - ``check_access_rule`` :
14 Overwrite the initial message for this model.
15+ - ``_message_read_add_expandables`` :
16+ add paremeter over_limit ,telling we have overlimit messages.
17+ - ``_get_expandable`` :
18+ add parameters limit and offset.
19
20=== modified file 'mail/mail_message.py'
21--- mail/mail_message.py 2013-09-19 14:23:38 +0000
22+++ mail/mail_message.py 2013-11-25 13:13:54 +0000
23@@ -69,7 +69,8 @@
24 _order = 'id desc'
25 _rec_name = 'record_name'
26
27- _message_read_limit = 30
28+ _message_read_limit = 50
29+ _message_read_offset = 0
30 _message_read_fields = ['id', 'parent_id', 'model', 'res_id', 'body', 'subject', 'date', 'to_read', 'email_from',
31 'type', 'vote_user_ids', 'attachment_ids', 'author_id', 'partner_ids', 'record_name']
32 _message_record_name_length = 18
33@@ -432,7 +433,7 @@
34 }
35
36 def _message_read_add_expandables(self, cr, uid, messages, message_tree, parent_tree,
37- message_unload_ids=[], thread_level=0, domain=[], parent_id=False, context=None):
38+ message_unload_ids=[], thread_level=0, domain=[], parent_id=False, max_limit=False, context=None):
39 """ Create expandables for message_read, to load new messages.
40 1. get the expandable for new threads
41 if display is flat (thread_level == 0):
42@@ -455,19 +456,20 @@
43 to load
44 :return bool: True
45 """
46- def _get_expandable(domain, message_nb, parent_id, max_limit):
47+ def _get_expandable(domain, message_nb, parent_id, limit, offset, max_limit):
48 return {
49 'domain': domain,
50 'nb_messages': message_nb,
51 'type': 'expandable',
52 'parent_id': parent_id,
53- 'max_limit': max_limit,
54+ 'max_limit': max_limit,
55+ 'limit': limit,
56+ 'offset': offset,
57 }
58
59 if not messages:
60 return True
61 message_ids = sorted(message_tree.keys())
62-
63 # 1. get the expandable for new threads
64 if thread_level == 0:
65 exp_domain = domain + [('id', '<', min(message_unload_ids + message_ids))]
66@@ -477,10 +479,10 @@
67 if ids:
68 # inside a thread: prepend
69 if parent_id:
70- messages.insert(0, _get_expandable(exp_domain, -1, parent_id, True))
71+ messages.insert(0, _get_expandable(exp_domain, -1, parent_id, self._message_read_limit, self._message_read_offset, max_limit))
72 # new threads: append
73 else:
74- messages.append(_get_expandable(exp_domain, -1, parent_id, True))
75+ messages.append(_get_expandable(exp_domain, -1, parent_id, self._message_read_limit, self._message_read_offset, max_limit))
76
77 # 2. get the expandables for new messages inside threads if display is not flat
78 if thread_level == 0:
79@@ -511,7 +513,7 @@
80 exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
81 idx = [msg.get('id') for msg in messages].index(child_id) + 1
82 # messages.append(_get_expandable(exp_domain, nb, message_id, False))
83- messages.insert(idx, _get_expandable(exp_domain, nb, message_id, False))
84+ messages.insert(idx, _get_expandable(exp_domain, nb, message_id, False, 0, False))
85 id_min, id_max, nb = max(child_ids), 0, 0
86 else:
87 id_min, id_max, nb = max(child_ids), 0, 0
88@@ -519,12 +521,12 @@
89 exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
90 idx = [msg.get('id') for msg in messages].index(message_id) + 1
91 # messages.append(_get_expandable(exp_domain, nb, message_id, id_min))
92- messages.insert(idx, _get_expandable(exp_domain, nb, message_id, False))
93+ messages.insert(idx, _get_expandable(exp_domain, nb, message_id, False, 0, False))
94
95 return True
96
97 def message_read(self, cr, uid, ids=None, domain=None, message_unload_ids=None,
98- thread_level=0, context=None, parent_id=False, limit=None):
99+ thread_level=0, context=None, parent_id=False, limit=None, offset=0):
100 """ Read messages from mail.message, and get back a list of structured
101 messages to be displayed as discussion threads. If IDs is set,
102 fetch these records. Otherwise use the domain to fetch messages.
103@@ -554,14 +556,18 @@
104 if message_unload_ids:
105 domain += [('id', 'not in', message_unload_ids)]
106 limit = limit or self._message_read_limit
107+ offset = offset or self._message_read_offset
108 message_tree = {}
109 message_list = []
110 parent_tree = {}
111-
112+ max_limit = False
113 # no specific IDS given: fetch messages according to the domain, add their parents if uid has access to
114 if ids is None:
115- ids = self.search(cr, uid, domain, context=context, limit=limit)
116-
117+ ids = self.search(cr, uid, domain, context=context)
118+ if ids:
119+ if len(ids) > limit:
120+ max_limit = True
121+ ids = limit and ids[offset:offset+limit] or ids[offset:]
122 # fetch parent if threaded, sort messages
123 for message in self.browse(cr, uid, ids, context=context):
124 message_id = message.id
125@@ -589,16 +595,15 @@
126 for key, message_id_list in parent_tree.iteritems():
127 message_id_list.sort(key=lambda item: item['id'])
128 message_id_list.insert(0, self._message_read_dict(cr, uid, message_tree[key], context=context))
129-
130 # create final ordered message_list based on parent_tree
131 parent_list = parent_tree.items()
132 parent_list = sorted(parent_list, key=lambda item: max([msg.get('id') for msg in item[1]]) if item[1] else item[0], reverse=True)
133 message_list = [message for (key, msg_list) in parent_list for message in msg_list]
134-
135 # get the child expandable messages for the tree
136 self._message_read_dict_postprocess(cr, uid, message_list, message_tree, context=context)
137 self._message_read_add_expandables(cr, uid, message_list, message_tree, parent_tree,
138- thread_level=thread_level, message_unload_ids=message_unload_ids, domain=domain, parent_id=parent_id, context=context)
139+ thread_level = thread_level, message_unload_ids=message_unload_ids, domain=domain, parent_id=parent_id, max_limit=max_limit, context=context)
140+
141 return message_list
142
143 #------------------------------------------------------
144
145=== modified file 'mail/mail_thread.py'
146--- mail/mail_thread.py 2013-10-18 14:49:24 +0000
147+++ mail/mail_thread.py 2013-11-25 13:13:54 +0000
148@@ -1462,7 +1462,6 @@
149 """ Add partners to the records followers. """
150 mail_followers_obj = self.pool.get('mail.followers')
151 subtype_obj = self.pool.get('mail.message.subtype')
152-
153 user_pid = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
154 if set(partner_ids) == set([user_pid]):
155 try:
156
157=== modified file 'mail/static/src/js/mail.js'
158--- mail/static/src/js/mail.js 2013-10-09 18:03:37 +0000
159+++ mail/static/src/js/mail.js 2013-11-25 13:13:54 +0000
160@@ -929,8 +929,10 @@
161 var self = this;
162
163 // read messages
164+
165 self.parent_thread.message_fetch(this.domain, this.context, false, function (arg, data) {
166 self.id = false;
167+ data = self.options.display_reverse ? data.reverse() : data //when display_reverse is true then show msg in last to first seq.
168 // insert the message on dom after this message
169 self.parent_thread.switch_new_message( data, self.$el );
170 self.animated_destroy(200);
171@@ -1221,7 +1223,6 @@
172 this.MailWidget = parent instanceof mail.Widget ? parent : false;
173 this.domain = options.domain || [];
174 this.context = _.extend(options.context || {});
175-
176 this.options = options.options;
177 this.options.root_thread = (options.options.root_thread != undefined ? options.options.root_thread : this);
178 this.options.show_compose_message = this.options.show_compose_message && !this.thread_level;
179@@ -1244,7 +1245,8 @@
180 this.partner_ids = datasets.partner_ids;
181 this.messages = [];
182 this.options.flat_mode = (this.options.display_indented_thread - this.thread_level > 0);
183-
184+ this.limit = 50;
185+ this.offset = 0;
186 // object compose message
187 this.compose_message = false;
188
189@@ -1445,7 +1447,9 @@
190 // context + additional
191 (replace_context ? replace_context : this.context),
192 // parent_id
193- this.context.default_parent_id || undefined
194+ this.context.default_parent_id || undefined,
195+ this.limit,
196+ this.offset
197 ]).done(callback ? _.bind(callback, this, arguments) : this.proxy('switch_new_message')
198 ).done(this.proxy('message_fetch_set_read'));
199 },
200@@ -1800,6 +1804,7 @@
201 'read_action': 'unread',
202 'show_record_name': false,
203 'show_compact_message': 1,
204+ 'display_reverse' : true,
205 }, this.node.params);
206
207 if (this.node.attrs.placeholder) {
208@@ -1923,6 +1928,7 @@
209 'show_compact_message': this.action.params.view_mailbox ? false : 1,
210 'view_inbox': false,
211 'emails_from_on_composer': false,
212+ 'display_reverse' : false,
213 }, this.action.params);
214 },
215
216
217=== modified file 'mail/tests/test_message_read.py'
218--- mail/tests/test_message_read.py 2013-08-27 13:30:58 +0000
219+++ mail/tests/test_message_read.py 2013-11-25 13:13:54 +0000
220@@ -187,3 +187,34 @@
221 self.assertEqual(len(read_msg_list), 9, 'message_read on Pigs should return 9 messages and 0 expandable')
222 self.assertEqual([msg_id8, msg_id7, msg_id6, msg_id5, msg_id4, msg_id3, msg_id2, msg_id1, msg_id0], read_msg_ids,
223 'message_read, More on flat, should return all remaning messages')
224+
225+ def test_10_message_read(self):
226+ """ Tests for message_read . """
227+ cr, uid, user_admin, user_raoul, group_pigs = self.cr, self.uid, self.user_admin, self.user_raoul, self.group_pigs
228+
229+ msg_id0 = self.group_pigs.message_post(body='test 1', subtype='mt_comment')
230+ msg_id1 = self.group_pigs.message_post(body='test 2', subtype='mt_comment')
231+ msg_id2 = self.group_pigs.message_post(body='test 3', subtype='mt_comment')
232+ msg_id3 = self.group_pigs.message_post(body='test 4', subtype='mt_comment')
233+ msg_id4 = self.group_pigs.message_post(body='test 5', subtype='mt_comment')
234+ msg_id5 = self.group_pigs.message_post(body='test 6', subtype='mt_comment')
235+ msg_id6 = self.group_pigs.message_post(body='test 7', subtype='mt_comment')
236+ msg_id7 = self.group_pigs.message_post(body='test 8', subtype='mt_comment')
237+ msg_id8 = self.group_pigs.message_post(body='test 9', subtype='mt_comment')
238+ msg_id9 = self.group_pigs.message_post(body='test 10', subtype='mt_comment')
239+ msg_id10 = self.group_pigs.message_post(body='test 11', subtype='mt_comment')
240+ msg_id11 = self.group_pigs.message_post(body='test 1', subtype='mt_comment')
241+ msg_id12 = self.group_pigs.message_post(body='test 2', subtype='mt_comment')
242+ msg_id13 = self.group_pigs.message_post(body='test 3', subtype='mt_comment')
243+ msg_id14 = self.group_pigs.message_post(body='test 4', subtype='mt_comment')
244+ msg_id15 = self.group_pigs.message_post(body='test 6', subtype='mt_comment')
245+ msg_id16 = self.group_pigs.message_post(body='test 7', subtype='mt_comment')
246+ msg_id17 = self.group_pigs.message_post(body='test 8', subtype='mt_comment')
247+ msg_id18 = self.group_pigs.message_post(body='test 9', subtype='mt_comment')
248+ msg_id19 = self.group_pigs.message_post(body='test 10', subtype='mt_comment')
249+ msg_id20 = self.group_pigs.message_post(body='test 11', subtype='mt_comment')
250+
251+ msg_ids = [msg_id20, msg_id19, msg_id18, msg_id17, msg_id16, msg_id15, msg_id14, msg_id13, msg_id12, msg_id11, msg_id10, msg_id9, msg_id8, msg_id7, msg_id6, msg_id5, msg_id4, msg_id3, msg_id2, msg_id1, msg_id0]
252+ # Test : message_read with limit and offset
253+ read_msg_list = self.mail_message.message_read(cr, uid,ids=msg_ids, limit=10, offset=0)
254+ read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']

Subscribers

People subscribed via source and target branches

to all changes: