[MERGE]merge with lp:~openerp-dev/openobject-addons/trunk-tracked-fields-chs-handle-stage-sgo

bzr revid: sgo@tinyerp.com-20121203131758-bge2ditl4yl7vhqu
This commit is contained in:
Sanjay Gohel (Open ERP)
2012-12-03 18:47:58 +05:30
8 changed files with 34 additions and 42 deletions
+1
View File
@@ -78,6 +78,7 @@ class crm_case_stage(osv.osv):
'state': fields.selection(AVAILABLE_STATES, 'Related Status', required=True,
help="The status of your document will automatically change regarding the selected stage. " \
"For example, if a stage is related to the status 'Close', when your document reaches this stage, it is automatically closed."),
'subtype': fields.char('Related Subtype', size=64),
'case_default': fields.boolean('Common to All Teams',
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
'fold': fields.boolean('Hide in Views when Empty',
-15
View File
@@ -382,7 +382,6 @@ class crm_lead(base_stage, format_address, osv.osv):
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 0.0)], context=context)
if stage_id:
self.case_set(cr, uid, [lead.id], values_to_update={'probability': 0.0}, new_stage_id=stage_id, context=context)
self.case_mark_lost_send_note(cr, uid, ids, context=context)
return True
def case_mark_won(self, cr, uid, ids, context=None):
@@ -391,7 +390,6 @@ class crm_lead(base_stage, format_address, osv.osv):
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 100.0)], context=context)
if stage_id:
self.case_set(cr, uid, [lead.id], values_to_update={'probability': 100.0}, new_stage_id=stage_id, context=context)
self.case_mark_won_send_note(cr, uid, ids, context=context)
return True
def set_priority(self, cr, uid, ids, priority):
@@ -843,11 +841,6 @@ class crm_lead(base_stage, format_address, osv.osv):
# OpenChatter methods and notifications
# ----------------------------------------
def stage_set_send_note(self, cr, uid, ids, stage_id, context=None):
""" Override of the (void) default notification method. """
stage_name = self.pool.get('crm.case.stage').name_get(cr, uid, [stage_id], context=context)[0][1]
return self.message_post(cr, uid, ids, body=_("Stage changed to <b>%s</b>.") % (stage_name), subtype="mt_crm_stage", context=context)
def case_get_note_msg_prefix(self, cr, uid, lead, context=None):
if isinstance(lead, (int, long)):
lead = self.browse(cr, uid, [lead], context=context)[0]
@@ -859,14 +852,6 @@ class crm_lead(base_stage, format_address, osv.osv):
self.message_post(cr, uid, [id], body=message, context=context)
return True
def case_mark_lost_send_note(self, cr, uid, ids, context=None):
message = _("Opportunity has been <b>lost</b>.")
return self.message_post(cr, uid, ids, body=message, subtype="mt_crm_lost", context=context)
def case_mark_won_send_note(self, cr, uid, ids, context=None):
message = _("Opportunity has been <b>won</b>.")
return self.message_post(cr, uid, ids, body=message, subtype="mt_crm_won", context=context)
def schedule_phonecall_send_note(self, cr, uid, ids, phonecall_id, action, context=None):
phonecall = self.pool.get('crm.phonecall').browse(cr, uid, [phonecall_id], context=context)[0]
if action == 'log': prefix = 'Logged'
+8
View File
@@ -7,6 +7,7 @@
<field name="name">New</field>
<field eval="1" name="case_default"/>
<field name="state">draft</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'10'" name="probability"/>
<field eval="'10'" name="sequence"/>
<field name="type">both</field>
@@ -15,6 +16,7 @@
<field name="name">Opportunity</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'20'" name="probability"/>
<field eval="'11'" name="sequence"/>
<field name="type">lead</field>
@@ -23,6 +25,7 @@
<field name="name">Qualification</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'20'" name="probability"/>
<field eval="'12'" name="sequence"/>
<field name="type">opportunity</field>
@@ -31,6 +34,7 @@
<field name="name">Proposition</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'40'" name="probability"/>
<field eval="'13'" name="sequence"/>
<field name="type">opportunity</field>
@@ -39,6 +43,7 @@
<field name="name">Negotiation</field>
<field eval="1" name="case_default"/>
<field name="state">open</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'60'" name="probability"/>
<field eval="'14'" name="sequence"/>
<field name="type">opportunity</field>
@@ -47,6 +52,7 @@
<field name="name">Won</field>
<field eval="1" name="case_default"/>
<field name="state">done</field>
<field name="subtype">mail.mt_crm_won</field>
<field eval="'100'" name="probability"/>
<field eval="'15'" name="sequence"/>
<field eval="1" name="on_change"/>
@@ -57,6 +63,7 @@
<field eval="1" name="case_default"/>
<field eval="False" name="fold"/>
<field name="state">cancel</field>
<field name="subtype">mail.mt_crm_stage</field>
<field eval="'0'" name="probability"/>
<field eval="'16'" name="sequence"/>
<field name="type">lead</field>
@@ -66,6 +73,7 @@
<field eval="1" name="case_default"/>
<field eval="True" name="fold"/>
<field name="state">cancel</field>
<field name="subtype">mail.mt_crm_lost</field>
<field eval="'0'" name="probability"/>
<field eval="'17'" name="sequence"/>
<field name="type">opportunity</field>
+1
View File
@@ -203,6 +203,7 @@
<group col="4">
<field name="name"/>
<field name="state"/>
<field name="subtype"/>
<field name="probability"/>
<field name="type"/>
<field name="on_change"/>
+13 -1
View File
@@ -324,20 +324,32 @@ class mail_thread(osv.AbstractModel):
model = c.parent_model or self._name
lang = context.get('lang')
return Trans._get_source(cr, uid, '{0},{1}'.format(model, c.name), 'field', lang, ci.column.string)
def get_subtype(model, record):
record_model = self.pool[model].browse(cr, SUPERUSER_ID, record)
if record_model.__hasattr__('subtype'):
return record_model.subtype
return False
for record, changed_fields in changes.items():
# TODO tpl changed_fields
chg = []
subtype = False
for f in changed_fields:
ci = tracked[f]
from_ = convert_for_display(record[f], ci.column)
to = convert_for_display(values[f], ci.column)
if to is None:
to = "Removed"
if ci.column._type == "many2one":
subtype = get_subtype(ci.column._obj,values[f])
chg.append((_t(ci), from_, to))
message = MakoTemplate(self._TRACK_TEMPLATE).render_unicode(updated_fields=updated_fields,
changes=chg)
record.message_post(message)
record.message_post(message,subtype=subtype)
return result
+2 -26
View File
@@ -46,6 +46,7 @@ class project_task_type(osv.osv):
'state': fields.selection(_TASK_STATE, 'Related Status', required=True,
help="The status of your document is automatically changed regarding the selected stage. " \
"For example, if a stage is related to the status 'Close', when your document reaches this stage, it is automatically closed."),
'subtype': fields.char('Related Subtype', size=64),
'fold': fields.boolean('Hide in views if empty',
help="This stage is not visible, for example in status bar or kanban view, when there are no records in that stage to display."),
}
@@ -993,14 +994,12 @@ class task(base_stage, osv.osv):
if not task.date_end:
vals['date_end'] = fields.datetime.now()
self.case_set(cr, uid, [task.id], 'done', vals, context=context)
self.case_close_send_note(cr, uid, [task.id], context=context)
return True
def do_reopen(self, cr, uid, ids, context=None):
for task in self.browse(cr, uid, ids, context=context):
project = task.project_id
self.case_set(cr, uid, [task.id], 'open', {}, context=context)
self.case_open_send_note(cr, uid, [task.id], context)
return True
def do_cancel(self, cr, uid, ids, context=None):
@@ -1012,7 +1011,6 @@ class task(base_stage, osv.osv):
self._check_child_task(cr, uid, ids, context=context)
for task in tasks:
self.case_set(cr, uid, [task.id], 'cancelled', {'remaining_hours': 0.0}, context=context)
self.case_cancel_send_note(cr, uid, [task.id], context=context)
return True
def do_open(self, cr, uid, ids, context=None):
@@ -1022,7 +1020,6 @@ class task(base_stage, osv.osv):
def case_open(self, cr, uid, ids, context=None):
if not isinstance(ids,list): ids = [ids]
self.case_set(cr, uid, ids, 'open', {'date_start': fields.datetime.now()}, context=context)
self.case_open_send_note(cr, uid, ids, context)
return True
def do_draft(self, cr, uid, ids, context=None):
@@ -1031,7 +1028,6 @@ class task(base_stage, osv.osv):
def case_draft(self, cr, uid, ids, context=None):
self.case_set(cr, uid, ids, 'draft', {}, context=context)
self.case_draft_send_note(cr, uid, ids, context=context)
return True
def do_pending(self, cr, uid, ids, context=None):
@@ -1039,8 +1035,7 @@ class task(base_stage, osv.osv):
return self.case_pending(cr, uid, ids, context=context)
def case_pending(self, cr, uid, ids, context=None):
self.case_set(cr, uid, ids, 'pending', {}, context=context)
return self.case_pending_send_note(cr, uid, ids, context=context)
return self.case_set(cr, uid, ids, 'pending', {}, context=context)
def _delegate_task_attachments(self, cr, uid, task_id, delegated_task_id, context=None):
attachment = self.pool.get('ir.attachment')
@@ -1080,7 +1075,6 @@ class task(base_stage, osv.osv):
self.do_pending(cr, uid, [task.id], context=context)
elif delegate_data['state'] == 'done':
self.do_close(cr, uid, [task.id], context=context)
self.do_delegation_send_note(cr, uid, [task.id], context)
delegated_tasks[task.id] = delegated_task_id
return delegated_tasks
@@ -1160,7 +1154,6 @@ class task(base_stage, osv.osv):
self._subscribe_project_followers_to_task(cr, uid, task_id, context=context)
self._store_history(cr, uid, [task_id], context=context)
self.create_send_note(cr, uid, [task_id], context=context)
return task_id
# Overridden to reset the kanban_state to normal whenever
@@ -1178,7 +1171,6 @@ class task(base_stage, osv.osv):
#raise osv.except_osv(_('Warning!'), _('Stage is not defined in the project.'))
write_vals = vals_reset_kstate if t.stage_id != new_stage else vals
super(task, self).write(cr, uid, [t.id], write_vals, context=context)
self.stage_set_send_note(cr, uid, [t.id], new_stage, context=context)
result = True
else:
result = super(task, self).write(cr, uid, ids, vals, context=context)
@@ -1288,24 +1280,8 @@ class task(base_stage, osv.osv):
res = super(task, self).message_get_monitored_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. """
stage_name = self.pool.get('project.task.type').name_get(cr, uid, [stage_id], context=context)[0][1]
return self.message_post(cr, uid, ids, body=_("Stage changed to <b>%s</b>.") % (stage_name),
context=context)
def create_send_note(self, cr, uid, ids, context=None):
return self.message_post(cr, uid, ids, body=_("Task has been <b>created</b>."), context=context)
def case_draft_send_note(self, cr, uid, ids, context=None):
return self.message_post(cr, uid, ids, body=_('Task has been set as <b>draft</b>.'), context=context)
def do_delegation_send_note(self, cr, uid, ids, context=None):
for task in self.browse(cr, uid, ids, context=context):
msg = _('Task has been <b>delegated</b> to <em>%s</em>.') % (task.user_id.name)
self.message_post(cr, uid, [task.id], body=msg, context=context)
return True
def project_task_reevaluate(self, cr, uid, ids, context=None):
if self.pool.get('res.users').has_group(cr, uid, 'project.group_time_work_estimation_tasks'):
return {
+8
View File
@@ -30,11 +30,13 @@
<field name="sequence">1</field>
<field name="name">Analysis</field>
<field name="state">draft</field>
<field name="subtype">project.mt_task_new</field>
<field name="case_default" eval="False"/>
</record>
<record id="project_tt_specification" model="project.task.type">
<field name="sequence">2</field>
<field name="name">Specification</field>
<field name="subtype">project.mt_task_change</field>
<field name="state">pending</field>
<field name="case_default" eval="True"/>
</record>
@@ -42,11 +44,13 @@
<field name="sequence">2</field>
<field name="name">Design</field>
<field name="state">open</field>
<field name="subtype">project.mt_task_change</field>
<field name="case_default" eval="True"/>
</record>
<record id="project_tt_development" model="project.task.type">
<field name="sequence">3</field>
<field name="name">Development</field>
<field name="subtype">project.mt_task_change</field>
<field name="state">open</field>
<field name="case_default" eval="True"/>
</record>
@@ -54,12 +58,14 @@
<field name="sequence">4</field>
<field name="name">Testing</field>
<field name="state">open</field>
<field name="subtype">project.mt_task_change</field>
<field name="case_default" eval="True"/>
</record>
<record id="project_tt_merge" model="project.task.type">
<field name="sequence">5</field>
<field name="name">Merge</field>
<field name="state">open</field>
<field name="subtype">project.mt_task_change</field>
<field name="case_default" eval="False"/>
<field name="fold" eval="True"/>
</record>
@@ -67,6 +73,7 @@
<field name="sequence">6</field>
<field name="name">Done</field>
<field name="state">done</field>
<field name="subtype">project.mt_task_closed</field>
<field name="case_default" eval="True"/>
<field name="fold" eval="True"/>
</record>
@@ -74,6 +81,7 @@
<field name="sequence">7</field>
<field name="name">Cancelled</field>
<field name="state">cancelled</field>
<field name="subtype">project.mt_task_canceled</field>
<field name="case_default" eval="True"/>
<field name="fold" eval="True"/>
</record>
+1
View File
@@ -746,6 +746,7 @@
</group>
<group>
<field name="state"/>
<field name="subtype"/>
<field name="sequence"/>
<field name="fold"/>
</group>