diff options
| author | atp (Open ERP) <atp@tinyerp.co.in> | 2010-06-22 10:45:44 +0530 |
|---|---|---|
| committer | atp (Open ERP) <atp@tinyerp.co.in> | 2010-06-22 10:45:44 +0530 |
| commit | b0efd26edd9f4e2aa75424b787ea46d2be15cd04 (patch) | |
| tree | e78cdb693e62a5c9a17f77a395eec51fb34becbf /addons/project | |
| parent | 46bb1ea51be702758d68a5f69db32c82dbccf9bd (diff) | |
| parent | 2319190c5a20cb8095f85cacca89a33164ba93d7 (diff) | |
[MERGE]: merge with lp:~openerp-dev/openobject-addons/trunk-dev-addons2
bzr revid: atp@tinyerp.co.in-20100622051544-c7hig73zk2at66cy
Diffstat (limited to 'addons/project')
| -rw-r--r-- | addons/project/__openerp__.py | 15 | ||||
| -rw-r--r-- | addons/project/board_project_demo.xml | 28 | ||||
| -rw-r--r-- | addons/project/board_project_manager_view.xml | 58 | ||||
| -rw-r--r-- | addons/project/board_project_view.xml | 140 | ||||
| -rw-r--r-- | addons/project/project.py | 9 | ||||
| -rw-r--r-- | addons/project/project_resource.py | 14 | ||||
| -rw-r--r-- | addons/project/project_view.xml | 9 | ||||
| -rw-r--r-- | addons/project/report/project_report_view.xml | 2 | ||||
| -rw-r--r-- | addons/project/security/ir.model.access.csv | 3 | ||||
| -rw-r--r-- | addons/project/test/test_project.yml | 322 |
10 files changed, 578 insertions, 22 deletions
diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index a98b5cb28fd..5d535963422 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -26,9 +26,14 @@ "author" : "Tiny", "website" : "http://www.openerp.com", "category" : "Generic Modules/Projects & Services", - "depends" : ["product", "analytic", "process", "mail_gateway"], + "depends" : ["product", "analytic", "process", "mail_gateway","board"], "description": """Project management module that track multi-level projects, tasks, work done on tasks, eso. It is able to render planning, order tasks, eso. + Dashboard for project members that includes: + * List of my open tasks + * List of messages + * Members list of project + * Issues """, "init_xml" : [], "update_xml": [ @@ -43,10 +48,16 @@ work done on tasks, eso. It is able to render planning, order tasks, eso. "project_installer.xml", "report/project_report_view.xml", "wizard/project_close_task_view.xml", + "board_project_view.xml", + 'board_project_manager_view.xml' ], 'demo_xml': [ - 'project_demo.xml' + 'project_demo.xml', + 'board_project_demo.xml', ], + 'test':[ + 'test/test_project.yml' + ], 'installable': True, 'active': False, 'certificate': '0075116868317', diff --git a/addons/project/board_project_demo.xml b/addons/project/board_project_demo.xml new file mode 100644 index 00000000000..fa92e92f092 --- /dev/null +++ b/addons/project/board_project_demo.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data noupdate="1"> + + + <!-- + Administrator shortcut + Demo user startup menu + --> + <record id="sc_account_dash" model="ir.ui.view_sc"> + <field name="name">project dashboard</field> + <field name="user_id" ref="base.user_demo"/> + <field name="resource">ir.ui.menu</field> + <field name="sequence">3</field> + <field name="res_id" ref="menu_board_project"/> + </record> + <record id="base.user_root" model="res.users"> + <field name="action_id" ref="open_board_project"/> + </record> + + <record id="note_project" model="board.note"> + <field name="name">Don't forget the new development policies.</field> + <field name="user_id" ref="base.user_root"/> + <field name="type">Project</field> + </record> + + </data> +</openerp> diff --git a/addons/project/board_project_manager_view.xml b/addons/project/board_project_manager_view.xml new file mode 100644 index 00000000000..3c32361e5ec --- /dev/null +++ b/addons/project/board_project_manager_view.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record id="note_project_type" model="board.note.type"> + <field name="name">Project managers</field> + </record> + + <!-- + Board for project managers + --> + <act_window domain="[('manager', '=', uid)]" id="act_my_project" name="My projects" res_model="project.project" view_mode="tree,form" view_type="form"/> + + <act_window domain="[('user_id','=',uid),('state','<>','close')]" id="act_my_account" name="My accounts to invoice" res_model="account.analytic.account" view_id="view_account_analytic_simplified" view_mode="tree,form" view_type="form"/> + +<!-- <record id="action_project_pipeline_user" model="ir.actions.act_window">--> +<!-- <field name="name">Pipeline of tasks</field>--> +<!-- <field name="res_model">report.task.user.pipeline.open</field>--> +<!-- <field name="view_type">form</field>--> +<!-- <field name="view_mode">graph,tree</field>--> +<!-- <field name="domain">[('user_id','in',department_users_get())]</field>--> +<!-- </record>--> + + + + <record id="board_project_manager_form" model="ir.ui.view"> + <field name="name">board.project.manager.form</field> + <field name="model">board.board</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Project manager board"> + <hpaned> + <child1> + <!-- <action colspan="4" height="220" name="%(act_my_project)d" string="My projects" width="510"/>--> + + <action colspan="4" height="150" name="%(act_my_account)d" string="My accounts to invoice" width="510"/> + </child1> + <child2> + <button colspan="4" icon="terp-partner" name="%(open_board_project)d" string="My tasks board" type="action"/> + </child2> + </hpaned> + </form> + </field> + </record> + + <record id="open_board_project_manager" model="ir.actions.act_window"> + <field name="name">Project Manager Dashboard</field> + <field name="res_model">board.board</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="usage">menu</field> + <field name="view_id" ref="board_project_manager_form"/> + </record> + + <menuitem action="open_board_project_manager" icon="terp-graph" id="menu_board_project_manager" parent="project.next_id_86" sequence="1" groups="project.group_project_user"/> + + </data> +</openerp> diff --git a/addons/project/board_project_view.xml b/addons/project/board_project_view.xml new file mode 100644 index 00000000000..3e65798e5d8 --- /dev/null +++ b/addons/project/board_project_view.xml @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="utf-8"?> +<openerp> + <data> + + <record id="note_project_manager_type" model="board.note.type"> + <field name="name">Project</field> + </record> + + <record id="view_task_tree" model="ir.ui.view"> + <field name="name">project.task.tree</field> + <field name="model">project.task</field> + <field name="type">tree</field> + <field eval="99" name="priority"/> + <field name="arch" type="xml"> + <tree colors="red:date_deadline<current_date;blue:date_deadline==current_date;black:date_deadline>current_date" string="My Tasks"> + <field name="name"/> + <field name="project_id"/> + <field name="date_deadline"/> + <field name="planned_hours"/> + <field name="effective_hours"/> + <field name="priority"/> + </tree> + </field> + </record> + <!-- Editable My task --> + <record id="view_task_tree" model="ir.ui.view"> + <field name="name">project.task.tree</field> + <field name="model">project.task</field> + <field name="type">tree</field> + <field eval="99" name="priority"/> + <field name="arch" type="xml"> + <tree editable="top" colors="red:date_deadline<current_date;blue:date_deadline==current_date;black:date_deadline>current_date" string="My Tasks"> + <field name="name"/> + <field name="project_id"/> + <field name="date_deadline"/> + <field name="planned_hours"/> + <field name="effective_hours"/> + <field name="priority"/> + </tree> + </field> + </record> + <record id="action_view_task_tree" model="ir.actions.act_window"> + <field name="name">My Open Tasks</field> + <field name="res_model">project.task</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('user_id','=',uid),('state','=','open')]</field> + <field name="view_id" ref="view_task_tree"/> + </record> + <record id="action_view_pending_task_tree" model="ir.actions.act_window"> + <field name="name">My Pending Tasks</field> + <field name="res_model">project.task</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('user_id','=',uid),('state','=','pending')]</field> + <field name="view_id" ref="view_task_tree"/> + </record> + <record id="action_view_task_tree_deadline" model="ir.actions.act_window"> + <field name="name">My Task's Deadlines</field> + <field name="res_model">project.task</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('user_id','=',uid),('state','=','open'),('date_deadline','<>',False)]</field> + <field name="view_id" ref="view_task_tree"/> + </record> + + <record id="action_view_board_note_tree" model="ir.actions.act_window"> + <field name="name">Public Notes</field> + <field name="res_model">board.note</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('type','=','Project')]</field> + </record> + + <!--Actions for deshboard --> + + <record id="action_view_project_editable_messages_tree" model="ir.actions.act_window"> + <field name="name">Messages</field> + <field name="res_model">project.message</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="view_id" ref="project.view_project_message_tree"/> + </record> + +<!-- <record id="action_view_project_member_tree" model="ir.actions.act_window"> + <field name="name">Project's Members</field> + <field name="res_model">resource.resource</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('resource_type','=','user')]</field> + <field name="view_id" ref="resource.resource_resource_tree"/> + </record>--> + + <record id="board_project_form" model="ir.ui.view"> + <field name="name">board.project.form</field> + <field name="model">board.board</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="My Board"> + <hpaned> + <child1> + <action colspan="4" name="%(action_view_task_tree)d" string="My Open Tasks" width="510"/> + <action colspan="4" name="%(action_view_pending_task_tree)d" string="My Pending Tasks" width="510"/> + </child1> + <child2> + <vpaned> + <child1> + <action colspan="4" name="%(project.action_project_vs_remaining_hours_graph)d" string="Remaining Hours Per Project" /> + </child1> + <child2> + <action colspan="4" name="%(project.action_task_by_days_vs_planned_hours_graph)d" string="Planned Hours Per Day" /> + </child2> + </vpaned> + </child2> + </hpaned> + </form> + </field> + </record> + + <record id="open_board_project" model="ir.actions.act_window"> + <field name="name">Project Dashboard</field> + <field name="res_model">board.board</field> + <field name="view_type">form</field> + <field name="view_mode">form</field> + <field name="usage">menu</field> + <field name="view_id" ref="board_project_form"/> + </record> + <menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/> + <menuitem + id="next_id_86" + name="Project" + parent="base.dashboard"/> + <menuitem + action="open_board_project" + icon="terp-graph" + id="menu_board_project" + parent="next_id_86" + sequence="1"/> + </data> +</openerp> diff --git a/addons/project/project.py b/addons/project/project.py index d511757c8dc..c5c389e5510 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -92,10 +92,10 @@ class project(osv.osv): FROM project_task WHERE - project_id =ANY(%s) AND + project_id IN %s AND state<>'cancelled' GROUP BY - project_id''',(ids2,)) + project_id''',(tuple(ids2),)) progress = dict(map(lambda x: (x[0], (x[1], x[2], x[3])), cr.fetchall())) for project in self.browse(cr, uid, ids, context=context): s = [0.0, 0.0, 0.0] @@ -196,7 +196,7 @@ class project(osv.osv): res = super(project, self).copy(cr, uid, id, default, context) ids = self.search(cr, uid, [('parent_id','child_of', [res])]) if ids: - cr.execute('update project_task set active=True where project_id =ANY(%s)',(ids,)) + cr.execute('update project_task set active=True where project_id IN %s',(tuple(ids),)) return res def duplicate_template(self, cr, uid, ids, context={}): @@ -272,7 +272,7 @@ class task(osv.osv): # Compute: effective_hours, total_hours, progress def _hours_get(self, cr, uid, ids, field_names, args, context=None): res = {} - cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id =ANY(%s) GROUP BY task_id",(ids,)) + cr.execute("SELECT task_id, COALESCE(SUM(hours),0) FROM project_task_work WHERE task_id IN %s GROUP BY task_id",(tuple(ids),)) hours = dict(cr.fetchall()) for task in self.browse(cr, uid, ids, context=context): res[task.id] = {'effective_hours': hours.get(task.id, 0.0), 'total_hours': task.remaining_hours + hours.get(task.id, 0.0)} @@ -343,7 +343,6 @@ class task(osv.osv): 'company_id': fields.many2one('res.company', 'Company'), } _defaults = { - 'user_id': lambda obj, cr, uid, context: uid, 'state': lambda *a: 'draft', 'priority': lambda *a: '2', 'progress': lambda *a: 0, diff --git a/addons/project/project_resource.py b/addons/project/project_resource.py index 75dd94ad5a3..478fd4316bc 100644 --- a/addons/project/project_resource.py +++ b/addons/project/project_resource.py @@ -18,10 +18,10 @@ def leaves_resource(cr,uid,calendar_id,resource_id=False,resource_calendar=False resource_leaves_pool = pool.get('resource.calendar.leaves') leaves = [] if resource_id: - resource_leave_ids = resource_leaves_pool.search(cr,uid,['|',('calendar_id','=',calendar_id),('calendar_id','=',resource_calendar),('resource_id','=',resource_id)]) + resource_leave_ids = resource_leaves_pool.search(cr, uid, ['|',('calendar_id','=',calendar_id),('calendar_id','=',resource_calendar),('resource_id','=',resource_id)]) else: - resource_leave_ids = resource_leaves_pool.search(cr,uid,[('calendar_id','=',calendar_id),('resource_id','=',False)]) - res_leaves = resource_leaves_pool.read(cr,uid,resource_leave_ids,['date_from','date_to']) + resource_leave_ids = resource_leaves_pool.search(cr, uid, [('calendar_id','=',calendar_id),('resource_id','=',False)]) + res_leaves = resource_leaves_pool.read(cr, uid, resource_leave_ids, ['date_from','date_to']) for leave in range(len(res_leaves)): dt_start = datetime.datetime.strptime(res_leaves[leave]['date_from'],'%Y-%m-%d %H:%M:%S') dt_end = datetime.datetime.strptime(res_leaves[leave]['date_to'],'%Y-%m-%d %H:%M:%S') @@ -42,8 +42,8 @@ def compute_working_calendar(cr,uid,calendar_id): wk_time = {} wktime_list = [] wktime_cal = [] - week_ids = resource_week_pool.search(cr,uid,[('calendar_id','=',calendar_id)]) - week_obj = resource_week_pool.read(cr,uid,week_ids,['dayofweek','hour_from','hour_to']) + week_ids = resource_week_pool.search(cr, uid, [('calendar_id','=',calendar_id)]) + week_obj = resource_week_pool.read(cr, uid, week_ids, ['dayofweek','hour_from','hour_to']) # Converting time formats into appropriate format required # and creating a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')] @@ -53,8 +53,8 @@ def compute_working_calendar(cr,uid,calendar_id): day = wk[week['dayofweek']] wk_days[week['dayofweek']] = wk[week['dayofweek']] - hour_from_str = timeformat_convert(cr,uid,week['hour_from']) - hour_to_str = timeformat_convert(cr,uid,week['hour_to']) + hour_from_str = timeformat_convert(cr, uid, week['hour_from']) + hour_to_str = timeformat_convert(cr, uid, week['hour_to']) res_str = hour_from_str + '-' + hour_to_str wktime_list.append((day,res_str)) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 004ed9ba429..cbb7b9d7337 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <openerp> <data> - <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_project_management" name="Project Management" parent="base.menu_main_pm" sequence="1"/> <menuitem id="menu_definitions" name="Configuration" parent="base.menu_main_pm" sequence="60"/> @@ -507,13 +507,14 @@ </record> <record id="open_task_type_form" model="ir.actions.act_window"> - <field name="name">Task Types</field> + <field name="name">Types</field> <field name="res_model">project.task.type</field> <field name="view_type">form</field> <field name="view_id" ref="task_type_tree"/> </record> - <menuitem action="open_task_type_form" id="menu_task_types" parent="project.menu_definitions"/> - + <menuitem id="menu_tasks_config" name="Tasks" parent="project.menu_definitions" sequence="1"/> + <menuitem action="open_task_type_form" id="menu_task_types_view" parent="menu_tasks_config" sequence="1"/> + <act_window domain="[('user_id', '=', active_id)]" id="act_res_users_2_project_project" name="User's projects" res_model="project.project" src_model="res.users" view_mode="tree,form" view_type="form"/> <act_window diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 9b685001664..92edbc78d77 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -117,7 +117,7 @@ <filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> <filter string="Stage" icon="terp-stage" context="{'group_by':'type'}" /> <separator orientation="vertical"/> - <filter string="Day" icon="terp-go-month" context="{'group_by':'day'}"/> + <filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/> <filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/> <filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/> </group> diff --git a/addons/project/security/ir.model.access.csv b/addons/project/security/ir.model.access.csv index 1a2fac38c6a..502c8af0596 100644 --- a/addons/project/security/ir.model.access.csv +++ b/addons/project/security/ir.model.access.csv @@ -19,9 +19,6 @@ "access_task_by_days","task.by.days","model_task_by_days","project.group_project_user",1,1,1,1 "access_close_task","close.task","model_close_task","project.group_project_user",1,1,1,1 "access_close_task_manager","close.task manager","model_close_task","project.group_project_manager",1,1,1,1 -"access_resource_calendar_project_user","resource.resource.calendar project user","resource.model_resource_calendar","project.group_project_user",1,0,0,0 -"access_resource_calendar_project_manager","resource.resource.calendar project manager","resource.model_resource_calendar","project.group_project_manager",1,1,1,1 -"access_fiscalyear_sequence_project_manager","account.sequence.fiscalyear project manager","account.model_account_sequence_fiscalyear","project.group_project_manager",1,1,0,0 "access_partner_task user","base.res.partner user","base.model_res_partner","project.group_project_user",1,0,0,0 "access_partner_task manager","base.res.partner manager","base.model_res_partner","project.group_project_manager",1,0,0,0 "access_partner_address_task user","base.res.partner.address user","base.model_res_partner_address","project.group_project_user",1,0,0,0 diff --git a/addons/project/test/test_project.yml b/addons/project/test/test_project.yml new file mode 100644 index 00000000000..25b3e94b57f --- /dev/null +++ b/addons/project/test/test_project.yml @@ -0,0 +1,322 @@ +- + Test project template feature +- + Create project 'OpenERP Training Programme' +- + !record {model: project.project, id: project_project_openerptrainingprogramme0}: + company_id: base.main_company + name: OpenERP Training Programme +- + Create task 'Technical Training' for this project +- + !record {model: project.task, id: project_task_technicaltraining0}: + date_start: '2010-05-31 11:48:38' + name: Technical Training + planned_hours: 30.0 + project_id: project_project_openerptrainingprogramme0 + remaining_hours: 30.0 + state: draft +- + Create task 'Functional Training' for this project +- + !record {model: project.task, id: project_task_functionaltraining0}: + date_start: '2010-05-31 11:49:11' + name: Functional Training + planned_hours: 30.0 + project_id: project_project_openerptrainingprogramme0 + remaining_hours: 30.0 + state: draft +- + Set project as project template +- + !python {model: project.project}: | + self.set_template(cr, uid, [ref("project_project_openerptrainingprogramme0")], + {"lang": "en_US", "active_model": "ir.ui.menu", "active_ids": [ref("project.menu_open_view_project_all")], + "tz": False, "active_id": ref("project.menu_open_view_project_all"), }) +- + Check if project in template state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in template state}: + - state == "template" +- + Create new project based on this template +- + !python {model: project.project}: | + new_prj = self.duplicate_template(cr, uid, [ref("project_project_openerptrainingprogramme0")], + {"lang": "en_US", "active_model": "ir.ui.menu", "active_ids": [ref("project.menu_open_view_project_all")], + "tz": False, "active_id": ref("project.menu_open_view_project_all"), }) + if not new_prj: + raise Exception( "New project based on template not created") + new_id = new_prj['res_id'] + state = self.read(cr, uid, [new_id], ['state'])[0]['state'] + assert state == 'open', "Project in %s state. Project created from template project must be in open state"%state +- + Reset project template to normal project +- + !python {model: project.project}: | + self.reset_project(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": + [ref("project.menu_open_view_project_all")], "tz": False, "active_model": + "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"), + }) +- + Check if project in open state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}: + - state == "open" + + + + +- + Test for different project-states +- + Keep project pending +- + !python {model: project.project}: | + self.set_pending(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": + [ref("project.menu_open_view_project_all")], "tz": False, "active_model": + "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"), + }) +- + Check if project in pending state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in pending state}: + - state == "pending" +- + Cancel the project +- + !python {model: project.project}: | + self.set_cancel(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": + [ref("project.menu_open_view_project_all")], "tz": False, "active_model": + "ir.ui.menu", "project_id": False, "active_id": ref("project.menu_open_view_project_all"), + }) +- + Check if project in cancel state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in cancel state}: + - state == "cancelled" +- + Re-open the project +- + !python {model: project.project}: | + self.set_open(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": [ref("project.menu_open_view_project_all")], + "tz": False, "active_model": "ir.ui.menu", "project_id": False, "active_id": + ref("project.menu_open_view_project_all"), }) +- + Check if project in open state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error, string: Project is in open state}: + - state == "open" + + + +- + Test for task work allocation +- + Check if task 'Technical Training' in draft state +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Project is in draft state}: + - state == "draft" +- + Open task 'Technical Training' +- + !python {model: project.task}: | + self.do_open(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")], + "tz": False, "active_model": "ir.ui.menu", "search_default_project_id": + False, "search_default_user_id": 1, "search_default_current": 1, "project_id": + False, "active_id": ref("project.menu_action_view_task"), }) +- + Check if task 'Technical Training' in open state and for other initial values +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Project is in open state}: + - state == "open" + - planned_hours == 30 + - remaining_hours == 30 + - delay_hours == 0.0 + - total_hours == 30 + - effective_hours == 0.0 +- + Make a work task entry 'Training on OpenERP modules, models and classes' of 10 hours +- + !record {model: project.task, id: project_task_technicaltraining0}: + work_ids: + - date: '2010-05-31 15:04:22' + hours: 10.0 + name: Training on OpenERP modules, models and classes + user_id: base.user_root +- + Check for effective hours and remaining hours, effective_hours must be equal to 10 +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After work task of 10 hours effective_hours must be equal to 10}: + - remaining_hours == 20 + - effective_hours == 10.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Make a work task entry 'Training on OpenERP xml views' of 10 hours +- + !record {model: project.task, id: project_task_technicaltraining0}: + work_ids: + - date: '2010-06-01 15:04:46' + hours: 10.0 + name: Training on OpenERP xml views + user_id: base.user_root +- + Check for effective hours and remaining hours, effective_hours must be equal to 20 +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 20}: + - remaining_hours == 10 + - effective_hours == 20.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Make a work task entry 'Training on workflows' of 10 hours +- + !record {model: project.task, id: project_task_technicaltraining0}: + work_ids: + - date: '2010-06-02 15:05:24' + hours: 10.0 + name: Training on workflows + user_id: base.user_root +- + Check for effective hours and remaining hours, effective_hours must be equal to 30 +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 30}: + - remaining_hours == 0 + - effective_hours == 30.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Set remaining hours of 10 hours for reevaluating the task +- + !record {model: config.compute.remaining, id: config_compute_remaining_0}: + remaining_hours: 10.0 +- + Reevaluate the task +- + !python {model: config.compute.remaining}: | + self.compute_hours(cr, uid, [ref("config_compute_remaining_0")], {"lang": "en_US", + "project_id": False, "tz": False, "active_model": "project.task", "search_default_project_id": + False, "search_default_user_id": 1, "search_default_current": 1, "active_ids": + [ref("project_task_technicaltraining0")], "active_id": ref("project_task_technicaltraining0"), }) + +- + Check for effective hours and remaining hours, remaining_hours must be 10 while planned_hours remains 30 +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After reevaluating the task with 10 hours remaining_hours must be 10 while planned_hours remains 30}: + - planned_hours == 30 + - remaining_hours == 10.0 + - effective_hours == 30.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Make a work task entry 'Training on reports and wizards' of 10 hours +- + !record {model: project.task, id: project_task_technicaltraining0}: + work_ids: + - date: '2010-05-31 15:08:40' + hours: 10.0 + name: Training on reports and wizards + user_id: base.user_root +- + Check for effective hours and remaining hours +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After one more work task of 10 hours effective_hours must be equal to 40 while planned_hours remains 30}: + - planned_hours == 30 + - remaining_hours == 0 + - effective_hours == 40.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Close the task +- + !python {model: project.task}: | + self.do_close(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")], + "tz": False, "active_model": "ir.ui.menu", "search_default_project_id": + False, "search_default_user_id": 1, "search_default_current": 1, "project_id": + False, "active_id": ref("project.menu_action_view_task"), }) +- + Check if task in done state +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: Task is in done state}: + - state == "done" + + +- + Test for task reactivation +- + Reactivate task +- + !record {model: config.compute.remaining, id: config_compute_remaining_1}: + remaining_hours: 10.0 +- + Reevaluate the task with 10 hours remaining +- + !python {model: config.compute.remaining}: | + self.compute_hours(cr, uid, [ref("config_compute_remaining_1")], {"lang": "en_US", + "project_id": False, "tz": False, "button_reactivate": True, "active_model": + "project.task", "search_default_project_id": False, "search_default_user_id": + 1, "search_default_current": 1, "active_ids": [ref("project_task_technicaltraining0")], "active_id": ref("project_task_technicaltraining0"), + }) +- + Check for effective hours and remaining hours, remaining_hours must be 10 while planned_hours remains 30 +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After reevaluating the task with 10 hours remaining_hours must be 10 while planned_hours remains 30}: + - planned_hours == 30 + - remaining_hours == 10.0 + - effective_hours == 40.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Make a work task entry 'Training on yml' of 5 hours +- + !record {model: project.task, id: project_task_technicaltraining0}: + work_ids: + - date: '2010-05-31 16:55:27' + hours: 5.0 + name: Training on yml + user_id: base.user_root +- + Check for effective hours and remaining hours +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After work task of 5 hours effective_hours must be equal to 45 and remaining_hours is 5}: + - planned_hours == 30 + - remaining_hours == 5.0 + - effective_hours == 45.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Close the task +- + !python {model: project.task}: | + self.do_close(cr, uid, [ref("project_task_technicaltraining0")], {"lang": "en_US", "active_ids": [ref("project.menu_action_view_task")], + "tz": False, "active_model": "ir.ui.menu", "search_default_project_id": + False, "search_default_user_id": 1, "search_default_current": 1, "project_id": + False, "active_id": ref("project.menu_action_view_task"), }) +- + Check if task in done state +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error}: + - state == "done" +- + Check for effective hours and remaining hours +- + !assert {model: project.task, id: project_task_technicaltraining0, severity: error, string: After closing the task planned_hours must remain 30 effective_hours must be 45 and remaining hours must be 0}: + - planned_hours == 30 + - remaining_hours == 0.0 + - effective_hours == 45.0 + - total_hours == effective_hours + remaining_hours + - delay_hours == total_hours - planned_hours +- + Close project 'OpenERP Training Programme' +- + !python {model: project.project}: | + self.set_done(cr, uid, [ref("project_project_openerptrainingprogramme0")], {"lang": "en_US", "active_ids": [ref("project.menu_open_view_project_all")], + "tz": False, "active_model": "ir.ui.menu", "project_id": False, "active_id": + ref("project.menu_open_view_project_all"), }) +- + Check if project in close state +- + !assert {model: project.project, id: project_project_openerptrainingprogramme0, severity: error}: + - state == "close" +
\ No newline at end of file |
