[MERGE, IMP] project, project_issue:merge mdi branch and update data for project

bzr revid: psi@tinyerp.com-20120419115219-mqfwp9f898vya1wh
This commit is contained in:
Purnendu Singh (OpenERP) 2012-04-19 17:22:19 +05:30
commit caf2d2018a
5 changed files with 106 additions and 36 deletions

View File

@ -44,9 +44,7 @@ class project_task_type(osv.osv):
'sequence': fields.integer('Sequence'),
'project_default': fields.boolean('Common to All Projects', help="If you check this field, this stage will be proposed by default on each new project. It will not assign this stage to existing projects."),
'project_ids': fields.many2many('project.project', 'project_task_type_rel', 'type_id', 'project_id', 'Projects'),
'state': fields.selection(_TASK_STATE, 'State', required=True,
help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
\n If the task is over, the states is set to \'Done\'.'),
'state': fields.selection(_TASK_STATE, 'State', required=True, help='This state is related to stage.'),
}
_defaults = {
'state': 'draft',
@ -660,6 +658,31 @@ class task(osv.osv):
for work in self.pool.get('project.task.work').browse(cr, uid, ids, context=context):
if work.task_id: result[work.task_id.id] = True
return result.keys()
def _get_state(self, cr, uid, ids, name, arg, context=None):
res = {}
for task in self.browse(cr, uid, ids, context=context):
if task.type_id:
res[task.id] = task.type_id.state
return res
def _get_stage(self, cr, uid, ids, context=None):
task_obj = self.pool.get('project.task')
result = {}
for stage in self.browse(cr, uid, ids, context=context):
if stage.state:
task_ids = task_obj.search(cr, uid, [('state', '=', stage.state)], context=context)
for task in task_obj.browse(cr, uid, task_ids, context=context):
result[task.id] = True
return result.keys()
def _save_state(self, cr, uid, task_id, field_name, field_value, arg, context=None):
stage_ids = self.pool.get('project.task.type').search(cr, uid, [('state', '=', field_value)], context=context)
if stage_ids:
self.write(cr, uid, task_id, {'type_id': stage_ids[0]}, context=context)
else:
cr.execute("""UPDATE project_task SET state=%s WHERE id=%s""", (field_value, task_id, ))
return True
_columns = {
'active': fields.function(_is_template, store=True, string='Not a Template Task', type='boolean', help="This field is computed automatically and have the same behavior than the boolean 'active' field: if the task is linked to a template or unactivated project, it will be hidden unless specifically asked."),
@ -668,7 +691,14 @@ class task(osv.osv):
'priority': fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Important'), ('0','Very important')], 'Priority', select=True),
'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of tasks."),
'type_id': fields.many2one('project.task.type', 'Stage'),
'state': fields.related('type_id','state', type='selection', selection=_TASK_STATE, string="State", readonly=True, store=True),
'state': fields.function(_get_state, fnct_inv=_save_state, type='selection', selection=_TASK_STATE, string="State", readonly=True,
store = {
'project.task': (lambda self, cr, uid, ids, c={}: ids, ['type_id'], 10),
'project.task.type': (_get_stage, ['state'], 10)
}, help='If the task is created the state is \'Draft\'.\
\n If the task is started, the state becomes \'In Progress\'.\
\n If review is needed the task is in \'Pending\' state.\
\n If the task is over, the states is set to \'Done\'.'),
'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready To Pull')], 'Kanban State',
help="A task's kanban state indicates special situations affecting it:\n"
" * Normal is the default situation\n"
@ -1087,6 +1117,10 @@ class task(osv.osv):
new_stage = vals.get('type_id')
vals_reset_kstate = dict(vals, kanban_state='normal')
for t in self.browse(cr, uid, ids, context=context):
#TO FIX:Kanban view doesn't raise warning
# stages = [stage.id for stage in t.project_id.type_ids]
# if new_stage not in stages:
# raise osv.except_osv(_('Warning !'), _('Stage is not defined in the project.'))
write_vals = vals_reset_kstate if t.type_id != new_stage else vals
super(task,self).write(cr, uid, [t.id], write_vals, context=context)
result = True

View File

@ -24,21 +24,25 @@
<record id="project_tt_specification" model="project.task.type">
<field name="sequence">1</field>
<field name="name">Design</field>
<field name="state">draft</field>
<field name="project_default" eval="1"/>
</record>
<record id="project_tt_development" model="project.task.type">
<field name="sequence">2</field>
<field name="name">Development</field>
<field name="state">open</field>
<field name="project_default" eval="1"/>
</record>
<record id="project_tt_testing" model="project.task.type">
<field name="sequence">3</field>
<field name="name">Testing</field>
<field name="state">pending</field>
<field name="project_default" eval="1"/>
</record>
<record id="project_tt_merge" model="project.task.type">
<field name="sequence">4</field>
<field name="name">Deployment</field>
<field name="state">done</field>
<field name="project_default" eval="1"/>
</record>
</data>

