[IMP] Project Management - better useability

bzr revid: fp@tinyerp.com-20100131212906-ja5a1pat6g56cef6
This commit is contained in:
Fabien Pinckaers 2010-01-31 22:29:06 +01:00
parent 6054dec0af
commit b947857764
6 changed files with 54 additions and 193 deletions

View File

@ -29,9 +29,9 @@ from tools.translate import _
class project_task_type(osv.osv):
_name = 'project.task.type'
_description = 'Project task type'
_description = 'Task Stage'
_columns = {
'name': fields.char('Type', required=True, size=64, translate=True),
'name': fields.char('Stage Name', required=True, size=64, translate=True),
'description': fields.text('Description'),
'sequence': fields.integer('Sequence'),
}
@ -52,7 +52,6 @@ class project(osv.osv):
res[m.id] = (m.parent_id and (m.parent_id.name + '/') or '') + m.name
return res
def check_recursion(self, cursor, user, ids, parent=None):
return super(project, self).check_recursion(cursor, user, ids,
parent=parent)
@ -104,43 +103,30 @@ class project(osv.osv):
raise osv.except_osv(_('Operation Not Permitted !'), _('You can not delete a project with tasks. I suggest you to deactivate it.'))
return super(project, self).unlink(cr, uid, ids, *args, **kwargs)
_columns = {
# 'name': fields.char("Project Name", size=128, required=True),
# 'complete_name': fields.function(_complete_name, method=True, string="Project Name", type='char', size=128),
'complete_name': fields.function(_complete_name, method=True, string="Project Name", type='char', size=250),
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the project without removing it."),
'category_id': fields.many2one('account.analytic.account','Analytic Account', help="Link this project to an analytic account if you need financial management on projects. It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc."),
'priority': fields.integer('Sequence'),
# 'manager': fields.many2one('res.users', 'Project Manager'),
'warn_manager': fields.boolean('Warn Manager', help="If you check this field, the project manager will receive a request each time a task is completed by his team."),
'resource_ids': fields.many2many('resource.resource', 'project_resource_rel', 'project_id', 'resource_id', 'Project Members', help="Project's member. Not used in any computation, just for information purpose."),
'tasks': fields.one2many('project.task', 'project_id', "Project tasks"),
# 'parent_id': fields.many2one('project.project', 'Parent Project',\
# help="If you have [?] in the name, it means there are no analytic account linked to project."),
# 'child_id': fields.one2many('project.project', 'parent_id', 'Subproject'),
'planned_hours': fields.function(_progress_rate, multi="progress", method=True, string='Planned Time', help="Sum of planned hours of all tasks related to this project."),
'effective_hours': fields.function(_progress_rate, multi="progress", method=True, string='Time Spent', help="Sum of spent hours of all tasks related to this project."),
'total_hours': fields.function(_progress_rate, multi="progress", method=True, string='Total Time', help="Sum of total hours of all tasks related to this project."),
'progress_rate': fields.function(_progress_rate, multi="progress", method=True, string='Progress', type='float', help="Percent of tasks closed according to the total of tasks todo."),
# 'partner_id': fields.many2one('res.partner', 'Partner'),
# 'contact_id': fields.many2one('res.partner.address', 'Contact'),
'warn_customer': fields.boolean('Warn Partner', help="If you check this, the user will have a popup when closing a task that propose a message to send by email to the customer."),
'warn_header': fields.text('Mail Header', help="Header added at the beginning of the email for the warning message sent to the customer when a task is closed."),
'warn_footer': fields.text('Mail Footer', help="Footer added at the beginning of the email for the warning message sent to the customer when a task is closed."),
# 'notes': fields.text('Notes', help="Internal description of the project."),
'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"),
# 'state': fields.selection([('template', 'Template'), ('open', 'Running'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', required=True, readonly=True,
# help='The project can be in either if the states \'Template\' and \'Running\'.\n If it is template then we can make projects based on the template projects. If its in \'Running\' state it is a normal project.\
# \n If it is to be reviewed then the state is \'Pending\'.\n When the project is completed the state is set to \'Done\'.'),
# 'company_id': fields.many2one('res.company', 'Company'),
# 'timesheet_id': fields.many2one('hr.timesheet.group', 'Working Time', help="Timetable working hours to adjust the gantt diagram report"),
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Allowed Task Types'),
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages'),
}
_defaults = {
'active': lambda *a: True,
# 'manager': lambda object,cr,uid,context: uid,
'priority': lambda *a: 1,
# 'state': lambda *a: 'open',
# 'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.project', context=c)
}
def _check_dates(self, cr, uid, ids):
leave = self.read(cr, uid, ids[0],['date_start','date'])
@ -153,12 +139,6 @@ class project(osv.osv):
(_check_dates, 'Error! project start-date must be lower then project end-date.', ['date_start', 'date'])
]
# _order = "parent_id,priority,name"
# _constraints = [
# (check_recursion, 'Error ! You can not create recursive projects.', ['parent_id'])
# ]
# toggle activity of projects, their sub projects and their tasks
def set_template(self, cr, uid, ids, context={}):
res = self.setActive(cr, uid, ids, value=False, context=context)
return res
@ -235,51 +215,12 @@ class task(osv.osv):
_description = "Tasks"
_date_name = "date_start"
# def compute_date(self,cr,uid):
# project_id = self.pool.get('project.project').search(cr,uid,[])
# for i in range(len(project_id)):
# task_ids = self.pool.get('project.task').search(cr,uid,[('project_id','=',project_id[i])])
# if task_ids:
# task_obj = self.pool.get('project.task').browse(cr,uid,task_ids)
# task_1 = task_obj[0]
# task_1.date_start = self.pool.get('project.project').browse(cr,uid,project_id[i]).date_start
# dt = mx.DateTime.strptime(task_1.date_start,"%Y-%m-%d").strftime("%Y-%m-%d")
# def Project_1():
# title = "New Project"
# start = dt
#
# def task1():
# start = dt
# effort = task_1.planned_hours
# title = "Task 1"
## project_1 = BalancedProject(Project_1)
## for t in project_1:
## print 'details:::',t.indent_name(), t.start, t.end, t.effort
def _str_get(self, task, level=0, border='***', context={}):
return border+' '+(task.user_id and task.user_id.name.upper() or '')+(level and (': L'+str(level)) or '')+(' - %.1fh / %.1fh'%(task.effective_hours or 0.0,task.planned_hours))+' '+border+'\n'+ \
border[0]+' '+(task.name or '')+'\n'+ \
(task.description or '')+'\n\n'
def _history_get(self, cr, uid, ids, name, args, context={}):
result = {}
for task in self.browse(cr, uid, ids, context=context):
result[task.id] = self._str_get(task, border='===')
t2 = task.parent_ids
level = 0
while t2:
level -= 1
result[task.id] = self._str_get(t2, level) + result[task.id]
t2 = t2.parent_ids
t3 = map(lambda x: (x,1), task.child_ids)
while t3:
t2 = t3.pop(0)
result[task.id] = result[task.id] + self._str_get(t2[0], t2[1])
t3 += map(lambda x: (x,t2[1]+1), t2[0].child_ids)
return result
# Compute: effective_hours, total_hours, progress
# Compute: effective_hours, total_hours, progress
def _hours_get(self, cr, uid, ids, field_names, args, context):
task_set = ','.join(map(str, ids))
cr.execute(("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id in (%s) GROUP BY task_id") % (task_set,))
@ -293,6 +234,8 @@ class task(osv.osv):
res[task.id]['progress'] = round(min(100.0 * hours.get(task.id, 0.0) / res[task.id]['total_hours'], 100),2)
else:
res[task.id]['progress'] = 0.0
if task.state in ('done','cancel'):
res[task.id]['progress'] = 100.0
res[task.id]['delay_hours'] = res[task.id]['total_hours'] - task.planned_hours
return res
@ -337,19 +280,17 @@ class task(osv.osv):
'description': fields.text('Description'),
'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), ('1','Urgent'), ('0','Very urgent')], 'Importance'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of tasks."),
'type': fields.many2one('project.task.type', 'Type', readonly=True),
'type': fields.many2one('project.task.type', 'Stage', readonly=True),
'state': fields.selection([('draft', 'Draft'),('open', 'In Progress'),('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True,
help='If the task is created the state \'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\'.'),
'date_start': fields.datetime('Starting Date'),
'date_end': fields.datetime('Ending Date'),
'date_deadline': fields.datetime('Deadline'),
'date_close': fields.datetime('Date Closed', readonly=True),
'date_deadline': fields.date('Deadline'),
'project_id': fields.many2one('project.project', 'Project', ondelete='cascade',
help="If you have [?] in the project name, it means there are no analytic account linked to this project."),
'parent_ids': fields.many2many('project.task', 'project_task_parent_rel', 'task_id', 'parent_id', 'Parent Tasks'),
'child_ids': fields.many2many('project.task', 'project_task_child_rel', 'task_id', 'child_id', 'Delegated Tasks'),
'history': fields.function(_history_get, method=True, string="Task Details", type="text"),
'notes': fields.text('Notes'),
'occupation_rate': fields.float('Occupation Rate', help='The occupation rate fields indicates how much of his time a user is working on a task. A 100% occupation rate means the user works full time on the tasks. The ending date of a task is computed like this: Starting Date + Duration / Occupation Rate.'),
'planned_hours': fields.float('Planned Hours', required=True, help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'),
@ -378,7 +319,7 @@ class task(osv.osv):
'occupation_rate':lambda *a: '1',
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c)
}
_order = "sequence, priority, date_deadline, id"
_order = "sequence, priority, date_start, id"
_constraints = [
(_check_dates, 'Error! task start-date must be lower then task end-date.', ['date_start', 'date_end'])
@ -430,7 +371,7 @@ class task(osv.osv):
'ref_doc1': 'project.task,%d'% (task.id,),
'ref_doc2': 'project.project,%d'% (project.id,),
})
self.write(cr, uid, [task.id], {'state': 'done', 'date_close':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0})
self.write(cr, uid, [task.id], {'state': 'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S'), 'remaining_hours': 0.0})
if task.parent_ids and task.parent_ids.state in ('pending','draft'):
reopen = True
for child in task.parent_ids.child_ids:
@ -509,9 +450,9 @@ class task(osv.osv):
typeid = typ.type.id
types = map(lambda x:x.id, typ.project_id.type_ids)
if types:
if typeid and typeid in types and types.index(typeid) != 0 :
if typeid and typeid in types:
index = types.index(typeid)
self.write(cr, uid, typ.id, {'type': types[index-1]})
self.write(cr, uid, typ.id, {'type': index and types[index-1] or False})
return True
task()

