diff --git a/addons/resource/models/resource.py b/addons/resource/models/resource.py index a29c8bdd2a5..36f22ea1ffa 100644 --- a/addons/resource/models/resource.py +++ b/addons/resource/models/resource.py @@ -304,6 +304,11 @@ class ResourceCalendar(models.Model): elif start_dt is None: start_dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) else: + # FORWARD-PORT UP TO SAAS-14 + # Add a strict limit when searching for intervals + force_start_dt = self.env.context.get('force_start_dt') + if force_start_dt and force_start_dt < start_dt: + work_limits.append((force_start_dt.replace(hour=0, minute=0, second=0, microsecond=0), force_start_dt)) work_limits.append((start_dt.replace(hour=0, minute=0, second=0, microsecond=0), start_dt)) if end_dt is None: end_dt = start_dt.replace(hour=23, minute=59, second=59, microsecond=999999) @@ -335,7 +340,15 @@ class ResourceCalendar(models.Model): dt_t.replace(tzinfo=tz_info).astimezone(pytz.UTC).replace(tzinfo=None), calendar_working_day.id ) - working_intervals += self.interval_remove_leaves(working_interval, work_limits) + + # FORWARD-PORT UP TO SAAS-14 + # Add a strict limit when searching for intervals (yeah, once again!) + if self.env.context.get('force_start_dt'): + for wi in self.interval_remove_leaves(working_interval, work_limits): + if wi[0] >= self.env.context['force_start_dt']: + working_intervals += [wi] + else: + working_intervals += self.interval_remove_leaves(working_interval, work_limits) # find leave intervals if leaves is None and compute_leaves: @@ -423,6 +436,12 @@ class ResourceCalendar(models.Model): """ if day_dt is None: day_dt = datetime.datetime.now() + elif day_dt is not None and hours > 0: + # FORWARD-PORT UP TO SAAS-14 + # FIXME: think about a better fix... However, solved from saas-15 thanks to refactoring + # Make sure the to keep the original start date when searching for intervals, since a + # difference in day may occur depending on the TZ. + self = self.with_context(force_start_dt=day_dt) backwards = (hours < 0) hours = abs(hours) intervals = [] diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py index 9fd6dddf8a8..971b9d3b575 100644 --- a/addons/resource/tests/test_resource.py +++ b/addons/resource/tests/test_resource.py @@ -477,6 +477,40 @@ class TestResource(TestResourceCommon): resource_id = self.env.ref('resource.resource_analyst').copy() self.assertTrue(resource_id, 'Unable to Duplicate Resource') + # FORWARD-PORT UP TO SAAS-14 + # Test already in Saas-15 + def test_80_resource_schedule_tz(self): + # Call schedule_hours for a user in Autralia, Sydney (GMT+10) + # Two cases: + # - start at 2013-02-15 08:00:00 => 2013-02-14 21:00:00 in UTC + # - start at 2013-02-15 11:00:00 => 2013-02-15 00:00:00 in UTC + + tz_context = dict(tz='Australia/Sydney') + self.env.user.with_context(tz_context).write({'tz': 'Australia/Sydney'}) + calendar = self.calendar.with_context(tz_context) + + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 1', + 'dayofweek': '3', + 'hour_from': 8, + 'hour_to': 12, + 'calendar_id': calendar.id, + }) + self.env['resource.calendar.attendance'].create({ + 'name': 'Day3 - 2', + 'dayofweek': '3', + 'hour_from': 13, + 'hour_to': 17, + 'calendar_id': calendar.id, + }) + + hours = 1.0/60.0 + start_dt = Datetime.from_string('2013-02-14 21:00:00') + res = calendar.schedule_hours(hours, start_dt) + self.assertEqual([(start_dt, start_dt.replace(minute=1))], res, 'resource_calendar: wrong schedule_hours computation') + start_dt = Datetime.from_string('2013-02-15 00:00:00') + res = calendar.schedule_hours(hours, start_dt) + self.assertEqual([(start_dt, start_dt.replace(minute=1))], res, 'resource_calendar: wrong schedule_hours computation') WAR_START = date(1932, 11, 2) WAR_END = date(1932, 12, 10)