From 339c2ecc541dba407a9ed3a0e588707a0b3e8c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 22 Jan 2014 15:28:05 +0100 Subject: [PATCH] [IMP] default_interval also in schedule_hours, allowing to schedule some work with a default calendar, like previous version of resource module. bzr revid: tde@openerp.com-20140122142805-8zyntmkx72l10fbq --- addons/resource/resource.py | 48 +++++++++++++++++--------- addons/resource/tests/test_resource.py | 17 +++++++-- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/addons/resource/resource.py b/addons/resource/resource.py index a5887e8b9fb..cbaf15147d1 100644 --- a/addons/resource/resource.py +++ b/addons/resource/resource.py @@ -176,8 +176,11 @@ class resource_calendar(osv.osv): calendar = self.browse(cr, uid, id, context=None) return [att for att in calendar.attendance_ids if int(att.dayofweek) in weekdays] - def get_weekdays(self, cr, uid, id, context=None): - """ Return the list of weekdays that contain at least one working interval """ + def get_weekdays(self, cr, uid, id, default_weekdays=None, context=None): + """ Return the list of weekdays that contain at least one working interval. + If no id is given (no calendar), return default weekdays. """ + if id is None: + return default_weekdays if default_weekdays is not None else [0, 1, 2, 3, 4] calendar = self.browse(cr, uid, id, context=None) weekdays = set() for attendance in calendar.attendance_ids: @@ -381,12 +384,11 @@ class resource_calendar(osv.osv): # -------------------------------------------------- # Hours scheduling - # Note: do not support calendar being None # -------------------------------------------------- def _schedule_hours(self, cr, uid, id, hours, day_dt=None, compute_leaves=False, resource_id=None, - context=None): + default_interval=None, context=None): """ Schedule hours of work, using a calendar and an optional resource to compute working and leave days. This method can be used backwards, i.e. scheduling days before a deadline. @@ -403,6 +405,12 @@ class resource_calendar(osv.osv): computing the leaves. If not set, only general leaves are computed. If set, generic and specific leaves are computed. + :param tuple default_interval: if no id, try to return a default working + day using default_interval[0] as beginning + hour, and default_interval[1] as ending hour. + Example: default_interval = (8, 16). + Otherwise, a void list of working intervals + is returned when id is None. :return tuple (datetime, intervals): datetime is the beginning/ending date of the schedulign; intervals are the @@ -420,7 +428,7 @@ class resource_calendar(osv.osv): iterations = 0 current_datetime = day_dt - call_args = dict(compute_leaves=compute_leaves, resource_id=resource_id, context=context) + call_args = dict(compute_leaves=compute_leaves, resource_id=resource_id, default_interval=default_interval, context=context) while float_compare(remaining_hours, 0.0, precision_digits=2) in (1, 0) and iterations < 1000: if backwards: @@ -430,7 +438,7 @@ class resource_calendar(osv.osv): working_intervals = self.get_working_intervals_of_day(cr, uid, id, **call_args) - if id is None: # no calendar -> consider working 8 hours + if id is None and not working_interval: # no calendar -> consider working 8 hours remaining_hours -= 8.0 elif working_intervals: if backwards: @@ -459,18 +467,18 @@ class resource_calendar(osv.osv): def schedule_hours_get_date(self, cr, uid, id, hours, day_dt=None, compute_leaves=False, resource_id=None, - context=None): + default_interval=None, context=None): """ Wrapper on _schedule_hours: return the beginning/ending datetime of an hours scheduling. """ - res = self._schedule_hours(cr, uid, id, hours, day_dt, compute_leaves, resource_id, context) - return res[0][0] + res = self._schedule_hours(cr, uid, id, hours, day_dt, compute_leaves, resource_id, default_interval, context) + return res and res[0][0] or False def schedule_hours(self, cr, uid, id, hours, day_dt=None, compute_leaves=False, resource_id=None, - context=None): + default_interval=None, context=None): """ Wrapper on _schedule_hours: return the working intervals of an hours scheduling. """ - return self._schedule_hours(cr, uid, id, hours, day_dt, compute_leaves, resource_id, context) + return self._schedule_hours(cr, uid, id, hours, day_dt, compute_leaves, resource_id, default_interval, context) # -------------------------------------------------- # Days scheduling @@ -544,7 +552,7 @@ class resource_calendar(osv.osv): """ Wrapper on _schedule_days: return the beginning/ending datetime of a days scheduling. """ res = self._schedule_days(cr, uid, id, days, day_date, compute_leaves, resource_id, default_interval, context) - return res and res[-1][1] or [] + return res and res[-1][1] or False def schedule_days(self, cr, uid, id, days, day_date=None, compute_leaves=False, resource_id=None, default_interval=None, context=None): @@ -573,21 +581,23 @@ class resource_calendar(osv.osv): return self.schedule_hours( cr, uid, id, hours * -1.0, day_dt=dt_from.replace(minute=0, second=0), - compute_leaves=True, resource_id=resource + compute_leaves=True, resource_id=resource, + default_interval=(8, 16) ) def interval_get_multi(self, cr, uid, date_and_hours_by_cal, resource=False, byday=True): """ Used in mrp_operations/mrp_operations.py (default parameters) and in interval_get() - :deprecated: OpenERP saas-3. Use get_working_hours_of_date instead. Note: + :deprecated: OpenERP saas-3. Use schedule_hours instead. Note: Byday was not used. Since saas-3, counts Leave hours instead of all-day leaves.""" res = {} for dt_str, hours, calendar_id in date_and_hours_by_cal: result = self.schedule_hours( cr, uid, calendar_id, hours, day_dt=datetime.datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S').replace(minute=0, second=0), - compute_leaves=True, resource_id=resource + compute_leaves=True, resource_id=resource, + default_interval=(8, 16) ) res[(dt_str, hours, calendar_id)] = result return res @@ -597,7 +607,8 @@ class resource_calendar(osv.osv): crm/crm_lead.py (res given). :deprecated: OpenERP saas-3. Use get_working_hours instead.""" - res = self.interval_get_multi(cr, uid, [(dt_from.strftime('%Y-%m-%d %H:%M:%S'), hours, id)], resource, byday)[(dt_from.strftime('%Y-%m-%d %H:%M:%S'), hours, id)] + res = self.interval_get_multi( + cr, uid, [(dt_from.strftime('%Y-%m-%d %H:%M:%S'), hours, id)], resource, byday)[(dt_from.strftime('%Y-%m-%d %H:%M:%S'), hours, id)] return res def interval_hours_get(self, cr, uid, id, dt_from, dt_to, resource=False): @@ -611,7 +622,10 @@ class resource_calendar(osv.osv): :deprecated: OpenERP saas-3. Use get_working_hours instead. Note: since saas-3, now resets hour/minuts. Now counts leave hours instead of all-day leaves.""" - return self.get_working_hours(cr, uid, id, dt_from, dt_to, compute_leaves=(not exclude_leaves), resource_id=resource_id, context=context) + return self.get_working_hours( + cr, uid, id, dt_from, dt_to, + compute_leaves=(not exclude_leaves), resource_id=resource_id, + default_interval=(8, 16), context=context) class resource_calendar_attendance(osv.osv): diff --git a/addons/resource/tests/test_resource.py b/addons/resource/tests/test_resource.py index ad06a1f2430..346317449d3 100644 --- a/addons/resource/tests/test_resource.py +++ b/addons/resource/tests/test_resource.py @@ -406,6 +406,19 @@ class TestResource(TestResourceCommon): compute_leaves=True, resource_id=self.resource1_id) self.assertEqual(res, 33.0, 'resource_calendar: wrong get_working_hours computation') + # -------------------------------------------------- + # Test4: misc + # -------------------------------------------------- + + # Test without calendar and default_interval + res = self.resource_calendar.get_working_hours( + cr, uid, None, + self.date1.replace(hour=6, minute=0), + self.date2.replace(hour=23, minute=0), + compute_leaves=True, resource_id=self.resource1_id, + default_interval=(8, 16)) + self.assertEqual(res, 32.0, 'resource_calendar: wrong get_working_hours computation') + def test_50_calendar_schedule_days(self): """ Testing calendar days scheduling """ cr, uid = self.cr, self.uid @@ -424,9 +437,9 @@ class TestResource(TestResourceCommon): self.assertEqual(res.date(), datetime.strptime('2013-03-01 00:0:00', _format).date(), 'resource_calendar: wrong days scheduling') # -------------------------------------------------- - # Test2: without calendar and default scheduling + # Test2: misc # -------------------------------------------------- - # Without calendar, should only count days -> 12 -> 16, 5 days + # Without calendar, should only count days -> 12 -> 16, 5 days with default intervals res = self.resource_calendar.schedule_days_get_date(cr, uid, None, 5, day_date=self.date1, default_interval=(8, 16)) self.assertEqual(res, datetime.strptime('2013-02-16 16:00:00', _format), 'resource_calendar: wrong days scheduling')