[MERGE] project_long_term: improve test coverage

bzr revid: rco@openerp.com-20111212092956-zc34lg2ue6yf0pwc
This commit is contained in:
Raphael Collet 2011-12-12 10:29:56 +01:00
commit d9bbf2f390
11 changed files with 88 additions and 1113 deletions

View File

@ -43,14 +43,7 @@ Features
"init_xml": [],
"demo_xml": ["project_long_term_demo.xml"],
"test": [
'test/test_schedule_phases_case1.yml',
'test/schedule_project_phases.yml',
'test/schedule_project_tasks.yml',
'test/test_schedule_phases_case2.yml',
'test/project_schedule_consecutive_day.yml',
'test/project_schedule_without_wroking_hour.yml',
'test/phase_constraint.yml',
'test/test_schedule_tasks_case1.yml',
'test/phase_process.yml',
],
"update_xml": [
"security/ir.model.access.csv",

View File

@ -5,6 +5,10 @@
This Demo data file Human Resources, Phases and Resources,Tasks allocation and also run scheduling of phase and tasks.
-->
<record id="project.project_integrate_openerp" model="project.project">
<field name="resource_calendar_id" ref="resource.timesheet_group1"/>
</record>
<!-- Project Phases -->
<record id="project_phase_1" model="project.phase">
@ -13,6 +17,7 @@
<field name="product_uom" ref="product.uom_day"/>
<field eval="1" name="sequence"/>
<field name="duration">30</field>
<field name="constraint_date_start" eval="time.strftime('%Y-%m-01 10:00:00')"></field>
<field name="project_id" ref="project.project_integrate_openerp"/>
</record>
@ -37,9 +42,9 @@
<field name="project_id" ref="project.project_integrate_openerp"/>
</record>
<function model="project.phase" name="set_open" eval="[ref('project_phase_3')]"/>
<record id="project_phase_4" model="project.phase">
<field eval="[(6, 0, [ref('project_phase_2')])]" name="previous_phase_ids"/>
<field eval="[(6, 0, [ref('project_phase_3')])]" name="previous_phase_ids"/>
<field name="name">Development and Integration</field>
<field name="product_uom" ref="product.uom_day"/>
<field eval="4" name="sequence"/>
@ -60,7 +65,7 @@
<field eval="[(6, 0, [ref('project_phase_5')])]" name="previous_phase_ids"/>
<field name="name">Deployement and Training</field>
<field name="product_uom" ref="product.uom_day"/>
<field eval="5" name="sequence"/>
<field eval="6" name="sequence"/>
<field name="duration">10</field>
<field name="project_id" ref="project.project_integrate_openerp"/>
</record>

View File

@ -1,118 +0,0 @@
-
Given that I have a project 'Test Phases'.
-
!record {model: project.project, id: project_project_developyamlproject0}:
name: "Develop Yaml Project Module"
date_start: !eval time.strftime('%Y-%m-%d')
resource_calendar_id: resource.timesheet_group1
members:
- base.user_admin
-
And I create three human ressources to work on this project, an analyst.
-
!record {model: resource.resource, id: resource_resource_analyst1}:
calendar_id: resource.timesheet_group1
name: Analyst
resource_type: user
time_efficiency: 1.0
user_id: base.user_admin
-
I define a developer HR.
-
!record {model: resource.resource, id: resource_resource_develop0}:
calendar_id: resource.timesheet_group1
name: Developer
resource_type: user
time_efficiency: 1.0
user_id: base.user_admin
-
I define a tester HR.
-
!record {model: resource.resource, id: resource_resource_tester1}:
calendar_id: resource.timesheet_group1
name: tester
resource_type: user
time_efficiency: 1.0
user_id: base.user_admin
-
Then I create three phases for my projects; Analysis, Development, Testing.
-
The first phase is 'Analysis' and has a duration of 6 days.
-
!record {model: project.phase, id: project_phase_analysisflowforyaml0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 6.0
name: "Analysis"
product_uom: product.uom_day
project_id: project_project_developyamlproject0
state: draft
-
I update the constrain and the analysis phase to not start before 4 days.
-
!python {model : project.phase }: |
pass
import datetime
from dateutil.relativedelta import *
start = datetime.date.today() + relativedelta(days=4)
self.write(cr,uid, [(ref("project_phase_analysisflowforyaml0"))], {'constraint_date_start': start})
-
The second phase is 'Development' and depend on the 'Analysis', with a duration of 6 days.
-
!record {model: project.phase, id: project_phase_developyaml0}:
duration: 6.0
name: Development
product_uom: product.uom_day
project_id: project_project_developyamlproject0
previous_phase_ids:
- project_phase_analysisflowforyaml0
-
I update the Constrain Date Start adn Date End for phase Develop yaml
-
!python {model : project.phase }: |
pass
import datetime
#from dateutil.relativedelta import *
#start = datetime.date.today() - relativedelta(days=5)
#end = datetime.date.today() + relativedelta(days=10)
#self.write(cr,uid, [(ref("project_phase_developyaml0"))], {'constraint_date_start': start, 'constraint_date_end':end})
-
The third phase is 'Testing' and depend on the 'Develop' phase, with a duration of 6 days.
-
!record {model: project.phase, id: project_phase_testyaml0}:
duration: 6.0
name: Testing
product_uom: product.uom_day
project_id: project_project_developyamlproject0
previous_phase_ids:
- project_phase_developyaml0
-
Then I launch the scheduler to compute starting and ending phases on all phases of this project.
-
!record {model: project.compute.phases, id: project_compute_phases_0}:
project_id: project_project_developyamlproject0
target_project: one
-
!python {model: project.project}: |
self.schedule_phases(cr, uid, [ref("project_project_developyamlproject0")])
-
After scheduling, I check the starting date and ending date on the phases are correct.
-
!python {model: project.phase}: |
import datetime
from dateutil.relativedelta import *
minstart = (datetime.date.today() + relativedelta(days=4)).strftime('%Y-%m-%d')
minend = (datetime.date.today() + relativedelta(days=11)).strftime('%Y-%m-%d')
phase1=self.browse(cr, uid, ref('project_phase_analysisflowforyaml0'))
assert phase1.date_start>=minstart, 'Error, the Analysis phase '+phase1.date_start+' should start after '+str(minstart)
assert phase1.date_end>=minend, 'Error, the Analysis phase should end after '+str(minend)
phase2=self.browse(cr, uid, ref('project_phase_developyaml0'))
assert phase2.date_start>=phase1.date_end, 'Error, the phase Development should start after the end of the Analysis phase'
phase3=self.browse(cr, uid, ref('project_phase_testyaml0'))
assert phase3.date_start>=phase2.date_end, 'Error, the phase Testing should start after the end of the Development phase'
assert phase3.date_start<phase3.date_end, 'Error, the phase Testing should start before ending'

View File

@ -0,0 +1,79 @@
-
In order to test process of Phases,
-
I create a record to schedule the phase of project.
-
!record {model: project.compute.phases, id: project_compute_phases01}:
target_project: 'one'
project_id: project.project_integrate_openerp
-
I schedule the phases.
-
!python {model: project.compute.phases}: |
self.check_selection(cr, uid, [ref("project_compute_phases01")])
-
I check the starting date and ending date on the phases after scheduling.
-
!python {model: project.project}: |
project = self.browse(cr, uid, ref("project.project_integrate_openerp"), context=context)
def _convert(date):
import time
return time.strptime(date, '%Y-%m-%d %H:%M:%S')
def _check(phase, _convert, _check): #TOFIX: why need to pass function ?
for next_phase in phase.next_phase_ids:
assert _convert(next_phase.date_start) >= _convert(phase.date_end), "Phase does not start in proper date."
_check(next_phase, _convert, _check)
return True
for phase in project.phase_ids:
assert phase.date_start, "Start date should be computed."
assert phase.date_end, "End date should be computed."
if not phase.previous_phase_ids and phase.constraint_date_start:
assert _convert(phase.date_start) >= _convert(phase.constraint_date_start), "Phase does not start in proper date."
_check(phase, _convert, _check)
-
I open phase.
-
!python {model: project.phase}: |
self.set_open(cr, uid, [ref("project_phase_1")])
-
I check state of phase after opened.
-
!assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in open state}:
- state == "open"
-
I put phase in pending state.
-
!python {model: project.phase}: |
self.set_pending(cr, uid, [ref("project_phase_1")])
-
I check state of phase after put in pending.
-
!assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in pending state}:
- state == "pending"
-
I make Phase in cancel state.
-
!python {model: project.phase}: |
self.set_cancel(cr, uid, [ref("project_phase_1")])
-
I check state of phase after cancelled.
-
!assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in cancel state}:
- state == "cancelled"
-
I put again in draft phase.
-
!python {model: project.phase}: |
self.set_draft(cr, uid, [ref("project_phase_1")])
-
I close phase.
-
!python {model: project.phase}: |
self.set_done(cr, uid, [ref("project_phase_1")])
-
I check state of phase after closed.
-
!assert {model: project.phase, id: project_phase_1, severity: error, string: Phase should be in done state}:
- state == "done"

