← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~akretion-team/project-service/add-project-action-item into lp:project-service

 

Alexis de Lattre has proposed merging lp:~akretion-team/project-service/add-project-action-item into lp:project-service.

Requested reviews:
  Project Core Editors (project-core-editors)

For more details, see:
https://code.launchpad.net/~akretion-team/project-service/add-project-action-item/+merge/216224

This merge proposal adds the module "project_action_item".

Extract from the module description :

This module adds action items on project tasks. When a user has completed the action item of a task, he can click on a button "Done with Timesheet" that starts a wizard ; this wizard will mark the action item as done and will create a timesheet line.

The idea behind this module is the following : on a task, we have the timesheet lines that give you the history of the actions made for that task... but we don't have anything to store the actions that must be carried out for that action (apart from the text field "description"). So, with this module : on a task, the timesheet lines (object hr.analytic.timesheet) still store the "past" actions carried out ; the action items (new object project.action.item) in "todo" state store the future actions that must be carried out. And we have a wizard to set an action item from todo to done and generate the corresponding timesheet line.
-- 
https://code.launchpad.net/~akretion-team/project-service/add-project-action-item/+merge/216224
Your team Project Core Editors is requested to review the proposed merge of lp:~akretion-team/project-service/add-project-action-item into lp:project-service.
=== added directory 'project_action_item'
=== added file 'project_action_item/__init__.py'
--- project_action_item/__init__.py	1970-01-01 00:00:00 +0000
+++ project_action_item/__init__.py	2014-04-16 22:02:09 +0000
@@ -0,0 +1,24 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Project Action Item module for OpenERP
+#    Copyright (C) 2014 Akretion (http://www.akretion.com)
+#    @author Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from . import project
+from . import wizard

=== added file 'project_action_item/__openerp__.py'
--- project_action_item/__openerp__.py	1970-01-01 00:00:00 +0000
+++ project_action_item/__openerp__.py	2014-04-16 22:02:09 +0000
@@ -0,0 +1,52 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Project Action Item module for OpenERP
+#    Copyright (C) 2014 Akretion (http://www.akretion.com)
+#    @author Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+    'name': 'Project Action Item',
+    'version': '0.1',
+    'category': 'Project Management',
+    'license': 'AGPL-3',
+    'summary': 'Adds action items on tasks',
+    'description': """
+Project Action Item
+===================
+
+This module adds action items on project tasks. When a user has completed the action item of a task, he can click on a button *Done with Timesheet* that starts a wizard ; this wizard will mark the action item as done and will create a timesheet line.
+
+Please contact Alexis de Lattre from Akretion <alexis.delattre@xxxxxxxxxxxx> for any help or question about this module.
+    """,
+    'author': 'Akretion',
+    'website': 'http://www.akretion.com',
+    'depends': ['project', 'hr_timesheet_task'],
+    'data': [
+        'wizard/done_generate_timesheet_view.xml',
+        'project_view.xml',
+        'security/ir.model.access.csv',
+    ],
+    'demo': ['project_demo.xml'],
+    'images': [
+        'static/src/img/screenshots/task_with_action_items.jpg',
+        'static/src/img/screenshots/create_timesheet_from_action_item_wizard.jpg',
+        ],
+    'installable': True,
+}