View File

@ -224,15 +224,15 @@
<field name="arch" type="xml">
<form string="Project" layout="manual">
<div class="oe_form_topbar">
<button name="do_cancel" states="draft,open,pending" string="Cancel" type="object" icon="gtk-cancel"/>
<button name="do_draft" states="open" string="Draft" type="object" icon="gtk-indent"/>
<button name="do_open" states="pending,draft" string="Start Task" type="object" icon="gtk-media-play"/>
<button name="do_cancel" states="draft,open,pending" string="Cancel" type="object" icon="gtk-cancel" groups="base.group_no_one"/>
<button name="do_draft" states="open" string="Draft" type="object" icon="gtk-indent" groups="base.group_no_one"/>
<button name="do_open" states="pending,draft" string="Start Task" type="object" icon="gtk-media-play" groups="base.group_no_one"/>
<button name="%(action_project_task_reevaluate)d" states="done,cancelled" string="Reactivate" type="action" icon="gtk-convert" context="{'button_reactivate':True}" />
<button name="do_pending" states="open" string="Pending" type="object" icon="gtk-media-pause"/>
<button name="do_pending" states="open" string="Pending" type="object" icon="gtk-media-pause" groups="base.group_no_one"/>
<button groups="base.group_extended" name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="terp-personal"/>
<button name="action_close" states="pending,open" string="Done" type="object" icon="terp-dialog-close"/>
<button name="action_close" states="pending,open" string="Done" type="object" icon="terp-dialog-close" groups="base.group_no_one"/>
<div class="oe_right">
<field name="state" nolabel="1" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}' select="1"/>
<field name="state" nolabel="1" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}' select="1" groups="base.group_no_one"/>
</div>
</div>
<sheet string="Task edition" layout="auto">
@ -280,7 +280,7 @@
<field name="name"/>
<field name="user_id"/>
<field name="type_id"/>
<field name="state"/>
<field name="state" groups="base.group_no_one"/>
<field name="effective_hours" widget="float_time"/>
<field name="progress" widget="progressbar"/>
<field name="remaining_hours" widget="float_time"/>
@ -382,7 +382,7 @@
type="object" class="oe_kanban_button"><t t-esc="time[0]"/></a
><b t-if="time[1]" class="oe_kanban_button oe_kanban_button_active"><t t-esc="Math.round(hours)"/></b
></t>
<a name="do_open" states="draft" string="Validate planned time and open task" type="object" class="oe_kanban_button oe_kanban_button_active">!</a>
<a name="do_open" states="draft" string="Validate planned time and open task" type="object" class="oe_kanban_button oe_kanban_button_active" groups="base.group_no_one">!</a>
</span>
</div>
<div class="oe_kanban_clear"/>
@ -392,7 +392,7 @@
<a string="Edit" icon="gtk-edit" type="edit"/>
<a string="Change Color" icon="color-picker" type="color" name="color"/>
<a name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="terp-personal"/>
<a name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close"/>
<a name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close" groups="base.group_no_one"/>
</div>
<div class="oe_kanban_right">
<a name="set_kanban_state_blocked" string="Mark as Blocked" kanban_states="normal,done" type="object" icon="kanban-stop"/>
@ -438,9 +438,9 @@
<field name="date_end" invisible="1" groups="base.group_no_one"/>
<field name="progress" widget="progressbar" invisible="context.get('set_visible',False)"/>
<field name="state" invisible="context.get('set_visible',False)"/>
<button name="do_open" states="pending,draft,done,cancelled" string="Start Task" type="object" icon="gtk-media-play" help="For changing to open state" invisible="context.get('set_visible',False)"/>
<button name="do_open" states="pending,draft,done,cancelled" string="Start Task" type="object" icon="gtk-media-play" help="For changing to open state" invisible="context.get('set_visible',False)" groups="base.group_no_one"/>
<button groups="base.group_extended" name="%(action_project_task_delegate)d" states="pending,open,draft" string="Delegate" type="action" icon="terp-personal" help="For changing to delegate state"/>
<button name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close" help="For changing to done state"/>
<button name="action_close" states="draft,pending,open" string="Done" type="object" icon="terp-dialog-close" help="For changing to done state" groups="base.group_no_one"/>
</tree>
</field>
</record>
@ -632,7 +632,7 @@
<menuitem id="menu_project_config_project" name="Projects and Stages" parent="menu_definitions" sequence="1"/>
<menuitem action="open_task_type_form" id="menu_task_types_view" parent="menu_project_config_project" sequence="2" groups="base.group_no_one"/>
<menuitem action="open_task_type_form" id="menu_task_types_view" parent="menu_project_config_project" sequence="2"/>
<menuitem action="open_view_project_all" id="menu_open_view_project_all" parent="menu_project_config_project" sequence="1" groups="base.group_no_one"/>
<act_window context="{'search_default_user_id': [active_id], 'default_user_id': active_id}" id="act_res_users_2_project_project" name="User's projects" res_model="project.project" src_model="res.users" view_mode="tree,form" view_type="form"/>

