From a8e1beba5ecc831b423f8f54e9dd5bc70b0480b2 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 30 Dec 2010 14:21:44 +0530 Subject: [FIX] project_long_term: In scheduling phase, screnario to take start date: phase start date or project start date or system current date bzr revid: hmo@tinyerp.com-20101230085144-ms3603jjatcaormk --- addons/project_long_term/project_long_term.py | 14 +++++++------- 1 file changed, 7 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 4640ea8fa48..d646e099f8b 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -282,10 +282,10 @@ class project_phase(osv.osv): res[phase.id] = resource_objs return res - def generate_schedule(self, cr, uid, ids, start_date, calendar_id=False, context=None): + def generate_schedule(self, cr, uid, ids, start_date=False, calendar_id=False, context=None): """ Schedule phase with the start date till all the next phases are completed. - @param: start_dsate : start date for the phase + @param: start_date (datetime.datetime) : start date for the phase. It would be either Start date of phase or start date of project or system current date @param: calendar_id : working calendar of the project """ if context is None: @@ -298,6 +298,9 @@ class project_phase(osv.osv): if not phase.responsible_id: raise osv.except_osv(_('No responsible person assigned !'),_("You must assign a responsible person for phase '%s' !") % (phase.name,)) + 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) avg_hours = uom_pool._compute_qty(cr, uid, phase.product_uom.id, phase.duration, default_uom_id) duration = str(avg_hours) + 'H' @@ -440,12 +443,9 @@ class project(osv.osv): ('state', 'in', ['draft', 'open', 'pending']), ('previous_phase_ids', '=', False) ]) - start_date = project.date_start - if not start_date: - start_date = datetime.now().strftime("%Y-%m-%d") - start_dt = datetime.strftime((datetime.strptime(start_date, "%Y-%m-%d")), "%Y-%m-%d %H:%M") calendar_id = project.resource_calendar_id and project.resource_calendar_id.id or False - phase_pool.generate_schedule(cr, uid, phase_ids, start_dt, calendar_id, context=context) + start_date = False + phase_pool.generate_schedule(cr, uid, phase_ids, start_date, calendar_id, context=context) return True def schedule_tasks(self, cr, uid, ids, context=None): -- cgit v1.2.3 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