View File

@ -1,127 +0,0 @@
-
Create a project 'Develop yaml Project Module'.
-
!record {model: project.project, id: project_project_developyamlproject_2}:
name: "Develop Yaml Project Module"
date_start: !eval time.strftime('%Y-%m-%d')
members:
- base.user_admin
-
I have set Working Time from Monday to Friday from 9am to 17pm.
-
!record {model: resource.calendar, id: resource_calendar_hoursweekstest_P2}:
name: "from Monday to Friday, from 9am to 17pm"
-
I have set Day1 Working Time for Monday to Friday from 9am to 17pm working hour
-
!record {model: resource.calendar.attendance, id: resource_calendar_hoursweekstest_P2day1}:
name: "Day1"
hour_from : 09.00
hour_to : 17.00
dayofweek : "0"
calendar_id : resource_calendar_hoursweekstest_P2
-
I have set Day2 Working Time for Monday to Friday from 9am to 17pm working hour
-
!record {model: resource.calendar.attendance, id: rresource_calendar_hoursweekstest_P2day2}:
name: "Day2"
hour_from : 09.00
hour_to : 17.00
dayofweek : "1"
calendar_id : resource_calendar_hoursweekstest_P2
-
I have set Day3 Working Time for Monday to Friday from 9am to 17pm working hour
-
!record {model: resource.calendar.attendance, id: resource_calendar_hoursweekstest_P2day3}:
name: "Day3"
hour_from : 09.00
hour_to : 17.00
dayofweek : "2"
calendar_id : resource_calendar_hoursweekstest_P2
-
I have set Day4 Working Time for Monday to Friday from 9am to 17pm working hour
-
!record {model: resource.calendar.attendance, id: resource_calendar_hoursweekstest_P2day4}:
name: "Day4"
hour_from: 09.00
hour_to: 17.00
dayofweek: "3"
calendar_id: resource_calendar_hoursweekstest_P2
-
I have set Day5 Working Time for Monday to Friday from 9am to 17pm working hour
-
!record {model: resource.calendar.attendance, id: resource_calendar_hoursweekstest_P2day5}:
name: "Day5"
hour_from: 09.00
hour_to: 17.00
dayofweek: "4"
calendar_id: resource_calendar_hoursweekstest_P2
-
Now Set working period to Project 'Develop yaml Project Module'
-
!python {model: project.project}: |
self.write(cr, uid, [ref("project_project_developyamlproject_2")], {'resource_calendar_id': ref("resource_calendar_hoursweekstest_P2")})
-
Create 3 a project phase.
First 'Analysis Flow for Yaml'Project Phase
-
!record {model: project.phase, id: project_project_developyamlproject_2_Phase1}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 5.0
name: "Analysis Flow for Yaml"
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
state: draft
-
Create project phase 'Develop yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_Phase2}:
duration: 5.0
name: Develop Yaml
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
previous_phase_ids:
- project_project_developyamlproject_2_Phase1
-
Create project phase 'Test Yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_Phase3}:
duration: 5.0
name: Testing Yaml
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
previous_phase_ids:
- project_project_developyamlproject_2_Phase2
-
Compute Schedule of phases For One project
-
!record {model: project.compute.phases, id: project_compute_phases_0}:
project_id: project_project_developyamlproject_2
target_project: one
-
Schedule project phases using Compute Phase Scheduling
-
!python {model: project.project}: |
self.schedule_phases(cr, uid, [ref("project_project_developyamlproject_2")])
-
After scheduling, Check that phases scheduled, check that either of phase's start_date, end_date not null.
-
!python {model: project.project}: |
proj=self.browse(cr, uid, [ref("project_project_developyamlproject_2")])[0]
for phase in proj.phase_ids:
if (not phase.date_start) or (not phase.date_end):
raise AssertionError("Phases not scheduled")