=== added directory 'project_action_item/i18n'
=== added file 'project_action_item/i18n/fr.po'
--- project_action_item/i18n/fr.po	1970-01-01 00:00:00 +0000
+++ project_action_item/i18n/fr.po	2014-04-16 22:02:09 +0000
@@ -0,0 +1,233 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#	* project_action_item
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-16 17:55+0000\n"
+"PO-Revision-Date: 2014-04-16 17:55+0000\n"
+"Last-Translator: Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: project_action_item
+#: field:hr.analytic.timesheet,action_item_id:0
+#: view:project.action.item:0
+msgid "Action Item"
+msgstr "Point d'action"
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.project_action_item_action
+#: model:ir.ui.menu,name:project_action_item.project_action_item_menu
+#: view:project.action.item:0
+#: view:project.task:0
+#: field:project.task,action_item_ids:0
+msgid "Action Items"
+msgstr "Points d'action"
+
+#. module: project_action_item
+#: field:project.task,done_action_item_ids:0
+msgid "Action Items Done"
+msgstr "Points d'action faits"
+
+#. module: project_action_item
+#: view:project.task:0
+#: field:project.task,todo_action_item_ids:0
+msgid "Action Items To Do"
+msgstr "Points d'action à faire"
+
+#. module: project_action_item
+#: field:project.action.item,user_id:0
+msgid "Assigned To"
+msgstr "Assigné à"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Back to To Do"
+msgstr "Revenir à À faire"
+
+#. module: project_action_item
+#: view:project.action.item.done.timesheet:0
+msgid "Cancel"
+msgstr "Annuler"
+
+#. module: project_action_item
+#: field:project.action.item,create_uid:0
+msgid "Created By"
+msgstr "Créé par"
+
+#. module: project_action_item
+#: field:project.action.item,create_date:0
+msgid "Creation Date"
+msgstr "Date de création"
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: field:project.action.item.done.timesheet,date:0
+msgid "Date"
+msgstr "Date"
+
+#. module: project_action_item
+#: field:project.action.item,date_done:0
+msgid "Date Done"
+msgstr "Fait le"
+
+#. module: project_action_item
+#: field:project.action.item,date_deadline:0
+msgid "Deadline"
+msgstr "Date limite"
+
+#. module: project_action_item
+#: field:project.action.item,name:0
+#: field:project.action.item.done.timesheet,name:0
+#: view:project.task:0
+msgid "Description"
+msgstr "Description"
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: selection:project.action.item,state:0
+msgid "Done"
+msgstr "Fait"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Done with Timesheet"
+msgstr "Fait avec feuille de temps"
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:50
+#, python-format
+msgid "Error:"
+msgstr "Erreur :"
+
+#. module: project_action_item
+#: field:project.action.item,estimated_quantity:0
+msgid "Estimated Quantity"
+msgstr "Durée estimée"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Group By..."
+msgstr "Groupé par..."
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.project_action_item_done_timesheet_action
+#: view:project.action.item.done.timesheet:0
+msgid "Mark Action Item as Done and Create Timesheet Line"
+msgstr "Marquer le point d'action comme fait et créer la feuille de temps"
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_project_action_item_done_timesheet
+msgid "Mark Project Action Item as Done with Timesheet Line"
+msgstr "Marquer le point d'action projet comme fait et créer la feuille de temps"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Mark as Done"
+msgstr "Marquer comme fait"
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: view:project.action.item.done.timesheet:0
+msgid "Mark as Done with Timesheet"
+msgstr "Marquer comme fait avec feuille de temps"
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.my_project_action_item_action
+#: model:ir.ui.menu,name:project_action_item.my_project_action_item_menu
+#: view:project.action.item:0
+msgid "My Action Items"
+msgstr "Mes points d'action"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "My Action Items To Do"
+msgstr "Mes points d'action à faire"
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_project_action_item
+msgid "Project Action Items"
+msgstr "Points d'action projet"
+
+#. module: project_action_item
+#: field:project.action.item.done.timesheet,quantity:0
+msgid "Quantity"
+msgstr "Quantité"
+
+#. module: project_action_item
+#: field:project.action.item,task_id:0
+msgid "Related Task"
+msgstr "Tâche associée"
+
+#. module: project_action_item
+#: field:project.action.item,timesheet_ids:0
+msgid "Related Timesheets"
+msgstr "Feuilles de temps associées"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Search Action Items"
+msgstr "Recherche de points d'action"
+
+#. module: project_action_item
+#: field:project.action.item,sequence:0
+msgid "Sequence"
+msgstr "Séquence"
+
+#. module: project_action_item
+#: field:project.action.item,state:0
+msgid "State"
+msgstr "État"
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:114
+#: model:ir.model,name:project_action_item.model_project_task
+#: view:project.action.item:0
+#, python-format
+msgid "Task"
+msgstr "Tâche"
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:51
+#, python-format
+msgid "This action item is not linked to a task, so we cannot generate a timesheet from it."
+msgstr "Ce point d'action n'est pas lié à une tâche, donc on ne peut pas générer de feuille de temps à partir de celui-ci."
+
+#. module: project_action_item
+#: field:project.action.item.done.timesheet,to_invoice:0
+msgid "Timesheet Invoicing Ratio"
+msgstr "Ratio de facturation des feuilles de temps"
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_hr_analytic_timesheet
+msgid "Timesheet Line"
+msgstr "Ligne de feuille de temps"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Timesheets"
+msgstr "Feuilles de temps"
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: selection:project.action.item,state:0
+msgid "To Do"
+msgstr "À faire"
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Total Estimated Quantity"
+msgstr "Durée totale estimée"
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: field:project.action.item.done.timesheet,user_id:0
+msgid "User"
+msgstr "Utilisateur"
+

