diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 6e1d3a7755b..6b29dbbafe6 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -859,13 +859,10 @@ class crm_lead(base_stage, osv.osv): # OpenChatter methods and notifications # ---------------------------------------- - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add the salesman. """ - user_ids = super(crm_lead, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(crm_lead, self).message_get_follower_fields(cr, uid, ids, context=context) + return res.append('user_id') def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index 7eedfa54ce5..1788c857aba 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -366,15 +366,10 @@ class hr_holidays(osv.osv): result[obj.id] = hr_manager_group['users'] return result - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add employee and its manager. """ - user_ids = super(hr_holidays, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - if obj.employee_id.parent_id and not obj.employee_id.parent_id.user_id.id in user_ids: - user_ids.append(obj.employee_id.parent_id.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(hr_holidays, self).message_get_follower_fields(cr, uid, ids, context=context) + return res + ['user_id', 'employee_id.parent_id.user_id'] def create_notificate(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 1db79172dc5..cdd3252ff49 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -461,13 +461,10 @@ class hr_applicant(base_stage, osv.Model): # OpenChatter methods and notifications # ------------------------------------------------------- - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add responsible user. """ - user_ids = super(hr_applicant, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(hr_applicant, self).message_get_follower_fields(cr, uid, ids, context=context) + return res.append('user_id') def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ diff --git a/addons/mail/mail_group.py b/addons/mail/mail_group.py index 84008548d96..306a758eda2 100644 --- a/addons/mail/mail_group.py +++ b/addons/mail/mail_group.py @@ -184,3 +184,12 @@ class mail_group(osv.Model): def action_group_leave(self, cr, uid, ids, context=None): return self.message_unsubscribe(cr, uid, ids, context=context) + + # ---------------------------------------- + # OpenChatter methods and notifications + # ---------------------------------------- + + def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): + """ Add 'responsible_id' to the monitored fields """ + res = super(mail_group, self).message_get_monitored_follower_fields(cr, uid, ids, context=context) + return res + ['responsible_id'] diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index efba082fee4..473dffe21fd 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -35,6 +35,10 @@ import xmlrpclib _logger = logging.getLogger(__name__) class many2many_reference(fields.many2many): + """ many2many_reference is an override of fields.many2many. It manages + many2many-like table where one id is given by two fields, res_model + and res_id. + """ def _get_query_and_where_params(self, cr, model, ids, values, where_params): """ Add in where: @@ -54,6 +58,7 @@ class many2many_reference(fields.many2many): return query, where_params def set(self, cr, model, id, name, values, user=None, context=None): + """ Override to add the res_model field in queries. """ if not values: return rel, id1, id2 = self._sql_names(model) obj = model.pool.get(self._obj) @@ -64,7 +69,7 @@ class many2many_reference(fields.many2many): idnew = obj.create(cr, user, act[2], context=context) cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+',res_model) VALUES (%s,%s,%s)', (id, idnew, model._name)) elif act[0] == 3: - cr.execute('DELETE FROM "'+rel+'" WHERE '+id1+'=%s AND '+id2+'=%s AND res_model=%s', (id, act[1], model._name)) + cr.execute('DELETE FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND res_model=%s', (id, act[1], model._name)) elif act[0] == 4: # following queries are in the same transaction - so should be relatively safe cr.execute('SELECT 1 FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND res_model=%s', (id, act[1], model._name)) @@ -80,7 +85,6 @@ class many2many_reference(fields.many2many): for act_nbr in act[2]: cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+',res_model) VALUES (%s,%s,%s)', (id, act_nbr, model._name)) else: - print act return super(many2many_reference, self).set(cr, model, id, name, values, user, context) class mail_thread(osv.Model): @@ -160,18 +164,36 @@ class mail_thread(osv.Model): #------------------------------------------------------ def create(self, cr, uid, vals, context=None): - """ Automatically subscribe the creator """ + """ Override of create to subscribe : + - the writer + - followers given by the monitored fields + """ thread_id = super(mail_thread, self).create(cr, uid, vals, context=context) + fields = self.message_get_follower_fields(cr, uid, [thread_id], context=context) + print fields if thread_id: self.message_subscribe(cr, uid, [thread_id], [uid], context=context) return thread_id def write(self, cr, uid, ids, vals, context=None): - """ Override of write to subscribe the writer, except if he has changed - the followers (to avoid unfollow-->follow). """ + """ Override of write to subscribe : + - the writer + - followers given by the monitored fields + """ if isinstance(ids, (int, long)): ids = [ids] + command = self.message_get_automatic_followers(cr, uid, ids, vals, context=context) + print command + if vals.get('message_follower_ids'): + vals['message_follower_ids'] += command + else: + vals['message_follower_ids'] = command + print vals write_res = super(mail_thread, self).write(cr, uid, ids, vals, context=context) + + + + if write_res and not vals.get('message_follower_ids'): self.message_subscribe(cr, uid, ids, [uid], context=context) return write_res; @@ -188,6 +210,39 @@ class mail_thread(osv.Model): msg_obj.unlink(cr, uid, msg_to_del_ids, context=context) return super(mail_thread, self).unlink(cr, uid, ids, context=context) + def message_get_automatic_followers(self, cr, uid, ids, record_vals, add_uid=True, fetch_missing=False, context=None): + """ + + :param record_vals: values given to the create method of the new + record, or values updated in a write. + :param monitored_fields: a list of fields that are monitored. Those + fields must be many2one fields to the res.users model. + :param fetch_missing: is set to True, the method will read the + record to find values that are not present in record_vals. + + #TODO : UPDATE WHEN MERGING TO PARTNERS + """ + # get monitored fields + monitored_fields = self.message_get_monitored_follower_fields(cr, uid, ids, context=context) + print monitored_fields + # for each monitored field: if in record_vals, it has been modified + fields = [field for field in monitored_fields if field in record_vals.iterkeys()] + print fields + + follower_ids = [] + for field in fields: + value = record_vals.get(field) + if value: + follower_ids.append(value) + elif fetch_missing: + pass + + print follower_ids + if add_uid and uid not in follower_ids: + follower_ids.append(uid) + + return self.message_subscribe_get_command(cr, uid, follower_ids, context=context) + #------------------------------------------------------ # mail.message wrappers and tools #------------------------------------------------------ @@ -931,6 +986,12 @@ class mail_thread(osv.Model): # Subscription mechanism #------------------------------------------------------ + def message_get_monitored_follower_fields(self, cr, uid, ids, context=None): + """ Returns a list of fields containing a res.user.id. Those fields + will be checked to automatically subscribe those users. + """ + return [] + def message_get_subscribers(self, cr, uid, ids, context=None): """ Returns the current document followers. Basically this method checks in mail.followers for entries with matching res_model, @@ -953,6 +1014,10 @@ class mail_thread(osv.Model): write_res = self.write(cr, uid, ids, {'message_follower_ids': [(4, id) for id in to_subscribe_uids]}, context=context) return [follower.id for thread in self.browse(cr, uid, ids, context=context) for follower in thread.message_follower_ids] + def message_subscribe_get_command(self, cr, uid, follower_ids, context=None): + """ Generate the many2many command to add followers. """ + return [(4, id) for id in follower_ids] + def message_unsubscribe(self, cr, uid, ids, user_ids = None, context=None): """ Unsubscribe the user (or user_ids) from the current document. @@ -963,6 +1028,10 @@ class mail_thread(osv.Model): write_res = self.write(cr, uid, ids, {'message_follower_ids': [(3, id) for id in to_unsubscribe_uids]}, context=context) return [follower.id for thread in self.browse(cr, uid, ids, context=context) for follower in thread.message_follower_ids] + def message_unsubscribe_get_command(self, cr, uid, follower_ids, context=None): + """ Generate the many2many command to remove followers. """ + return [(3, id) for id in follower_ids] + #------------------------------------------------------ # Notification API #------------------------------------------------------ diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 749d95c0c23..a41e4dbc332 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -1046,13 +1046,10 @@ class mrp_production(osv.osv): # OpenChatter methods and notifications # --------------------------------------------------- - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add responsible user. """ - user_ids = super(mrp_production, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(mrp_production, self).message_get_follower_fields(cr, uid, ids, context=context) + return res.append('user_id') def create_send_note(self, cr, uid, ids, context=None): self.message_append_note(cr, uid, ids, body=_("Manufacturing order has been created."), context=context) diff --git a/addons/project/project.py b/addons/project/project.py index 6f3b23f4746..b1db7fde6b3 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -513,13 +513,10 @@ def Project(): # OpenChatter methods and notifications # ------------------------------------------------ - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add responsible user. """ - user_ids = super(project, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(project, self).message_get_follower_fields(cr, uid, ids, context=context) + return res.append('user_id') def create(self, cr, uid, vals, context=None): if context is None: context = {} @@ -1201,15 +1198,10 @@ class task(base_stage, osv.osv): result[obj.id].append(obj.user_id.id) return result - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add responsible user and project manager. """ - user_ids = super(task, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - if obj.manager_id and not obj.manager_id.id in user_ids: - user_ids.append(obj.manager_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(task, self).message_get_follower_fields(cr, uid, ids, context=context) + return res + ['user_id', 'manager_id'] def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """ diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 7b2afbeacf2..5aa34c173c5 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -502,13 +502,10 @@ class project_issue(base_stage, osv.osv): # OpenChatter methods and notifications # ------------------------------------------------------- - def message_get_subscribers(self, cr, uid, ids, context=None): - """ Override to add responsible user. """ - user_ids = super(project_issue, self).message_get_subscribers(cr, uid, ids, context=context) - for obj in self.browse(cr, uid, ids, context=context): - if obj.user_id and not obj.user_id.id in user_ids: - user_ids.append(obj.user_id.id) - return user_ids + def message_get_follower_fields(self, cr, uid, ids, context=None): + """ Override to add 'user_id' field to automatic subscription. """ + res = super(project_issue, self).message_get_follower_fields(cr, uid, ids, context=context) + return res.append('user_id') def stage_set_send_note(self, cr, uid, ids, stage_id, context=None): """ Override of the (void) default notification method. """