View File

@ -1,76 +0,0 @@
-
Create a project 'Develop yaml Implementation Module'.
-
!record {model: project.project, id: project_project_developyamlproject_2}:
name: "Develop Yaml Project Module"
date_start: !eval time.strftime('%Y-%m-%d')
-
Create 4 Project phase.
First Project Phase 'Analysis Flow for Yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_phase_1}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 6.0
product_uom: product.uom_day
name: "Analysis Flow for Yaml"
project_id: project_project_developyamlproject_2
state: draft
-
Create project phase 'Develop yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_phase_2}:
duration: 6.0
name: "Develop yaml"
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
previous_phase_ids:
- project_project_developyamlproject_2_phase_1
state: draft
-
Create project phase 'Test Yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_phase_3}:
duration: 6.0
name: Testing Yaml
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
previous_phase_ids:
- project_project_developyamlproject_2_phase_2
state: draft
-
Create project phase 'Implement Yaml'
-
!record {model: project.phase, id: project_project_developyamlproject_2_phase_4}:
duration: 6.0
name: Testing Yaml
product_uom: product.uom_day
project_id: project_project_developyamlproject_2
previous_phase_ids:
- project_project_developyamlproject_2_phase_3
state: draft
-
Compute Schedule of phases For One project
-
!record {model: project.compute.phases, id: project_compute_phases_0}:
project_id: project_project_developyamlproject_2
target_project: one
-
Schedule project phases using Compute Phase Scheduling
-
!python {model: project.project}: |
self.schedule_phases(cr, uid, [ref("project_project_developyamlproject_2")])
-
After scheduling, Check that phases scheduled, check that either of phase's start_date, end_date not null.
-
!python {model: project.project}: |
proj=self.browse(cr, uid, [ref("project_project_developyamlproject_2")])[0]
for phase in proj.phase_ids:
if (not phase.date_start) or (not phase.date_end):
raise AssertionError("Phases not scheduled")