=== added file 'project_action_item/i18n/project_action_item.pot'
--- project_action_item/i18n/project_action_item.pot	1970-01-01 00:00:00 +0000
+++ project_action_item/i18n/project_action_item.pot	2014-04-16 22:02:09 +0000
@@ -0,0 +1,233 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#	* project_action_item
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-16 17:54+0000\n"
+"PO-Revision-Date: 2014-04-16 17:54+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: project_action_item
+#: field:hr.analytic.timesheet,action_item_id:0
+#: view:project.action.item:0
+msgid "Action Item"
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.project_action_item_action
+#: model:ir.ui.menu,name:project_action_item.project_action_item_menu
+#: view:project.action.item:0
+#: view:project.task:0
+#: field:project.task,action_item_ids:0
+msgid "Action Items"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.task,done_action_item_ids:0
+msgid "Action Items Done"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.task:0
+#: field:project.task,todo_action_item_ids:0
+msgid "Action Items To Do"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,user_id:0
+msgid "Assigned To"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Back to To Do"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item.done.timesheet:0
+msgid "Cancel"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,create_uid:0
+msgid "Created By"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,create_date:0
+msgid "Creation Date"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: field:project.action.item.done.timesheet,date:0
+msgid "Date"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,date_done:0
+msgid "Date Done"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,date_deadline:0
+msgid "Deadline"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,name:0
+#: field:project.action.item.done.timesheet,name:0
+#: view:project.task:0
+msgid "Description"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: selection:project.action.item,state:0
+msgid "Done"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Done with Timesheet"
+msgstr ""
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:50
+#, python-format
+msgid "Error:"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,estimated_quantity:0
+msgid "Estimated Quantity"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Group By..."
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.project_action_item_done_timesheet_action
+#: view:project.action.item.done.timesheet:0
+msgid "Mark Action Item as Done and Create Timesheet Line"
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_project_action_item_done_timesheet
+msgid "Mark Project Action Item as Done with Timesheet Line"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Mark as Done"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: view:project.action.item.done.timesheet:0
+msgid "Mark as Done with Timesheet"
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.actions.act_window,name:project_action_item.my_project_action_item_action
+#: model:ir.ui.menu,name:project_action_item.my_project_action_item_menu
+#: view:project.action.item:0
+msgid "My Action Items"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "My Action Items To Do"
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_project_action_item
+msgid "Project Action Items"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item.done.timesheet,quantity:0
+msgid "Quantity"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,task_id:0
+msgid "Related Task"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,timesheet_ids:0
+msgid "Related Timesheets"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Search Action Items"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,sequence:0
+msgid "Sequence"
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item,state:0
+msgid "State"
+msgstr ""
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:114
+#: model:ir.model,name:project_action_item.model_project_task
+#: view:project.action.item:0
+#, python-format
+msgid "Task"
+msgstr ""
+
+#. module: project_action_item
+#: code:addons/project_action_item/wizard/done_generate_timesheet.py:51
+#, python-format
+msgid "This action item is not linked to a task, so we cannot generate a timesheet from it."
+msgstr ""
+
+#. module: project_action_item
+#: field:project.action.item.done.timesheet,to_invoice:0
+msgid "Timesheet Invoicing Ratio"
+msgstr ""
+
+#. module: project_action_item
+#: model:ir.model,name:project_action_item.model_hr_analytic_timesheet
+msgid "Timesheet Line"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Timesheets"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: selection:project.action.item,state:0
+msgid "To Do"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+msgid "Total Estimated Quantity"
+msgstr ""
+
+#. module: project_action_item
+#: view:project.action.item:0
+#: field:project.action.item.done.timesheet,user_id:0
+msgid "User"
+msgstr ""
+