View File

@ -3,7 +3,6 @@
<data>
<menuitem icon="terp-project" id="menu_main" name="Project Management"/>
<menuitem id="menu_project_management" name="Project Management" parent="menu_main" sequence="1"/>
<!-- <menuitem id="menu_tasks" name="Tasks" parent="menu_main"/>-->
<menuitem id="menu_pm_invoicing" name="Invoicing" parent="menu_main" sequence="7"/>
<menuitem id="menu_pm_budget" name="Budgets" parent="menu_pm_invoicing"/>
@ -13,7 +12,7 @@
action="account_budget.act_crossovered_budget_view" />
<menuitem id="menu_definitions" name="Configuration" parent="project.menu_main" sequence="60"/>
<!--Time Tracking menu-->
<menuitem
<menuitem
id="menu_project_management_time_tracking"
name="Time Tracking"
parent="menu_main" sequence="3"/>
@ -83,8 +82,7 @@
<label string="Date Stop: %%(date_stop)s"/>
</group>
</page>
<page string="Tasks" groups="base.group_extended">
<separator string="Task Types"/>
<page string="Tasks Stages" groups="base.group_extended">
<field nolabel="1" name="type_ids" colspan="4"/>
</page>
<page string="Notes">
@ -168,7 +166,7 @@
<field name="view_id" ref="view_project"/>
</record>
<!--<menuitem action="open_view_template_project" id="menu_template_project" parent="project.menu_definitions"/>-->
<menuitem id="menu_template_project_specification" parent="project.menu_definitions" name="Specification" sequence="1"/>
<menuitem id="menu_template_project_specification" parent="project.menu_definitions" name="Specification" sequence="1"/>
<menuitem action="open_view_template_project" id="menu_template_project" parent="project.menu_template_project_specification" name="Specification Template"/>
<record id="view_task_work_form" model="ir.ui.view">
<field name="name">project.task.work.form</field>
@ -268,10 +266,7 @@
<field name="name" select="1"/>
<field name="project_id" required="1" select="1"/>
<field name="total_hours" widget="float_time"/>
<field name="date_start"/>
<field name="date_deadline" select="2"/>
<field name="occupation_rate"/>
<field name="date_end"/>
<field name="user_id" select="1"/>
<field name="progress" widget="progressbar"/>
</group>
@ -313,7 +308,7 @@
</group>
</page>
<page groups="base.group_extended" string="Delegations">
<separator string="Parent Tasks" colspan="4"/>
<separator string="Parent Tasks" colspan="4"/>
<field colspan="4" height="150" name="parent_ids" nolabel="1"/>
<separator string="Delegated tasks" colspan="4"/>
<field colspan="4" height="150" name="child_ids" nolabel="1" attrs="{'readonly':[('state','!=','draft')]}">
@ -327,7 +322,6 @@
<field name="date_deadline"/>
</tree>
</field>
<field colspan="4" name="history" nolabel="1"/>
</page>
<page groups="base.group_extended" string="Extra Info" attrs="{'readonly':[('state','=','done')]}">
@ -338,16 +332,17 @@
</group>
<group colspan="2" col="2">
<separator string="Dates" colspan="2"/>
<field name="date_close" select="2"/>
<field name="date_start"/>
<field name="date_end"/>
</group>
<separator string="Miscelleanous" colspan="4"/>
<field name="partner_id" select="2"/>
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
<group col="4" colspan="2">
<field name="type" widget="selection" />
<button name="prev_type" string="Previous" type="object" icon="gtk-go-back" help="Change to Previous Type"/>
<button name="next_type" string="Next" type="object" icon="gtk-go-forward" help="Change to Next Type"/>
</group>
<button name="prev_type" string="Previous" type="object" icon="gtk-go-back" help="Change to Previous Stage"/>
<button name="next_type" string="Next" type="object" icon="gtk-go-forward" help="Change to Next Stage"/>
</group>
<field name="active" select="2"/>
<separator colspan="4" string="Notes"/>
<field colspan="4" name="notes" nolabel="1"/>
@ -367,10 +362,16 @@
<field name="name"/>
<field name="project_id" icon="gtk-indent"/>
<field name="user_id"/>
<field name="remaining_hours" widget="float_time" sum="Remaining Hours"/>
<field name="date_deadline"/>
<field name="remaining_hours" widget="float_time"/>
<field name="type"/>
<button name="next_type" states="draft,open,pending" string="Change Type" type="object" icon="gtk-go-forward" help="Change Type"/>
<field name="type" groups="base.group_extended"/>
<button name="next_type"
states="draft,open,pending"
string="Change Stage"
type="object"
icon="gtk-go-forward"
groups="base.group_extended"
help="Change Type"/>
<field name="progress" widget="progressbar"/>
<field name="state"/>
<button name="do_open" states="pending,draft" string="Start Task" type="object" icon="gtk-execute" help="For changing to open state"/>
@ -471,7 +472,7 @@
<field name="arch" type="xml">
<search string="Task Edition">
<group col="20" colspan="4">
<filter string="Draft" domain="[('state','=','draft')]" help="Draft Tasks" icon="terp-project"/>
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Open and Draft Tasks" icon="terp-project" default="1"/>
<filter string="In Progress" domain="[('state','=','open')]" help="Open Tasks" icon="terp-project"/>
<filter string="Pending" domain="[('state','=','pending')]" help="Pending Tasks" icon="terp-project"/>
<separator orientation="vertical"/>
@ -487,7 +488,8 @@
<group expand="1" string="Group By..." colspan="4" col="20">
<filter string="By Users" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="By Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
<filter string="By Type" icon="terp-project" domain="[]" context="{'group_by':'type'}"/>
<filter string="By Stage" icon="terp-project" domain="[]" context="{'group_by':'type'}"/>
<filter string="By State" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
</group>
</search>
</field>
@ -498,13 +500,11 @@
<field name="res_model">project.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,gantt,graph</field>
<field eval="False" name="view_id"/>
<field eval="True" name="filter"/>
<field eval="False" name="filter"/>
<field name="view_id" ref="view_task_tree2"/>
<field name="search_view_id" ref="view_task_search_form"/>
</record>
<!--<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_tasks"/> -->
<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_project_management" name="Tasks" sequence="2"/>
<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_project_management" sequence="2"/>
<record id="action_view_task_overpassed_draft" model="ir.actions.act_window">
<field name="name">Overpassed Tasks</field>
@ -539,7 +539,7 @@
<field name="model">project.task.type</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Task type">
<form string="Task Stage">
<field name="name" select="1"/>
<field name="sequence"/>
<field colspan="4" name="description" select="1"/>
@ -551,8 +551,8 @@
<field name="model">project.task.type</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Task type">
<field name="sequence"/>
<tree string="Task Stage">
<field name="sequence"/>
<field name="name"/>
</tree>
</field>
@ -677,7 +677,7 @@
<field name="view_id" ref="view_project_message_tree"/>
</record>
<!--<menuitem id="menu_message_main" name="Message" parent="menu_main"/>-->
<!--<menuitem id="menu_message_main" name="Message" parent="menu_main"/>-->
<menuitem action="action_view_project_messages_tree" id="menu_message_tree" parent="menu_project_management" sequence="11"/>
<act_window domain="[('user_id', '=', active_id),('state', '&lt;&gt;', 'cancelled'),('state', '&lt;&gt;', 'done')]" id="act_res_users_2_project_task_opened" name="Assigned tasks" res_model="project.task" src_model="res.users" view_mode="tree,form,gantt,calendar,graph" view_type="form"/>

