diff --git a/addons/mail/mail_group.py b/addons/mail/mail_group.py index 0ff6c3f798d..2c8b9450439 100644 --- a/addons/mail/mail_group.py +++ b/addons/mail/mail_group.py @@ -107,17 +107,12 @@ class mail_group(osv.Model): # FP Note: code to be improved. Check we have a code for res.users # when we give them a new group. - def _subscribe_user_with_group_m2m_command(self, cr, uid, ids, group_ids_command, context=None): - # form: {'group_ids': [(3, 10), (3, 3), (4, 10), (4, 3)]} or {'group_ids': [(6, 0, [ids]} - user_group_ids = [command[1] for command in group_ids_command if command[0] == 4] - user_group_ids += [id for command in group_ids_command if command[0] == 6 for id in command[2]] - # retrieve the user member of those groups - partner_ids = [] - res_groups_obj = self.pool.get('res.groups') - for group in res_groups_obj.browse(cr, uid, user_group_ids, context=context): - partner_ids += [user.partner_id.id for user in group.users] - # subscribe the users - return self.message_subscribe(cr, uid, ids, partner_ids, context=context) + def _subscribe_users(self, cr, uid, ids, context=None): + for mail_group in self.browse(cr, uid, ids, context=context): + partner_ids = [] + for group in mail_group.group_ids: + partner_ids += [user.partner_id.id for user in group.users] + self.message_subscribe(cr, uid, ids, partner_ids, context=context) def create(self, cr, uid, vals, context=None): mail_alias = self.pool.get('mail.alias') @@ -150,8 +145,7 @@ class mail_group(osv.Model): mail_alias.write(cr, uid, [vals['alias_id']], {"alias_force_thread_id": mail_group_id}, context) if vals.get('group_ids'): - self._subscribe_user_with_group_m2m_command(cr, uid, [mail_group_id], vals.get('group_ids'), context=context) - + self._subscribe_users(cr, uid, [mail_group_id], context=context) return mail_group_id def unlink(self, cr, uid, ids, context=None): @@ -163,7 +157,8 @@ class mail_group(osv.Model): return res def write(self, cr, uid, ids, vals, context=None): + result = super(mail_group, self).write(cr, uid, ids, vals, context=context) if vals.get('group_ids'): - self._subscribe_user_with_group_m2m_command(cr, uid, ids, vals.get('group_ids'), context=context) - return super(mail_group, self).write(cr, uid, ids, vals, context=context) + self._subscribe_users(cr, uid, ids, vals.get('group_ids'), context=context) + return result diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index 8d53793341b..9aae5f9a8b7 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -49,6 +49,7 @@ class mail_mail(osv.Model): 'content_subtype': 'plain', } + # FP Note: should we use a dict instead ? def schedule_with_attach(self, cr, uid, email_from, email_to, subject, body, model=False, type='email', email_cc=None, reply_to=False, partner_ids=None, attachments=None, message_id=False, references=False, res_id=False, content_subtype='plain', diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 3a942bf53a7..43628f217f1 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -360,5 +360,3 @@ class mail_message(osv.Model): msg['body'] = msg['body_text'] msg['sub_type'] = msg['content_subtype'] or 'plain' return msg - - diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 7cdaa70f5de..74a69ac88e5 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -103,8 +103,8 @@ class mail_thread(osv.Model): return res # FP Note: todo - def _search_state(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None): - return [('id','in',[])] + def _search_unread(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None): + return [] _columns = { 'message_is_follower': fields.function(_get_is_follower, @@ -116,7 +116,7 @@ class mail_thread(osv.Model): domain=lambda self: [('model','=',self._name)], string='Related Messages', help="All messages related to the current document."), - 'message_unread': fields.function(_get_message_data, fnct_search=_search_state, 'Message Read', + 'message_unread': fields.function(_get_message_data, fnct_search=_search_unread, 'Has Unread Messages', help="When checked, new messages require your attention.", multi="_get_message_data"), 'message_summary': fields.function(_get_message_data, method=True, @@ -131,12 +131,10 @@ class mail_thread(osv.Model): #------------------------------------------------------ def create(self, cr, uid, vals, context=None): - """ Override of create to subscribe : - - the writer - - followers given by the monitored fields + """ Override of create to subscribe the current user """ thread_id = super(mail_thread, self).create(cr, uid, vals, context=context) - self.message_subscribe(cr, uid, [thread_id], [uid], context=context) + self.message_subscribe_users(cr, uid, [thread_id], [uid], context=context) return thread_id def unlink(self, cr, uid, ids, context=None): @@ -155,6 +153,8 @@ class mail_thread(osv.Model): # mail.message wrappers and tools #------------------------------------------------------ + # FP Note: should we support attachment ? Also, this method must be on + # the mail.message object, not on the thread. def message_create(self, cr, uid, thread_id, vals, context=None): """ OpenChatter: wrapper of mail.message create method - creates the mail.message @@ -177,14 +177,7 @@ class mail_thread(osv.Model): # Generic message api #------------------------------------------------------ - def message_capable_models(self, cr, uid, context=None): - ret_dict = {} - for model_name in self.pool.obj_list(): - model = self.pool.get(model_name) - if 'mail.thread' in getattr(model, '_inherit', []): - ret_dict[model_name] = model._description - return ret_dict - + # I propose to remove this. Everyone should use message_create instead. def message_append(self, cr, uid, threads, subject, body_text=None, body_html=None, type='email', email_date=None, parent_id=False, content_subtype='plain', state=None, @@ -313,6 +306,7 @@ class mail_thread(osv.Model): new_msg_ids.append(self.message_create(cr, uid, thread.id, data, context=context)) return new_msg_ids + # to be removed completly def message_append_dict(self, cr, uid, ids, msg_dict, context=None): """Creates a new mail.message attached to the given threads (``ids``), with the contents of ``msg_dict``, by calling ``message_append`` @@ -866,19 +860,37 @@ class mail_thread(osv.Model): return True return False - def message_subscribe(self, cr, uid, ids, partner_ids=None, context=None): + def message_subscribe_users(self, cr, uid, ids, user_ids=None, context=None): + if not user_ids: user_ids = [uid] + partners = {} + for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context): + partners[user.partner_id.id] = True + return self.message_subscribe(cr, uid, ids, partners.keys(), context=context) + + def message_subscribe(self, cr, uid, ids, partner_ids, context=None): """ - :param user_ids: a list of user_ids; if not set, subscribe + :param partner_ids: a list of user_ids; if not set, subscribe uid instead :param return: new value of followers, for Chatter """ - subscription_obj = self.pool.get('mail.subscription') + obj = self.pool.get('mail.followers') + objids = obj.search(cr, uid, [ + ('res_id', 'in', ids), + ('res_model', '=', self._name), + ('partner_id', 'in', partner_ids), + ], context=context) + followers = {} + for follow in obj.browse(cr, uid, objids, context=context) + followers.setdefault(follow.partner_id.id, {})[follow.res_id] = True create_ids = [] - for id in ids: - already_subscribed_user_ids = self.message_get_followers(cr, uid, [id], context=context) - for user_id in to_subscribe_uids: - if user_id in already_subscribed_user_ids: continue - create_ids.append(subscription_obj.create(cr, uid, {'res_model': self._name, 'res_id': id, 'user_id': user_id}, context=context)) + for res_id in ids: + for partner_id in partner_ids: + if followers.get(partner_id, {}).get(res_id, False): + continue + create_ids.append(obj.create(cr, uid, { + 'res_model': self._name, + 'res_id': res_id, 'partner_id': partner_id + }, context=context)) return create_ids def message_unsubscribe(self, cr, uid, ids, user_ids = None, context=None): diff --git a/addons/mail/res_partner.py b/addons/mail/res_partner.py index 062c557b325..c6ec7712fe1 100644 --- a/addons/mail/res_partner.py +++ b/addons/mail/res_partner.py @@ -31,18 +31,11 @@ class res_partner_mail(osv.Model): The purpose is to add messages directly sent to the partner. It also adds messages pushed to the related user, if any, using @login. """ - initial_domain = super(res_partner_mail, self).message_search_get_domain(cr, uid, ids, context=context) - # to avoid models inheriting from res.partner if self._name != 'res.partner': - return initial_domain + return super(res_partner_mail, self).message_search_get_domain(cr, uid, ids, context=context) # add message linked to the partner - search_domain = ['|'] + initial_domain + ['|', ('partner_id', 'in', ids), ('partner_ids', 'in', ids)] - # if partner is linked to a user: find @login - res_users_obj = self.pool.get('res.users') - user_ids = res_users_obj.search(cr, uid, [('partner_id', 'in', ids)], context=context) - for user in res_users_obj.browse(cr, uid, user_ids, context=context): - search_domain = ['|'] + search_domain + ['|', ('body_text', 'like', '@%s' % (user.login)), ('body_html', 'like', '@%s' % (user.login))] - return search_domain + return [('partner_ids', 'in', ids)] + _columns = { 'notification_email_pref': fields.selection([ ('all', 'All feeds'), diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index e57b046622e..1a39ed64bd9 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -98,17 +98,16 @@ class res_users(osv.Model): alias_id = mail_alias.create_unique_alias(cr, uid, {'alias_name': data['login']}, model_name=self._name, context=context) data['alias_id'] = alias_id data.pop('alias_name', None) # prevent errors during copy() + # create user that follows its related partner - user_id = super(res_users, self).create(cr, uid, data, context=context) - user = self.browse(cr, uid, user_id, context=context) - self.pool.get('res.partner').message_subscribe(cr, uid, [user.partner_id.id], [user_id], context=context) + self.pool.get('res.partner').message_subscribe_users(cr, uid, [user_id], [user_id], context=context) # alias mail_alias.write(cr, SUPERUSER_ID, [alias_id], {"alias_force_thread_id": user_id}, context) # create a welcome message - self.create_welcome_message(cr, uid, user, context=context) + self._create_welcome_message(cr, uid, user, context=context) return user_id - def create_welcome_message(self, cr, uid, user, context=None): + def _create_welcome_message(self, cr, uid, user, context=None): company_name = user.company_id.name if user.company_id else _('the company') subject = '''%s has joined %s.''' % (user.name, company_name) body = '''Welcome to OpenERP !''' @@ -135,35 +134,35 @@ class res_users(osv.Model): # that should help cleaning those wrappers # -------------------------------------------------- - def message_append(self, cr, uid, threads, subject, body_text=None, body_html=None, - type='email', email_date=None, parent_id=False, - content_subtype='plain', state=None, - partner_ids=None, email_from=False, email_to=False, - email_cc=None, email_bcc=None, reply_to=None, - headers=None, message_id=False, references=None, - attachments=None, original=None, context=None): - for user in self.browse(cr, uid, threads, context=context): - user.partner_id.message_append(subject, body_text, body_html, type, email_date, parent_id, - content_subtype, state, partner_ids, email_from, email_to, email_cc, email_bcc, reply_to, - headers, message_id, references, attachments, original) + #def message_append(self, cr, uid, threads, subject, body_text=None, body_html=None, + # type='email', email_date=None, parent_id=False, + # content_subtype='plain', state=None, + # partner_ids=None, email_from=False, email_to=False, + # email_cc=None, email_bcc=None, reply_to=None, + # headers=None, message_id=False, references=None, + # attachments=None, original=None, context=None): + # for user in self.browse(cr, uid, threads, context=context): + # user.partner_id.message_append(subject, body_text, body_html, type, email_date, parent_id, + # content_subtype, state, partner_ids, email_from, email_to, email_cc, email_bcc, reply_to, + # headers, message_id, references, attachments, original) - def message_read(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None, - limit=100, offset=0, domain=None, context=None): - for user in self.browse(cr, uid, ids, context=context): - return user.partner_id.message_read(fetch_ancestors, ancestor_ids, limit, offset, domain) + #def message_read(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None, + # limit=100, offset=0, domain=None, context=None): + # for user in self.browse(cr, uid, ids, context=context): + # return user.partner_id.message_read(fetch_ancestors, ancestor_ids, limit, offset, domain) - def message_search(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None, - limit=100, offset=0, domain=None, count=False, context=None): - for user in self.browse(cr, uid, ids, context=context): - return user.partner_id.message_search(fetch_ancestors, ancestor_ids, limit, offset, domain, count) + #def message_search(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None, + # limit=100, offset=0, domain=None, count=False, context=None): + # for user in self.browse(cr, uid, ids, context=context): + # return user.partner_id.message_search(fetch_ancestors, ancestor_ids, limit, offset, domain, count) - def message_subscribe(self, cr, uid, ids, user_ids = None, context=None): - for user in self.browse(cr, uid, ids, context=context): - return user.partner_id.message_subscribe(user_ids) + #def message_subscribe(self, cr, uid, ids, user_ids = None, context=None): + # for user in self.browse(cr, uid, ids, context=context): + # return user.partner_id.message_subscribe(user_ids) - def message_unsubscribe(self, cr, uid, ids, user_ids = None, context=None): - for user in self.browse(cr, uid, ids, context=context): - return user.partner_id.message_unsubscribe(user_ids) + #def message_unsubscribe(self, cr, uid, ids, user_ids = None, context=None): + # for user in self.browse(cr, uid, ids, context=context): + # return user.partner_id.message_unsubscribe(user_ids) class res_users_mail_group(osv.Model): @@ -175,6 +174,7 @@ class res_users_mail_group(osv.Model): _name = 'res.users' _inherit = ['res.users'] + # FP Note: to improve def write(self, cr, uid, ids, vals, context=None): write_res = super(res_users_mail_group, self).write(cr, uid, ids, vals, context=context) if vals.get('groups_id'): @@ -195,6 +195,7 @@ class res_groups_mail_group(osv.Model): _name = 'res.groups' _inherit = 'res.groups' + # FP Note: to improve def write(self, cr, uid, ids, vals, context=None): if vals.get('users'): # form: {'group_ids': [(3, 10), (3, 3), (4, 10), (4, 3)]} or {'group_ids': [(6, 0, [ids]} @@ -205,4 +206,3 @@ class res_groups_mail_group(osv.Model): mail_group_obj.message_subscribe(cr, uid, mail_group_ids, user_ids, context=context) return super(res_groups_mail_group, self).write(cr, uid, ids, vals, context=context) -# vim:et: