[IMP] idea: workflow moved on a new priority field to avoid issues with kanban / clickable statusbar widget. Added a color field depending on the priori field. Updated views accordingly.

bzr revid: tde@openerp.com-20130618131545-33tht1ps4ayzk0so
This commit is contained in:
Thibault Delavallée 2013-06-18 15:15:45 +02:00
parent 4c9333c802
commit aff7d457c4
4 changed files with 86 additions and 68 deletions

View File

@ -7,53 +7,50 @@
<field name="on_create">True</field>
</record>
<record model="workflow.activity" id="act_draft">
<record model="workflow.activity" id="act_normal">
<field name="wkf_id" ref="wkf_idea" />
<field name="flow_start">True</field>
<field name="name">draft</field>
<field name="name">normal</field>
<field name="kind">function</field>
<field name="action">idea_draft()</field>
<field name="action">idea_set_normal_priority()</field>
</record>
<record model="workflow.activity" id="act_open">
<record model="workflow.activity" id="act_low">
<field name="wkf_id" ref="wkf_idea" />
<field name="name">open</field>
<field name="name">low</field>
<field name="kind">function</field>
<field name="action">idea_open()</field>
<field name="action">idea_set_low_priority()</field>
</record>
<record model="workflow.activity" id="act_close">
<record model="workflow.activity" id="act_high">
<field name="wkf_id" ref="wkf_idea" />
<field name="name">close</field>
<field name="name">high</field>
<field name="kind">function</field>
<field name="action">idea_close()</field>
<field name="flow_stop">True</field>
</record>
<record model="workflow.activity" id="act_cancel">
<field name="wkf_id" ref="wkf_idea" />
<field name="name">cancel</field>
<field name="kind">function</field>
<field name="action">idea_cancel()</field>
<field name="flow_stop">True</field>
<field name="action">idea_set_high_priority()</field>
</record>
<record model="workflow.transition" id="t1">
<field name="act_from" ref="act_draft" />
<field name="act_to" ref="act_open" />
<field name="signal">idea_open</field>
<field name="act_from" ref="act_normal" />
<field name="act_to" ref="act_low" />
<field name="signal">idea_set_low_priority</field>
</record>
<record model="workflow.transition" id="t2">
<field name="act_from" ref="act_open" />
<field name="act_to" ref="act_close" />
<field name="signal">idea_close</field>
<field name="act_from" ref="act_low" />
<field name="act_to" ref="act_normal" />
<field name="signal">idea_set_normal_priority</field>
</record>
<record model="workflow.transition" id="t3">
<field name="act_from" ref="act_normal" />
<field name="act_to" ref="act_high" />
<field name="signal">idea_set_high_priority</field>
</record>
<record model="workflow.transition" id="t4">
<field name="act_from" ref="act_open" />
<field name="act_to" ref="act_cancel" />
<field name="signal">idea_cancel</field>
<field name="act_from" ref="act_high" />
<field name="act_to" ref="act_normal" />
<field name="signal">idea_set_normal_priority</field>
</record>
</data>

View File

