diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py
index a98b5cb28fd..09b2c019543 100644
--- a/addons/project/__openerp__.py
+++ b/addons/project/__openerp__.py
@@ -47,6 +47,9 @@ work done on tasks, eso. It is able to render planning, order tasks, eso.
'demo_xml': [
'project_demo.xml'
],
+ 'test':[
+ 'test/test_project.yml'
+ ],
'installable': True,
'active': False,
'certificate': '0075116868317',
diff --git a/addons/project/project.py b/addons/project/project.py
index 61720675f49..8312df7cf0c 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -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/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
diff --git a/addons/project_gtd/__openerp__.py b/addons/project_gtd/__openerp__.py
index 7c8dc035e0f..ba46d295234 100644
--- a/addons/project_gtd/__openerp__.py
+++ b/addons/project_gtd/__openerp__.py
@@ -50,6 +50,9 @@ performing those tasks.
'wizard/project_gtd_fill_view.xml',
],
'demo_xml': ['project_gtd_demo.xml'],
+ 'test':[
+ 'test/gtd_test.yml'
+ ],
'installable': True,
'active': False,
'certificate': '0043525236301',
diff --git a/addons/project_gtd/test/gtd_test.yml b/addons/project_gtd/test/gtd_test.yml
new file mode 100644
index 00000000000..84422af3467
--- /dev/null
+++ b/addons/project_gtd/test/gtd_test.yml
@@ -0,0 +1,80 @@
+-
+ Create a task 'Develop time management module' with monthly timebox
+-
+ !record {model: project.task, id: project_task_developtimemanagementmodule0}:
+ date_end: '2010-06-04 10:00:00'
+ date_start: '2010-06-02 14:42:21'
+ name: Develop time management module
+ planned_hours: 15.0
+ project_id: project.project_project_22
+ remaining_hours: 15.0
+ state: draft
+ timebox_id: project_gtd.timebox_monthly
+
+
+-
+ Open the task
+-
+ !python {model: project.task}: |
+ self.do_open(cr, uid, [ref("project_task_developtimemanagementmodule0")], {"lang":
+ "en_US", "project_id": False, "tz": False, "active_model": "ir.ui.menu",
+ "department_id": False, "section_id": False, "search_default_project_id":
+ False, "search_default_user_id": 1, "search_default_current": 1, "active_ids":
+ [ref("project.menu_action_view_task")], "active_id": ref("project.menu_action_view_task"),
+ })
+
+-
+ Create time box for next week
+-
+ !record {model: project.gtd.timebox, id: project_gtd_timebox_nextweek0}:
+ name: Next Week
+ sequence: 0.0
+
+-
+ Create time box for tomorrow
+-
+ !record {model: project.gtd.timebox, id: project_gtd_timebox_tomorrow1}:
+ name: Tomorrow
+ sequence: 0.0
+
+-
+ Planify the task from monthly timebox to tomorrow timebox
+-
+ !record {model: project.timebox.fill.plan, id: project_timebox_fill_plan_0}:
+ task_ids:
+ - project_task_developtimemanagementmodule0
+ timebox_id: project_gtd.timebox_monthly
+ timebox_to_id: project_gtd_timebox_tomorrow1
+
+
+-
+ Set the task to tomorrow timebox
+-
+ !python {model: project.timebox.fill.plan}: |
+ self.process(cr, uid, [ref("project_timebox_fill_plan_0")], {"lang": "en_US",
+ "project_id": False, "tz": False, "active_model": "project.gtd.timebox",
+ "department_id": False, "section_id": False, "record_id": 1, "active_ids":
+ [ref("project_gtd.timebox_daily")], "active_id": ref("project_gtd.timebox_daily"),
+ })
+
+-
+ Check if task set to tomorrow timebox
+-
+ !assert {model: project.task, id: project_task_developtimemanagementmodule0, string: Task set to tomorrow timebox}:
+ - timebox_id.id == ref("project_gtd_timebox_tomorrow1")
+
+-
+ Empty Timebox for tomorrow
+-
+ !python {model: project.timebox.empty}: |
+ self._empty(cr, uid, {"lang": "en_US",
+ "project_id": False, "tz": False, "active_model": "project.gtd.timebox",
+ "department_id": False, "section_id": False, "record_id": 1, "active_ids":
+ [ref("project_gtd_timebox_tomorrow1")], "active_id": ref("project_gtd_timebox_tomorrow1"),
+ })
+
+-
+ Check task 'Develop time management module' is no more in tomorrow timebox
+-
+ !assert {model: project.task, id: project_task_developtimemanagementmodule0, string: Task is not in tomorrow timebox}:
+ - timebox_id.id != ref("project_gtd_timebox_tomorrow1")
\ No newline at end of file
diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py
index 982d1688014..f9f38fca8e3 100644
--- a/addons/project_issue/__openerp__.py
+++ b/addons/project_issue/__openerp__.py
@@ -47,6 +47,10 @@
'security/ir.model.access.csv',
],
'demo_xml': ['project_issue_demo.xml'],
+ 'test' : [
+ 'test/convert_issue_to_task.yml',
+ 'test/test_project_issue_states.yml'
+ ],
'installable': True,
'active': False,
}
diff --git a/addons/project_issue/test/convert_issue_to_task.yml b/addons/project_issue/test/convert_issue_to_task.yml
new file mode 100644
index 00000000000..13ddef69251
--- /dev/null
+++ b/addons/project_issue/test/convert_issue_to_task.yml
@@ -0,0 +1,32 @@
+-
+ Create an issue
+-
+ !record {model: project.issue, id: project_issue_onchangeevent0}:
+ categ_id: project_issue.bug_categ
+ name: on_change event does not pass context to the method
+ project_id: project.project_project_22
+ working_hours_close: 0.0
+ working_hours_open: 0.0
+
+-
+ Check there is no task attached to issue
+-
+ !assert {model: project.issue, id: project_issue_onchangeevent0, string: There must not be any task attached to issue}:
+ - task_id.id == False
+
+-
+ Convert issue to task
+-
+ !python {model: project.issue}: |
+ self.convert_issue_task(cr, uid, [ref("project_issue_onchangeevent0")],
+ {"lang": "en_US", "project_id": False, "tz": False, "active_model": "ir.ui.menu",
+ "department_id": False, "section_id": False, "search_default_project_id":
+ False, "search_default_my_bugs": 1, "search_default_user_id": 1, "search_default_current_bugs":
+ 1, "active_ids": [ref("project_issue.menu_project_issue_track")], "active_id":
+ ref("project_issue.menu_project_issue_track"), })
+
+-
+ Check there is a task attached to issue
+-
+ !assert {model: project.issue, id: project_issue_onchangeevent0, string: After creating a task for the issue there must be a task attached to it}:
+ - task_id.id != False
diff --git a/addons/project_issue/test/test_project_issue_states.yml b/addons/project_issue/test/test_project_issue_states.yml
new file mode 100644
index 00000000000..ee48c9a9df0
--- /dev/null
+++ b/addons/project_issue/test/test_project_issue_states.yml
@@ -0,0 +1,112 @@
+-
+ Create an issue
+-
+ !record {model: project.issue, id: project_issue_stockmovedates0}:
+ categ_id: project_issue.bug_categ
+ name: Stock Move dates
+ project_id: project.project_project_22
+ working_hours_close: 0.0
+ working_hours_open: 0.0
+-
+ Check if issue in 'draft' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in draft state}:
+ - state == 'draft'
+
+-
+ Open the issue
+-
+ !python {model: project.issue}: |
+ self.case_open(cr, uid, [ref("project_issue_stockmovedates0")], {"lang":
+ "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")], "tz":
+ False, "active_model": "ir.ui.menu", "search_default_project_id": False, "search_default_my_bugs":
+ 1, "search_default_user_id": 1, "search_default_current_bugs": 1, "project_id":
+ False, "active_id": ref("project_issue.menu_project_issue_track"), })
+-
+ Check if issue in 'open' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in open state}:
+ - state == 'open'
+
+-
+ Keep issue pending
+-
+ !python {model: project.issue}: |
+ self.case_pending(cr, uid, [ref("project_issue_stockmovedates0")],
+ {"lang": "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_my_bugs": 1, "search_default_user_id": 1, "search_default_current_bugs":
+ 1, "project_id": False, "active_id": ref("project_issue.menu_project_issue_track"),
+ })
+-
+ Check if issue in 'pending' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in pending state}:
+ - state == 'pending'
+
+
+-
+ Open the issue
+-
+ !python {model: project.issue}: |
+ self.case_open(cr, uid, [ref("project_issue_stockmovedates0")], {"lang":
+ "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")], "tz":
+ False, "active_model": "ir.ui.menu", "search_default_project_id": False, "search_default_my_bugs":
+ 1, "search_default_user_id": 1, "search_default_current_bugs": 1, "project_id":
+ False, "active_id": ref("project_issue.menu_project_issue_track"), })
+-
+ Check if issue in 'open' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in open state}:
+ - state == 'open'
+
+
+-
+ Cancel the issue
+-
+ !python {model: project.issue}: |
+ self.case_cancel(cr, uid, [ref("project_issue_stockmovedates0")],
+ {"lang": "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_my_bugs": 1, "search_default_user_id": 1, "search_default_current_bugs":
+ 1, "project_id": False, "active_id": ref("project_issue.menu_project_issue_track"),
+ })
+-
+ Check if issue in 'cancel' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in cancel state}:
+ - state == 'cancel'
+
+
+-
+ Reset the issue
+-
+ !python {model: project.issue}: |
+ self.case_reset(cr, uid, [ref("project_issue_stockmovedates0")],
+ {"lang": "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_my_bugs": 1, "search_default_user_id": 1, "search_default_current_bugs":
+ 1, "project_id": False, "active_id": ref("project_issue.menu_project_issue_track"),
+ })
+-
+ Check if issue in 'draft' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in draft state}:
+ - state == 'draft'
+
+
+-
+ Close the issue
+-
+ !python {model: project.issue}: |
+ self.case_close(cr, uid, [ref("project_issue_stockmovedates0")],
+ {"lang": "en_US", "active_ids": [ref("project_issue.menu_project_issue_track")],
+ "tz": False, "active_model": "ir.ui.menu", "search_default_project_id":
+ False, "search_default_my_bugs": 1, "search_default_user_id": 1, "search_default_current_bugs":
+ 1, "project_id": False, "active_id": ref("project_issue.menu_project_issue_track"),
+ })
+-
+ Check if issue in 'done' state
+-
+ !assert {model: project.issue, id: project_issue_stockmovedates0, severity: error, string: Issue is in done state}:
+ - state == 'done'
diff --git a/addons/project_long_term/__openerp__.py b/addons/project_long_term/__openerp__.py
index 32945899b30..7bc0e3c9984 100644
--- a/addons/project_long_term/__openerp__.py
+++ b/addons/project_long_term/__openerp__.py
@@ -38,6 +38,11 @@
""",
"init_xml" : [],
"demo_xml" : ["project_long_term_demo.xml"],
+ "test" : [
+ 'test/schedule_project_phases.yml',
+ 'test/schedule_project_tasks.yml',
+ 'test/schedule_phase_tasks.yml'
+ ],
"update_xml": [
"security/ir.model.access.csv",
"project_long_term_wizard.xml" ,
diff --git a/addons/project_long_term/test/schedule_phase_tasks.yml b/addons/project_long_term/test/schedule_phase_tasks.yml
new file mode 100644
index 00000000000..7af72f05824
--- /dev/null
+++ b/addons/project_long_term/test/schedule_phase_tasks.yml
@@ -0,0 +1,101 @@
+-
+ Create project 'Develop an outlook-openerp synchronization plugin'
+-
+ !record {model: project.project, id: project_project_project0}:
+ company_id: base.main_company
+ name: Project123
+ members:
+ - project_long_term.res_users_manager0
+ - project_long_term.res_users_user0
+ - project_long_term.res_users_userfinance0
+ - project_long_term.res_users_userdesign0
+ - project_long_term.res_users_userdeveloper0
+ - project_long_term.res_users_usertester0
+ - project_long_term.res_users_useranalyst0
+-
+ Create phase 'Develop GUI' in Outlook
+-
+ !record {model: project.phase, id: project_phase_phase0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 200.0
+ name: phase123
+ product_uom: product.uom_day
+ project_id: project_project_project0
+ state: draft
+ resource_ids:
+ - resource_id: project_long_term.resource_resource_analyst0
+ useability: 80.0
+ - resource_id: project_long_term.resource_resource_programmer0
+ useability: 30.0
+ - resource_id: project_long_term.resource_resource_webdesigner0
+ useability: 30.0
+
+
+-
+ Create the phase task 'Develop GUI for Server Configuration'
+-
+ !record {model: project.task, id: project_task_t0}:
+ name: t1
+ occupation_rate: 1.0
+ planned_hours: 20.0
+ remaining_hours: 20.0
+ state: draft
+ phase_id: project_phase_phase0
+ project_id: project_project_project0
+
+
+-
+ Create the phase task 'Develop GUI for Modules Configuration'
+-
+ !record {model: project.task, id: project_task_t1}:
+ name: t2
+ occupation_rate: 1.0
+ planned_hours: 25.0
+ remaining_hours: 25.0
+ state: draft
+ phase_id: project_phase_phase0
+ project_id: project_project_project0
+
+-
+ Create the phase task 'Develop GUI for OpenERP Synchronisation'
+-
+ !record {model: project.task, id: project_task_t2}:
+ name: t3
+ occupation_rate: 1.0
+ planned_hours: 30.0
+ remaining_hours: 30.0
+ state: draft
+ phase_id: project_phase_phase0
+ project_id: project_project_project0
+
+
+-
+ Create the phase task 'Develop required Menus'
+-
+ !record {model: project.task, id: project_task_3}:
+ name: t4
+ occupation_rate: 1.0
+ planned_hours: 25.0
+ remaining_hours: 25.0
+ state: draft
+ phase_id: project_phase_phase0
+ project_id: project_project_project0
+
+
+-
+ Schedule phase tasks
+-
+ !python {model: project.schedule.tasks}: |
+ self.compute_date(cr, uid, {"lang": "en_US",
+ "active_model": "project.phase", "active_ids": [ref("project_phase_phase0")],
+ "tz": False, "record_id": 138, "project_id": ref("project_project_project0"), "active_id": ref("project_phase_phase0"),
+ })
+
+-
+ Check if tasks scheduled, check that either of task's start_date, end_date and user_id is not null
+-
+ !python {model: project.phase}: |
+ phase=self.browse(cr, uid, [ref("project_phase_phase0")])[0]
+ for task in phase.task_ids:
+ if (not task.user_id) or (not task.date_start) or (not task.date_end):
+ raise AssertionError("Phase Tasks not scheduled")
\ No newline at end of file
diff --git a/addons/project_long_term/test/schedule_project_phases.yml b/addons/project_long_term/test/schedule_project_phases.yml
new file mode 100644
index 00000000000..470f2dc2e48
--- /dev/null
+++ b/addons/project_long_term/test/schedule_project_phases.yml
@@ -0,0 +1,143 @@
+-
+ Create a project 'World Bank's Project'
+-
+ !record {model: project.project, id: project_project_worldbanksproject0}:
+ company_id: base.main_company
+ name: "World Bank's Project"
+ priority: 4
+
+-
+ Create a project phase 'Defining Client's Basic Idea of Project'
+-
+ !record {model: project.phase, id: project_phase_definingclientsbasicideaofproject0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 15.0
+ name: "Defining Client's Basic Idea of Project"
+ product_uom: product.uom_day
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+
+-
+ Create project phase 'Establishing Project Feasibility'
+-
+ !record {model: project.phase, id: project_phase_establishingprojectfeasibility0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 30.0
+ name: Establishing Project Feasibility
+ product_uom: product.uom_day
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+-
+ Create project phase 'Preparation of Engineering Designs'
+-
+ !record {model: project.phase, id: project_phase_preparationofengineeringdesigns0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 100.0
+ name: Preparation of Engineering Designs
+ product_uom: product.uom_hour
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+
+-
+ Create project phase 'Procurement of Works and Goods'
+-
+ !record {model: project.phase, id: project_phase_procurementofworksandgoods0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 24.0
+ name: Procurement of Works and Goods
+ product_uom: product.uom_hour
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+
+-
+ Create project phase 'Project Construction'
+-
+ !record {model: project.phase, id: project_phase_projectconstruction0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 4320.0
+ name: Project Construction
+ product_uom: product.uom_hour
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+
+-
+ Create project phase 'Project Completion'
+-
+ !record {model: project.phase, id: project_phase_projectcompletion0}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 240.0
+ name: Project Completion
+ product_uom: product.uom_hour
+ project_id: project_project_worldbanksproject0
+ state: draft
+
+-
+ Set previous phase for phase 'Establishing Project Feasibility'
+-
+ !record {model: project.phase, id: project_phase_establishingprojectfeasibility0}:
+ previous_phase_ids:
+ - project_phase_definingclientsbasicideaofproject0
+
+
+-
+ Set previous phase for phase 'Preparation of Engineering Designs'
+-
+ !record {model: project.phase, id: project_phase_preparationofengineeringdesigns0}:
+ previous_phase_ids:
+ - project_phase_establishingprojectfeasibility0
+
+-
+ Set previous phase for phase 'Procurement of Works and Goods'
+-
+ !record {model: project.phase, id: project_phase_procurementofworksandgoods0}:
+ previous_phase_ids:
+ - project_phase_preparationofengineeringdesigns0
+
+-
+ Set previous phase for phase 'Project Construction'
+-
+ !record {model: project.phase, id: project_phase_projectconstruction0}:
+ previous_phase_ids:
+ - project_phase_procurementofworksandgoods0
+
+
+-
+ Set previous phase for phase 'Project Completion'
+-
+ !record {model: project.phase, id: project_phase_projectcompletion0}:
+ previous_phase_ids:
+ - project_phase_projectconstruction0
+
+
+-
+ Get the project to schedule phases
+-
+ !record {model: project.compute.phases, id: project_compute_phases_0}:
+ project_id: project_project_worldbanksproject0
+ target_project: one
+
+
+-
+ Schedule project phases
+-
+ !python {model: project.compute.phases}: |
+ self.check_selection(cr, uid, [ref("project_compute_phases_0")], {"lang": "en_US",
+ "project_id": False, "tz": False, "active_model": "ir.ui.menu", "department_id":
+ False, "section_id": False, "record_id": 279, "active_ids": [ref("project_long_term.menu_compute_phase")],
+ "active_id": ref("project_long_term.menu_compute_phase"), })
+
+-
+ Check if phases scheduled, check that either of phase's start_date, end_date and user_id is not null
+-
+ !python {model: project.project}: |
+ prj=self.browse(cr, uid, [ref("project_project_worldbanksproject0")])[0]
+ for task in prj.tasks:
+ if (not task.user_id) or (not task.date_start) or (not task.date_end):
+ raise AssertionError("Tasks not scheduled")
+
+
\ No newline at end of file
diff --git a/addons/project_long_term/test/schedule_project_tasks.yml b/addons/project_long_term/test/schedule_project_tasks.yml
new file mode 100644
index 00000000000..40dbd07b3ff
--- /dev/null
+++ b/addons/project_long_term/test/schedule_project_tasks.yml
@@ -0,0 +1,108 @@
+-
+ Create project 'Develop a thunderbird-openerp synchronization plugin'
+-
+ !record {model: project.project, id: project_project_project1}:
+ company_id: base.main_company
+ name: Project2
+ members:
+ - project_long_term.res_users_manager0
+ - project_long_term.res_users_user0
+ - project_long_term.res_users_userfinance0
+ - project_long_term.res_users_userdesign0
+ - project_long_term.res_users_userdeveloper0
+ - project_long_term.res_users_usertester0
+ - project_long_term.res_users_useranalyst0
+
+-
+ Create phase 'Develop GUI' in Thunderbird
+-
+ !record {model: project.phase, id: project_phase_phase1}:
+ date_start: '2010-06-02 00:00:00'
+ duration: 100.0
+ name: phase22
+ product_uom: product.uom_day
+ project_id: project_project_project1
+ state: draft
+ resource_ids:
+ - resource_id: project_long_term.resource_resource_analyst0
+ useability: 80.0
+ - resource_id: project_long_term.resource_resource_programmer0
+ useability: 30.0
+ - resource_id: project_long_term.resource_resource_webdesigner0
+ useability: 30.0
+
+
+-
+ Create the phase task 'Develop GUI for Server Configuration'
+-
+ !record {model: project.task, id: project_task_t00}:
+ name: t1
+ occupation_rate: 1.0
+ planned_hours: 20.0
+ remaining_hours: 20.0
+ state: draft
+ phase_id: project_phase_phase1
+ project_id: project_project_project1
+
+
+-
+ Create the phase task 'Develop GUI for Modules Configuration'
+-
+ !record {model: project.task, id: project_task_t11}:
+ name: t2
+ occupation_rate: 1.0
+ planned_hours: 25.0
+ remaining_hours: 25.0
+ state: draft
+ phase_id: project_phase_phase1
+ project_id: project_project_project1
+
+-
+ Create the phase task 'Develop GUI for OpenERP Synchronisation'
+-
+ !record {model: project.task, id: project_task_t22}:
+ name: t3
+ occupation_rate: 1.0
+ planned_hours: 30.0
+ remaining_hours: 30.0
+ state: draft
+ phase_id: project_phase_phase1
+ project_id: project_project_project1
+
+
+-
+ Create the phase task 'Develop required Menus'
+-
+ !record {model: project.task, id: project_task_t33}:
+ name: t4
+ occupation_rate: 1.0
+ planned_hours: 25.0
+ remaining_hours: 25.0
+ state: draft
+ phase_id: project_phase_phase1
+ project_id: project_project_project1
+
+-
+ Get the project to schedule the tasks
+-
+ !record {model: project.compute.tasks, id: project_compute_tasks_0}:
+ project_id: project_project_project1
+
+
+-
+ Schedule tasks
+-
+ !python {model: project.compute.tasks}: |
+ self.compute_date(cr, uid, [ref("project_compute_tasks_0")], {"lang": "en_US",
+ "active_model": "ir.ui.menu", "active_ids": [ref("project_long_term.menu_compute_tasks")],
+ "tz": False, "record_id": 138, "project_id": ref("project_project_project1"), "active_id": ref("project_long_term.menu_compute_tasks"),
+ })
+
+-
+ Check if tasks scheduled, check that either of task's start_date, end_date and user_id is not null
+-
+ !python {model: project.project}: |
+ prj=self.browse(cr, uid, [ref("project_project_project1")])[0]
+ for task in prj.tasks:
+ if (not task.user_id) or (not task.date_start) or (not task.date_end):
+ raise AssertionError("Project Tasks not scheduled")
\ No newline at end of file
diff --git a/addons/project_long_term/wizard/project_compute_phases_view.xml b/addons/project_long_term/wizard/project_compute_phases_view.xml
index 0a3b2e12336..6bbb01ca7e4 100644
--- a/addons/project_long_term/wizard/project_compute_phases_view.xml
+++ b/addons/project_long_term/wizard/project_compute_phases_view.xml
@@ -8,22 +8,22 @@
form
diff --git a/addons/project_long_term/wizard/project_compute_tasks.py b/addons/project_long_term/wizard/project_compute_tasks.py
index 9f2eb707c60..af5ceaea676 100644
--- a/addons/project_long_term/wizard/project_compute_tasks.py
+++ b/addons/project_long_term/wizard/project_compute_tasks.py
@@ -112,9 +112,9 @@ class project_compute_tasks(osv.osv_memory):
if each_task.priority in priority_dict.keys():
priorty = priority_dict[each_task.priority]
if each_task.user_id:
- for resource in resources:
- if resource.__name__ == each_task.user_id.name: # check me!!
- task = create_tasks(i, hours, priorty, resource)
+ for resrce in resources:
+ if resrce.__name__ == each_task.user_id.name: # check me!!
+ task = create_tasks(i, hours, priorty, resrce)
else:
task = create_tasks(i, hours, priorty)
i += 1
diff --git a/addons/project_long_term/wizard/project_schedule_tasks.py b/addons/project_long_term/wizard/project_schedule_tasks.py
index 8ec2d4c16e0..3e01c25e975 100644
--- a/addons/project_long_term/wizard/project_schedule_tasks.py
+++ b/addons/project_long_term/wizard/project_schedule_tasks.py
@@ -131,9 +131,9 @@ class project_schedule_task(osv.osv_memory):
if each_task.priority in priority_dict.keys():
priorty = priority_dict[each_task.priority]
if each_task.user_id:
- for resource in resources:
- if resource.__name__ == each_task.user_id.name:
- task = create_tasks(i, hours, priorty, resource)
+ for resrce in resources:
+ if resrce.__name__ == each_task.user_id.name:
+ task = create_tasks(i, hours, priorty, resrce)
else:
task = create_tasks(i, hours, priorty)
i += 1
diff --git a/addons/project_planning/__openerp__.py b/addons/project_planning/__openerp__.py
index 87a68a2e410..4496239e8c4 100644
--- a/addons/project_planning/__openerp__.py
+++ b/addons/project_planning/__openerp__.py
@@ -53,6 +53,9 @@ At the end of the month, the planning manager can also check if the encoded time
#'report_account_analytic.planning.csv',
'project_planning_demo.xml',
],
+ 'test': [
+ 'test/planning_states.yml'
+ ],
'installable': True,
'active': False,
'certificate': '0034901836973',
diff --git a/addons/project_planning/test/planning_states.yml b/addons/project_planning/test/planning_states.yml
new file mode 100644
index 00000000000..12dd38c8247
--- /dev/null
+++ b/addons/project_planning/test/planning_states.yml
@@ -0,0 +1,86 @@
+-
+ Create a analytic planning 'Project Planning'
+-
+ !record {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0}:
+ business_days: 20
+ date_from: '2010-06-01'
+ date_to: '2010-06-30'
+ name: Project Planning
+ state: draft
+ user_id: base.user_demo
+
+
+-
+ Open the planning
+-
+ !python {model: report_account_analytic.planning}: |
+ self.action_open(cr, uid, [ref("report_account_analytic_planning_projectplanning0")],
+ {"lang": "en_US", "active_ids": [ref("project_planning.menu_report_account_analytic_planning")],
+ "tz": False, "active_model": "ir.ui.menu", "section_id": False, "active_id":
+ ref("project_planning.menu_report_account_analytic_planning"), "search_default_user_id":
+ 1, "project_id": False, "department_id": False, })
+-
+ Check if planning in open state
+-
+ !assert {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0, string: Planning in open state}:
+ - state == "open"
+
+-
+ Cancel the planning
+-
+ !python {model: report_account_analytic.planning}: |
+ self.action_cancel(cr, uid, [ref("report_account_analytic_planning_projectplanning0")],
+ {"lang": "en_US", "active_ids": [ref("project_planning.menu_report_account_analytic_planning")],
+ "tz": False, "active_model": "ir.ui.menu", "section_id": False, "active_id":
+ ref("project_planning.menu_report_account_analytic_planning"), "search_default_user_id":
+ 1, "project_id": False, "department_id": False, })
+-
+ Check if planning in cancel state
+-
+ !assert {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0, string: Planning in cancel state}:
+ - state == "cancel"
+
+-
+ Reopen the planning
+-
+ !python {model: report_account_analytic.planning}: |
+ self.action_draft(cr, uid, [ref("report_account_analytic_planning_projectplanning0")],
+ {"lang": "en_US", "active_ids": [ref("project_planning.menu_report_account_analytic_planning")],
+ "tz": False, "active_model": "ir.ui.menu", "section_id": False, "active_id":
+ ref("project_planning.menu_report_account_analytic_planning"), "search_default_user_id":
+ 1, "project_id": False, "department_id": False, })
+-
+ Check if planning in draft state
+-
+ !assert {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0, string: Planning in draft state}:
+ - state == "draft"
+
+-
+ Open the planning
+-
+ !python {model: report_account_analytic.planning}: |
+ self.action_open(cr, uid, [ref("report_account_analytic_planning_projectplanning0")],
+ {"lang": "en_US", "active_ids": [ref("project_planning.menu_report_account_analytic_planning")],
+ "tz": False, "active_model": "ir.ui.menu", "section_id": False, "active_id":
+ ref("project_planning.menu_report_account_analytic_planning"), "search_default_user_id":
+ 1, "project_id": False, "department_id": False, })
+-
+ Check if planning in open state
+-
+ !assert {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0, string: Planning in open state}:
+ - state == "open"
+
+-
+ Close the planning
+-
+ !python {model: report_account_analytic.planning}: |
+ self.action_done(cr, uid, [ref("report_account_analytic_planning_projectplanning0")],
+ {"lang": "en_US", "active_ids": [ref("project_planning.menu_report_account_analytic_planning")],
+ "tz": False, "active_model": "ir.ui.menu", "section_id": False, "active_id":
+ ref("project_planning.menu_report_account_analytic_planning"), "search_default_user_id":
+ 1, "project_id": False, "department_id": False, })
+-
+ Check if planning in done state
+-
+ !assert {model: report_account_analytic.planning, id: report_account_analytic_planning_projectplanning0, string: Planning in done state}:
+ - state == "done"
\ No newline at end of file
diff --git a/addons/project_retro_planning/__openerp__.py b/addons/project_retro_planning/__openerp__.py
index 80601db9e81..e53b6b01233 100644
--- a/addons/project_retro_planning/__openerp__.py
+++ b/addons/project_retro_planning/__openerp__.py
@@ -25,13 +25,16 @@
'version': '0.1',
'category': 'Generic Modules/Projects & Services',
'description': """
- - If deadline date of project is changed
+ - If deadline date of project is changed
then the deadline date for all the tasks will change to the same """,
'author': 'Tiny',
'depends': ['base', 'project'],
'init_xml': [],
'update_xml': [],
'demo_xml': [],
+ 'test' : [
+ 'test/deadline_change.yml'
+ ],
'installable': True,
'active': False,
'certificate': '0057235475485',
diff --git a/addons/project_retro_planning/project_retro_planning.py b/addons/project_retro_planning/project_retro_planning.py
index 3300ac0eebe..8e8975cbbf8 100644
--- a/addons/project_retro_planning/project_retro_planning.py
+++ b/addons/project_retro_planning/project_retro_planning.py
@@ -19,28 +19,27 @@
#
##############################################################################
-from datetime import date,timedelta
+from datetime import date,timedelta,datetime
import time
from osv import fields, osv
-from datetime import datetime
class project_project(osv.osv):
_inherit = 'project.project'
-
def write(self, cr, uid, ids,vals, *args, **kwargs):
if 'date' in vals and vals['date']:
data_project = self.browse(cr,uid,ids)
+ project_task = self.pool.get('project.task')
for prj in data_project:
- c= date(*time.strptime(vals['date'],'%Y-%m-%d')[:3])
+ new_end_date = date(*time.strptime(vals['date'],'%Y-%m-%d')[:3])
if prj.date:
- d= date(*time.strptime(prj.date,'%Y-%m-%d')[:3])
+ old_end_date = date(*time.strptime(prj.date,'%Y-%m-%d')[:3])
for task in prj.tasks:
- start_dt = (datetime(*time.strptime(task.date_start,'%Y-%m-%d %H:%M:%S')[:6])+(c-d)).strftime('%Y-%m-%d %H:%M:%S')
+ start_dt = (datetime(*time.strptime(task.date_start,'%Y-%m-%d %H:%M:%S')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d %H:%M:%S')
if task.date_deadline:
- deadline_dt = (datetime(*time.strptime(task.date_deadline,'%Y-%m-%d %H:%M:%S')[:6])+(c-d)).strftime('%Y-%m-%d %H:%M:%S')
- self.pool.get('project.task').write(cr,uid,task.id,{'date_start':start_dt, 'date_deadline':deadline_dt})
+ deadline_dt = (datetime(*time.strptime(task.date_deadline,'%Y-%m-%d')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d')
+ project_task.write(cr,uid,task.id,{'date_start':start_dt, 'date_deadline':deadline_dt})
else:
- self.pool.get('project.task').write(cr,uid,task.id,{'date_start':start_dt})
+ project_task.write(cr,uid,task.id,{'date_start':start_dt})
return super(project_project,self).write(cr, uid, ids, vals, *args, **kwargs)
project_project()
diff --git a/addons/project_retro_planning/test/deadline_change.yml b/addons/project_retro_planning/test/deadline_change.yml
new file mode 100644
index 00000000000..0778c5c883b
--- /dev/null
+++ b/addons/project_retro_planning/test/deadline_change.yml
@@ -0,0 +1,48 @@
+-
+ Create project 'Retro Planning'
+-
+ !record {model: project.project, id: project_project_retroplanning0}:
+ company_id: base.main_company
+ date: '2010-06-11'
+ name: Retro Planning
+
+
+-
+ Create task 'Plan all projects'
+-
+ !record {model: project.task, id: project_task_planallprojects0}:
+ date_deadline: '2010-06-07'
+ date_end: '2010-06-04 14:00:00'
+ date_start: '2010-06-01 17:25:32'
+ name: Plan all projects
+ planned_hours: 24.0
+ project_id: project_project_retroplanning0
+ remaining_hours: 24.0
+ state: draft
+
+-
+ Check if task deadline_date and start_date changes upon changing its project's end_date
+-
+ !python {model: project.project}: |
+ from datetime import datetime, date
+ import time
+ data_project = self.browse(cr,uid,[ref("project_project_retroplanning0")])
+ prj = data_project[0]
+ old_end_date=''
+ if prj.date:
+ old_end_date = date(*time.strptime(prj.date,'%Y-%m-%d')[:3])
+ if old_end_date:
+ new_end_date = date(*time.strptime('2010-06-10','%Y-%m-%d')[:3])
+ res={}
+ for task in prj.tasks:
+ start_dt = (datetime(*time.strptime(task.date_start,'%Y-%m-%d %H:%M:%S')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d %H:%M:%S')
+ deadline_dt=''
+ if task.date_deadline:
+ deadline_dt = (datetime(*time.strptime(task.date_deadline,'%Y-%m-%d')[:6])+(new_end_date-old_end_date)).strftime('%Y-%m-%d')
+ res[task.id]=[start_dt,deadline_dt]
+ self.write(cr, uid, [ref("project_project_retroplanning0")], {'date':'2010-06-10'})
+ data_project = self.browse(cr,uid,[ref("project_project_retroplanning0")])
+ prj = data_project[0]
+ for task in prj.tasks:
+ assert task.date_start == res[task.id][0], "task start date differs, expected %s, got %s"%(res[task.id][0], task.date_start)
+ assert task.date_deadline == res[task.id][1], "task deadline date differs, expected %s, got %s"%(res[task.id][1], task.date_deadline)
\ No newline at end of file
diff --git a/addons/project_timesheet/__openerp__.py b/addons/project_timesheet/__openerp__.py
index f98a796a935..d87bb7eb2fc 100644
--- a/addons/project_timesheet/__openerp__.py
+++ b/addons/project_timesheet/__openerp__.py
@@ -35,6 +35,9 @@
'init_xml': [],
'update_xml': ["process/project_timesheet_process.xml", "report/task_report_view.xml"],
'demo_xml': [],
+ 'test': [
+ 'test/worktask_entry_to_timesheetline_entry.yml',
+ ],
'installable': True,
'active': False,
'certificate': '0075123647453',
diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml
new file mode 100644
index 00000000000..7e275067673
--- /dev/null
+++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml
@@ -0,0 +1,102 @@
+-
+ Create an user 'HR Manager'
+-
+ !record {model: res.users, id: res_users_hrmanager0}:
+ company_id: base.main_company
+ context_lang: en_US
+ login: hr
+ name: HR Manager
+ password: hr
+
+-
+ Create a product with type service used to specifies employees designation
+-
+ !record {model: product.product, id: product_product_hrmanger0}:
+ categ_id: product.product_category_services
+ cost_method: standard
+ mes_type: fixed
+ name: HR Manger
+ procure_method: make_to_stock
+ standard_price: 1.0
+ supply_method: buy
+ type: service
+ uom_id: product.product_uom_unit
+ uom_po_id: product.product_uom_unit
+ volume: 0.0
+ warranty: 0.0
+ weight: 0.0
+ weight_net: 0.0
+
+-
+ Create an analytic journal for employees timesheet
+-
+ !record {model: account.analytic.journal, id: account_analytic_journal_hrtimesheet0}:
+ company_id: base.main_company
+ name: HR Timesheet
+ type: general
+
+-
+ Create an employee 'HR Manager' for user 'HR Manager'
+-
+ !record {model: hr.employee, id: hr_employee_hrmanager0}:
+ name: HR Manager
+ user_id: res_users_hrmanager0
+ product_id: product_product_hrmanger0
+ journal_id: account_analytic_journal_hrtimesheet0
+
+-
+ Create a timesheet sheet for hr manager
+-
+ !record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_sheetforhrmanager0}:
+ date_current: '2010-06-03'
+ date_from: '2010-06-01'
+ date_to: '2010-06-30'
+ name: Sheet for hr manager
+ state: new
+ user_id: res_users_hrmanager0
+
+-
+ Create a project 'Timesheet Management'
+-
+ !record {model: project.project, id: project_project_timesheetmanagement0}:
+ company_id: base.main_company
+ name: Timesheet Management
+
+
+-
+ Create a task 'Get all timesheet records'
+-
+ !record {model: project.task, id: project_task_getalltimesheetrecords0}:
+ date_start: '2010-06-03 14:54:55'
+ name: Get all timesheet records
+ planned_hours: 20.0
+ project_id: project_project_timesheetmanagement0
+ remaining_hours: 20.0
+ state: draft
+ user_id: res_users_hrmanager0
+
+-
+ Open the task
+-
+ !python {model: project.task}: |
+ self.do_open(cr, uid, [ref("project_task_getalltimesheetrecords0")], {"lang":
+ "en_US", "active_ids": [ref("project_project_timesheetmanagement0")], "tz":
+ False, "active_model": "project.project", "department_id": False, "project_id":
+ False, "active_id": ref("project_project_timesheetmanagement0"), })
+
+-
+ Make a work task entry 'Get work calendar of all employees' of 10 hours done by hr manager
+-
+ !record {model: project.task, id: project_task_getalltimesheetrecords0}:
+ work_ids:
+ - date: '2010-06-03 15:04:47'
+ hours: 10.0
+ hr_analytic_timesheet_id: 3L
+ name: Get work calendar of all employees
+ user_id: res_users_hrmanager0
+
+-
+ Check for timesheet_ids in hr manager's timesheet
+-
+ !assert {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_sheetforhrmanager0, string: After hr manager's work task, length of timesheet line of current timesheet must be greater then 1}:
+ - len(timesheet_ids) > 0
\ No newline at end of file