summaryrefslogtreecommitdiff
path: root/addons/project
diff options
context:
space:
mode:
Diffstat (limited to 'addons/project')
-rw-r--r--addons/project/__openerp__.py15
-rw-r--r--addons/project/board_project_demo.xml28
-rw-r--r--addons/project/board_project_manager_view.xml58
-rw-r--r--addons/project/board_project_view.xml140
-rw-r--r--addons/project/project.py9
-rw-r--r--addons/project/project_resource.py14
-rw-r--r--addons/project/project_view.xml9
-rw-r--r--addons/project/report/project_report_view.xml2
-rw-r--r--addons/project/security/ir.model.access.csv3
-rw-r--r--addons/project/test/test_project.yml322
10 files changed, 578 insertions, 22 deletions
diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py
index a98b5cb28fd..5d535963422 100644
--- a/addons/project/__openerp__.py
+++ b/addons/project/__openerp__.py
@@ -26,9 +26,14 @@
"author" : "Tiny",
"website" : "http://www.openerp.com",
"category" : "Generic Modules/Projects & Services",
- "depends" : ["product", "analytic", "process", "mail_gateway"],
+ "depends" : ["product", "analytic", "process", "mail_gateway","board"],
"description": """Project management module that track multi-level projects, tasks,
work done on tasks, eso. It is able to render planning, order tasks, eso.
+ Dashboard for project members that includes:
+ * List of my open tasks
+ * List of messages
+ * Members list of project
+ * Issues
""",
"init_xml" : [],
"update_xml": [
@@ -43,10 +48,16 @@ work done on tasks, eso. It is able to render planning, order tasks, eso.
"project_installer.xml",
"report/project_report_view.xml",
"wizard/project_close_task_view.xml",
+ "board_project_view.xml",
+ 'board_project_manager_view.xml'
],
'demo_xml': [
- 'project_demo.xml'
+ 'project_demo.xml',
+ 'board_project_demo.xml',
],
+ 'test':[
+ 'test/test_project.yml'
+ ],
'installable': True,
'active': False,
'certificate': '0075116868317',
diff --git a/addons/project/board_project_demo.xml b/addons/project/board_project_demo.xml
new file mode 100644
index 00000000000..fa92e92f092
--- /dev/null
+++ b/addons/project/board_project_demo.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data noupdate="1">
+
+
+ <!--
+ Administrator shortcut
+ Demo user startup menu
+ -->
+ <record id="sc_account_dash" model="ir.ui.view_sc">
+ <field name="name">project dashboard</field>
+ <field name="user_id" ref="base.user_demo"/>
+ <field name="resource">ir.ui.menu</field>
+ <field name="sequence">3</field>
+ <field name="res_id" ref="menu_board_project"/>
+ </record>
+ <record id="base.user_root" model="res.users">
+ <field name="action_id" ref="open_board_project"/>
+ </record>
+
+ <record id="note_project" model="board.note">
+ <field name="name">Don't forget the new development policies.</field>
+ <field name="user_id" ref="base.user_root"/>
+ <field name="type">Project</field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/project/board_project_manager_view.xml b/addons/project/board_project_manager_view.xml
new file mode 100644
index 00000000000..3c32361e5ec
--- /dev/null
+++ b/addons/project/board_project_manager_view.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="note_project_type" model="board.note.type">
+ <field name="name">Project managers</field>
+ </record>
+
+ <!--
+ Board for project managers
+ -->
+ <act_window domain="[('manager', '=', uid)]" id="act_my_project" name="My projects" res_model="project.project" view_mode="tree,form" view_type="form"/>
+
+ <act_window domain="[('user_id','=',uid),('state','&lt;&gt;','close')]" id="act_my_account" name="My accounts to invoice" res_model="account.analytic.account" view_id="view_account_analytic_simplified" view_mode="tree,form" view_type="form"/>
+
+<!-- <record id="action_project_pipeline_user" model="ir.actions.act_window">-->
+<!-- <field name="name">Pipeline of tasks</field>-->
+<!-- <field name="res_model">report.task.user.pipeline.open</field>-->
+<!-- <field name="view_type">form</field>-->
+<!-- <field name="view_mode">graph,tree</field>-->
+<!-- <field name="domain">[('user_id','in',department_users_get())]</field>-->
+<!-- </record>-->
+
+
+
+ <record id="board_project_manager_form" model="ir.ui.view">
+ <field name="name">board.project.manager.form</field>
+ <field name="model">board.board</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Project manager board">
+ <hpaned>
+ <child1>
+ <!-- <action colspan="4" height="220" name="%(act_my_project)d" string="My projects" width="510"/>-->
+
+ <action colspan="4" height="150" name="%(act_my_account)d" string="My accounts to invoice" width="510"/>
+ </child1>
+ <child2>
+ <button colspan="4" icon="terp-partner" name="%(open_board_project)d" string="My tasks board" type="action"/>
+ </child2>
+ </hpaned>
+ </form>
+ </field>
+ </record>
+
+ <record id="open_board_project_manager" model="ir.actions.act_window">
+ <field name="name">Project Manager Dashboard</field>
+ <field name="res_model">board.board</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
+ <field name="usage">menu</field>
+ <field name="view_id" ref="board_project_manager_form"/>
+ </record>
+
+ <menuitem action="open_board_project_manager" icon="terp-graph" id="menu_board_project_manager" parent="project.next_id_86" sequence="1" groups="project.group_project_user"/>
+
+ </data>
+</openerp>
diff --git a/addons/project/board_project_view.xml b/addons/project/board_project_view.xml
new file mode 100644
index 00000000000..3e65798e5d8
--- /dev/null
+++ b/addons/project/board_project_view.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="note_project_manager_type" model="board.note.type">
+ <field name="name">Project</field>
+ </record>
+
+ <record id="view_task_tree" model="ir.ui.view">
+ <field name="name">project.task.tree</field>
+ <field name="model">project.task</field>
+ <field name="type">tree</field>
+ <field eval="99" name="priority"/>
+ <field name="arch" type="xml">
+ <tree colors="red:date_deadline&lt;current_date;blue:date_deadline==current_date;black:date_deadline&gt;current_date" string="My Tasks">
+ <field name="name"/>
+ <field name="project_id"/>
+ <field name="date_deadline"/>
+ <field name="planned_hours"/>
+ <field name="effective_hours"/>
+ <field name="priority"/>
+ </tree>
+ </field>
+ </record>
+ <!-- Editable My task -->
+ <record id="view_task_tree" model="ir.ui.view">
+ <field name="name">project.task.tree</field>
+ <field name="model">project.task</field>
+ <field name="type">tree</field>
+ <field eval="99" name="priority"/>
+ <field name="arch" type="xml">
+ <tree editable="top" colors="red:date_deadline&lt;current_date;blue:date_deadline==current_date;black:date_deadline&gt;current_date" string="My Tasks">
+ <field name="name"/>
+ <field name="project_id"/>
+ <field name="date_deadline"/>
+ <field name="planned_hours"/>
+ <field name="effective_hours"/>
+ <field name="priority"/>
+ </tree>
+ </field>
+ </record>
+ <record id="action_view_task_tree" model="ir.actions.act_window">
+ <field name="name">My Open Tasks</field>
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">[('user_id','=',uid),('state','=','open')]</field>
+ <field name="view_id" ref="view_task_tree"/>
+ </record>
+ <record id="action_view_pending_task_tree" model="ir.actions.act_window">
+ <field name="name">My Pending Tasks</field>
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">[('user_id','=',uid),('state','=','pending')]</field>
+ <field name="view_id" ref="view_task_tree"/>
+ </record>
+ <record id="action_view_task_tree_deadline" model="ir.actions.act_window">
+ <field name="name">My Task's Deadlines</field>
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">[('user_id','=',uid),('state','=','open'),('date_deadline','&lt;&gt;',False)]</field>
+ <field name="view_id" ref="view_task_tree"/>
+ </record>
+
+ <record id="action_view_board_note_tree" model="ir.actions.act_window">
+ <field name="name">Public Notes</field>
+ <field name="res_model">board.note</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">[('type','=','Project')]</field>
+ </record>
+
+ <!--Actions for deshboard -->
+
+ <record id="action_view_project_editable_messages_tree" model="ir.actions.act_window">
+ <field name="name">Messages</field>
+ <field name="res_model">project.message</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="view_id" ref="project.view_project_message_tree"/>
+ </record>
+
+<!-- <record id="action_view_project_member_tree" model="ir.actions.act_window">
+ <field name="name">Project's Members</field>
+ <field name="res_model">resource.resource</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="domain">[('resource_type','=','user')]</field>
+ <field name="view_id" ref="resource.resource_resource_tree"/>
+ </record>-->
+
+ <record id="board_project_form" model="ir.ui.view">
+ <field name="name">board.project.form</field>
+ <field name="model">board.board</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="My Board">
+ <hpaned>
+ <child1>
+ <action colspan="4" name="%(action_view_task_tree)d" string="My Open Tasks" width="510"/>
+ <action colspan="4" name="%(action_view_pending_task_tree)d" string="My Pending Tasks" width="510"/>
+ </child1>
+ <child2>
+ <vpaned>
+ <child1>
+ <action colspan="4" name="%(project.action_project_vs_remaining_hours_graph)d" string="Remaining Hours Per Project" />
+ </child1>
+ <child2>
+ <action colspan="4" name="%(project.action_task_by_days_vs_planned_hours_graph)d" string="Planned Hours Per Day" />
+ </child2>
+ </vpaned>
+ </child2>
+ </hpaned>
+ </form>
+ </field>
+ </record>
+
+ <record id="open_board_project" model="ir.actions.act_window">
+ <field name="name">Project Dashboard</field>
+ <field name="res_model">board.board</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
+ <field name="usage">menu</field>
+ <field name="view_id" ref="board_project_form"/>
+ </record>
+ <menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>
+ <menuitem
+ id="next_id_86"
+ name="Project"
+ parent="base.dashboard"/>
+ <menuitem
+ action="open_board_project"
+ icon="terp-graph"
+ id="menu_board_project"
+ parent="next_id_86"
+ sequence="1"/>
+ </data>
+</openerp>
diff --git a/addons/project/project.py b/addons/project/project.py
index d511757c8dc..c5c389e5510 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -92,10 +92,10 @@ class project(osv.osv):
FROM
project_task
WHERE
- project_id =ANY(%s) AND
+ project_id IN %s AND
state<>'cancelled'
GROUP BY
- project_id''',(ids2,))
+ project_id''',(tuple(ids2),))
progress = dict(map(lambda x: (x[0], (x[1], x[2], x[3])), cr.fetchall()))
for project in self.browse(cr, uid, ids, context=context):
s = [0.0, 0.0, 0.0]
@@ -196,7 +196,7 @@ class project(osv.osv):
res = super(project, self).copy(cr, uid, id, default, context)
ids = self.search(cr, uid, [('parent_id','child_of', [res])])
if ids:
- cr.execute('update project_task set active=True where project_id =ANY(%s)',(ids,))
+ cr.execute('update project_task set active=True where project_id IN %s',(tuple(ids),))
return res
def duplicate_template(self, cr, uid, ids, context={}):
@@ -272,7 +272,7 @@ class task(osv.osv):
# Compute: effective_hours, total_hours, progress
def _hours_get(self, cr, uid, ids, field_names, args, context=None):
res = {}
- cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id =ANY(%s) GROUP BY task_id",(ids,))
+ cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),))
hours = dict(cr.fetchall())
for task in self.browse(cr, uid, ids, context=context):
res[task.id] = {'effective_hours': hours.get(task.id, 0.0), 'total_hours': task.remaining_hours + hours.get(task.id, 0.0)}
@@ -343,7 +343,6 @@ class task(osv.osv):
'company_id': fields.many2one('res.company', 'Company'),
}
_defaults = {
- 'user_id': lambda obj, cr, uid, context: uid,
'state': lambda *a: 'draft',
'priority': lambda *a: '2',
'progress': lambda *a: 0,
diff --git a/addons/project/project_resource.py b/addons/project/project_resource.py
index 75dd94ad5a3..478fd4316bc 100644
--- a/addons/project/project_resource.py
+++ b/addons/project/project_resource.py
@@ -18,10 +18,10 @@ def leaves_resource(cr,uid,calendar_id,resource_id=False,resource_calendar=False
resource_leaves_pool = pool.get('resource.calendar.leaves')
leaves = []
if resource_id:
- resource_leave_ids = resource_leaves_pool.search(cr,uid,['|',('calendar_id','=',calendar_id),('calendar_id','=',resource_calendar),('resource_id','=',resource_id)])
+ resource_leave_ids = resource_leaves_pool.search(cr, uid, ['|',('calendar_id','=',calendar_id),('calendar_id','=',resource_calendar),('resource_id','=',resource_id)])
else:
- resource_leave_ids = resource_leaves_pool.search(cr,uid,[('calendar_id','=',calendar_id),('resource_id','=',False)])
- res_leaves = resource_leaves_pool.read(cr,uid,resource_leave_ids,['date_from','date_to'])
+ resource_leave_ids = resource_leaves_pool.search(cr, uid, [('calendar_id','=',calendar_id),('resource_id','=',False)])
+ res_leaves = resource_leaves_pool.read(cr, uid, resource_leave_ids, ['date_from','date_to'])
for leave in range(len(res_leaves)):
dt_start = datetime.datetime.strptime(res_leaves[leave]['date_from'],'%Y-%m-%d %H:%M:%S')
dt_end = datetime.datetime.strptime(res_leaves[leave]['date_to'],'%Y-%m-%d %H:%M:%S')
@@ -42,8 +42,8 @@ def compute_working_calendar(cr,uid,calendar_id):
wk_time = {}
wktime_list = []
wktime_cal = []
- week_ids = resource_week_pool.search(cr,uid,[('calendar_id','=',calendar_id)])
- week_obj = resource_week_pool.read(cr,uid,week_ids,['dayofweek','hour_from','hour_to'])
+ week_ids = resource_week_pool.search(cr, uid, [('calendar_id','=',calendar_id)])
+ week_obj = resource_week_pool.read(cr, uid, week_ids, ['dayofweek','hour_from','hour_to'])
# Converting time formats into appropriate format required
# and creating a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')]
@@ -53,8 +53,8 @@ def compute_working_calendar(cr,uid,calendar_id):
day = wk[week['dayofweek']]
wk_days[week['dayofweek']] = wk[week['dayofweek']]
- hour_from_str = timeformat_convert(cr,uid,week['hour_from'])
- hour_to_str = timeformat_convert(cr,uid,week['hour_to'])
+ hour_from_str = timeformat_convert(cr, uid, week['hour_from'])
+ hour_to_str = timeformat_convert(cr, uid, week['hour_to'])
res_str = hour_from_str + '-' + hour_to_str
wktime_list.append((day,res_str))
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 004ed9ba429..cbb7b9d7337 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
- <menuitem icon="terp-project" id="base.menu_main_pm" name="Project Management" sequence="1"/>
+ <menuitem icon="terp-project" id="base.menu_main_pm" name="Project" sequence="10"/>
<menuitem id="menu_project_management" name="Project Management" parent="base.menu_main_pm" sequence="1"/>
<menuitem id="menu_definitions" name="Configuration" parent="base.menu_main_pm" sequence="60"/>
@@ -507,13 +507,14 @@
</record>
<record id="open_task_type_form" model="ir.actions.act_window">
- <field name="name">Task Types</field>
+ <field name="name">Types</field>
<field name="res_model">project.task.type</field>
<field name="view_type">form</field>
<field name="view_id" ref="task_type_tree"/>
</record>
- <menuitem action="open_task_type_form" id="menu_task_types" parent="project.menu_definitions"/>
-
+ <menuitem id="menu_tasks_config" name="Tasks" parent="project.menu_definitions" sequence="1"/>
+ <menuitem action="open_task_type_form" id="menu_task_types_view" parent="menu_tasks_config" sequence="1"/>
+
<act_window domain="[('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"/>
<act_window
diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml
index 9b685001664..92edbc78d77 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -117,7 +117,7 @@
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Stage" icon="terp-stage" context="{'group_by':'type'}" />
<separator orientation="vertical"/>
- <filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/>
+ <filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
</group>
diff --git a/addons/project/security/ir.model.access.csv b/addons/project/security/ir.model.access.csv
index 1a2fac38c6a..502c8af0596 100644
--- a/addons/project/security/ir.model.access.csv
+++ b/addons/project/security/ir.model.access.csv
@@ -19,9 +19,6 @@
"access_task_by_days","task.by.days","model_task_by_days","project.group_project_user",1,1,1,1
"access_close_task","close.task","model_close_task","project.group_project_user",1,1,1,1
"access_close_task_manager","close.task manager","model_close_task","project.group_project_manager",1,1,1,1
-"access_resource_calendar_project_user","resource.resource.calendar project user","resource.model_resource_calendar","project.group_project_user",1,0,0,0
-"access_resource_calendar_project_manager","resource.resource.calendar project manager","resource.model_resource_calendar","project.group_project_manager",1,1,1,1
-"access_fiscalyear_sequence_project_manager","account.sequence.fiscalyear project manager","account.model_account_sequence_fiscalyear","project.group_project_manager",1,1,0,0
"access_partner_task user","base.res.partner user","base.model_res_partner","project.group_project_user",1,0,0,0
"access_partner_task manager","base.res.partner manager","base.model_res_partner","project.group_project_manager",1,0,0,0
"access_partner_address_task user","base.res.partner.address user","base.model_res_partner_address","project.group_project_user",1,0,0,0
diff --git a/addons/project/test/test_project.yml b/addons/project/test/test_project.yml
new file mode 100644
index 00000000000..25b3e94b57f
--- /dev/null
+++ b/addons/project/test/test_project.yml
@@ -0,0 +1,322 @@
+-
+ Test project template feature
+-
+ Create project 'OpenERP Training Programme'
+-
+ !record {model: project.project, id: project_project_openerptrainingprogramme0}:
+ company_id: base.main_company
+ name: OpenERP Training Programme
+-
+ Create task 'Technical Training' for this project
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ date_start: '2010-05-31 11:48:38'
+ name: Technical Training
+ planned_hours: 30.0
+ project_id: project_project_openerptrainingprogramme0
+ remaining_hours: 30.0
+ state: draft
+-
+ Create task 'Functional Training' for this project
+-
+ !record {model: project.task, id: project_task_functionaltraining0}:
+ date_start: '2010-05-31 11:49:11'
+ name: Functional Training
+ planned_hours: 30.0
+ project_id: project_project_openerptrainingprogramme0
+ remaining_hours: 30.0
+ state: draft
+-
+ Set project as project template
+-
+ !python {model: project.project}: |
+ self.set_template(cr, uid, [ref("project_project_openerptrainingprogramme0")],
+ {"lang": "en_US", "active_model": "ir.ui.menu", "active_ids": [ref("project.menu_open_view_project_all")],
+ "tz": False, "active_id": ref("project.menu_open_view_project_all"), })
+-
+ Check if project in template state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in template state}:
+ - state == "template"
+-
+ Create new project based on this template
+-
+ !python {model: project.project}: |
+ new_prj = self.duplicate_template(cr, uid, [ref("project_project_openerptrainingprogramme0")],
+ {"lang": "en_US", "active_model": "ir.ui.menu", "active_ids": [ref("project.menu_open_view_project_all")],
+ "tz": False, "active_id": ref("project.menu_open_view_project_all"), })
+ if not new_prj:
+ raise Exception( "New project based on template not created")
+ new_id = new_prj['res_id']
+ state = self.read(cr, uid, [new_id], ['state'])[0]['state']
+ assert state == 'open', "Project in %s state. Project created from template project must be in open state"%state
+-
+ Reset project template to normal project
+-
+ !python {model: project.project}: |
+ self.reset_project(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids":
+ [ref("project.menu_open_view_project_all")], "tz": False, "active_model":
+ "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"),
+ })
+-
+ Check if project in open state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}:
+ - state == "open"
+
+
+
+
+-
+ Test for different project-states
+-
+ Keep project pending
+-
+ !python {model: project.project}: |
+ self.set_pending(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids":
+ [ref("project.menu_open_view_project_all")], "tz": False, "active_model":
+ "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"),
+ })
+-
+ Check if project in pending state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in pending state}:
+ - state == "pending"
+-
+ Cancel the project
+-
+ !python {model: project.project}: |
+ self.set_cancel(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids":
+ [ref("project.menu_open_view_project_all")], "tz": False, "active_model":
+ "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"),
+ })
+-
+ Check if project in cancel state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in cancel state}:
+ - state == "cancelled"
+-
+ Re-open the project
+-
+ !python {model: project.project}: |
+ self.set_open(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": [ref("project.menu_open_view_project_all")],
+ "tz": False, "active_model": "ir.ui.menu", "project_id": False, "active_id":
+ ref("project.menu_open_view_project_all"), })
+-
+ Check if project in open state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}:
+ - state == "open"
+
+
+
+-
+ Test for task work allocation
+-
+ Check if task 'Technical Training' in draft state
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Project is in draft state}:
+ - state == "draft"
+-
+ Open task 'Technical Training'
+-
+ !python {model: project.task}: |
+ self.do_open(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_user_id": 1, "search_default_current": 1, "project_id":
+ False, "active_id": ref("project.menu_action_view_task"), })
+-
+ Check if task 'Technical Training' in open state and for other initial values
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Project is in open state}:
+ - state == "open"
+ - planned_hours == 30
+ - remaining_hours == 30
+ - delay_hours == 0.0
+ - total_hours == 30
+ - effective_hours == 0.0
+-
+ Make a work task entry 'Training on OpenERP modules, models and classes' of 10 hours
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ work_ids:
+ - date: '2010-05-31 15:04:22'
+ hours: 10.0
+ name: Training on OpenERP modules, models and classes
+ user_id: base.user_root
+-
+ Check for effective hours and remaining hours, effective_hours must be equal to 10
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After work task of 10 hours effective_hours must be equal to 10}:
+ - remaining_hours == 20
+ - effective_hours == 10.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Make a work task entry 'Training on OpenERP xml views' of 10 hours
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ work_ids:
+ - date: '2010-06-01 15:04:46'
+ hours: 10.0
+ name: Training on OpenERP xml views
+ user_id: base.user_root
+-
+ Check for effective hours and remaining hours, effective_hours must be equal to 20
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 20}:
+ - remaining_hours == 10
+ - effective_hours == 20.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Make a work task entry 'Training on workflows' of 10 hours
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ work_ids:
+ - date: '2010-06-02 15:05:24'
+ hours: 10.0
+ name: Training on workflows
+ user_id: base.user_root
+-
+ Check for effective hours and remaining hours, effective_hours must be equal to 30
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 30}:
+ - remaining_hours == 0
+ - effective_hours == 30.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Set remaining hours of 10 hours for reevaluating the task
+-
+ !record {model: config.compute.remaining, id: config_compute_remaining_0}:
+ remaining_hours: 10.0
+-
+ Reevaluate the task
+-
+ !python {model: config.compute.remaining}: |
+ self.compute_hours(cr, uid, [ref("config_compute_remaining_0")], {"lang": "en_US",
+ "project_id": False, "tz": False, "active_model": "project.task", "search_default_project_id":
+ False, "search_default_user_id": 1, "search_default_current": 1, "active_ids":
+ [ref("project_task_technicaltraining0")], "active_id": ref("project_task_technicaltraining0"), })
+
+-
+ Check for effective hours and remaining hours, remaining_hours must be 10 while planned_hours remains 30
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After reevaluating the task with 10 hours remaining_hours must be 10 while planned_hours remains 30}:
+ - planned_hours == 30
+ - remaining_hours == 10.0
+ - effective_hours == 30.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Make a work task entry 'Training on reports and wizards' of 10 hours
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ work_ids:
+ - date: '2010-05-31 15:08:40'
+ hours: 10.0
+ name: Training on reports and wizards
+ user_id: base.user_root
+-
+ Check for effective hours and remaining hours
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 40 while planned_hours remains 30}:
+ - planned_hours == 30
+ - remaining_hours == 0
+ - effective_hours == 40.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Close the task
+-
+ !python {model: project.task}: |
+ self.do_close(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_user_id": 1, "search_default_current": 1, "project_id":
+ False, "active_id": ref("project.menu_action_view_task"), })
+-
+ Check if task in done state
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Task is in done state}:
+ - state == "done"
+
+
+-
+ Test for task reactivation
+-
+ Reactivate task
+-
+ !record {model: config.compute.remaining, id: config_compute_remaining_1}:
+ remaining_hours: 10.0
+-
+ Reevaluate the task with 10 hours remaining
+-
+ !python {model: config.compute.remaining}: |
+ self.compute_hours(cr, uid, [ref("config_compute_remaining_1")], {"lang": "en_US",
+ "project_id": False, "tz": False, "button_reactivate": True, "active_model":
+ "project.task", "search_default_project_id": False, "search_default_user_id":
+ 1, "search_default_current": 1, "active_ids": [ref("project_task_technicaltraining0")], "active_id": ref("project_task_technicaltraining0"),
+ })
+-
+ Check for effective hours and remaining hours, remaining_hours must be 10 while planned_hours remains 30
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After reevaluating the task with 10 hours remaining_hours must be 10 while planned_hours remains 30}:
+ - planned_hours == 30
+ - remaining_hours == 10.0
+ - effective_hours == 40.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Make a work task entry 'Training on yml' of 5 hours
+-
+ !record {model: project.task, id: project_task_technicaltraining0}:
+ work_ids:
+ - date: '2010-05-31 16:55:27'
+ hours: 5.0
+ name: Training on yml
+ user_id: base.user_root
+-
+ Check for effective hours and remaining hours
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After work task of 5 hours effective_hours must be equal to 45 and remaining_hours is 5}:
+ - planned_hours == 30
+ - remaining_hours == 5.0
+ - effective_hours == 45.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Close the task
+-
+ !python {model: project.task}: |
+ self.do_close(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_user_id": 1, "search_default_current": 1, "project_id":
+ False, "active_id": ref("project.menu_action_view_task"), })
+-
+ Check if task in done state
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error}:
+ - state == "done"
+-
+ Check for effective hours and remaining hours
+-
+ !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After closing the task planned_hours must remain 30 effective_hours must be 45 and remaining hours must be 0}:
+ - planned_hours == 30
+ - remaining_hours == 0.0
+ - effective_hours == 45.0
+ - total_hours == effective_hours + remaining_hours
+ - delay_hours == total_hours - planned_hours
+-
+ Close project 'OpenERP Training Programme'
+-
+ !python {model: project.project}: |
+ self.set_done(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": [ref("project.menu_open_view_project_all")],
+ "tz": False, "active_model": "ir.ui.menu", "project_id": False, "active_id":
+ ref("project.menu_open_view_project_all"), })
+-
+ Check if project in close state
+-
+ !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error}:
+ - state == "close"
+ \ No newline at end of file