=== added file 'project_action_item/project.py'
--- project_action_item/project.py	1970-01-01 00:00:00 +0000
+++ project_action_item/project.py	2014-04-16 22:02:09 +0000
@@ -0,0 +1,90 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Project Action Item module for OpenERP
+#    Copyright (C) 2014 Akretion (http://www.akretion.com)
+#    @author Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.osv import orm, fields
+
+
+class project_action_item(orm.Model):
+    _name = "project.action.item"
+    _description = "Project Action Items"
+
+    _columns = {
+        'task_id': fields.many2one('project.task', 'Related Task'),
+        'name': fields.char('Description', size=256, required=True),
+        'date_deadline': fields.date('Deadline'),
+        'date_done': fields.date('Date Done'),
+        'user_id': fields.many2one('res.users', 'Assigned To'),
+        'estimated_quantity': fields.float('Estimated Quantity'),
+        'timesheet_ids': fields.one2many(
+            'hr.analytic.timesheet', 'action_item_id', 'Related Timesheets'),
+        'state': fields.selection([
+            ('todo', 'To Do'),
+            ('done', 'Done'),
+            ], 'State', readonly=True),
+        'create_uid': fields.many2one(
+            'res.users', 'Created By', readonly=True),
+        'create_date': fields.datetime('Creation Date', readonly=True),
+        'sequence': fields.integer('Sequence'),
+        }
+
+    _defaults = {
+        'state': 'todo',
+        }
+
+    def set_to_done(self, cr, uid, ids, context=None):
+        today = fields.date.context_today(self, cr, uid, context=context)
+        self.write(cr, uid, ids, {
+            'state': 'done',
+            'date_done': today,
+            }, context=context)
+        return
+
+    def back_to_todo(self, cr, uid, ids, context=None):
+        self.write(cr, uid, ids, {
+            'state': 'todo',
+            'date_done': False,
+            }, context=context)
+        return
+
+
+class hr_analytic_timesheet(orm.Model):
+    _inherit = "hr.analytic.timesheet"
+
+    _columns = {
+        'action_item_id': fields.many2one(
+            'project.action.item', 'Action Item'),
+        }
+
+
+class project_task(orm.Model):
+    _inherit = "project.task"
+
+    _columns = {
+        'todo_action_item_ids': fields.one2many(
+            'project.action.item', 'task_id', 'Action Items To Do',
+            domain=[('state', '=', 'todo')]),
+        'done_action_item_ids': fields.one2many(
+            'project.action.item', 'task_id', 'Action Items Done',
+            domain=[('state', '=', 'done')]),
+        'action_item_ids': fields.one2many(
+            'project.action.item', 'task_id', 'Action Items'),
+        }

=== added file 'project_action_item/project_demo.xml'
--- project_action_item/project_demo.xml	1970-01-01 00:00:00 +0000
+++ project_action_item/project_demo.xml	2014-04-16 22:02:09 +0000
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+<data noupdate="1">
+
+<record id="action_item_1" model="project.action.item">
+    <field name="name">Write specs</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">4.5</field>
+    <field name="sequence">1</field>
+</record>
+
+<record id="action_item_2" model="project.action.item">
+    <field name="name">Develop a proto</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">16</field>
+    <field name="sequence">2</field>
+</record>
+
+<record id="action_item_3" model="project.action.item">
+    <field name="name">Show proto to management</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">1</field>
+    <field name="sequence">3</field>
+</record>
+
+<record id="action_item_4" model="project.action.item">
+    <field name="name">Update specs after management meeting</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">1</field>
+    <field name="sequence">4</field>
+</record>
+
+<record id="action_item_5" model="project.action.item">
+    <field name="name">Develop final version</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">42</field>
+    <field name="sequence">5</field>
+</record>
+
+<record id="action_item_6" model="project.action.item">
+    <field name="name">Show final version to usability team</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">3</field>
+    <field name="sequence">6</field>
+</record>
+
+<record id="action_item_7" model="project.action.item">
+    <field name="name">Merge proposal and review</field>
+    <field name="task_id" ref="project.project_task_8"/>
+    <field name="user_id" ref="base.user_demo"/>
+    <field name="estimated_quantity">3.5</field>
+    <field name="sequence">7</field>
+</record>
+
+
+
+</data>
+</openerp>

