diff --git a/addons/project_scrum/project_scrum.py b/addons/project_scrum/project_scrum.py
index 482e41e179c..a80a31ff257 100644
--- a/addons/project_scrum/project_scrum.py
+++ b/addons/project_scrum/project_scrum.py
@@ -45,49 +45,29 @@ class project_scrum_sprint(osv.osv):
_name = 'project.scrum.sprint'
_description = 'Project Scrum Sprint'
- def _calc_progress(self, cr, uid, ids, name, args, context=None):
- res = {}
+ def _compute(self, cr, uid, ids, fields, arg, context=None):
+ res = {}.fromkeys(ids, 0.0)
+ progress = {}
+ if not ids:
+ return res
if context is None:
context = {}
- for sprint in self.browse(cr, uid, ids):
+ for sprint in self.browse(cr, uid, ids, context=context):
tot = 0.0
prog = 0.0
+ effective = 0.0
+ progress = 0.0
for bl in sprint.backlog_ids:
tot += bl.expected_hours
+ effective += bl.effective_hours
prog += bl.expected_hours * bl.progress / 100.0
- res.setdefault(sprint.id, 0.0)
if tot>0:
- res[sprint.id] = round(prog/tot*100)
- return res
-
- def _calc_effective(self, cr, uid, ids, name, args, context=None):
- res = {}
- if context is None:
- context = {}
- for sprint in self.browse(cr, uid, ids):
- res.setdefault(sprint.id, 0.0)
- for bl in sprint.backlog_ids:
- res[sprint.id] += bl.effective_hours
- return res
-
- def _calc_planned(self, cr, uid, ids, name, args, context=None):
- res = {}
- if context is None:
- context = {}
- for sprint in self.browse(cr, uid, ids):
- res.setdefault(sprint.id, 0.0)
- for bl in sprint.backlog_ids:
- res[sprint.id] += bl.expected_hours
- return res
-
- def _calc_expected(self, cr, uid, ids, name, args, context=None):
- res = {}
- if context is None:
- context = {}
- for sprint in self.browse(cr, uid, ids):
- res.setdefault(sprint.id, 0.0)
- for bl in sprint.backlog_ids:
- res[sprint.id] += bl.expected_hours
+ progress = round(prog/tot*100)
+ res[sprint.id] = {
+ 'progress' : progress,
+ 'expected_hours' : tot,
+ 'effective_hours': effective,
+ }
return res
def button_cancel(self, cr, uid, ids, context=None):
@@ -137,9 +117,9 @@ class project_scrum_sprint(osv.osv):
'review': fields.text('Sprint Review'),
'retrospective': fields.text('Sprint Retrospective'),
'backlog_ids': fields.one2many('project.scrum.product.backlog', 'sprint_id', 'Sprint Backlog'),
- 'progress': fields.function(_calc_progress, method=True, string='Progress (0-100)', help="Computed as: Time Spent / Total Time."),
- 'effective_hours': fields.function(_calc_effective, method=True, string='Effective hours', help="Computed using the sum of the task work done."),
- 'expected_hours': fields.function(_calc_expected, method=True, string='Planned Hours', help='Estimated time to do the task.'),
+ 'progress': fields.function(_compute, group_operator="avg", type='float', multi="progress", method=True, string='Progress (0-100)', help="Computed as: Time Spent / Total Time."),
+ 'effective_hours': fields.function(_compute, multi="effective_hours", method=True, string='Effective hours', help="Computed using the sum of the task work done."),
+ 'expected_hours': fields.function(_compute, multi="expected_hours", method=True, string='Planned Hours', help='Estimated time to do the task.'),
'state': fields.selection([('draft','Draft'),('open','Open'),('pending','Pending'),('cancel','Cancelled'),('done','Done')], 'State', required=True),
}
_defaults = {
@@ -188,39 +168,31 @@ class project_scrum_product_backlog(osv.osv):
return self.name_get(cr, uid, ids, context=context)
return super(project_scrum_product_backlog, self).name_search(cr, uid, name, args, operator,context, limit=limit)
- def _calc_progress(self, cr, uid, ids, name, args, context=None):
- res = {}
+ def _compute(self, cr, uid, ids, fields, arg, context=None):
+ res = {}.fromkeys(ids, 0.0)
+ progress = {}
+ if not ids:
+ return res
if context is None:
context = {}
- for bl in self.browse(cr, uid, ids):
+ for backlog in self.browse(cr, uid, ids, context=context):
tot = 0.0
prog = 0.0
- for task in bl.tasks_id:
+ effective = 0.0
+ task_hours = 0.0
+ progress = 0.0
+ for task in backlog.tasks_id:
+ task_hours += task.total_hours
+ effective += task.effective_hours
tot += task.planned_hours
prog += task.planned_hours * task.progress / 100.0
- res.setdefault(bl.id, 0.0)
if tot>0:
- res[bl.id] = round(prog/tot*100)
- return res
-
- def _calc_effective(self, cr, uid, ids, name, args, context=None):
- res = {}
- if context is None:
- context = {}
- for bl in self.browse(cr, uid, ids):
- res.setdefault(bl.id, 0.0)
- for task in bl.tasks_id:
- res[bl.id] += task.effective_hours
- return res
-
- def _calc_task(self, cr, uid, ids, name, args, context=None):
- res = {}
- if context is None:
- context = {}
- for bl in self.browse(cr, uid, ids):
- res.setdefault(bl.id, 0.0)
- for task in bl.tasks_id:
- res[bl.id] += task.total_hours
+ progress = round(prog/tot*100)
+ res[backlog.id] = {
+ 'progress' : progress,
+ 'effective_hours': effective,
+ 'task_hours' : task_hours
+ }
return res
def button_cancel(self, cr, uid, ids, context=None):
@@ -291,11 +263,11 @@ class project_scrum_product_backlog(osv.osv):
'sequence' : fields.integer('Sequence', help="Gives the sequence order when displaying a list of product backlog."),
'tasks_id': fields.one2many('project.task', 'product_backlog_id', 'Tasks Details'),
'state': fields.selection([('draft','Draft'),('open','Open'),('pending','Pending'),('done','Done'),('cancel','Cancelled')], 'State', required=True),
- 'progress': fields.function(_calc_progress, method=True, string='Progress', help="Computed as: Time Spent / Total Time."),
- 'effective_hours': fields.function(_calc_effective, method=True, string='Spent Hours', help="Computed using the sum of the time spent on every related tasks"),
+ 'progress': fields.function(_compute, multi="progress", group_operator="avg", type='float', method=True, string='Progress', help="Computed as: Time Spent / Total Time."),
+ 'effective_hours': fields.function(_compute, multi="effective_hours", method=True, string='Spent Hours', help="Computed using the sum of the time spent on every related tasks"),
'expected_hours': fields.float('Planned Hours', help='Estimated total time to do the Backlog'),
'create_date': fields.datetime("Creation Date", readonly=True),
- 'task_hours': fields.function(_calc_task, method=True, string='Task Hours', help='Estimated time of the total hours of the tasks')
+ 'task_hours': fields.function(_compute, multi="task_hours", method=True, string='Task Hours', help='Estimated time of the total hours of the tasks')
}
_defaults = {
'state': 'draft',
diff --git a/addons/project_scrum/wizard/project_scrum_backlog_create_task.py b/addons/project_scrum/wizard/project_scrum_backlog_create_task.py
index 92681d804a9..2b8a641622d 100644
--- a/addons/project_scrum/wizard/project_scrum_backlog_create_task.py
+++ b/addons/project_scrum/wizard/project_scrum_backlog_create_task.py
@@ -24,7 +24,7 @@ class backlog_create_task(osv.osv_memory):
_name = 'project.scrum.backlog.create.task'
_description = 'Create Tasks from Product Backlogs'
_columns = {
- 'user_id': fields.many2one('res.users', 'Assign To')
+ 'user_id': fields.many2one('res.users', 'Assign To', help="Resposible user who can work on task")
}
def do_create(self, cr, uid, ids, context=None):
diff --git a/addons/project_scrum/wizard/project_scrum_backlog_create_task_view.xml b/addons/project_scrum/wizard/project_scrum_backlog_create_task_view.xml
index cb77a7d315d..6707a7326d0 100644
--- a/addons/project_scrum/wizard/project_scrum_backlog_create_task_view.xml
+++ b/addons/project_scrum/wizard/project_scrum_backlog_create_task_view.xml
@@ -7,21 +7,22 @@
project.scrum.backlog.create.task
form
-
- Create Tasks
+ Convert into Tasks
ir.actions.act_window
project.scrum.backlog.create.task
form
@@ -32,7 +33,7 @@
- Create Tasks
+ Convert into Tasks
client_action_multi
action
diff --git a/addons/project_scrum/wizard/project_scrum_backlog_sprint.py b/addons/project_scrum/wizard/project_scrum_backlog_sprint.py
index 640bdfd4a65..52704fe1097 100644
--- a/addons/project_scrum/wizard/project_scrum_backlog_sprint.py
+++ b/addons/project_scrum/wizard/project_scrum_backlog_sprint.py
@@ -25,8 +25,8 @@ class backlog_sprint_assign(osv.osv_memory):
_name = 'project.scrum.backlog.assign.sprint'
_description = 'Assign sprint to backlogs'
_columns = {
- 'sprint_id': fields.many2one('project.scrum.sprint', 'Sprint Name', required=True),
- 'state_open': fields.boolean('Set Open', help="Change the state of product backlogs to open if its in draft state"),
+ 'sprint_id': fields.many2one('project.scrum.sprint', 'Sprint', required=True, help="Select Sprint to assign backlog."),
+ 'state_open': fields.boolean('Open Backlog', help="Change the state of product backlogs to open if its in draft state"),
'convert_to_task': fields.boolean('Convert To Task', help="Create Task for Product Backlog")
}
_defaults = {
diff --git a/addons/project_scrum/wizard/project_scrum_backlog_sprint_view.xml b/addons/project_scrum/wizard/project_scrum_backlog_sprint_view.xml
index d44886eb986..b6c5ea30b42 100644
--- a/addons/project_scrum/wizard/project_scrum_backlog_sprint_view.xml
+++ b/addons/project_scrum/wizard/project_scrum_backlog_sprint_view.xml
@@ -8,20 +8,16 @@
form
@@ -47,4 +43,4 @@
-
\ No newline at end of file
+