diff options
| author | Harry (Open ERP) <hmo@tinyerp.com> | 2010-04-06 18:04:29 +0530 |
|---|---|---|
| committer | Harry (Open ERP) <hmo@tinyerp.com> | 2010-04-06 18:04:29 +0530 |
| commit | 85c42e9270d9689e08b2864a5292ae801ecbfd67 (patch) | |
| tree | d013befdb389847c9320f980f4e8ec824fda3bee /addons/project_long_term/wizard | |
| parent | d07c7bc4d6f85d593071e1d5a4900771d32545d1 (diff) | |
| parent | aa70854c09a1e287342e830318c873131bf9744f (diff) | |
[MERGE]
bzr revid: hmo@tinyerp.com-20100406123429-hu7m4lnflo0amjr5
Diffstat (limited to 'addons/project_long_term/wizard')
4 files changed, 79 insertions, 74 deletions
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: |
