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
- - - - - - - - - -