=== added file 'project_action_item/project_view.xml'
--- project_action_item/project_view.xml	1970-01-01 00:00:00 +0000
+++ project_action_item/project_view.xml	2014-04-16 22:02:09 +0000
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2014 Akretion (http://www.akretion.com/)
+    @author: Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+    The licence is in the file __openerp__.py
+-->
+
+<openerp>
+<data>
+
+<record id="project_action_item_form" model="ir.ui.view">
+    <field name="name">project_action_item.form</field>
+    <field name="model">project.action.item</field>
+    <field name="arch" type="xml">
+        <form string="Action Item" version="7.0">
+            <header>
+                <button name="%(project_action_item_done_timesheet_action)d"
+                    type="action" string="Mark as Done with Timesheet"
+                    class="oe_highlight" states="todo"/>
+                <button name="set_to_done" type="object"
+                    string="Mark as Done" states="todo"/>
+                <button name="back_to_todo" type="object"
+                    string="Back to To Do" states="done"/>
+                <field name="state" widget="statusbar"/>
+            </header>
+            <group name="main">
+                <field name="task_id"
+                    invisible="not context.get('project_action_item_main_view')"/>
+                <field name="name"/>
+                <field name="date_deadline"/>
+                <field name="date_done" states="done"/>
+                <field name="estimated_quantity" widget="float_time"/>
+                <field name="user_id"/>
+                <field name="create_date"/>
+                <field name="create_uid"/>
+                <field name="sequence" invisible="1"/>
+            </group>
+            <group main="timesheet" string="Timesheets">
+                <field name="timesheet_ids" nolabel="1"/>
+            </group>
+        </form>
+    </field>
+</record>
+
+<record id="project_action_item_tree" model="ir.ui.view">
+    <field name="name">project_action_item.tree</field>
+    <field name="model">project.action.item</field>
+    <field name="arch" type="xml">
+        <tree string="Action Items" editable="bottom" colors="blue:state=='todo'">
+            <field name="name"/>
+            <field name="task_id"
+                invisible="not context.get('project_action_item_main_view')"/>
+            <field name="date_deadline"/>
+            <field name="estimated_quantity"
+                widget="float_time" sum="Total Estimated Quantity"/>
+            <field name="user_id"/>
+            <button name="%(project_action_item_done_timesheet_action)d"
+                type="action" string="Done with Timesheet" states="todo"/>
+            <field name="state"
+                invisible="context.get('action_item_state_invisible')"/>
+            <field name="sequence" invisible="1"/>
+        </tree>
+    </field>
+</record>
+
+<record id="project_action_item_search" model="ir.ui.view">
+    <field name="name">project_action_item.search</field>
+    <field name="model">project.action.item</field>
+    <field name="arch" type="xml">
+        <search string="Search Action Items">
+            <field name="name" />
+            <filter name="my_action_items_todo"
+                string="My Action Items To Do"
+                domain="[('user_id', '=', uid), ('state', '=', 'todo')]"/>
+            <filter name="my_action_items" string="My Action Items"
+                domain="[('user_id', '=', uid)]"/>
+            <filter name="todo" string="To Do"
+                domain="[('state', '=', 'todo')]" />
+            <filter name="done" string="Done"
+                domain="[('state', '=', 'done')]" />
+            <group string="Group By..." name="groupby">
+                <filter name="user_id_groupby" string="User"
+                    context="{'group_by': 'user_id'}"/>
+                <filter name="date_groupby" string="Date"
+                    context="{'group_by': 'date'}"/>
+                <filter name="task_groupby" string="Task"
+                    context="{'group_by': 'task_id'}"/>
+            </group>
+        </search>
+    </field>
+</record>
+
+<record id="project_action_item_action" model="ir.actions.act_window">
+    <field name="name">Action Items</field>
+    <field name="res_model">project.action.item</field>
+    <field name="view_type">form</field>
+    <field name="view_mode">tree,form</field>
+    <field name="context">{'project_action_item_main_view': True}</field>
+</record>
+
+<record id="my_project_action_item_action" model="ir.actions.act_window">
+    <field name="name">My Action Items</field>
+    <field name="res_model">project.action.item</field>
+    <field name="view_type">form</field>
+    <field name="view_mode">tree,form</field>
+    <field name="context">{'project_action_item_main_view': True, 'search_default_my_action_items_todo': 1}</field>
+</record>
+
+
+<menuitem id="project_action_item_menu" action="project_action_item_action"
+    parent="project.menu_project_management" sequence="11"/>
+
+<menuitem id="my_project_action_item_menu" action="my_project_action_item_action"
+    parent="project.menu_project_management" sequence="12"/>
+
+<!-- add todo action items on tasks -->
+<record id="view_task_form2" model="ir.ui.view">
+    <field name="name">add.action.items.on.tasks.form</field>
+    <field name="model">project.task</field>
+    <field name="inherit_id" ref="project.view_task_form2"/>
+    <field name="arch" type="xml">
+        <page string="Description" position="after">
+            <page name="action_items" string="Action Items">
+                <group name="todo_action_items" string="Action Items To Do">
+                    <field name="todo_action_item_ids" nolabel="1"
+                        context="{'action_item_state_invisible': True}"/>
+                </group>
+            </page>
+        </page>
+    </field>
+</record>
+
+<!-- add link to action item on timesheet -->
+<record id="hr_timesheet_line_form" model="ir.ui.view">
+    <field name="name">add.action.items.on.timesheet.form</field>
+    <field name="model">hr.analytic.timesheet</field>
+    <field name="inherit_id" ref="hr_timesheet_task.hr_timesheet_line_form"/>
+    <field name="arch" type="xml">
+        <field name="task_id" position="after">
+            <field name="action_item_id"/>
+        </field>
+    </field>
+</record>
+
+</data>
+</openerp>

=== added directory 'project_action_item/security'
=== added file 'project_action_item/security/ir.model.access.csv'
--- project_action_item/security/ir.model.access.csv	1970-01-01 00:00:00 +0000
+++ project_action_item/security/ir.model.access.csv	2014-04-16 22:02:09 +0000
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_project_action_item_user,Full access on action items to Project Users,model_project_action_item,project.group_project_user,1,1,1,1

=== added directory 'project_action_item/static'
=== added directory 'project_action_item/static/src'
=== added directory 'project_action_item/static/src/img'
=== added directory 'project_action_item/static/src/img/screenshots'
=== added file 'project_action_item/static/src/img/screenshots/create_timesheet_from_action_item_wizard.jpg'
Binary files project_action_item/static/src/img/screenshots/create_timesheet_from_action_item_wizard.jpg	1970-01-01 00:00:00 +0000 and project_action_item/static/src/img/screenshots/create_timesheet_from_action_item_wizard.jpg	2014-04-16 22:02:09 +0000 differ
=== added file 'project_action_item/static/src/img/screenshots/task_with_action_items.jpg'
Binary files project_action_item/static/src/img/screenshots/task_with_action_items.jpg	1970-01-01 00:00:00 +0000 and project_action_item/static/src/img/screenshots/task_with_action_items.jpg	2014-04-16 22:02:09 +0000 differ
=== added directory 'project_action_item/wizard'
=== added file 'project_action_item/wizard/__init__.py'
--- project_action_item/wizard/__init__.py	1970-01-01 00:00:00 +0000
+++ project_action_item/wizard/__init__.py	2014-04-16 22:02:09 +0000
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Project Action Item module for OpenERP
+#    Copyright (C) 2014 Akretion (http://www.akretion.com)
+#    @author Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from . import done_generate_timesheet

=== added file 'project_action_item/wizard/done_generate_timesheet.py'
--- project_action_item/wizard/done_generate_timesheet.py	1970-01-01 00:00:00 +0000
+++ project_action_item/wizard/done_generate_timesheet.py	2014-04-16 22:02:09 +0000
@@ -0,0 +1,124 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Project Action Item module for OpenERP
+#    Copyright (C) 2014 Akretion (http://www.akretion.com)
+#    @author Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.osv import orm, fields
+from openerp.tools.translate import _
+
+
+class project_action_item_done_timesheet(orm.TransientModel):
+    _name = 'project.action.item.done.timesheet'
+    _description = 'Mark Project Action Item as Done with Timesheet Line'
+
+    _columns = {
+        'date': fields.date('Date', required=True),
+        'user_id': fields.many2one('res.users', 'User', required=True),
+        'quantity': fields.float('Quantity'),
+        'name': fields.char('Description', size=256, required=True),
+        'to_invoice': fields.many2one(
+            'hr_timesheet_invoice.factor', 'Timesheet Invoicing Ratio'),
+        }
+
+    def default_get(self, cr, uid, fields_list, context=None):
+        if context is None:
+            context = {}
+        active_id = context.get('active_id')
+        res = {}
+        if active_id:
+            item = self.pool['project.action.item'].browse(
+                cr, uid, active_id, context=context)
+            if not item.task_id:
+                raise orm.except_orm(
+                    _('Error:'),
+                    _("This action item is not linked to a task, "
+                        "so we cannot generate a timesheet from it."))
+            res = {
+                'name': item.name,
+                'quantity': item.estimated_quantity,
+                'to_invoice': (
+                    item.task_id.project_id
+                    and item.task_id.project_id.to_invoice.id or False),
+            }
+        res.update({
+            'user_id': uid,
+            'date': fields.date.context_today(self, cr, uid, context=context),
+            })
+        return res
+
+    def _prepare_timesheet(self, cr, uid, action_item, wizard, context=None):
+        task_id = action_item.task_id.id
+        to_invoice = wizard.to_invoice.id or False
+        res_user = self.pool['hr.analytic.timesheet'].on_change_user_id(
+            cr, uid, False, context['user_id'])
+        journal_id = res_user['value']['journal_id']
+        product_id = res_user['value']['product_id']
+        res_unit = self.pool['hr.analytic.timesheet'].on_change_unit_amount(
+            cr, uid, False, product_id, wizard.quantity, False, unit=False,
+            journal_id=journal_id, task_id=task_id, to_invoice=to_invoice,
+            context=context)
+        res_unit['value'].update({
+            'name': wizard.name,
+            'date': wizard.date,
+            'user_id': wizard.user_id.id,
+            'unit_amount': wizard.quantity,
+            'journal_id': journal_id,
+            'task_id': task_id,
+            'to_invoice': to_invoice,
+            'action_item_id': action_item.id,
+            })
+        return res_unit['value']
+
+    def mark_done_with_timesheet(self, cr, uid, ids, context=None):
+        assert len(ids) == 1, "Only one ID"
+        wizard = self.browse(cr, uid, ids[0], context=context)
+        if context is None:
+            context = {}
+        action_item_id = context['active_id']
+        ts_ctx = context.copy()
+        ts_ctx['user_id'] = wizard.user_id.id
+        action_item_obj = self.pool['project.action.item']
+        action_item = action_item_obj.browse(
+            cr, uid, action_item_id, context=context)
+        ts_vals = self._prepare_timesheet(
+            cr, uid, action_item, wizard, context=ts_ctx)
+        self.pool['hr.analytic.timesheet'].create(
+            cr, uid, ts_vals, context=ts_ctx)
+        self.pool['project.action.item'].write(
+            cr, uid, action_item_id, {
+                'state': 'done',
+                'date_done': wizard.date,
+                }, context=context)
+        if context.get('project_action_item_main_view'):
+            res = True
+        else:
+            # refresh the view of the task after completion of the wizard
+            res = {
+                'name': _('Task'),
+                'type': 'ir.actions.act_window',
+                'res_model': 'project.task',
+                'view_type': 'form',
+                'view_mode': 'form,tree,kanban,calendar,gantt,graph',
+                'nodestroy': False,
+                'target': 'current',
+                'res_id': action_item.task_id.id,
+                'context': context,
+                }
+        return res

=== added file 'project_action_item/wizard/done_generate_timesheet_view.xml'
--- project_action_item/wizard/done_generate_timesheet_view.xml	1970-01-01 00:00:00 +0000
+++ project_action_item/wizard/done_generate_timesheet_view.xml	2014-04-16 22:02:09 +0000
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2014 Akretion (http://www.akretion.com/)
+    @author: Alexis de Lattre <alexis.delattre@xxxxxxxxxxxx>
+    The licence is in the file __openerp__.py
+-->
+
+<openerp>
+<data>
+
+<record id="project_action_item_done_timesheet_form" model="ir.ui.view">
+    <field name="name">project_action_item_done_timesheet.form</field>
+    <field name="model">project.action.item.done.timesheet</field>
+    <field name="arch" type="xml">
+        <form string="Mark Action Item as Done and Create Timesheet Line" version="7.0">
+            <group name="main">
+                <field name="name"/>
+                <field name="date"/>
+                <field name="quantity" widget="float_time"/>
+                <field name="user_id"/>
+                <field name="to_invoice"/>
+            </group>
+            <footer>
+                <button name="mark_done_with_timesheet" type="object"
+                    string="Mark as Done with Timesheet" class="oe_highlight"/>
+                <button special="cancel" string="Cancel" class="oe_link"/>
+            </footer>
+        </form>
+    </field>
+</record>
+
+<record id="project_action_item_done_timesheet_action" model="ir.actions.act_window">
+    <field name="name">Mark Action Item as Done and Create Timesheet Line</field>
+    <field name="res_model">project.action.item.done.timesheet</field>
+    <field name="view_type">form</field>
+    <field name="view_mode">form</field>
+    <field name="target">new</field>
+</record>
+
+</data>
+</openerp>