diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 501c4787dee..656c5c724a8 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -302,8 +302,9 @@
tree
-
+
+
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index e411248db4b..f4d8b32e569 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -72,7 +72,7 @@ class report_project_task_user(osv.osv):
date_trunc('day',t.date_end) as date_end,
to_date(to_char(t.date_deadline, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_deadline,
-- sum(cast(to_char(date_trunc('day',t.date_end) - date_trunc('day',t.date_start),'DD') as int)) as no_of_days,
- (extract('epoch' from (t.date_end-t.date_start)))/(3600*24) as no_of_days,
+ abs((extract('epoch' from (t.date_end-t.date_start)))/(3600*24)) as no_of_days,
t.user_id,
progress as progress,
t.project_id,
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 17df3444b27..e3ed767dff8 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -141,7 +141,7 @@ class project_issue(crm.crm_case, osv.osv):
else:
res[issue.id][field] = abs(float(duration))
return res
-
+
_columns = {
'id': fields.integer('ID'),
'name': fields.char('Name', size=128, required=True),
@@ -193,6 +193,7 @@ class project_issue(crm.crm_case, osv.osv):
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1),
+ 'progress': fields.related('task_id', 'progress', string='Progress (%)',group_operator="avg"),
}
def _get_project(self, cr, uid, context):
@@ -245,6 +246,7 @@ class project_issue(crm.crm_case, osv.osv):
vals = {
'task_id': new_task_id,
+ 'state':'open'
}
case_obj.write(cr, uid, [bug.id], vals)
@@ -286,6 +288,15 @@ class project_issue(crm.crm_case, osv.osv):
if not stage.on_change:
return {'value':{}}
return {'value':{}}
+
+ def onchange_task_id(self, cr, uid, ids, task_id, context=None):
+ if context is None:
+ context = {}
+ result = {}
+ if not task_id:
+ return {'value':{}}
+ task = self.pool.get('project.task').browse(cr, uid, task_id, context)
+ return {'value':{'assigned_to': task.user_id.id,}}
def case_escalate(self, cr, uid, ids, *args):
"""Escalates case to top level
@@ -405,6 +416,17 @@ class project_issue(crm.crm_case, osv.osv):
@param **args: Return Dictionary of Keyword Value
"""
return True
+
+ def copy(self, cr, uid, id, default=None, context=None):
+ if not context:
+ context={}
+ issue = self.read(cr, uid, id, ['name'], context=context)
+ if not default:
+ default = {}
+ default = default.copy()
+ default['name'] = issue['name'] + _(' (copy)')
+ return super(project_issue, self).copy(cr, uid, id, default=default,
+ context=context)
project_issue()
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 56677c61a61..9062b47a25e 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -73,6 +73,7 @@
+
@@ -85,7 +86,7 @@
-
+
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 9f8f5bf8d56..d1df71630f8 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -20,6 +20,7 @@
##############################################################################
from datetime import datetime
+from dateutil.relativedelta import relativedelta
from tools.translate import _
from osv import fields, osv
from resource.faces import task as Task
@@ -90,6 +91,19 @@ class project_phase(osv.osv):
model_data_obj = self.pool.get('ir.model.data')
model_data_id = model_data_obj._get_id(cr, uid, 'product', 'uom_hour')
return model_data_obj.read(cr, uid, [model_data_id], ['res_id'])[0]['res_id']
+
+ def _compute(self, cr, uid, ids, context=None):
+ res = {}
+ if not ids:
+ return res
+ for phase in self.browse(cr, uid, ids, context=context):
+ tot = 0.0
+ for task in phase.task_ids:
+ tot += task.planned_hours
+ res[phase.id] = {
+ 'total_hours' : tot
+ }
+ return res
_columns = {
'name': fields.char("Name", size=64, required=True),
@@ -108,7 +122,8 @@ class project_phase(osv.osv):
'responsible_id': fields.many2one('res.users', 'Responsible', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}),
'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')], 'State', readonly=True, required=True,
help='If the phase is created the state \'Draft\'.\n If the phase is started, the state becomes \'In Progress\'.\n If review is needed the phase is in \'Pending\' state.\
- \n If the phase is over, the states is set to \'Done\'.')
+ \n If the phase is over, the states is set to \'Done\'.'),
+ 'total_hours': fields.function(_compute, method=True, string='Total Hours'),
}
_defaults = {
'responsible_id': lambda obj,cr,uid,context: uid,
@@ -130,6 +145,14 @@ class project_phase(osv.osv):
project_id = project_obj.browse(cr, uid, project, context=context)
result['date_start'] = project_id.date_start
return {'value': result}
+
+ def onchange_days(self, cr, uid, ids, project, context=None):
+ result = {}
+ for id in ids:
+ project_id = self.browse(cr, uid, id, context=context)
+ newdate = datetime.strptime(project_id.date_start, '%Y-%m-%d') + relativedelta(days=project_id.duration or 0.0)
+ result['date_end'] = newdate.strftime('%Y-%m-%d')
+ return {'value': result}
def _check_date_start(self, cr, uid, phase, date_end, context=None):
if context is None:
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index a3ff3b39669..5a70e5acb5e 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -97,7 +97,7 @@
-
+
@@ -134,6 +134,7 @@
+
@@ -67,12 +68,13 @@
project.messages
search
-
+
+
@@ -86,7 +88,7 @@
- Communication Messages
+ Project Messages
project.messages
form
diff --git a/addons/project_planning/project_planning_view.xml b/addons/project_planning/project_planning_view.xml
index 93a5c2c81b7..9363413e4a2 100644
--- a/addons/project_planning/project_planning_view.xml
+++ b/addons/project_planning/project_planning_view.xml
@@ -278,7 +278,6 @@
-
@@ -294,6 +293,7 @@
report_account_analytic.planning.stat
form
graph,tree
+ {"search_default_user_id":uid}