View File

@ -1,180 +0,0 @@
-
Create a project 'World Bank's Project'
-
!record {model: project.project, id: project_project_worldbanksproject0}:
name: "World Bank's Project"
priority: 4
members:
- project.res_users_analyst
- project.res_users_project_manager
- project.res_users_technical_leader
- project.res_users_developer
- project.res_users_designer
- project.res_users_tester
-
Create a project phase 'Defining Client's Basic Idea of Project'
-
!record {model: project.phase, id: project_phase_definingclientsbasicideaofproject0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 15.0
name: "Defining Client's Basic Idea of Project"
product_uom: product.uom_day
project_id: project_project_worldbanksproject0
-
Create project phase 'Establishing Project Feasibility'
-
!record {model: project.phase, id: project_phase_establishingprojectfeasibility0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 30.0
name: Establishing Project Feasibility
product_uom: product.uom_day
project_id: project_project_worldbanksproject0
-
Create the phase task 'Develop GUI for Server Configuration'
-
!record {model: project.task, id: project_task_t0}:
name: Develop GUI for Server Configuration
planned_hours: 20.0
state: draft
phase_id: project_phase_definingclientsbasicideaofproject0
project_id: project_project_worldbanksproject0
-
Create the phase task 'Develop GUI for Modules Configuration'
-
!record {model: project.task, id: project_task_t1}:
name: Develop GUI for Modules Configuration
planned_hours: 25.0
remaining_hours: 25.0
state: draft
phase_id: project_phase_definingclientsbasicideaofproject0
project_id: project_project_worldbanksproject0
-
Create project phase 'Preparation of Engineering Designs'
-
!record {model: project.phase, id: project_phase_preparationofengineeringdesigns0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 100.0
name: Preparation of Engineering Designs
product_uom: product.uom_hour
project_id: project_project_worldbanksproject0
-
Create the phase task 'Develop GUI for Client Configuration'
-
!record {model: project.task, id: project_task_t2}:
name: Develop GUI for Server Configuration
planned_hours: 20.0
remaining_hours: 20.0
state: draft
phase_id: project_phase_preparationofengineeringdesigns0
project_id: project_project_worldbanksproject0
-
Create the phase task 'Develop GUI for Client Module Configuration'
-
!record {model: project.task, id: project_task_t3}:
name: Develop GUI for Modules Configuration
planned_hours: 25.0
remaining_hours: 25.0
state: draft
phase_id: project_phase_preparationofengineeringdesigns0
project_id: project_project_worldbanksproject0
-
Create project phase 'Procurement of Works and Goods'
-
!record {model: project.phase, id: project_phase_procurementofworksandgoods0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 24.0
name: Procurement of Works and Goods
product_uom: product.uom_hour
project_id: project_project_worldbanksproject0
-
Create project phase 'Project Construction'
-
!record {model: project.phase, id: project_phase_projectconstruction0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 4320.0
name: Project Construction
product_uom: product.uom_hour
project_id: project_project_worldbanksproject0
-
Create project phase 'Project Completion'
-
!record {model: project.phase, id: project_phase_projectcompletion0}:
date_start: !eval time.strftime('%Y-%m-%d')
duration: 240.0
name: Project Completion
product_uom: product.uom_hour
project_id: project_project_worldbanksproject0
-
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.project}: |
self.schedule_phases(cr, uid, ref("project_project_worldbanksproject0"))
-
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 phase in prj.phase_ids:
if (not phase.date_start) or (not phase.date_end):
raise AssertionError("Tasks not scheduled")

View File

@ -1,86 +0,0 @@
-
Create project 'Develop a thunderbird-openerp synchronization plugin'
-
!record {model: project.project, id: project_project_project1}:
name: Develop a thunderbird-openerp synchronization plugin
members:
- project.res_users_project_manager
- project.res_users_technical_leader
- project.res_users_developer
- project.res_users_designer
- project.res_users_tester
- project.res_users_analyst
- project.res_users_finacial_manager
-
Create phase 'Develop GUI' in thunderbird
-
!record {model: project.phase, id: project_phase_phase1}:
date_start: !eval time.strftime('%Y-%m-%d %H:%M:%S')
duration: 200.0
name: Develop GUI in thunderbird
product_uom: product.uom_day
project_id: project_project_project1
state: draft
-
Create the phase task 'Develop GUI for Server Configuration'
-
!record {model: project.task, id: project_task_t10}:
name: Develop GUI for Server Configuration
planned_hours: 20.0
remaining_hours: 20.0
state: draft
phase_id: project_phase_phase1
project_id: project_project_project1
user_id: project.res_users_developer
-
Create the phase task 'Develop GUI for Modules Configuration'
-
!record {model: project.task, id: project_task_t11}:
name: Develop GUI for Modules Configuration
planned_hours: 25.0
remaining_hours: 25.0
state: draft
phase_id: project_phase_phase1
project_id: project_project_project1
user_id: project.res_users_developer
-
Create the phase task 'Develop GUI for OpenERP Synchronisation'
-
!record {model: project.task, id: project_task_t12}:
name: Develop GUI for OpenERP Synchronisation
planned_hours: 30.0
remaining_hours: 30.0
state: draft
phase_id: project_phase_phase1
project_id: project_project_project1
user_id: project.res_users_developer
-
Create the phase task 'Design required GUI/Menus'
-
!record {model: project.task, id: project_task_13}:
name: Design required GUI/Menus
planned_hours: 25.0
remaining_hours: 25.0
state: draft
phase_id: project_phase_phase1
project_id: project_project_project1
user_id: project.res_users_designer
-
Schedule tasks
-
!python {model: project.project}: |
self.schedule_tasks(cr, uid, ref("project_project_project1"))
-
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 task.state in ('done','cancelled'):
continue
if (not task.user_id) or (not task.date_start) or (not task.date_end):
raise AssertionError("Project tasks not scheduled!")

View File

@ -1,76 +0,0 @@
-
In order to test scheduling of project phases, I create two different phases and
test it with two different dates for scheduling.
-
I create a project Development and Testing.
-
!record {model: project.project, id: project_project_project_case1}:
name: "Development and Testing"
date_start: !eval time.strftime('%Y-%m-%d')
balance: 0.0
credit: 0.0
currency_id: base.EUR
debit: 0.0
effective_hours: 0.0
members:
- base.user_admin
planned_hours: 0.0
progress_rate: 0.0
quantity: 0.0
quantity_max: 0.0
state: open
type_ids:
- project.project_tt_specification
- project.project_tt_development
- project.project_tt_testing
- project.project_tt_merge
-
I create first phase of the project.
-
!record {model: project.phase, id: project_phase_firstphase0_case1}:
duration: 2.0
name: First Phase
product_uom: product.uom_day
project_id: project_project_project_case1
state: draft
-
I create second phase of the project.
-
!record {model: project.phase, id: project_phase_secondphase0_case2}:
duration: 3.0
name: Second Phase
previous_phase_ids:
- project_phase_firstphase0_case1
product_uom: product.uom_day
project_id: project_project_project_case1
state: draft
-
Now I create a record to compute the phase of project.
-
!record {model: project.compute.phases, id: project_compute_phases0}:
target_project: 'one'
project_id: project_project_project_case1
-
I schedule the phases.
-
!python {model: project.compute.phases}: |
self.check_selection(cr, uid, [ref("project_compute_phases0")])
-
I check the starting and ending dates of both phases.
-
!python {model: project.phase}: |
import datetime
from dateutil.relativedelta import *
start = (datetime.date.today()).strftime('%Y-%m-%d')
end = (datetime.date.today() + relativedelta(days=1)).strftime('%Y-%m-%d 17:00:00')
first_phase = self.browse(cr, uid, ref('project_phase_firstphase0_case1'))
assert (first_phase.date_start[:10] >= start),'Start dates are wrong: %s < %s !' % (first_phase.date_start[:10], start)
assert (first_phase.date_end >= end),'End dates are wrong: %s <%s!' % (first_phase.date_end, end)
second_phase = self.browse(cr, uid, ref('project_phase_secondphase0_case2'))
start = first_phase.date_end
end = (datetime.date.today() + relativedelta(days=4)).strftime('%Y-%m-%d')
assert second_phase.date_start >= start, 'Dates are wrong on second phase: %s < %s!' % (second_phase.date_start, start)
assert second_phase.date_end >= end, 'Dates are wrong on second phase %s < %s!' % (second_phase.date_end, end)

View File

@ -1,193 +0,0 @@
-
In order to test scheduling of project phases, I create two different
working periods and resources. And schedule the phases.
-
I create first working period 'Working Time A'.
-
!record {model: resource.calendar, id: resource_calendar_workingtimea0}:
attendance_ids:
- dayofweek: '0'
hour_from: 10.0
hour_to: 16.0
name: Monday
- dayofweek: '1'
hour_from: 10.0
hour_to: 16.0
name: Tuesday
- dayofweek: '2'
hour_from: 10.0
hour_to: 16.0
name: Wednesday
- dayofweek: '3'
hour_from: 10.0
hour_to: 16.0
name: Thursday
name: Working Time A
-
Creating a resource.calendar.attendance record
-
!record {model: resource.calendar.attendance, id: resource_calendar_attendance_monday0}:
calendar_id: resource_calendar_workingtimea0
dayofweek: '0'
hour_from: 10.0
hour_to: 16.0
name: Monday
-
Creating a resource.calendar.attendance record
-
!record {model: resource.calendar.attendance, id: resource_calendar_attendance_tuesday0}:
calendar_id: resource_calendar_workingtimea0
dayofweek: '1'
hour_from: 10.0
hour_to: 16.0
name: Tuesday
-
Creating a resource.calendar.attendance record
-
!record {model: resource.calendar.attendance, id: resource_calendar_attendance_wednesday0}:
calendar_id: resource_calendar_workingtimea0
dayofweek: '2'
hour_from: 10.0
hour_to: 16.0
name: Wednesday
-
Creating a resource.calendar.attendance record
-
!record {model: resource.calendar.attendance, id: resource_calendar_attendance_thursday0}:
calendar_id: resource_calendar_workingtimea0
dayofweek: '3'
hour_from: 10.0
hour_to: 16.0
name: Thursday
-
I create second working period 'Working Time B'.
-
!record {model: resource.calendar, id: resource_calendar_workingtimeb0}:
attendance_ids:
- dayofweek: '4'
hour_from: 9.0
hour_to: 18.0
name: Friday
name: Working Time B
-
Creating a resource.calendar.attendance record
-
!record {model: resource.calendar.attendance, id: resource_calendar_attendance_friday0}:
calendar_id: resource_calendar_workingtimeb0
dayofweek: '4'
hour_from: 9.0
hour_to: 18.0
name: Friday
-
I create first resource say 'Resource X' without assigning working period.
-
!record {model: resource.resource, id: resource_resource_resourcex0}:
name: Resource X
resource_type: user
time_efficiency: 1.0
user_id: base.user_admin
-
I create first resource say 'Resource Y' with working period 'Working Time B'.
-
!record {model: resource.resource, id: resource_resource_resourcey0}:
calendar_id: resource_calendar_workingtimeb0
name: Resource Y
resource_type: user
time_efficiency: 1.0
user_id: base.user_admin
-
I create a project 'Development and Testing' and assign working period 'Working Time A'.
-
!record {model: project.project, id: project_project_project0}:
balance: 0.0
credit: 0.0
currency_id: base.EUR
debit: 0.0
effective_hours: 0.0
members:
- base.user_admin
name: Development and Testing
planned_hours: 20.0
progress_rate: 0.0
quantity: 0.0
quantity_max: 0.0
resource_calendar_id: resource_calendar_workingtimea0
state: open
tasks:
- delay_hours: 0.0
effective_hours: 0.0
name: Task 1
planned_hours: 10.0
remaining_hours: 10.0
state: draft
total_hours: 10.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task 2
planned_hours: 10.0
remaining_hours: 10.0
state: draft
total_hours: 10.0
total_hours: 10.0
members:
- project.res_users_analyst
- project.res_users_project_manager
- project.res_users_technical_leader
- project.res_users_developer
- project.res_users_designer
- project.res_users_tester
type_ids:
- project.project_tt_specification
- project.project_tt_development
- project.project_tt_testing
- project.project_tt_merge
-
I create a phase 'Initial Phase' for project 'Development and Testing'.
-
!record {model: project.phase, id: project_phase_phase0}:
date_start: '2011-01-03 08:00:00'
duration: 0.0
name: Initial Phase
product_uom: product.uom_day
project_id: project_project_project0
state: draft
-
I create first task 'Developing module' and assign 10h.
-
!record {model: project.task, id: project_task_task0}:
delay_hours: 0.0
effective_hours: 0.0
name: Developing module
planned_hours: 10.0
project_id: project_project_project0
remaining_hours: 10.0
state: draft
total_hours: 10.0
phase_id: project_phase_phase0
-
I create first task 'Testing module' and assign 10h.
-
!record {model: project.task, id: project_task_task1}:
delay_hours: 0.0
effective_hours: 0.0
name: Testing module
planned_hours: 10.0
project_id: project_project_project0
remaining_hours: 10.0
state: draft
total_hours: 10.0
phase_id: project_phase_phase0
-
Now I create a record to compute the phase of project.
-
!record {model: project.compute.phases, id: project_compute_phases0}:
target_project: 'one'
project_id: project_project_project0
-
I schedule the phases.
-
!python {model: project.compute.phases}: |
self.check_selection(cr, uid, [ref("project_compute_phases0")])

View File

@ -1,246 +0,0 @@
-
In order to test scheduling of tasks, I create four tasks with different sequences and schedule them.
-
I create first user.
-
!record {model: res.users, id: res_users_user0}:
company_id: base.main_company
context_lang: en_US
groups_id:
- base.group_partner_manager
- base.group_user
login: user1
name: User 1
password: user1
-
I create second user.
-
!record {model: res.users, id: res_users_user1}:
company_id: base.main_company
context_lang: en_US
groups_id:
- base.group_partner_manager
- base.group_user
login: user2
name: User 2
password: user2
-
I create a Project.
-
!record {model: project.project, id: project_project_projecta0}:
balance: 0.0
credit: 0.0
currency_id: base.EUR
debit: 0.0
effective_hours: 0.0
name: Project A
members:
- res_users_user0
- res_users_user1
phase_ids:
- date_start: '2011-01-06 08:00:00'
duration: 2.0
name: Phase A
product_uom: product.uom_day
state: draft
task_ids:
- delay_hours: 0.0
effective_hours: 0.0
name: Task D
planned_hours: 5.0
remaining_hours: 5.0
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task C
planned_hours: 5.0
remaining_hours: 5.0
sequence: 11
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task B
planned_hours: 5.0
remaining_hours: 5.0
sequence: 13
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task A
planned_hours: 5.0
remaining_hours: 5.0
sequence: 14
state: draft
total_hours: 5.0
planned_hours: 20.0
progress_rate: 0.0
quantity: 0.0
quantity_max: 0.0
state: open
tasks:
- delay_hours: 0.0
effective_hours: 0.0
name: Task D
planned_hours: 5.0
remaining_hours: 5.0
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task C
planned_hours: 5.0
remaining_hours: 5.0
sequence: 11
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task B
planned_hours: 5.0
remaining_hours: 5.0
sequence: 13
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task A
planned_hours: 5.0
remaining_hours: 5.0
sequence: 14
state: draft
total_hours: 5.0
total_hours: 15.0
-
I create first task with highest sequence.
-
!record {model: project.task, id: project_task_taska0}:
delay_hours: 0.0
effective_hours: 0.0
name: Task A
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 14
state: draft
total_hours: 5.0
-
I create second task.
-
!record {model: project.task, id: project_task_taskb0}:
delay_hours: 0.0
effective_hours: 0.0
name: Task B
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 13
state: draft
total_hours: 5.0
-
I create third task.
-
!record {model: project.task, id: project_task_taskc0}:
delay_hours: 0.0
effective_hours: 0.0
name: Task C
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 11
state: draft
total_hours: 5.0
-
I create fourth task with lowest sequence.
-
!record {model: project.task, id: project_task_taskd0}:
delay_hours: 0.0
effective_hours: 0.0
name: Task D
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
state: draft
total_hours: 5.0
-
Now I create a resource for first user.
-
!record {model: resource.resource, id: resource_resource_user0}:
name: User 1
resource_type: user
time_efficiency: 1.0
user_id: res_users_user0
-
I create a resource for second user.
-
!record {model: resource.resource, id: resource_resource_user1}:
name: User 2
resource_type: user
time_efficiency: 1.0
user_id: res_users_user1
-
Now I create one phase for the project.
-
!record {model: project.phase, id: project_phase_phasea0}:
date_start: '2011-01-06 08:00:00'
duration: 2.0
name: Phase A
product_uom: product.uom_day
project_id: project_project_projecta0
state: draft
task_ids:
- delay_hours: 0.0
effective_hours: 0.0
name: Task D
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task C
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 11
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task B
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 13
state: draft
total_hours: 5.0
- delay_hours: 0.0
effective_hours: 0.0
name: Task A
planned_hours: 5.0
project_id: project_project_projecta0
remaining_hours: 5.0
sequence: 14
state: draft
total_hours: 5.0
-
Now I create a record to schedule the tasks of project.
-
!record {model: project.compute.tasks, id: project_compute_tasks0}:
project_id: project_project_projecta0
-
I schedule the tasks.
-
!python {model: project.compute.tasks}: |
self.compute_date(cr, uid, [ref("project_compute_tasks0")])
-
I check that whether the tasks now allocated to respected resources or not.
-
!python {model: project.task}: |
task_ids = self.search(cr, uid, [('project_id','=',ref('project_project_projecta0'))])
for task in self.browse(cr, uid, task_ids):
if (not task.date_start) or (not task.date_end):
raise AssertionError("Tasks are not scheduled.")