View File

@ -37,47 +37,5 @@
</record>
<!--rule for Tasks-->
<record model="ir.rule.group" id="project_task_rule_group">
<field name="name">project.task.rule.group</field>
<field name="model_id" search="[('model','=','project.task')]" model="ir.model"/>
<field name="global" eval="True"/>
</record>
<record id="project_task_rule" model="ir.rule">
<field name="domain_force">['|',('project_id','=',False),('project_id','in',[user.context_project_id])]</field>
<field name="rule_group" ref="project_task_rule_group"/>
</record>
<record model="ir.rule.group" id="project_task_work_rule_group">
<field name="name">project.task.work.rule.group</field>
<field name="model_id" search="[('model','=','project.task.work')]" model="ir.model"/>
<field name="global" eval="True"/>
</record>
<record id="project_task_work_rule" model="ir.rule">
<field name="domain_force">['|',('task_id.project_id','=',False),('task_id.project_id','in',[user.context_project_id])]</field>
<field name="rule_group" ref="project_task_work_rule_group"/>
</record>
<record model="ir.rule.group" id="project_project_rule_group">
<field name="name">project.project.work.rule.group</field>
<field name="model_id" search="[('model','=','project.project')]" model="ir.model"/>
<field name="global" eval="True"/>
</record>
<record id="project_project_rule" model="ir.rule">
<field name="domain_force">['|',('id','=',False),('id','in',[user.context_project_id])]</field>
<field name="rule_group" ref="project_project_rule_group"/>
</record>
<record model="ir.rule.group" id="project_message_rule_group">
<field name="name">project.project.work.rule.group</field>
<field name="model_id" search="[('model','=','project.message')]" model="ir.model"/>
<field name="global" eval="True"/>
</record>
<record id="project_message_rule" model="ir.rule">
<field name="domain_force">['|',('project_id','=',False),('project_id','in',[user.context_project_id])]</field>
<field name="rule_group" ref="project_message_rule_group"/>
</record>
</data>
</openerp>

View File

@ -43,7 +43,7 @@ performing those tasks.
'update_xml': [
'project_gtd_data.xml',
'project_gtd_view.xml',
'project_gtd_wizard.xml',
'project_gtd_wizard.xml',
'security/ir.model.access.csv',
],
'demo_xml': ['project_gtd_demo.xml'],

View File

@ -169,7 +169,7 @@ class project_task(osv.osv):
timebox_obj = self.pool.get('project.gtd.timebox')
if res['type'] == 'search':
tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
search_extended ='''<newline/><group col="%d" expand="1" string="%s">''' % (len(tt)+6,_('Getting Things Done'))
search_extended ='''<newline/><group col="%d" expand="1" string="%s" groups="project_gtd.group_project_getting">''' % (len(tt)+6,_('Getting Things Done'))
search_extended += '''<filter domain="[('timebox_id','=', False)]" icon="gtk-new" string="Inbox"/>'''
search_extended += '''<separator orientation="vertical"/>'''
for time in tt:

View File

@ -7,8 +7,8 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Context">
<field name="sequence" invisible="1"/>
<field name="name"/>
<field name="project_default_id"/>
</tree>
</field>
</record>
@ -38,7 +38,7 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Timebox">
<field name="sequence"/>
<field name="sequence" invisible="1"/>
<field name="name"/>
<field name="icon"/>
</tree>
@ -74,10 +74,10 @@
<field name="type">tree</field>
<field name="inherit_id" ref="project.view_task_tree2" />
<field name="arch" type="xml">
<field name="project_id" position="after">
<field name="timebox_id"/>
<button name="prev_timebox" type="object" icon="gtk-go-back" string="Previous" states="draft,pending,open"/>
<button name="next_timebox" type="object" icon="gtk-go-forward" string="Next" states="draft,pending,open"/>
<field name="remaining_hours" position="after">
<field name="timebox_id" groups="project_gtd.group_project_getting"/>
<button name="prev_timebox" type="object" icon="gtk-go-back" string="Previous" states="draft,pending,open" groups="project_gtd.group_project_getting"/>
<button name="next_timebox" type="object" icon="gtk-go-forward" string="Next" states="draft,pending,open" groups="project_gtd.group_project_getting"/>
</field>
</field>
</record>
@ -90,8 +90,8 @@
<field name="arch" type="xml">
<field name="progress" position="after">
<newline/>
<field name="context_id" select="2" widget="selection"/>
<field name="timebox_id" select="1"/>
<field name="context_id" select="2" widget="selection" groups="project_gtd.group_project_getting"/>
<field name="timebox_id" select="1" groups="project_gtd.group_project_getting"/>
<newline/>
</field>
</field>
@ -105,11 +105,11 @@
<tree editable="top" colors="grey:state in ('done',);red:state in ('cancelled');black:state not in ('done','cancelled')" string="Tasks">
<field name="sequence" invisible="1"/>
<field name="name"/>
<field name="user_id"/>
<field name="timebox_id" widget="selection"/>
<button name="prev_timebox" type="object" icon="gtk-go-back" string="Previous" states="draft,pending,open"/>
<button name="next_timebox" type="object" icon="gtk-go-forward" string="Next" states="draft,pending,open"/>
<field name="planned_hours" widget="float_time"/>
<field name="user_id"/>
<field name="timebox_id" widget="selection" groups="project_gtd.group_project_getting"/>
<button name="prev_timebox" type="object" icon="gtk-go-back" string="Previous" states="draft,pending,open" groups="project_gtd.group_project_getting"/>
<button name="next_timebox" type="object" icon="gtk-go-forward" string="Next" states="draft,pending,open" groups="project_gtd.group_project_getting"/>
<field name="state" invisible="1"/>
<button name="%(project.wizard_close_task)d" states="draft,pending,open" string="Done" type="action" icon="gtk-jump-to" help="For changing to done state"/>
<button groups="base.group_extended" name="%(project.wizard_delegate_task)d" states="pending,open" string="Delegate" type="action" icon="gtk-sort-descending"/>
@ -133,43 +133,5 @@
parent="project.menu_project_management"
action="action_prject_task_tree"/>
<act_window name="My Inbox"
domain="[('user_id', '=', uid),('state','in',('draft','open'))]"
res_model="project.task"
src_model="project.gtd.timebox"
view_type="form"
view_mode="tree,form"
id="act_timebox_tasks_my_inbox"/>
<act_window name="My Open Tasks"
domain="[('user_id', '=', uid),('state','in',('draft','open'))]"
res_model="project.task"
src_model="project.gtd.timebox"
view_type="form"
view_mode="tree,form"
id="act_timebox_tasks_my_open"/>
<act_window name="My Pending Tasks"
domain="[('user_id', '=', uid),('state','=','pending')]"
res_model="project.task"
src_model="project.gtd.timebox"
view_type="form"
view_mode="tree,form"
id="act_timebox_tasks_my_pending"/>
<act_window name="My Deadlines"
domain="[('user_id', '=', uid),('state','in',('draft','open','pending')),('date_deadline','&lt;&gt;',False)]"
res_model="project.task"
src_model="project.gtd.timebox"
view_type="form"
view_mode="tree,form"
id="act_timebox_tasks_my_deadline_open"/>
<act_window name="Timebox Tasks"
domain="[('timebox_id', '=', active_id)]"
res_model="project.task"
src_model="project.gtd.timebox"
view_type="form"
view_mode="tree,form"
id="act_timebox_tasks"/>
</data>
</openerp>