[MERGE] pap work for project and its related modules yaml
bzr revid: mra@mra-laptop-20100608121140-5hqn9mpupbjy6qh2
This commit is contained in:
commit
b567404c6c
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
@ -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',
|
||||
|
|
|
@ -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")
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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'
|
|
@ -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" ,
|
||||
|
|
|
@ -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")
|
|
@ -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")
|
||||
|
||||
|
|
@ -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")
|
|
@ -8,22 +8,22 @@
|
|||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Compute Scheduling of Phases">
|
||||
<group height="170" width="500">
|
||||
<group colspan="4" col="4">
|
||||
<label colspan="4" string="This wizard will schedule phases for all or specified project" />
|
||||
<newline />
|
||||
<field name="target_project" colspan="4"/>
|
||||
</group>
|
||||
<newline />
|
||||
<group colspan="4" col="6" attrs="{'invisible':[('target_project','=','all')]}">
|
||||
<field name="project_id"/>
|
||||
</group>
|
||||
<separator colspan="4"/>
|
||||
<group colspan="4" col="6"> <!-- Improve me -->
|
||||
<button icon="gtk-cancel" special="cancel" string="_Cancel"/>
|
||||
<button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/>
|
||||
</group>
|
||||
</group>
|
||||
<group width="380" height="180">
|
||||
<group colspan="4" col="4">
|
||||
<label colspan="4" string="This wizard will schedule phases for all or specified project" />
|
||||
<newline />
|
||||
<field name="target_project" colspan="4"/>
|
||||
</group>
|
||||
<newline />
|
||||
<group colspan="4" col="6" attrs="{'invisible':[('target_project','=','all')]}">
|
||||
<field name="project_id"/>
|
||||
</group>
|
||||
<separator colspan="4"/>
|
||||
<group colspan="4" col="6"> <!-- Improve me -->
|
||||
<button icon="gtk-cancel" special="cancel" string="_Cancel"/>
|
||||
<button icon="gtk-ok" name="check_selection" string="_Compute" type="object"/>
|
||||
</group>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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"
|
|
@ -32,6 +32,9 @@
|
|||
'init_xml': [],
|
||||
'update_xml': [],
|
||||
'demo_xml': [],
|
||||
'test' : [
|
||||
'test/deadline_change.yml'
|
||||
],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0057235475485',
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
|
@ -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',
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue