summaryrefslogtreecommitdiff
path: root/addons/project_long_term
diff options
context:
space:
mode:
authorHarry (Open ERP) <hmo@tinyerp.com>2010-04-06 18:04:29 +0530
committerHarry (Open ERP) <hmo@tinyerp.com>2010-04-06 18:04:29 +0530
commit85c42e9270d9689e08b2864a5292ae801ecbfd67 (patch)
treed013befdb389847c9320f980f4e8ec824fda3bee /addons/project_long_term
parentd07c7bc4d6f85d593071e1d5a4900771d32545d1 (diff)
parentaa70854c09a1e287342e830318c873131bf9744f (diff)
[MERGE]
bzr revid: hmo@tinyerp.com-20100406123429-hu7m4lnflo0amjr5
Diffstat (limited to 'addons/project_long_term')
-rw-r--r--addons/project_long_term/__init__.py9
-rw-r--r--addons/project_long_term/__terp__.py23
-rw-r--r--addons/project_long_term/project_data_scheduler.xml23
-rw-r--r--addons/project_long_term/project_long_term.py (renamed from addons/project_long_term/project.py)236
-rw-r--r--addons/project_long_term/project_long_term_data.xml (renamed from addons/project_long_term/project_data.xml)4
-rw-r--r--addons/project_long_term/project_long_term_demo.xml (renamed from addons/project_long_term/project_demo.xml)0
-rw-r--r--addons/project_long_term/project_long_term_report.xml (renamed from addons/project_long_term/project_report.xml)1
-rw-r--r--addons/project_long_term/project_long_term_view.xml (renamed from addons/project_long_term/project_view.xml)31
-rw-r--r--addons/project_long_term/project_long_term_wizard.xml (renamed from addons/project_long_term/project_wizard.xml)3
-rw-r--r--addons/project_long_term/project_long_term_workflow.xml (renamed from addons/project_long_term/project_workflow.xml)0
-rw-r--r--addons/project_long_term/wizard/compute_phases_date.py50
-rw-r--r--addons/project_long_term/wizard/compute_tasks_date.py52
-rw-r--r--addons/project_long_term/wizard/schedule_tasks.py25
-rw-r--r--addons/project_long_term/wizard/working_calendar.py26
14 files changed, 233 insertions, 250 deletions
diff --git a/addons/project_long_term/__init__.py b/addons/project_long_term/__init__.py
index 5a6ad27710f..8efcc1a0007 100644
--- a/addons/project_long_term/__init__.py
+++ b/addons/project_long_term/__init__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
@@ -15,12 +15,11 @@
# 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/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-import project
+import project_long_term
import wizard
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project_long_term/__terp__.py b/addons/project_long_term/__terp__.py
index 5367ff02567..25529f5b245 100644
--- a/addons/project_long_term/__terp__.py
+++ b/addons/project_long_term/__terp__.py
@@ -18,8 +18,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
-
{
"name" : "Long Term Project Management",
"version": "1.1",
@@ -27,15 +25,24 @@
"website" : "http://www.openerp.com",
"category" : "Generic Modules/Projects & Services",
"depends" : ["project", "resource"],
- "description": """Long Term Project management module that track planning, scheduling, resources allocation.
+ "description": """
+
+ Long Term Project management module that track planning, scheduling, resources allocation.
+ Mainly used with Big project management.
+ - Project Phases will be maintain by Manager of the project
+ - Compute Phase Scheduling: Compute start date and end date of the phases which are in draft,open and pending state of the project given.
+ If no project given then all the draft,open and pending states phases will be taken
+ - Compute Task Scheduling: This works same as the scheduler button on project.phase. It takes the project as arguement and computes all the open,draft and pending tasks
+ - Schedule Tasks: All the tasks which are in draft,pending and open states are scheduled with taking the phase's start date
+
""",
"init_xml" : [],
- "demo_xml" : ["project_demo.xml"],
+ "demo_xml" : ["project_long_term_demo.xml"],
"update_xml": [
- #"security/ir.model.access.csv",
- "project_wizard.xml" ,
- "project_view.xml",
- "project_workflow.xml"
+ "security/ir.model.access.csv",
+ "project_long_term_wizard.xml" ,
+ "project_long_term_view.xml",
+ "project_long_term_workflow.xml"
],
'installable': True,
'active': False,
diff --git a/addons/project_long_term/project_data_scheduler.xml b/addons/project_long_term/project_data_scheduler.xml
deleted file mode 100644
index 32e74725d58..00000000000
--- a/addons/project_long_term/project_data_scheduler.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data noupdate="1">
-
-
- <record forcecreate="True" id="ir_cron_scheduler_action" model="ir.cron">
- <field name="name">Calculate Project Task Length Scheduler</field>
- <field eval="False" name="active"/>
- <field name="user_id" ref="base.user_root"/>
- <field name="interval_number">1</field>
- <field name="interval_type">minutes</field>
- <field name="numbercall">-1</field>
- <field eval="False" name="doall"/>
- <field eval="True" name="active"/>
- <field eval="'project.project'" name="model"/>
- <field eval="'compute_date'" name="function"/>
- <!--<field model="project.project" search="[]" name="args"/>
- <field eval="select id from project.project" name="args"/>-->
- </record>
-
- </data>
-</openerp>
-
diff --git a/addons/project_long_term/project.py b/addons/project_long_term/project_long_term.py
index 595d3c82140..0ac0f902220 100644
--- a/addons/project_long_term/project.py
+++ b/addons/project_long_term/project_long_term.py
@@ -18,24 +18,23 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
from lxml import etree
import mx.DateTime
import time
+
from tools.translate import _
from osv import fields, osv
-
class project_phase(osv.osv):
_name = "project.phase"
_description = "Project Phase"
- def _check_recursion(self, cr, uid, ids):
- obj_self = self.browse(cr, uid, ids[0])
- prev_ids = obj_self.previous_phase_ids
- next_ids = obj_self.next_phase_ids
+ def _check_recursion(self, cr, uid, ids, context={}):
+ data_phase = self.browse(cr, uid, ids[0], context=context)
+ prev_ids = data_phase.previous_phase_ids
+ next_ids = data_phase.next_phase_ids
# it should nither be in prev_ids nor in next_ids
- if (obj_self in prev_ids) or (obj_self in next_ids):
+ if (data_phase in prev_ids) or (data_phase in next_ids):
return False
ids = [id for id in prev_ids if id in next_ids]
# both prev_ids and next_ids must be unique
@@ -48,7 +47,7 @@ class project_phase(osv.osv):
while prev_ids:
cr.execute('select distinct prv_phase_id from project_phase_rel where next_phase_id in ('+','.join(map(str, prev_ids))+')')
prv_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall()))
- if obj_self.id in prv_phase_ids:
+ if data_phase.id in prv_phase_ids:
return False
ids = [id for id in prv_phase_ids if id in next_ids]
if ids:
@@ -58,7 +57,7 @@ class project_phase(osv.osv):
while next_ids:
cr.execute('select distinct next_phase_id from project_phase_rel where prv_phase_id in ('+','.join(map(str, next_ids))+')')
next_phase_ids = filter(None, map(lambda x: x[0], cr.fetchall()))
- if obj_self.id in next_phase_ids:
+ if data_phase.id in next_phase_ids:
return False
ids = [id for id in next_phase_ids if id in prev_ids]
if ids:
@@ -66,33 +65,30 @@ class project_phase(osv.osv):
next_ids = next_phase_ids
return True
- def _check_dates(self, cr, uid, ids):
- phase = self.read(cr, uid, ids[0], ['date_start', 'date_end'])
- if phase['date_start'] and phase['date_end']:
- if phase['date_start'] > phase['date_end']:
- return False
+ def _check_dates(self, cr, uid, ids, context={}):
+ phase = self.read(cr, uid, ids[0], ['date_start', 'date_end'], context=context)
+ if phase['date_start'] and phase['date_end'] and phase['date_start'] > phase['date_end']:
+ return False
return True
- def _check_constraint_start(self, cr, uid, ids):
- phase = self.read(cr, uid, ids[0], ['date_start', 'constraint_date_start'])
- if phase['date_start'] and phase['constraint_date_start']:
- if phase['date_start'] < phase['constraint_date_start']:
- return False
+ def _check_constraint_start(self, cr, uid, ids, context={}):
+ phase = self.read(cr, uid, ids[0], ['date_start', 'constraint_date_start'], context=context)
+ if phase['date_start'] and phase['constraint_date_start'] and phase['date_start'] < phase['constraint_date_start']:
+ return False
return True
- def _check_constraint_end(self, cr, uid, ids):
- phase = self.read(cr, uid, ids[0], ['date_end', 'constraint_date_end'])
- if phase['date_end'] and phase['constraint_date_end']:
- if phase['date_end'] > phase['constraint_date_end']:
- return False
+ def _check_constraint_end(self, cr, uid, ids, context={}):
+ phase = self.read(cr, uid, ids[0], ['date_end', 'constraint_date_end'], context=context)
+ if phase['date_end'] and phase['constraint_date_end'] and phase['date_end'] > phase['constraint_date_end']:
+ return False
return True
_columns = {
'name': fields.char("Phase Name", size=64, required=True),
'date_start': fields.datetime('Starting Date'),
'date_end': fields.datetime('End Date'),
- 'constraint_date_start': fields.datetime('Constraint Starting Date'),
- 'constraint_date_end': fields.datetime('Constraint End Date'),
+ 'constraint_date_start': fields.datetime('Start Date', help='force the phase to start after this date'),
+ 'constraint_date_end': fields.datetime('End Date', help='force the phase to finish before this date'),
'project_id': fields.many2one('project.project', 'Project', required=True),
'next_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'prv_phase_id', 'next_phase_id', 'Next Phases'),
'previous_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'next_phase_id', 'prv_phase_id', 'Previous Phases'),
@@ -120,73 +116,73 @@ class project_phase(osv.osv):
(_check_constraint_end, 'Error! Phase must end-before Constraint End Date.', ['date_end', 'constraint_date_end']),
]
- def onchange_project(self, cr, uid, ids, project):
+ def onchange_project(self, cr, uid, ids, project, context={}):
result = {}
+ project_obj = self.pool.get('project.project')
if project:
- project_obj = self.pool.get('project.project')
- project_id = project_obj.browse(cr, uid, project)
- if project_id.date_start:
- result['date_start'] = mx.DateTime.strptime(project_id.date_start, "%Y-%m-%d").strftime('%Y-%m-%d %H:%M:%S')
- return {'value': result}
+ project_id = project_obj.browse(cr, uid, project, context=context)
+ if project_id.date_start:
+ result['date_start'] = mx.DateTime.strptime(project_id.date_start, "%Y-%m-%d").strftime('%Y-%m-%d %H:%M:%S')
+ return {'value': result}
return {'value': {'date_start': []}}
- def _check_date_start(self, cr, uid, phase, date_end, context=None):
+ def _check_date_start(self, cr, uid, phase, date_end, context={}):
"""
Check And Compute date_end of phase if change in date_start < older time.
"""
- resource_calendar_obj = self.pool.get('resource.calendar')
uom_obj = self.pool.get('product.uom')
resource_obj = self.pool.get('resource.resource')
- calendar_id = phase.project_id.resource_calendar_id.id
+ cal_obj = self.pool.get('resource.calendar')
+ calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)])
if resource_id:
- cal_id = resource_obj.browse(cr, uid, resource_id[0]).calendar_id.id
+# cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id
+ res = resource_obj.read(cr, uid, resource_id[0], ['calendar_id'], context=context)[0]
+ cal_id = res.get('calendar_id', False) and res.get('calendar_id')[0] or False
if cal_id:
calendar_id = cal_id
- default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')])[0]
+ default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')], context=context)[0]
avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
- work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id or False, date_end, avg_hours or 0.0, resource_id or False)
+ work_times = cal_obj.interval_min_get(cr, uid, calendar_id, date_end, avg_hours or 0.0, resource_id and resource_id[0] or False)
dt_start = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr, uid, [phase.id], {'date_start': dt_start, 'date_end': date_end.strftime('%Y-%m-%d %H:%M:%S')})
+ self.write(cr, uid, [phase.id], {'date_start': dt_start, 'date_end': date_end.strftime('%Y-%m-%d %H:%M:%S')}, context=context)
- def _check_date_end(self, cr, uid, phase, date_start, context=None):
+ def _check_date_end(self, cr, uid, phase, date_start, context={}):
"""
Check And Compute date_end of phase if change in date_end > older time.
"""
- resource_calendar_obj = self.pool.get('resource.calendar')
uom_obj = self.pool.get('product.uom')
resource_obj = self.pool.get('resource.resource')
- calendar_id = phase.project_id.resource_calendar_id.id
- resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)])
+ cal_obj = self.pool.get('resource.calendar')
+ calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
+ resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)], context=context)
if resource_id:
- cal_id = resource_obj.browse(cr, uid, resource_id[0]).calendar_id.id
+# cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id
+ res = resource_obj.read(cr, uid, resource_id[0], ['calendar_id'], context=context)[0]
+ cal_id = res.get('calendar_id', False) and res.get('calendar_id')[0] or False
if cal_id:
calendar_id = cal_id
- default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')])[0]
+ default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')], context=context)[0]
avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id)
- work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id or False, date_start, avg_hours or 0.0, resource_id or False)
+ work_times = cal_obj.interval_get(cr, uid, calendar_id, date_start, avg_hours or 0.0, resource_id and resource_id[0] or False)
dt_end = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr, uid, [phase.id], {'date_start': date_start.strftime('%Y-%m-%d %H:%M:%S'), 'date_end': dt_end})
-
- def write(self, cr, uid, ids, vals, context=None):
+ self.write(cr, uid, [phase.id], {'date_start': date_start.strftime('%Y-%m-%d %H:%M:%S'), 'date_end': dt_end}, context=context)
+ def write(self, cr, uid, ids, vals, context={}):
+ resource_calendar_obj = self.pool.get('resource.calendar')
+ resource_obj = self.pool.get('resource.resource')
+ uom_obj = self.pool.get('product.uom')
if not context:
context = {}
-
if context.get('scheduler',False):
return super(project_phase, self).write(cr, uid, ids, vals, context=context)
-
# Consider calendar and efficiency if the phase is performed by a resource
# otherwise consider the project's working calendar
- phase = self.browse(cr, uid, ids[0])
- resource_calendar_obj = self.pool.get('resource.calendar')
- resource_obj = self.pool.get('resource.resource')
- uom_obj = self.pool.get('product.uom')
- resource_id = False
- calendar_id = phase.project_id.resource_calendar_id.id
- resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)])
+ phase = self.browse(cr, uid, ids[0], context=context)
+ calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
+ resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)],context=context)
if resource_id:
- cal_id = resource_obj.browse(cr, uid, resource_id[0]).calendar_id.id
+ cal_id = resource_obj.browse(cr, uid, resource_id[0], context=context).calendar_id.id
if cal_id:
calendar_id = cal_id
default_uom_id = uom_obj.search(cr, uid, [('name', '=', 'Hour')])[0]
@@ -194,25 +190,20 @@ class project_phase(osv.osv):
# Change the date_start and date_end
# for previous and next phases respectively based on valid condition
- if vals.get('date_start'):
- if vals['date_start'] < phase.date_start:
+ if vals.get('date_start', False) and vals['date_start'] < phase.date_start:
dt_start = mx.DateTime.strptime(vals['date_start'],'%Y-%m-%d %H:%M:%S')
- work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id or False, dt_start, avg_hours or 0.0, resource_id or False)
- vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- super(project_phase, self).write(cr, uid, ids, vals, context=context)
-
+ work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, dt_start, avg_hours or 0.0, resource_id and resource_id[0] or False)
+ if work_times:
+ vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
for prv_phase in phase.previous_phase_ids:
- self._check_date_start(cr, uid, prv_phase, dt_start)
- if vals.get('date_end'):
- if vals['date_end'] > phase.date_end:
+ self._check_date_start(cr, uid, prv_phase, dt_start, context=context)
+ if vals.get('date_end', False) and vals['date_end'] > phase.date_end:
dt_end = mx.DateTime.strptime(vals['date_end'],'%Y-%m-%d %H:%M:%S')
- work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id or False, dt_end, avg_hours or 0.0, resource_id or False)
- vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
- super(project_phase, self).write(cr, uid, ids, vals, context=context)
-
+ work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, dt_end, avg_hours or 0.0, resource_id and resource_id[0] or False)
+ if work_times:
+ vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
for next_phase in phase.next_phase_ids:
- self._check_date_end(cr, uid, next_phase, dt_end)
-
+ self._check_date_end(cr, uid, next_phase, dt_end, context=context)
return super(project_phase, self).write(cr, uid, ids, vals, context=context)
def set_draft(self, cr, uid, ids, *args):
@@ -276,66 +267,70 @@ class task(osv.osv):
def onchange_planned(self, cr, uid, ids, project, user_id=False, planned=0.0, effective=0.0, date_start=None, occupation_rate=0.0):
result = {}
+ resource = False
+ resource_obj = self.pool.get('resource.resource')
+ project_pool = self.pool.get('project.project')
+ resource_calendar = self.pool.get('resource.calendar')
+ if not project:
+ return {'value' : result}
if date_start:
- resource_obj = self.pool.get('resource.resource')
- project_pool = self.pool.get('project.project')
hrs = float(planned / float(occupation_rate))
calendar_id = project_pool.browse(cr, uid, project).resource_calendar_id.id
- resource_calendar = self.pool.get('resource.calendar')
dt_start = mx.DateTime.strptime(date_start, '%Y-%m-%d %H:%M:%S')
resource_id = resource_obj.search(cr, uid, [('user_id','=',user_id)])
if resource_id:
- resource = resource_obj.browse(cr, uid, resource_id)[0]
- hrs = planned / (float(occupation_rate) * resource.time_efficiency)
- if resource.calendar_id.id:
- calendar_id = resource.calendar_id.id
- work_times = resource_calendar.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0, resource_id or False)
- result['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
+ resource_data = resource_obj.browse(cr, uid, resource_id)[0]
+ resource = resource_data.id
+ hrs = planned / (float(occupation_rate) * resource_data.time_efficiency)
+ if resource_data.calendar_id.id:
+ calendar_id = resource_data.calendar_id.id
+ work_times = resource_calendar.interval_get(cr, uid, calendar_id, dt_start, hrs or 0.0, resource or False)
+ if work_times:
+ result['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
result['remaining_hours'] = planned - effective
return {'value' : result}
- def _check_date_start(self, cr, uid, task, date_end, context=None):
+ def _check_date_start(self, cr, uid, task, date_end, context={}):
"""
Check And Compute date_end of task if change in date_start < older time.
"""
resource_calendar_obj = self.pool.get('resource.calendar')
resource_obj = self.pool.get('resource.resource')
- calendar_id = task.project_id.resource_calendar_id.id
+ calendar_id = task.project_id.resource_calendar_id and task.project_id.resource_calendar_id.id or False
hours = task.planned_hours / task.occupation_rate
- resource_id = resource_obj.search(cr, uid, [('user_id', '=', task.user_id.id)])
+ resource_id = resource_obj.search(cr, uid, [('user_id', '=', task.user_id.id)], context=context)
if resource_id:
- resource = resource_obj.browse(cr, uid, resource_id[0])
+ resource = resource_obj.browse(cr, uid, resource_id[0], context=context)
if resource.calendar_id.id:
- calendar_id = resource.calendar_id.id
+ calendar_id = resource.calendar_id and resource.calendar_id.id or False
hours = task.planned_hours / (float(task.occupation_rate) * resource.time_efficiency)
- work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id or False, date_end, hours or 0.0, resource_id or False)
+ work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, date_end, hours or 0.0, resource_id and resource_id[0] or False)
dt_start = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
self.write(cr, uid, [task.id], {'date_start' : dt_start,'date_end' : date_end.strftime('%Y-%m-%d %H:%M:%S')})
- def _check_date_end(self, cr, uid, task, date_start, context=None):
+ def _check_date_end(self, cr, uid, task, date_start, context={}):
"""
Check And Compute date_end of task if change in date_end > older time.
"""
-
resource_calendar_obj = self.pool.get('resource.calendar')
resource_obj = self.pool.get('resource.resource')
- calendar_id = task.project_id.resource_calendar_id.id
+ calendar_id = task.project_id.resource_calendar_id and task.project_id.resource_calendar_id.id or False
hours = task.planned_hours / task.occupation_rate
- resource_id = resource_obj.search(cr,uid,[('user_id', '=', task.user_id.id)])
+ resource_id = resource_obj.search(cr,uid,[('user_id', '=', task.user_id.id)], context=context)
if resource_id:
- resource = resource_obj.browse(cr, uid, resource_id[0])
+ resource = resource_obj.browse(cr, uid, resource_id[0], context=context)
if resource.calendar_id.id:
- calendar_id = resource.calendar_id.id
+ calendar_id = resource.calendar_id and resource.calendar_id.id or False
hours = task.planned_hours / (float(task.occupation_rate) * resource.time_efficiency)
- work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id or False, date_start, hours or 0.0, resource_id or False)
+ work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, date_start, hours or 0.0, resource_id and resource_id[0] or False)
dt_end = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- self.write(cr, uid, [task.id], {'date_start' : date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end' : dt_end})
-
- def write(self, cr, uid, ids, vals, context=None):
+ self.write(cr, uid, [task.id], {'date_start': date_start.strftime('%Y-%m-%d %H:%M:%S'),'date_end' : dt_end}, context=context)
+ def write(self, cr, uid, ids, vals, context={}):
+ resource_calendar_obj = self.pool.get('resource.calendar')
+ resource_obj = self.pool.get('resource.resource')
if not context:
context = {}
-
if context.get('scheduler',False):
return super(task, self).write(cr, uid, ids, vals, context=context)
@@ -345,40 +340,33 @@ class task(osv.osv):
if isinstance(ids, list):
task_id = ids[0]
task_rec = self.browse(cr, uid, task_id, context=context)
- resource_calendar_obj = self.pool.get('resource.calendar')
- resource_obj = self.pool.get('resource.resource')
- calendar_id = task_rec.project_id.resource_calendar_id.id
+ calendar_id = task_rec.project_id.resource_calendar_id and task_rec.project_id.resource_calendar_id.id or False
hrs = task_rec.planned_hours / task_rec.occupation_rate
- resource_id = resource_obj.search(cr, uid, [('user_id', '=', task_rec.user_id.id)])
+ resource_id = resource_obj.search(cr, uid, [('user_id', '=', task_rec.user_id.id)], context=context)
if resource_id:
- resource = resource_obj.browse(cr, uid, resource_id[0])
+ resource = resource_obj.browse(cr, uid, resource_id[0], context=context)
if resource.calendar_id.id:
- calendar_id = resource.calendar_id.id
+ calendar_id = resource.calendar_id and resource.calendar_id.id or False
hrs = task_rec.planned_hours / (float(task_rec.occupation_rate) * resource.time_efficiency)
# Change the date_start and date_end
# for previous and next tasks respectively based on valid condition
- if vals.get('date_start'):
- if vals['date_start'] < task_rec.date_start:
- dt_start = mx.DateTime.strptime(vals['date_start'], '%Y-%m-%d %H:%M:%S')
- work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id or False, dt_start, hrs or 0.0, resource_id or False)
+ if vals.get('date_start', False) and vals['date_start'] < task_rec.date_start:
+ dt_start = mx.DateTime.strptime(vals['date_start'], '%Y-%m-%d %H:%M:%S')
+ work_times = resource_calendar_obj.interval_get(cr, uid, calendar_id, dt_start, hrs or 0.0, resource.id or False)
+ if work_times:
vals['date_end'] = work_times[-1][1].strftime('%Y-%m-%d %H:%M:%S')
- super(task, self).write(cr, uid, ids, vals, context=context)
-
- for prv_task in task_rec.parent_ids:
- self._check_date_start(cr, uid, prv_task, dt_start)
- if vals.get('date_end'):
- if vals['date_end'] > task_rec.date_end:
- dt_end = mx.DateTime.strptime(vals['date_end'], '%Y-%m-%d %H:%M:%S')
- work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id or False, dt_end, hrs or 0.0, resource_id or False)
+ for prv_task in task_rec.parent_ids:
+ self._check_date_start(cr, uid, prv_task, dt_start)
+ if vals.get('date_end', False) and vals['date_end'] > task_rec.date_end:
+ dt_end = mx.DateTime.strptime(vals['date_end'], '%Y-%m-%d %H:%M:%S')
+ work_times = resource_calendar_obj.interval_min_get(cr, uid, calendar_id, dt_end, hrs or 0.0, resource.id or False)
+ if work_times:
vals['date_start'] = work_times[0][0].strftime('%Y-%m-%d %H:%M:%S')
- super(task, self).write(cr, uid, ids, vals, context=context)
-
- for next_task in task_rec.child_ids:
- self._check_date_end(cr, uid, next_task, dt_end)
+ for next_task in task_rec.child_ids:
+ self._check_date_end(cr, uid, next_task, dt_end)
return super(task, self).write(cr, uid, ids, vals, context=context)
task()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project_long_term/project_data.xml b/addons/project_long_term/project_long_term_data.xml
index 2addd68fa19..32d041544cc 100644
--- a/addons/project_long_term/project_data.xml
+++ b/addons/project_long_term/project_long_term_data.xml
@@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
- <!--
- Requests Links
- -->
+ <!-- Requests Links -->
<record id="req_link_project" model="res.request.link">
<field name="name">Project</field>
<field name="object">project.project</field>
diff --git a/addons/project_long_term/project_demo.xml b/addons/project_long_term/project_long_term_demo.xml
index 24bc7ff9438..24bc7ff9438 100644
--- a/addons/project_long_term/project_demo.xml
+++ b/addons/project_long_term/project_long_term_demo.xml
diff --git a/addons/project_long_term/project_report.xml b/addons/project_long_term/project_long_term_report.xml
index c3b681cdd8b..3bbbce1874c 100644
--- a/addons/project_long_term/project_report.xml
+++ b/addons/project_long_term/project_long_term_report.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
-
<report auto="False" id="report_project_task_gantt" model="project.task" name="project.tasks.gantt" string="Gantt Representation"/>
<report auto="False" id="report_project_project_gantt" model="project.project" name="project.project.gantt" string="Gantt Representation"/>
</data>
diff --git a/addons/project_long_term/project_view.xml b/addons/project_long_term/project_long_term_view.xml
index 0af1e09c422..53eaba2e4a9 100644
--- a/addons/project_long_term/project_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -48,7 +48,7 @@
<field name="responsible_id"/>
<field name="date_start"/>
<field name="date_end"/>
- <field name="duration"/>
+ <field name="duration" widget="float_time"/>
<field name="product_uom"/>
</group>
<notebook colspan="4">
@@ -68,9 +68,9 @@
<field name="state" select="1"/>
<button string="Draft" name="set_draft" states="open" icon="gtk-indent"/>
<button string="Start Phase" name="set_open" states="pending,draft" icon="gtk-execute"/>
- <button string="Cancel" name="set_cancel" states="draft,open,pending" icon="gtk-cancel"/>
<button string="Done" name="set_done" states="draft,pending,open" icon="gtk-jump-to"/>
<button string="Pending" name="set_pending" states="open" icon="gtk-media-pause"/>
+ <button string="Cancel" name="set_cancel" states="draft,open,pending" icon="gtk-cancel"/>
</group>
</page>
<page string="Other Info">
@@ -83,10 +83,10 @@
<separator string="Scheduling" colspan="2"/>
<field name="sequence"/>
</group>
- <separator colspan="4" string="Next Phases"/>
- <field colspan="4" name="next_phase_ids" nolabel="1"/>
<separator colspan="4" string="Previous Phases"/>
<field colspan="4" name="previous_phase_ids" nolabel="1"/>
+ <separator colspan="4" string="Next Phases"/>
+ <field colspan="4" name="next_phase_ids" nolabel="1"/>
</page>
<page string="Task Detail">
<separator colspan="4" string="Project's Tasks"/>
@@ -101,7 +101,7 @@
<field name="remaining_hours" widget="float_time" sum="Remaining Hours"/>
<field name="effective_hours" invisible="1"/>
<field name="state"/>
- <field name="occupation_rate" invisible="1"/>
+ <field name="occupation_rate"/>
</tree>
<form string="Project's Tasks">
<notebook colspan="4">
@@ -115,7 +115,7 @@
<separator string="Dates" colspan="2"/>
<field name="date_start"/>
<field name="date_deadline"/>
- <field name="occupation_rate" invisible="1"/>
+ <field name="occupation_rate"/>
</group>
<group colspan="2" col="2">
<separator string="Planning" colspan="2"/>
@@ -149,9 +149,10 @@
<field name="project_id" on_change="onchange_project(project_id)"/>
<field name="responsible_id"/>
<field name="date_start"/>
- <field name="date_end"/>
+ <!--<field name="date_end"/>
<field name="duration"/>
- <field name="product_uom"/>
+ <field name="product_uom"/>-->
+ <field name="state"/>
</tree>
</field>
</record>
@@ -190,17 +191,23 @@
<field name="arch" type="xml">
<search string="Project Phases">
<group colspan="4" col="20">
+ <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Phases" icon="terp-project" default="1"/>
+ <filter string="In Progress" domain="[('state','=','open')]" help="Open Phases" icon="terp-project"/>
+ <filter string="Pending" domain="[('state','=','pending')]" help="Pending Phases" icon="terp-project"/>
<field name="name"/>
- <field name="project_id" widget="selection"/>
- <field name="responsible_id">
+ <field name="project_id" widget="selection">
+ <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
+ </field>
+ <field name="responsible_id" widget="selection">
<filter domain="[('responsible_id','=',uid)]" help="My Phase" icon="gtk-execute" default="1"/>
</field>
<field name="date_start"/>
- <field name="date_end"/>
+ <!--<field name="date_end"/>-->
</group>
<newline/>
<group expand="1" string="Group By..." colspan="4" col="20">
<filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
+ <filter string="State" icon="terp-project" domain="[]" context="{'group_by':'state'}"/>
<filter string="User" icon="terp-project" domain="[]" context="{'group_by':'responsible_id'}"/>
<filter string="Start Date" icon="terp-project" domain="[]" context="{'group_by':'date_start'}"/>
</group>
@@ -209,7 +216,7 @@
</record>
<record id="act_project_phase" model="ir.actions.act_window">
- <field name="name">Project phases</field>
+ <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,gantt</field>
diff --git a/addons/project_long_term/project_wizard.xml b/addons/project_long_term/project_long_term_wizard.xml
index c61a1042003..0904bbb4429 100644
--- a/addons/project_long_term/project_wizard.xml
+++ b/addons/project_long_term/project_long_term_wizard.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
+
<wizard id="wizard_compute_phase" menu="False" model="project.phase" name="wizard.compute.phases" string="Compute Phase Scheduling"/>
<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 id="base.menu_pm_planning" name="Planning" parent="base.menu_main" sequence="3"/>
<menuitem
@@ -19,5 +21,6 @@
parent="base.menu_pm_planning"
type="wizard"
sequence="1"/>
+
</data>
</openerp>
diff --git a/addons/project_long_term/project_workflow.xml b/addons/project_long_term/project_long_term_workflow.xml
index f476ac16cd6..f476ac16cd6 100644
--- a/addons/project_long_term/project_workflow.xml
+++ b/addons/project_long_term/project_long_term_workflow.xml
diff --git a/addons/project_long_term/wizard/compute_phases_date.py b/addons/project_long_term/wizard/compute_phases_date.py
index 3c14d7525aa..61f3bb42251 100644
--- a/addons/project_long_term/wizard/compute_phases_date.py
+++ b/addons/project_long_term/wizard/compute_phases_date.py
@@ -18,14 +18,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+import datetime
+from resource.faces import *
+from new import classobj
import wizard
import pooler
from tools.translate import _
-import datetime
-
-from resource.faces import *
-from new import classobj
import working_calendar as wkcal
@@ -37,7 +36,7 @@ compute_form = """<?xml version="1.0" ?>
</form>"""
compute_fields = {
- 'project_id': {'string':'Project', 'type':'many2one', 'relation':'project.project'},
+ 'project_id': {'string':'Project', 'type':'many2one', 'relation':'project.project', 'help': 'If you do not specify project then it will take All projects with state=draft, open, pending'},
}
@@ -50,7 +49,6 @@ class wizard_compute_phases(wizard.interface):
calendar_id -- working calendar of the project
"""
-
pool = pooler.get_pool(cr.dbname)
phase_obj = pool.get('project.phase')
resource_obj = pool.get('resource.resource')
@@ -60,13 +58,14 @@ class wizard_compute_phases(wizard.interface):
leaves = []
time_efficiency = 1.0
resource_id = resource_obj.search(cr, uid, [('user_id', '=', phase.responsible_id.id)])
+
if resource_id:
# Create a new resource object with
# all the attributes of the Resource Class
resource = resource_obj.browse(cr, uid, resource_id, context=context)[0]
time_efficiency = resource.time_efficiency
- leaves = wkcal.compute_leaves(cr, uid, calendar_id or False , resource_id, resource.calendar_id.id)
- phase_resource_obj = classobj(str(phase.responsible_id.name), (Resource,),
+ leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource.id, resource.calendar_id.id)
+ phase_resource_obj = classobj((phase.responsible_id.name.encode('utf8')), (Resource,),
{'__doc__': phase.responsible_id.name,
'__name__': phase.responsible_id.name,
'vacation': tuple(leaves),
@@ -83,7 +82,7 @@ class wizard_compute_phases(wizard.interface):
# If project has working calendar then that
# else the default one would be considered
if calendar_id:
- working_days = wkcal.compute_working_calendar(cr, uid, calendar_id)
+ working_days = wkcal.compute_working_calendar(cr, uid, calendar_id, context=context)
vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id))
def phase():
@@ -105,18 +104,20 @@ class wizard_compute_phases(wizard.interface):
end_date = e_date
date_start = end_date
# Write the calculated dates back
+ ctx = context.copy()
+ ctx.update({'scheduler': True})
phase_obj.write(cr, uid, [phase.id], {'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'),
'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S')},
- context={'scheduler': True
- })
+ context=ctx)
# Recursive call till all the next phases scheduled
for phase in phase.next_phase_ids:
if phase.state in ['draft','open','pending']:
- self._phase_schedule(cr, uid, phase, date_start, phase.project_id.resource_calendar_id.id or False)
+ id_cal = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
+ self._phase_schedule(cr, uid, phase, date_start, id_cal, context=context)
else:
continue
- def _compute_date(self, cr, uid, data, context):
+ def _compute_date(self, cr, uid, data, context={}):
"""
Compute the phases for scheduling.
"""
@@ -132,24 +133,25 @@ class wizard_compute_phases(wizard.interface):
else: # Else take all the draft,open,pending states phases
phase_ids = phase_obj.search(cr, uid,[('state', 'in', ['draft', 'open', 'pending']),
('previous_phase_ids', '=', False)
- ])
+ ], context=context)
phase_ids.sort()
- phase_objs = phase_obj.browse(cr, uid, phase_ids, context=context)
- for phase in phase_objs:
+ phases = phase_obj.browse(cr, uid, phase_ids, context=context)
+ for phase in phases:
start_date = phase.project_id.date_start
if not phase.project_id.date_start:
start_date = datetime.datetime.now().strftime("%Y-%m-%d")
start_dt = datetime.datetime.strftime((datetime.datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M")
- calendar_id = phase.project_id.resource_calendar_id.id
- self._phase_schedule(cr, uid, phase, start_dt, calendar_id or False)
+ calendar_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
+ self._phase_schedule(cr, uid, phase, start_dt, calendar_id, context=context)
return {}
def _open_phases_list(self, cr, uid, data, context):
"""
Return the scheduled phases list.
"""
- mod_obj = pooler.get_pool(cr.dbname).get('ir.model.data')
- act_obj = pooler.get_pool(cr.dbname).get('ir.actions.act_window')
+ pool = pooler.get_pool(cr.dbname)
+ mod_obj = pool.get('ir.model.data')
+ act_obj = pool.get('ir.actions.act_window')
result = mod_obj._get_id(cr, uid, 'project_long_term', 'act_project_phase')
id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id']
result = act_obj.read(cr, uid, [id], context=context)[0]
@@ -162,15 +164,15 @@ class wizard_compute_phases(wizard.interface):
states = {
'init': {
'actions': [],
- 'result': {'type':'form', 'arch':compute_form, 'fields':compute_fields, 'state':[
- ('end', 'Cancel'),
- ('compute', 'Compute')
+ 'result': {'type': 'form', 'arch': compute_form, 'fields': compute_fields, 'state':[
+ ('end', 'Cancel', 'gtk-cancel'),
+ ('compute', 'Compute', 'gtk-ok', True)
]},
},
'compute': {
'actions': [_compute_date],
- 'result': {'type': 'action', 'action':_open_phases_list, 'state':'end'},
+ 'result': {'type': 'action', 'action': _open_phases_list, 'state': 'end'},
},
}
wizard_compute_phases('wizard.compute.phases')
diff --git a/addons/project_long_term/wizard/compute_tasks_date.py b/addons/project_long_term/wizard/compute_tasks_date.py
index cc6a443a454..77e7bbd6512 100644
--- a/addons/project_long_term/wizard/compute_tasks_date.py
+++ b/addons/project_long_term/wizard/compute_tasks_date.py
@@ -18,18 +18,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
-import wizard
-import pooler
-from tools.translate import _
import datetime
-
from resource.faces import *
from new import classobj
import operator
import working_calendar as wkcal
+import wizard
+import pooler
+from tools.translate import _
+
compute_form = """<?xml version="1.0" ?>
<form string="Compute Scheduling of Tasks">
<field name="project_id" colspan="4"/>
@@ -41,7 +40,7 @@ success_msg = """<?xml version="1.0" ?>
</form>"""
compute_fields = {
- 'project_id': {'string':'Project', 'type':'many2one', 'relation':'project.project', 'required':'True'},
+ 'project_id': {'string':'Project', 'type':'many2one', 'relation':'project.project', 'required':True},
}
class wizard_compute_tasks(wizard.interface):
@@ -62,8 +61,8 @@ class wizard_compute_tasks(wizard.interface):
])
if task_ids:
task_ids.sort()
- task_objs = task_pool.browse(cr, uid, task_ids, context=context)
- calendar_id = project.resource_calendar_id.id
+ tasks = task_pool.browse(cr, uid, task_ids, context=context)
+ calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False
start_date = project.date_start
if not project.date_start:
start_date = datetime.datetime.now().strftime("%Y-%m-%d")
@@ -73,12 +72,14 @@ class wizard_compute_tasks(wizard.interface):
for user in project.members:
leaves = []
time_efficiency = 1.0
- resource_id = resource_obj.search(cr, uid, [('user_id', '=', user.id)])
+ resource_id = resource_obj.search(cr, uid, [('user_id', '=', user.id)], context=context)
if resource_id:
- resource = resource_obj.browse(cr, uid, resource_id, context=context)[0]
- leaves = wkcal.compute_leaves(cr, uid, calendar_id or False , resource_id, resource.calendar_id.id)
- time_efficiency = resource.time_efficiency
- resources.append(classobj(str(user.name), (Resource,), {'__doc__': user.name,
+# resource = resource_obj.browse(cr, uid, resource_id, context=context)[0]
+ resource = resource_obj.read(cr, uid, resource_id, ['calendar_id','time_efficiency'], context=context)[0]
+ if resource.get('calendar_id', False):
+ leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource_id[0], resource['calendar_id'] and resource['calendar_id'][0] or False)
+ time_efficiency = resource.get('time_efficiency')
+ resources.append(classobj((user.name.encode('utf8')), (Resource,), {'__doc__': user.name,
'__name__': user.name,
'vacation': tuple(leaves),
'efficiency': time_efficiency
@@ -105,20 +106,20 @@ class wizard_compute_tasks(wizard.interface):
try:
resource = reduce(operator.or_, resources)
except:
- raise wizard.except_wizard(_('MemberError'), _('Project must have members assigned !'))
+ raise wizard.except_wizard(_('Error'), _('Project must have members assigned !'))
minimum_time_unit = 1
if calendar_id: # If project has calendar
working_days = wkcal.compute_working_calendar(cr, uid, calendar_id)
vacation = tuple(wkcal.compute_leaves(cr, uid, calendar_id))
# Dynamic Creation of tasks
i = 0
- for each_task in task_objs:
+ for each_task in tasks:
hours = str(each_task.planned_hours / each_task.occupation_rate)+ 'H'
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:
+ if resource.__name__ == each_task.user_id.name: # check me!!
task = create_tasks(i, hours, priorty, resource)
else:
task = create_tasks(i, hours, priorty)
@@ -131,29 +132,30 @@ class wizard_compute_tasks(wizard.interface):
s_date = t.start.to_datetime()
e_date = t.end.to_datetime()
if loop_no == 0:
- project_obj.write(cr, uid, [project_id], {'date' : e_date})
+ project_obj.write(cr, uid, [project_id], {'date' : e_date}, context=context)
else:
+ ctx = context.copy()
+ ctx.update({'scheduler': True})
user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)])
- task_pool.write(cr, uid, [task_objs[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'),
+ task_pool.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'),
'date_deadline': e_date.strftime('%Y-%m-%d %H:%M:%S'),
'user_id': user_id[0]},
- context={'scheduler': True
- })
+ context=ctx)
loop_no +=1
return {}
states = {
'init': {
'actions': [],
- 'result': {'type':'form', 'arch':compute_form, 'fields':compute_fields, 'state':[
- ('end', 'Cancel'),
- ('compute', 'Compute')
+ 'result': {'type': 'form', 'arch': compute_form, 'fields': compute_fields, 'state': [
+ ('end', 'Cancel', 'gtk-cancel'),
+ ('compute', 'Compute', 'gtk-ok', True)
]},
},
'compute': {
'actions': [_compute_date],
- 'result': {'type':'form','arch':success_msg,'fields':{}, 'state':[('end', 'Ok')]},
+ 'result': {'type': 'form','arch': success_msg,'fields': {}, 'state': [('end', 'Ok')]},
}
}
wizard_compute_tasks('wizard.compute.tasks')
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
diff --git a/addons/project_long_term/wizard/schedule_tasks.py b/addons/project_long_term/wizard/schedule_tasks.py
index 6db678333a9..4a170859032 100644
--- a/addons/project_long_term/wizard/schedule_tasks.py
+++ b/addons/project_long_term/wizard/schedule_tasks.py
@@ -18,18 +18,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-
-import wizard
-import pooler
-from tools.translate import _
import datetime
-
from resource.faces import *
from new import classobj
import operator
import working_calendar as wkcal
+import wizard
+import pooler
+from tools.translate import _
+
success_msg = """<?xml version="1.0" ?>
<form string="Compute Scheduling of Tasks">
<label string="Task Scheduling completed successfully."/>
@@ -48,8 +47,9 @@ class wizard_schedule_task(wizard.interface):
resource_eff = res.time_efficiency
resource_cal = res.calendar_id.id
if resource_cal:
- leaves = wkcal.compute_leaves(cr, uid, phase.project_id.resource_calendar_id.id or False, res.id, resource_cal)
- resource_objs.append(classobj(str(res.user_id.name), (Resource,),
+ cal_id = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False
+ leaves = wkcal.compute_leaves(cr, uid, cal_id, res.id, resource_cal, context=context)
+ resource_objs.append(classobj(res.user_id.name.encode('utf8'), (Resource,),
{'__doc__': res.user_id.name,
'__name__': res.user_id.name,
'vacation': tuple(leaves),
@@ -57,7 +57,7 @@ class wizard_schedule_task(wizard.interface):
}))
return resource_objs
- def _compute_date(self, cr, uid, data, context):
+ def _compute_date(self, cr, uid, data, context={}):
"""
Schedule the tasks according to resource available and priority.
"""
@@ -101,7 +101,7 @@ class wizard_schedule_task(wizard.interface):
try:
resource = reduce(operator.or_, resources)
except:
- raise wizard.except_wizard(_('ResourceError'), _('Phase must have resources assigned !'))
+ raise wizard.except_wizard(_('Error'), _('Phase must have resources assigned !'))
minimum_time_unit = 1
if calendar_id: # If project has working calendar
working_days = wkcal.compute_working_calendar(cr, uid, calendar_id)
@@ -127,18 +127,19 @@ class wizard_schedule_task(wizard.interface):
s_date = t.start.to_datetime()
e_date = t.end.to_datetime()
if loop_no > 0:
+ ctx = context.copy()
+ ctx.update({'scheduler': True})
user_id = user_obj.search(cr, uid, [('name', '=', t.booked_resource[0].__name__)])
task_obj.write(cr, uid, [tasks[loop_no-1].id], {'date_start': s_date.strftime('%Y-%m-%d %H:%M:%S'),
'date_deadline': e_date.strftime('%Y-%m-%d %H:%M:%S'),
'user_id': user_id[0]},
- context={'scheduler': True
- })
+ context=ctx)
loop_no +=1
return {}
states = {
'init': {
'actions': [_compute_date],
- 'result': {'type':'form','arch':success_msg,'fields':{}, 'state':[('end', 'Ok')]},
+ 'result': {'type':'form','arch':success_msg,'fields':{}, 'state':[('end', 'Ok', 'gtk-ok', True)]},
}
}
wizard_schedule_task('phase.schedule.tasks')
diff --git a/addons/project_long_term/wizard/working_calendar.py b/addons/project_long_term/wizard/working_calendar.py
index faddcdd0011..ba8ec7db150 100644
--- a/addons/project_long_term/wizard/working_calendar.py
+++ b/addons/project_long_term/wizard/working_calendar.py
@@ -18,9 +18,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
+import datetime
import pooler
-import datetime
def convert_timeformat(cr, uid, time_string, context={}):
""" Convert input time string: 8.5 to output time string 8:30."""
@@ -32,7 +32,7 @@ def convert_timeformat(cr, uid, time_string, context={}):
converted_string = hour_part + ':' + str(round_mins)[0:2]
return converted_string
-def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=False):
+def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=False, context={}):
"""Compute the leaves from the working calendar of the resource.
@@ -49,21 +49,21 @@ def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=Fa
leave_ids = resource_calendar_leaves_obj.search(cr, uid, ['|', ('calendar_id', '=', calendar_id),
('calendar_id', '=', resource_calendar),
('resource_id', '=', resource_id)
- ])
+ ], context=context)
else:
leave_ids = resource_calendar_leaves_obj.search(cr, uid, [('calendar_id', '=', calendar_id),
('resource_id', '=', False)
- ])
- leaves = resource_calendar_leaves_obj.read(cr, uid, leave_ids, ['date_from', 'date_to'])
+ ], context=context)
+ leaves = resource_calendar_leaves_obj.read(cr, uid, leave_ids, ['date_from', 'date_to'], context=context)
for i in range(len(leaves)):
- dt_start = datetime.datetime.strptime(leaves[i]['date_from'], '%Y-%m-%d %H:%M:%S')
- dt_end = datetime.datetime.strptime(leaves[i]['date_to'], '%Y-%m-%d %H:%M:%S')
- no = dt_end - dt_start
- [leave_list.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))]
- leave_list.sort()
+ dt_start = datetime.datetime.strptime(leaves[i]['date_from'], '%Y-%m-%d %H:%M:%S')
+ dt_end = datetime.datetime.strptime(leaves[i]['date_to'], '%Y-%m-%d %H:%M:%S')
+ no = dt_end - dt_start
+ [leave_list.append((dt_start + datetime.timedelta(days=x)).strftime('%Y-%m-%d')) for x in range(int(no.days + 1))]
+ leave_list.sort()
return leave_list
-def compute_working_calendar(cr, uid, calendar_id):
+def compute_working_calendar(cr, uid, calendar_id, context={}):
"""Change the format of working calendar from 'Openerp' format to bring it into 'Faces' format.
@@ -80,8 +80,8 @@ def compute_working_calendar(cr, uid, calendar_id):
wk_time = {}
wktime_list = []
wktime_cal = []
- week_ids = resource_week_obj.search(cr, uid, [('calendar_id', '=', calendar_id)])
- weeks = resource_week_obj.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'])
+ week_ids = resource_week_obj.search(cr, uid, [('calendar_id', '=', calendar_id)], context=context)
+ weeks = resource_week_obj.read(cr, uid, week_ids, ['dayofweek', 'hour_from', 'hour_to'], context=context)
# Convert time formats into appropriate format required
# and create a list like [('mon', '8:00-12:00'), ('mon', '13:00-18:00')]
for week in weeks: