From 574b0ecfa2afc42701931fa48f17cd2f2470dd46 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 30 Dec 2010 16:07:23 +0530 Subject: [FIX] project_long_term: scheduling phase: if calendar is not specify, take 24/7 working days bzr revid: hmo@tinyerp.com-20101230103723-ay3li558ro4lpph9 --- addons/project_long_term/project_long_term.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index d646e099f8b..d2bc48df375 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -291,9 +291,10 @@ class project_phase(osv.osv): if context is None: context = {} resource_pool = self.pool.get('resource.resource') + data_pool = self.pool.get('ir.model.data') resource_allocation_pool = self.pool.get('project.resource.allocation') uom_pool = self.pool.get('product.uom') - default_uom_id = self._get_default_uom_id(cr, uid) + data_model, day_uom_id = data_pool.get_object_reference(cr, uid, 'product', 'uom_day') for phase in self.browse(cr, uid, ids, context=context): if not phase.responsible_id: raise osv.except_osv(_('No responsible person assigned !'),_("You must assign a responsible person for phase '%s' !") % (phase.name,)) @@ -302,8 +303,8 @@ class project_phase(osv.osv): start_date = phase.project_id.date_start or phase.date_start or datetime.now().strftime("%Y-%m-%d") start_date = datetime.strftime((datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d") phase_resource_obj = resource_pool.generate_resources(cr, uid, [phase.responsible_id.id], calendar_id, context=context) - avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) - duration = str(avg_hours) + 'H' + avg_days = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, day_uom_id) + duration = str(avg_days) + 'd' # Create a new project for each phase def Project(): # If project has working calendar then that @@ -311,14 +312,17 @@ class project_phase(osv.osv): start = start_date minimum_time_unit = 1 resource = phase_resource_obj + working_hours_per_day = 24 + vacation = [] if calendar_id: - working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) + working_hours_per_day = 8 #TODO: it should be come from calendars vacation = tuple(resource_pool.compute_vacation(cr, uid, calendar_id)) - + working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) def phase(): effort = duration project = Task.BalancedProject(Project) + s_date = project.phase.start.to_datetime() e_date = project.phase.end.to_datetime() # Recalculate date_start and date_end @@ -537,9 +541,12 @@ class project_task(osv.osv): except: raise osv.except_osv(_('Error'), _('Should have Resources Allocation or Project Members!')) minimum_time_unit = 1 - if calendar_id: # If project has working calendar - working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) + working_hours_per_day = 24 + vacation = [] + if calendar_id: + working_hours_per_day = 8 #TODO: it should be come from calendars vacation = tuple(resource_pool.compute_vacation(cr, uid, calendar_id, context=context)) + working_days = resource_pool.compute_working_calendar(cr, uid, calendar_id, context=context) # Dynamic creation of tasks task_number = 0 for openobect_task in self.browse(cr, uid, ids, context=context): -- cgit v1.2.3 From 224253a44dffed237d4c8a531dae029cb6143118 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 30 Dec 2010 16:18:25 +0530 Subject: [FIX] project_long_term: fix regression bzr revid: hmo@tinyerp.com-20101230104825-kuf2gj3pgoyhqif8 --- addons/project_long_term/project_long_term.py | 50 +-------------------------- 1 file changed, 1 insertion(+), 49 deletions(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index d2bc48df375..ad972b89dad 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -192,55 +192,6 @@ class project_phase(osv.osv): dt_end = work_times[-1][1].strftime('%Y-%m-%d') self.write(cr, uid, [phase.id], {'date_start': date_start.strftime('%Y-%m-%d'), 'date_end': dt_end}, context=context) - def write(self, cr, uid, ids, vals, context=None): - resource_calendar_obj = self.pool.get('resource.calendar') - resource_obj = self.pool.get('resource.resource') - uom_obj = self.pool.get('product.uom') - if context is None: - context = {} - res = super(project_phase, self).write(cr, uid, ids, vals, context=context) - if context.get('scheduler',False): - return res - # Consider calendar and efficiency if the phase is performed by a resource - # otherwise consider the project's working calendar - - #TOCHECK : why need this ? - if isinstance(ids, (int, long)): - ids = [ids] - default_uom_id = self._get_default_uom_id(cr, uid) - for phase in self.browse(cr, uid, ids, 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], context=context).calendar_id.id - if cal_id: - calendar_id = cal_id - - avg_hours = uom_obj._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) - # Change the date_start and date_end - # for previous and next phases respectively based on valid condition - if vals.get('date_start', False) and vals['date_start'] < phase.date_start: - dt_start = datetime.strptime(vals['date_start'], '%Y-%m-%d') - 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') - for prv_phase in phase.previous_phase_ids: - if prv_phase.id == phase.id: - continue - 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 = datetime.strptime(vals['date_end'], '%Y-%m-%d') - 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') - for next_phase in phase.next_phase_ids: - if next_phase.id == phase.id: - continue - self._check_date_end(cr, uid, next_phase, dt_end, context=context) - - return res - def copy(self, cr, uid, id, default=None, context=None): if default is None: default = {} @@ -511,6 +462,7 @@ class project_task(osv.osv): """ Schedule the tasks according to resource available and priority. """ + resource_pool = self.pool.get('resource.resource') if not ids: return False if context is None: -- cgit v1.2.3 From 74287c78938cd17d1f2c79063450b879d2989ef5 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 30 Dec 2010 16:27:27 +0530 Subject: [FIX] project_long_term: remove onchange day on project.phase module. no need to change end date of phase. we can schedule end date using scheduler phase bzr revid: hmo@tinyerp.com-20101230105727-ev1fppejij0ngv32 --- addons/project_long_term/project_long_term.py | 7 ------- 1 file changed, 7 deletions(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index ad972b89dad..f13752f86e4 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -144,13 +144,6 @@ class project_phase(osv.osv): 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): """ -- cgit v1.2.3 From e0fc25a57d289c4b1da35176ab430c134194c929 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 30 Dec 2010 18:05:34 +0530 Subject: [IMP] project_long_term: improved view/tooltips bzr revid: hmo@tinyerp.com-20101230123534-dde55foizf83fddi --- addons/project_long_term/project_long_term.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index f13752f86e4..6c20603d08d 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -105,8 +105,8 @@ class project_phase(osv.osv): _columns = { 'name': fields.char("Name", size=64, required=True), - 'date_start': fields.date('Start Date', help="Starting Date of the phase", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), - 'date_end': fields.date('End Date', help="Ending Date of the phase", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'date_start': fields.date('Start Date', help="It's computed according to the phases order : the start date of the 1st phase is set by you while the other start dates depend on the end date of their previous phases", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), + 'date_end': fields.date('End Date', help=" It's computed by the scheduler according to the start date and the duration.", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'constraint_date_start': fields.date('Minimum Start Date', help='force the phase to start after this date', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'constraint_date_end': fields.date('Deadline', help='force the phase to finish before this date', states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'project_id': fields.many2one('project.project', 'Project', required=True), @@ -484,7 +484,7 @@ class project_task(osv.osv): try: resource = reduce(operator.or_, resources) except: - raise osv.except_osv(_('Error'), _('Should have Resources Allocation or Project Members!')) + raise osv.except_osv(_('Error'), _('Resources should be allocated to your phases and Members should be assigned to your Project!')) minimum_time_unit = 1 working_hours_per_day = 24 vacation = [] -- cgit v1.2.3 From f8c4b4e72ffea7448648cb1b5e4e5576c9cfa970 Mon Sep 17 00:00:00 2001 From: "qdp-launchpad@tinyerp.com" <> Date: Thu, 30 Dec 2010 18:25:03 +0100 Subject: [FIX] project_long_term: scheduling of tasks should reassign only task not yet started bzr revid: qdp-launchpad@tinyerp.com-20101230172503-58xe1zekdcwxgesi --- addons/project_long_term/project_long_term.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 6c20603d08d..c8dbcdf0dcd 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -319,7 +319,7 @@ class project_phase(osv.osv): start_date = datetime.now().strftime("%Y-%m-%d") resources = resources_list.get(phase.id, []) calendar_id = phase.project_id.resource_calendar_id.id - task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['open', 'draft', 'pending'] , phase.task_ids))) + task_ids = map(lambda x : x.id, (filter(lambda x : x.state in ['draft'] , phase.task_ids))) #reassign only task not yet started if task_ids: task_pool.generate_schedule(cr, uid, task_ids, resources, calendar_id, start_date, context=context) -- cgit v1.2.3 From db3ecb06499f378d9226420f5807fbb84b33128a Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 31 Dec 2010 17:27:54 +0530 Subject: [FIX] project_long_term: fix bzr revid: hmo@tinyerp.com-20101231115754-f4gvpijitxqme15j --- addons/project_long_term/project_long_term.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'addons/project_long_term/project_long_term.py') diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index c8dbcdf0dcd..45d75b16b05 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -19,7 +19,7 @@ # ############################################################################## -from datetime import datetime +from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from tools.translate import _ from osv import fields, osv @@ -246,8 +246,10 @@ class project_phase(osv.osv): if not start_date: start_date = phase.project_id.date_start or phase.date_start or datetime.now().strftime("%Y-%m-%d") start_date = datetime.strftime((datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d") - phase_resource_obj = resource_pool.generate_resources(cr, uid, [phase.responsible_id.id], calendar_id, context=context) + phase_resource_obj = self.generate_resources(cr, uid, [phase.id], context=context)[phase.id] avg_days = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, day_uom_id) + if not phase_resource_obj: #TOCHECK: why need this ? + avg_days = avg_days - 1 duration = str(avg_days) + 'd' # Create a new project for each phase def Project(): @@ -295,10 +297,10 @@ class project_phase(osv.osv): 'date_end': end_date.strftime('%Y-%m-%d') }, context=ctx) # Recursive call till all the next phases scheduled - for phase in phase.next_phase_ids: - if phase.state in ['draft', 'open', 'pending']: - id_cal = phase.project_id.resource_calendar_id and phase.project_id.resource_calendar_id.id or False - self.generate_schedule(cr, uid, [phase.id], date_start, id_cal, context=context) + for next_phase in phase.next_phase_ids: + if next_phase.state in ['draft', 'open', 'pending']: + id_cal = next_phase.project_id.resource_calendar_id and next_phase.project_id.resource_calendar_id.id or False + self.generate_schedule(cr, uid, [next_phase.id], date_start+timedelta(days=1), id_cal, context=context) else: continue return True -- cgit v1.2.3