@ -23,43 +23,45 @@
<field name="name">Communicate using emails</field>
<field name="description">I start communicating with prospects more by email than phonecalls. I send an email to create a sense of emergency, like "can I call you this week about our quote?" and I call only those that answer this email.</field>
<field name="user_id" eval="ref('base.user_demo')"/>
<field name="state">open</field>
<field name="category_ids" eval="[(6, 0, [ref('idea.idea_cat_0'), ref('idea.idea_cat_1')])]"/>
</record>
<workflow action="idea_open" model="idea.idea" ref="idea_idea_1"/>
<workflow action="idea_set_high_priority" model="idea.idea" ref="idea_idea_1"/>
<record model="idea.idea" id="idea_idea_2">
<field name="name">Use a two-stages testing phase</field>
<field name="description">We should perform testing using two levels of validation.</field>
<field name="user_id" eval="ref('base.user_root')"/>
<field name="state">open</field>
<field name="category_ids" eval="[(6, 0, [ref('idea.idea_cat_1'), ref('idea.idea_cat_2')])]"/>
</record>
<workflow action="idea_open" model="idea.idea" ref="idea_idea_2"/>
<workflow action="idea_set_high_priority" model="idea.idea" ref="idea_idea_2"/>
<record model="idea.idea" id="idea_idea_3">
<field name="name">Write some functional documentation about procurements</field>
<field name="description">We receive many questions about OpenChatter. Maybe some functional doc could save us some time.</field>
<field name="user_id" eval="ref('base.user_demo')"/>
<field name="state">open</field>
<field name="category_ids" eval="[(6, 0, [ref('idea.idea_cat_0'), ref('idea.idea_cat_1')])]"/>
</record>
<workflow action="idea_open" model="idea.idea" ref="idea_idea_3"/>
<record model="idea.idea" id="idea_idea_4">
<field name="name">Better management of smtp errors</field>
<field name="description">There should be away to store the reason why some emails are not sent.</field>
<field name="user_id" eval="ref('base.user_root')"/>
<field name="state">close</field>
<field name="category_ids" eval="[(6, 0, [ref('idea.idea_cat_2')])]"/>
</record>
<workflow action="idea_open" model="idea.idea" ref="idea_idea_4"/>
<workflow action="idea_close" model="idea.idea" ref="idea_idea_4"/>
<workflow action="idea_set_low_priority" model="idea.idea" ref="idea_idea_4"/>
<record model="idea.idea" id="idea_idea_5">
<field name="name">Kitten mode enabled by default</field>
<field name="description">As this is the most loved feature, the kitten mode should be enabled by default. And maybe even impossible to remove.</field>
<field name="user_id" eval="ref('base.user_root')"/>
<field name="state">cancel</field>
<field name="category_ids" eval="[(6, 0, [ref('idea.idea_cat_2')])]"/>
</record>
<workflow action="idea_open" model="idea.idea" ref="idea_idea_5"/>
<workflow action="idea_cancel" model="idea.idea" ref="idea_idea_5"/>
<workflow action="idea_set_low_priority" model="idea.idea" ref="idea_idea_4"/>
</data>
</openerp>

View File

