diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 330bbb1fc9b..cca195a1539 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -102,6 +102,7 @@ class crm_case_section(osv.osv):
""" Model for sales teams. """
_name = "crm.case.section"
_inherits = {'mail.alias': 'alias_id'}
+ _inherit = "mail.thread"
_description = "Sales Teams"
_order = "complete_name"
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index d8b7fb58e49..d3f7e1d77ef 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -277,6 +277,10 @@ class crm_lead(base_stage, format_address, osv.osv):
def create(self, cr, uid, vals, context=None):
obj_id = super(crm_lead, self).create(cr, uid, vals, context)
+ section_id = self.browse(cr, uid, obj_id, context=context).section_id
+ if section_id:
+ followers = [follow.id for follow in section_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [obj_id], followers, context=context)
self.create_send_note(cr, uid, [obj_id], context=context)
return obj_id
@@ -790,7 +794,12 @@ class crm_lead(base_stage, format_address, osv.osv):
stage = self.pool.get('crm.case.stage').browse(cr, uid, vals['stage_id'], context=context)
if stage.on_change:
vals['probability'] = stage.probability
- return super(crm_lead,self).write(cr, uid, ids, vals, context)
+ if vals.get('section_id'):
+ section_id = self.pool.get('crm.case.section').browse(cr, uid, vals.get('section_id'), context=context)
+ if section_id:
+ vals.setdefault('message_follower_ids', [])
+ vals['message_follower_ids'] += [(4, follower.id) for follower in section_id.message_follower_ids]
+ return super(crm_lead,self).write(cr, uid, ids, vals, context)
# ----------------------------------------
# Mail Gateway
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index df2177a51fe..1da78e50843 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -115,6 +115,10 @@
+
+
+
+
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index 3508dc36d49..d0da22c5681 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -141,6 +141,7 @@ hr_employee()
class hr_evaluation(osv.osv):
_name = "hr_evaluation.evaluation"
+ _inherit = "mail.thread"
_description = "Employee Appraisal"
_rec_name = 'employee_id'
_columns = {
@@ -242,8 +243,10 @@ class hr_evaluation(osv.osv):
def button_final_validation(self, cr, uid, ids, context=None):
request_obj = self.pool.get('hr.evaluation.interview')
self.write(cr, uid, ids, {'state':'progress'}, context=context)
- for id in self.browse(cr, uid, ids, context=context):
- if len(id.survey_request_ids) != len(request_obj.search(cr, uid, [('evaluation_id', '=', id.id),('state', 'in', ['done','cancel'])], context=context)):
+ for evaluation in self.browse(cr, uid, ids, context=context):
+ if evaluation.employee_id and evaluation.employee_id.parent_id and evaluation.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [evaluation.id], user_ids=[evaluation.employee_id.parent_id.user_id.id], context=context)
+ if len(evaluation.survey_request_ids) != len(request_obj.search(cr, uid, [('evaluation_id', '=', evaluation.id),('state', 'in', ['done','cancel'])], context=context)):
raise osv.except_osv(_('Warning!'),_("You cannot change state, because some appraisal(s) are in waiting answer or draft state."))
return True
@@ -263,6 +266,10 @@ class hr_evaluation(osv.osv):
return True
def write(self, cr, uid, ids, vals, context=None):
+ if vals.get('employee_id'):
+ employee_id = self.pool.get('hr.employee').browse(cr, uid, vals.get('employee_id'), context=context)
+ if employee_id.parent_id and employee_id.parent_id.user_id:
+ vals['message_follower_ids'] = [(4, employee_id.parent_id.user_id.partner_id.id)]
if 'date' in vals:
new_vals = {'date_deadline': vals.get('date')}
obj_hr_eval_iterview = self.pool.get('hr.evaluation.interview')
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index 2f3deae7b60..ca90e98e516 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -209,6 +209,10 @@
+
+
+
+
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 83f986e59cc..91dc44fed61 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -118,6 +118,9 @@ class hr_expense_expense(osv.osv):
return {'value': {'department_id': department_id, 'company_id': company_id}}
def expense_confirm(self, cr, uid, ids, *args):
+ for expense in self.browse(cr, uid, ids):
+ if expense.employee_id and expense.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [expense.id], user_ids=[expense.employee_id.parent_id.user_id.id])
self.write(cr, uid, ids, {
'state':'confirm',
'date_confirm': time.strftime('%Y-%m-%d')
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 759170224bd..76d4e42818a 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -303,7 +303,7 @@ class hr_holidays(osv.osv):
self.check_holidays(cr, uid, ids, context=context)
for record in self.browse(cr, uid, ids, context=context):
if record.employee_id and record.employee_id.parent_id and record.employee_id.parent_id.user_id:
- self.message_subscribe(cr, uid, [record.id], user_ids=[record.employee_id.parent_id.user_id.id], context=context)
+ self.message_subscribe_users(cr, uid, [record.id], user_ids=[record.employee_id.parent_id.user_id.id], context=context)
self.holidays_confirm_notificate(cr, uid, ids, context=context)
return self.write(cr, uid, ids, {'state':'confirm'})
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index fcdbfda0667..13c11cf72c7 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -103,6 +103,7 @@ class one2many_mod(fields.one2many):
class hr_timesheet_sheet(osv.osv):
_name = "hr_timesheet_sheet.sheet"
+ _inherit = "mail.thread"
_table = 'hr_timesheet_sheet_sheet'
_order = "id desc"
_description="Timesheet"
@@ -265,6 +266,8 @@ class hr_timesheet_sheet(osv.osv):
def button_confirm(self, cr, uid, ids, context=None):
for sheet in self.browse(cr, uid, ids, context=context):
+ if sheet.employee_id and sheet.employee_id.parent_id and sheet.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [sheet.id], user_ids=[sheet.employee_id.parent_id.user_id.id], context=context)
self.check_employee_attendance_state(cr, uid, sheet.id, context=context)
di = sheet.user_id.company_id.timesheet_max_difference
if (abs(sheet.total_difference) < di) or not di:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 2d6930b85d1..9a7416464af 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -142,6 +142,10 @@
+
+
+
+
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index cf33bd64640..d1dd9f89fb7 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -26,6 +26,8 @@ openerp_mail_followers = function(session, mail) {
this._super.apply(this, arguments);
this.options.image = this.node.attrs.image || 'image_small';
this.options.title = this.node.attrs.title || 'Followers';
+ this.options.context = this.node.attrs.context;
+ this.options.comment = this.node.attrs.help || false;
this.ds_model = new session.web.DataSetSearch(this, this.view.model);
this.ds_follow = new session.web.DataSetSearch(this, this.field.relation);
},
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index 32ce34d48d1..cf31ab3e24c 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -11,6 +11,11 @@
+
+
+
+
+
diff --git a/addons/project/project.py b/addons/project/project.py
index 3572fd094b3..dbb579e2f7d 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -1100,6 +1100,10 @@ class task(base_stage, osv.osv):
def create(self, cr, uid, vals, context=None):
task_id = super(task, self).create(cr, uid, vals, context=context)
+ project_id = self.browse(cr, uid, task_id, context=context).project_id
+ if project_id:
+ followers = [follower.id for follower in project_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [task_id], followers, context=context)
self._store_history(cr, uid, [task_id], context=context)
self.create_send_note(cr, uid, [task_id], context=context)
return task_id
@@ -1109,6 +1113,9 @@ class task(base_stage, osv.osv):
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
+ if vals.get('project_id'):
+ project_id = self.pool.get('project.project').browse(cr, uid, vals.get('project_id'), context=context)
+ vals['message_follower_ids'] = [(4, follower.id) for follower in project_id.message_follower_ids]
if vals and not 'kanban_state' in vals and 'stage_id' in vals:
new_stage = vals.get('stage_id')
vals_reset_kstate = dict(vals, kanban_state='normal')
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 745b4dfb43d..4ce02f5a437 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -152,7 +152,7 @@
-
+
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index f39be0c09d5..981ab0693d4 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -364,6 +364,10 @@ class project_issue(base_stage, osv.osv):
logged_fields = ['stage_id', 'state', 'message_ids']
if any([field in vals for field in logged_fields]):
vals['date_action_last'] = time.strftime('%Y-%m-%d %H:%M:%S')
+ if vals.get('project_id'):
+ project_id = self.pool.get('project.project').browse(cr, uid, vals.get('project_id'), context=context)
+ vals['message_follower_ids'] = [(4, follower.id) for follower in project_id.message_follower_ids]
+
return super(project_issue, self).write(cr, uid, ids, vals, context)
def onchange_task_id(self, cr, uid, ids, task_id, context=None):
@@ -381,6 +385,10 @@ class project_issue(base_stage, osv.osv):
def create(self, cr, uid, vals, context=None):
obj_id = super(project_issue, self).create(cr, uid, vals, context=context)
+ project_id = self.browse(cr, uid, obj_id, context=context).project_id
+ if project_id:
+ followers = [follower.id for follower in project_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [obj_id], followers, context=context)
self.create_send_note(cr, uid, [obj_id], context=context)
return obj_id
diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py
index b6d5ec25ce1..80e9f3b4f42 100644
--- a/addons/sale_crm/sale_crm.py
+++ b/addons/sale_crm/sale_crm.py
@@ -23,13 +23,27 @@ from osv import osv,fields
class sale_order(osv.osv):
_inherit = 'sale.order'
-
_columns = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'categ_ids': fields.many2many('crm.case.categ', 'sale_order_category_rel', 'order_id', 'category_id', 'Categories', \
domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]")
}
+ def create(self, cr, uid, vals, context=None):
+ order = super(sale_order, self).create(cr, uid, vals, context=context)
+ section_id = self.browse(cr, uid, order, context=context).section_id
+ if section_id:
+ followers = [follow.id for follow in section_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [order], followers, context=context)
+ return order
+
+ def write(self, cr, uid, ids, vals, context=None):
+ if vals.get('section_id'):
+ section_id = self.pool.get('crm.case.section').browse(cr, uid, vals.get('section_id'), context=context)
+ if section_id:
+ vals['message_follower_ids'] = [(4, follower.id) for follower in section_id.message_follower_ids]
+ return super(sale_order, self).write(cr, uid, ids, vals, context=context)
+
sale_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: