diff --git a/addons/account/data/account_data.xml b/addons/account/data/account_data.xml index 0406efd4526..949d03324f3 100644 --- a/addons/account/data/account_data.xml +++ b/addons/account/data/account_data.xml @@ -155,11 +155,13 @@ Validated account.invoice + Invoice validated Paid account.invoice + Invoice paid diff --git a/addons/account_voucher/account_voucher_data.xml b/addons/account_voucher/account_voucher_data.xml index 440d1c5814a..6329176c6e9 100644 --- a/addons/account_voucher/account_voucher_data.xml +++ b/addons/account_voucher/account_voucher_data.xml @@ -17,6 +17,7 @@ Status Change account.voucher + Status changed diff --git a/addons/analytic/analytic_data.xml b/addons/analytic/analytic_data.xml index 26eb5ae3dd5..042c2162036 100644 --- a/addons/analytic/analytic_data.xml +++ b/addons/analytic/analytic_data.xml @@ -6,16 +6,19 @@ Contract to Renew account.analytic.account + Contract pending Contract Finished account.analytic.account + Contract closed Contract Opened account.analytic.account + Contract opened diff --git a/addons/crm/crm_lead_data.xml b/addons/crm/crm_lead_data.xml index bb590f49d73..724ec491efe 100644 --- a/addons/crm/crm_lead_data.xml +++ b/addons/crm/crm_lead_data.xml @@ -171,11 +171,13 @@ Stage Changed crm.lead + Stage changed Opportunity Won crm.lead + Opportunity won diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 13736d1442a..a0b16f042bc 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -470,11 +470,13 @@ Stage Changed hr.applicant + Stage changed Applicant Hired hr.applicant + Applicant hired diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index d75a9199369..5ac69eef489 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -243,7 +243,7 @@ class mail_thread(osv.AbstractModel): # subscribe uid unless asked not to if not context.get('mail_create_nosubscribe'): self.message_subscribe_users(cr, uid, [thread_id], [uid], context=context) - self.message_subscribe_from_parent(cr, uid, [thread_id], values.keys(), context=context) + self.message_auto_subscribe(cr, uid, [thread_id], values.keys(), context=context) # automatic logging unless asked not to (mainly for various testing purpose) if not context.get('mail_create_nolog'): @@ -261,7 +261,7 @@ class mail_thread(osv.AbstractModel): # Perform write, update followers result = super(mail_thread, self).write(cr, uid, ids, values, context=context) - self.message_subscribe_from_parent(cr, uid, ids, values.keys(), context=context) + self.message_auto_subscribe(cr, uid, ids, values.keys(), context=context) # Perform the tracking if tracked_fields: @@ -1069,7 +1069,24 @@ class mail_thread(osv.AbstractModel): self.check_access_rights(cr, uid, 'write') return self.write(cr, SUPERUSER_ID, ids, {'message_follower_ids': [(3, pid) for pid in partner_ids]}, context=context) - def message_subscribe_from_parent(self, cr, uid, ids, updated_fields, context=None): + def _message_get_auto_subscribe_fields(self, cr, uid, updated_fields, auto_follow_fields=['user_id'], context=None): + """ Returns the list of relational fields linking to res.users that should + trigger an auto subscribe. The default list checks for the fields + - called 'user_id' + - linking to res.users + - with track_visibility set + In OpenERP V7, this is sufficent for all major addon such as opportunity, + project, issue, recruitment, sale. + Override this method if a custom behavior is needed about fields + that automatically subscribe users. + """ + user_field_lst = [] + for name, column_info in self._all_columns.items(): + if name in auto_follow_fields and name in updated_fields and getattr(column_info.column, 'track_visibility', False) and column_info.column._obj == 'res.users': + user_field_lst.append(name) + return user_field_lst + + def message_auto_subscribe(self, cr, uid, ids, updated_fields, context=None): """ 1. fetch project subtype related to task (parent_id.res_model = 'project.task') 2. for each project subtype: subscribe the follower to the task @@ -1077,13 +1094,16 @@ class mail_thread(osv.AbstractModel): subtype_obj = self.pool.get('mail.message.subtype') follower_obj = self.pool.get('mail.followers') + # fetch auto_follow_fields + user_field_lst = self._message_get_auto_subscribe_fields(cr, uid, updated_fields, context=context) + # fetch related record subtypes related_subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', False), ('parent_id.res_model', '=', self._name)], context=context) subtypes = subtype_obj.browse(cr, uid, related_subtype_ids, context=context) default_subtypes = [subtype for subtype in subtypes if subtype.res_model == False] related_subtypes = [subtype for subtype in subtypes if subtype.res_model != False] relation_fields = set([subtype.relation_field for subtype in subtypes if subtype.relation_field != False]) - if not related_subtypes or not any(relation in updated_fields for relation in relation_fields): + if (not related_subtypes or not any(relation in updated_fields for relation in relation_fields)) and not user_field_lst: return True for record in self.browse(cr, uid, ids, context=context): @@ -1105,20 +1125,24 @@ class mail_thread(osv.AbstractModel): for follower in follower_obj.browse(cr, SUPERUSER_ID, follower_ids, context=context): new_followers.setdefault(follower.partner_id.id, set()).add(subtype.parent_id.id) - if not parent_res_id or not parent_model: - continue + if parent_res_id and parent_model: + for subtype in default_subtypes: + follower_ids = follower_obj.search(cr, SUPERUSER_ID, [ + ('res_model', '=', parent_model), + ('res_id', '=', parent_res_id), + ('subtype_ids', 'in', [subtype.id]) + ], context=context) + for follower in follower_obj.browse(cr, SUPERUSER_ID, follower_ids, context=context): + new_followers.setdefault(follower.partner_id.id, set()).add(subtype.id) - for subtype in default_subtypes: - follower_ids = follower_obj.search(cr, SUPERUSER_ID, [ - ('res_model', '=', parent_model), - ('res_id', '=', parent_res_id), - ('subtype_ids', 'in', [subtype.id]) - ], context=context) - for follower in follower_obj.browse(cr, SUPERUSER_ID, follower_ids, context=context): - new_followers.setdefault(follower.partner_id.id, set()).add(subtype.id) + # add followers coming from res.users relational fields that are tracked + user_ids = [getattr(record, name).id for name in user_field_lst if getattr(record, name)] + for partner_id in [user.partner_id.id for user in self.pool.get('res.users').browse(cr, SUPERUSER_ID, user_ids, context=context)]: + new_followers.setdefault(partner_id, None) for pid, subtypes in new_followers.items(): - self.message_subscribe(cr, uid, [record.id], [pid], list(subtypes), context=context) + subtypes = list(subtypes) if subtypes is not None else None + self.message_subscribe(cr, uid, [record.id], [pid], subtypes, context=context) return True #------------------------------------------------------ diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index 56a21342d9e..025327d70b3 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -94,16 +94,19 @@ Task Blocked project.task + Task blocked Task Done project.task + Task closed Stage Changed project.task + Stage changed diff --git a/addons/project_issue/project_issue_data.xml b/addons/project_issue/project_issue_data.xml index 55ec90b430d..591e6c04878 100644 --- a/addons/project_issue/project_issue_data.xml +++ b/addons/project_issue/project_issue_data.xml @@ -59,16 +59,19 @@ Access all issues from the top Project menu, and access the issues of a specific Issue Blocked project.issue + Issue blocked Issue Closed project.issue + Issue closed Stage Changed project.issue + Stage changed diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml index 72c3f5ab044..ceb43ba281a 100644 --- a/addons/purchase/purchase_data.xml +++ b/addons/purchase/purchase_data.xml @@ -52,10 +52,12 @@ RFQ Confirmed + purchase.order RFQ Approved + purchase.order diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml index 6d7cd043c39..a0e93cbf581 100644 --- a/addons/sale/sale_data.xml +++ b/addons/sale/sale_data.xml @@ -48,11 +48,13 @@ Quotation send sale.order + Quotation send Sales Order Confirmed sale.order + Quotation confirmed