@ -52,6 +52,15 @@ class IdeaIdea(osv.Model):
('close', 'Accepted'),
('cancel', 'Refused')]
def _get_color(self, cr, uid, ids, fields, args, context=None):
res = dict.fromkeys(ids, 3)
for idea in self.browse(cr, uid, ids, context=context):
if idea.priority == 'low':
res[idea.id] = 0
elif idea.priority == 'high':
res[idea.id] = 7
return res
_columns = {
'user_id': fields.many2one('res.users', 'Responsible', required=True),
'name': fields.char('Summary', required=True, readonly=True,
@ -61,7 +70,10 @@ class IdeaIdea(osv.Model):
states={'draft': [('readonly', False)]},
help='Content of the idea'),
'category_ids': fields.many2many('idea.category', string='Tags'),
'state': fields.selection(_get_state_list, string='Status'),
'state': fields.selection(_get_state_list, string='Status', required=True),
'priority': fields.selection([('low', 'Low'), ('normal', 'Normal'), ('high', 'High')],
string='Priority', required=True),
'color': fields.function(_get_color, type='integer', string='Color Index'),
}
_sql_constraints = [
@ -71,6 +83,7 @@ class IdeaIdea(osv.Model):
_defaults = {
'user_id': lambda self, cr, uid, ctx=None: uid,
'state': lambda self, cr, uid, ctx=None: self._get_state_list(cr, uid, ctx)[0][0],
'priority': 'normal',
}
#------------------------------------------------------
@ -79,38 +92,38 @@ class IdeaIdea(osv.Model):
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False):
""" Override read_group to always display all states. """
# Default result structure
states = self._get_state_list(cr, uid, context=context)
read_group_all_states = [{
'__context': {'group_by': groupby[1:]},
'__domain': domain + [('state', '=', state_value)],
'state': state_value,
'state_count': 0,
} for state_value, state_name in states]
# Get standard results
read_group_res = super(IdeaIdea, self).read_group(cr, uid, domain, fields, groupby, offset, limit, context, orderby)
# Update standard results with default results
result = []
for state_value, state_name in states:
res = filter(lambda x: x['state'] == state_value, read_group_res)
if not res:
res = filter(lambda x: x['state'] == state_value, read_group_all_states)
res[0]['state'] = [state_value, state_name]
result.append(res[0])
return result
if groupby and groupby[0] == "state":
# Default result structure
states = self._get_state_list(cr, uid, context=context)
read_group_all_states = [{
'__context': {'group_by': groupby[1:]},
'__domain': domain + [('state', '=', state_value)],
'state': state_value,
'state_count': 0,
} for state_value, state_name in states]
# Get standard results
read_group_res = super(IdeaIdea, self).read_group(cr, uid, domain, fields, groupby, offset, limit, context, orderby)
# Update standard results with default results
result = []
for state_value, state_name in states:
res = filter(lambda x: x['state'] == state_value, read_group_res)
if not res:
res = filter(lambda x: x['state'] == state_value, read_group_all_states)
res[0]['state'] = [state_value, state_name]
result.append(res[0])
return result
else:
return super(IdeaIdea, self).read_group(cr, uid, domain, fields, groupby, offset=offset, limit=limit, context=context, orderby=orderby)
#------------------------------------------------------
# Workflow / Actions
#------------------------------------------------------
def idea_cancel(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
def idea_set_low_priority(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'priority': 'low'}, context=context)
def idea_open(self, cr, uid, ids, context={}):
return self.write(cr, uid, ids, {'state': 'open'}, context=context)
def idea_set_normal_priority(self, cr, uid, ids, context={}):
return self.write(cr, uid, ids, {'priority': 'normal'}, context=context)
def idea_close(self, cr, uid, ids, context={}):
return self.write(cr, uid, ids, {'state': 'close'}, context=context)
def idea_draft(self, cr, uid, ids, context={}):
return self.write(cr, uid, ids, {'state': 'draft'}, context=context)
def idea_set_high_priority(self, cr, uid, ids, context={}):
return self.write(cr, uid, ids, {'priority': 'high'}, context=context)

View File

@ -7,10 +7,11 @@
<field name="model">idea.idea</field>
<field name="arch" type="xml">
<kanban version="7.0" default_group_by="state" class="oe_background_grey">
<field name="color"/>
<field name="user_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_idea_idea oe_kanban_global_click">
<div t-attf-class="oe_kanban_card oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_idea_idea oe_kanban_global_click">
<div class="oe_dropdown_toggle oe_dropdown_kanban"
groups="base.group_user">
<span class="oe_e">í</span>
@ -42,16 +43,20 @@
<field name="arch" type="xml">
<form string="Idea" version="7.0">
<header>
<button name="idea_open" string="Open" states="draft" class="oe_highlight"/>
<button name="idea_close" string="Accept" states="open" class="oe_highlight"/>
<button name="idea_cancel" string="Refuse" states="open" class="oe_highlight"/>
<field name="state" widget="statusbar" statusbar_visible="draft,open,close"/>
<button name="idea_set_low_priority" string="Set Low Priority" class="oe_highlight"
attrs="{'invisible': [('priority', '!=', 'normal')]}"/>
<button name="idea_set_normal_priority" string="Set Normal Priority" class="oe_highlight"
attrs="{'invisible': [('priority', 'not in', ['low', 'high'])]}"/>
<button name="idea_set_high_priority" string="Set High Priority" class="oe_highlight"
attrs="{'invisible': [('priority', '!=', 'normal')]}"/>
<field name="state" widget="statusbar" clickable="True"/>
</header>
<sheet>
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
<group>
<field name="user_id"/>
<field name="priority" readonly="True"/>
<field name="category_ids" widget="many2many_tags"/>
<field name="description"/>
</group>
@ -67,6 +72,7 @@
<tree colors="blue:state == 'draft';black:state in ('open', 'close'); gray:state == 'cancel'" string="Ideas">
<field name="name"/>
<field name="user_id"/>
<field name="priority"/>
<field name="state"/>
</tree>
</field>