View File

@ -165,6 +165,31 @@ class project_issue(crm.crm_case, osv.osv):
if work.task_id:
issues += issue_pool.search(cr, uid, [('task_id','=',work.task_id.id)])
return issues
def _get_state(self, cr, uid, ids, name, arg, context=None):
res = {}
for issue in self.browse(cr, uid, ids, context=context):
if issue.type_id:
res[issue.id] = issue.type_id.state
return res
def _get_stage(self, cr, uid, ids, context=None):
issue_obj = self.pool.get('project.issue')
result = {}
for stage in self.browse(cr, uid, ids, context=context):
if stage.state:
issue_ids = issue_obj.search(cr, uid, [('state', '=', stage.state)], context=context)
for issue in issue_obj.browse(cr, uid, issue_ids, context=context):
result[issue.id] = True
return result.keys()
def _save_state(self, cr, uid, issue_id, field_name, field_value, arg, context=None):
stage_ids = self.pool.get('project.task.type').search(cr, uid, [('state', '=', field_value)], context=context)
if stage_ids:
self.write(cr, uid, [issue_id], {'type_id': stage_ids[0]}, context=context)
else:
cr.execute("""UPDATE project_issue SET state=%s WHERE id=%s""", (field_value, issue_id, ))
return True
_columns = {
'id': fields.integer('ID', readonly=True),
@ -181,7 +206,14 @@ class project_issue(crm.crm_case, osv.osv):
'partner_id': fields.many2one('res.partner', 'Partner', select=1),
'company_id': fields.many2one('res.company', 'Company'),
'description': fields.text('Description'),
'state': fields.related('type_id','state', type='selection', selection=_ISSUE_STATE, string="State", readonly=True, store=True),
'state': fields.function(_get_state, fnct_inv=_save_state, type='selection', selection=_ISSUE_STATE, string="State", readonly=True,
store = {
'project.issue': (lambda self, cr, uid, ids, c={}: ids, ['type_id'], 10),
'project.task.type': (_get_stage, ['state'], 10)
}, help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'email_from': fields.char('Email', size=128, help="These people will receive email.", select=1),
'email_cc': fields.char('Watchers Emails', size=256, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
'date_open': fields.datetime('Opened', readonly=True,select=True),

View File

@ -87,13 +87,13 @@
<field name="description" nolabel="1" colspan="4"/>
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}'/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="terp-dialog-close"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<field name="state" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}' groups="base.group_no_one"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel" groups="base.group_no_one"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward" groups="base.group_no_one"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="terp-dialog-close" groups="base.group_no_one"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause" groups="base.group_no_one"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert" groups="base.group_no_one"/>
</group>
</page>
<page string="Extra Info" groups="base.group_extended">
@ -137,12 +137,12 @@
<field name="user_id"/>
<field name="progress" widget="progressbar" attrs="{'invisible':[('task_id','=',False)]}"/>
<field name="state"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward" help="To Do"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel" groups="base.group_no_one"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to" groups="base.group_no_one"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward" help="To Do" groups="base.group_no_one"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause" groups="base.group_no_one"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert" groups="base.group_no_one"/>
<field name="categ_id" invisible="1"/>
<field name="task_id" invisible="1"/>
</tree>
@ -262,9 +262,9 @@
<a string="Convert To Task" name="convert_issue_task" icon="gtk-index" type="object"/>
</div>
<div class="oe_kanban_right">
<a name="case_open" string="Open" states="draft,pending" type="object" icon="kanban-apply"/>
<a name="case_pending" string="Pending" states="draft,open" type="object" icon="kanban-pause"/>
<a name="case_close" string="Close" states="open,draft,pending" type="object" icon="kanban-stop"/>
<a name="case_open" string="Open" states="draft,pending" type="object" icon="kanban-apply" groups="base.group_no_one"/>
<a name="case_pending" string="Pending" states="draft,open" type="object" icon="kanban-pause" groups="base.group_no_one"/>
<a name="case_close" string="Close" states="open,draft,pending" type="object" icon="kanban-stop" groups="base.group_no_one"/>
</div>
<div class="oe_kanban_clear"/>
</div>
@ -301,12 +301,12 @@
<field name="version_id"/>
<field name="user_id"/>
<field name="state"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel" groups="base.group_no_one"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to" groups="base.group_no_one"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward" groups="base.group_no_one"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause" groups="base.group_no_one"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert" groups="base.group_no_one"/>
</tree>
</field>
</record>