diff options
Diffstat (limited to 'addons/project_long_term')
12 files changed, 401 insertions, 34 deletions
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/project_long_term.py b/addons/project_long_term/project_long_term.py index 57fbd1abb5f..f1c40a4c8ba 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -45,7 +45,7 @@ class project_phase(osv.osv): next_ids = [rec.id for rec in next_ids] # iter prev_ids while prev_ids: - cr.execute('select distinct prv_phase_id from project_phase_rel where next_phase_id in ('+','.join(map(str, prev_ids))+')') + cr.execute('select distinct prv_phase_id from project_phase_rel where next_phase_id IN %s',(tuple(prev_ids),)) prv_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall())) if data_phase.id in prv_phase_ids: return False @@ -55,7 +55,7 @@ class project_phase(osv.osv): prev_ids = prv_phase_ids # iter next_ids while next_ids: - cr.execute('select distinct next_phase_id from project_phase_rel where prv_phase_id in ('+','.join(map(str, next_ids))+')') + cr.execute('select distinct next_phase_id from project_phase_rel where prv_phase_id IN %s',(tuple(next_ids),)) next_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall())) if data_phase.id in next_phase_ids: return False diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml index cafaefa9633..478fbd19785 100644 --- a/addons/project_long_term/project_long_term_view.xml +++ b/addons/project_long_term/project_long_term_view.xml @@ -2,7 +2,7 @@ <openerp> <data> - <menuitem id="menu_project_long_term" name="Long Term Planning" parent="base.menu_main_pm" sequence="1"/> + <menuitem id="base.menu_project_long_term" name="Long Term Planning" parent="base.menu_main_pm" sequence="1"/> # ------------------------------------------------------ # Project Resource Allocation @@ -248,6 +248,16 @@ <field name="search_view_id" ref="view_project_phase_search"/> </record> + <record id="act_project_phase_list" model="ir.actions.act_window"> + <field name="name">Project Phases</field> + <field name="res_model">project.phase</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form,calendar</field> + <field name="context">{'search_default_responsible_id':uid}</field> + <field name="search_view_id" ref="view_project_phase_search"/> + </record> + + # ------------------------------------------------------ # Project # ------------------------------------------------------ @@ -292,18 +302,18 @@ <menuitem action="act_project_phase" groups="base.group_extended" - id="menu_project_phase" parent="menu_project_long_term" sequence="4"/> + id="menu_project_phase" parent="base.menu_project_long_term" sequence="1"/> <menuitem id="menu_resouce_allocation" action="act_resouce_allocation" - name="Resource Allocations" parent="menu_project_long_term" /> + name="Resource Allocations" parent="base.menu_project_long_term" sequence="2"/> - <!--<menuitem icon="terp-project" id="base.menu_main_pm" name="Project Management" sequence="1"/>--> + <!--<menuitem icon="terp-project" id="base.menu_main_pm" name="Project" sequence="10"/>--> <menuitem id="menu_pm_resources_project1" groups="base.group_extended" - name="Resources" parent="base.menu_main_pm" sequence="2"/> + name="Resources" parent="project.menu_definitions" sequence="3"/> - <menuitem id="menu_phase_schedule" name="Scheduling" parent="menu_project_long_term"/> - <menuitem action="resource.action_resource_resource_tree" id="menu_view_resource" parent="menu_pm_resources_project1" sequence="1"/> + <menuitem id="menu_phase_schedule" name="Scheduling" parent="base.menu_project_long_term" sequence="4"/> + <menuitem action="resource.action_resource_resource_tree" id="menu_view_resource" parent="project.menu_project_management" sequence="4"/> <menuitem action="resource.action_resource_calendar_form" id="menu_view_resource_calendar" parent="menu_pm_resources_project1" sequence="1"/> <menuitem action="resource.action_resource_calendar_leave_tree" id="menu_view_resource_calendar_leaves" parent="menu_pm_resources_project1" sequence="1"/> diff --git a/addons/project_long_term/project_long_term_wizard.xml b/addons/project_long_term/project_long_term_wizard.xml index fa546b9e86f..ea43762653c 100644 --- a/addons/project_long_term/project_long_term_wizard.xml +++ b/addons/project_long_term/project_long_term_wizard.xml @@ -6,7 +6,7 @@ <!--<wizard id="wizard_schedule_task" menu="False" model="project.phase" name="phase.schedule.tasks" string="Schedule Tasks"/>--> <!--<wizard id="wizard_compute_task" model="project.task" menu="False" name="wizard.compute.tasks" string="Compute Task Scheduling"/>--> - <menuitem icon="terp-project" id="base.menu_main" name="Project Management" sequence="1"/> +<!-- <menuitem icon="terp-project" id="base.menu_main" name="Project Management" sequence="1"/>--> <!--<menuitem id="base.menu_pm_planning" name="Planning" parent="base.menu_main" sequence="3"/>--> <!-- <menuitem action="wizard_compute_phase" 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.py b/addons/project_long_term/wizard/project_compute_phases.py index 5353db25be6..ce2e2c0bbb1 100644 --- a/addons/project_long_term/wizard/project_compute_phases.py +++ b/addons/project_long_term/wizard/project_compute_phases.py @@ -165,7 +165,7 @@ class project_compute_phases(osv.osv_memory): context = {} mod_obj = self.pool.get('ir.model.data') act_obj = self.pool.get('ir.actions.act_window') - result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase') + result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase_list') id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id'] result = act_obj.read(cr, uid, [id], context=context)[0] result['domain'] = [('state', 'not in', ['cancelled','done'])] 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 @@ <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> diff --git a/addons/project_long_term/wizard/project_compute_tasks.py b/addons/project_long_term/wizard/project_compute_tasks.py index 0816bf3c3f1..bd569abf90e 100644 --- a/addons/project_long_term/wizard/project_compute_tasks.py +++ b/addons/project_long_term/wizard/project_compute_tasks.py @@ -112,9 +112,9 @@ class project_compute_tasks(osv.osv_memory): if each_task.priority in priority_dict.keys(): priorty = priority_dict[each_task.priority] if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: # check me!! - task = create_tasks(i, hours, priorty, resource) + for resrce in resources: + if resrce.__name__ == each_task.user_id.name: # check me!! + task = create_tasks(i, hours, priorty, resrce) else: task = create_tasks(i, hours, priorty) i += 1 diff --git a/addons/project_long_term/wizard/project_schedule_tasks.py b/addons/project_long_term/wizard/project_schedule_tasks.py index d4d2da82cec..78ad2166698 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks.py +++ b/addons/project_long_term/wizard/project_schedule_tasks.py @@ -131,9 +131,9 @@ class project_schedule_task(osv.osv_memory): if each_task.priority in priority_dict.keys(): priorty = priority_dict[each_task.priority] if each_task.user_id: - for resource in resources: - if resource.__name__ == each_task.user_id.name: - task = create_tasks(i, hours, priorty, resource) + for resrce in resources: + if resrce.__name__ == each_task.user_id.name: + task = create_tasks(i, hours, priorty, resrce) else: task = create_tasks(i, hours, priorty) i += 1 diff --git a/addons/project_long_term/wizard/project_schedule_tasks_view.xml b/addons/project_long_term/wizard/project_schedule_tasks_view.xml index f17d573185d..b62a3c107d9 100644 --- a/addons/project_long_term/wizard/project_schedule_tasks_view.xml +++ b/addons/project_long_term/wizard/project_schedule_tasks_view.xml @@ -8,7 +8,7 @@ <field name="type">form</field> <field name="arch" type="xml"> <form string="Schedule Tasks"> - <group height="90" width="250"> + <group height="90" width="275"> <label string="Task Scheduling completed successfully."/> <group colspan="4" col="6"> <button icon="gtk-ok" colspan="4" special="cancel" string="_Ok"/> |
