[IMP] project_long_term: Improve the module and bug fixes and overall cleaning
bzr revid: mra@tinyerp.com-20100311071006-u6usdghqls7t4inl
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -60,12 +59,13 @@ 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)
|
||||
leaves = wkcal.compute_leaves(cr, uid, calendar_id , resource.id, resource.calendar_id.id)
|
||||
phase_resource_obj = classobj(str(phase.responsible_id.name), (Resource,),
|
||||
{'__doc__': phase.responsible_id.name,
|
||||
'__name__': phase.responsible_id.name,
|
||||
@@ -105,18 +105,19 @@ 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)
|
||||
self._phase_schedule(cr, uid, phase, date_start, phase.project_id.resource_calendar_id.id or False, 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,7 +133,7 @@ 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:
|
||||
@@ -141,7 +142,7 @@ class wizard_compute_phases(wizard.interface):
|
||||
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)
|
||||
self._phase_schedule(cr, uid, phase, start_dt, calendar_id or False, context=context)
|
||||
return {}
|
||||
|
||||
def _open_phases_list(self, cr, uid, data, context):
|
||||
@@ -162,7 +163,7 @@ class wizard_compute_phases(wizard.interface):
|
||||
states = {
|
||||
'init': {
|
||||
'actions': [],
|
||||
'result': {'type':'form', 'arch':compute_form, 'fields':compute_fields, 'state':[
|
||||
'result': {'type': 'form', 'arch': compute_form, 'fields': compute_fields, 'state':[
|
||||
('end', 'Cancel'),
|
||||
('compute', 'Compute')
|
||||
|
||||
@@ -170,7 +171,7 @@ class wizard_compute_phases(wizard.interface):
|
||||
},
|
||||
'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')
|
||||
|
||||
@@ -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"/>
|
||||
@@ -105,7 +104,7 @@ 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)
|
||||
@@ -131,29 +130,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'),
|
||||
'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':[
|
||||
'result': {'type': 'form', 'arch': compute_form, 'fields': compute_fields, 'state': [
|
||||
('end', 'Cancel'),
|
||||
('compute', 'Compute')
|
||||
]},
|
||||
},
|
||||
'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:
|
||||
@@ -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,7 +47,8 @@ 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)
|
||||
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(str(res.user_id.name), (Resource,),
|
||||
{'__doc__': res.user_id.name,
|
||||
'__name__': res.user_id.name,
|
||||
@@ -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,12 +127,13 @@ 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 = {
|
||||
|
||||
@@ -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,12 +49,12 @@ 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')
|
||||
@@ -63,7 +63,7 @@ def compute_leaves(cr, uid, calendar_id, resource_id=False, resource_calendar=Fa
|
||||
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:
|
||||
|
||||
Reference in New Issue
Block a user