From c268809a3733bbcb6fcde7ca881d0cdf9859c936 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Wed, 20 Feb 2019 11:41:54 +0100 Subject: [PATCH 1/2] [resource_calendar_schedule_iterations] --- .../README.rst | 95 ++++ .../__init__.py | 2 + .../__manifest__.py | 19 + .../data/ir_config_parameter_data.xml | 18 + resource_calendar_schedule_iteration/hooks.py | 126 ++++++ .../model/__init__.py | 1 + .../model/resource_calendar.py | 22 + .../readme/CONFIGURE.rst | 5 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 13 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 417 ++++++++++++++++++ 12 files changed, 720 insertions(+) create mode 100644 resource_calendar_schedule_iteration/README.rst create mode 100644 resource_calendar_schedule_iteration/__init__.py create mode 100644 resource_calendar_schedule_iteration/__manifest__.py create mode 100644 resource_calendar_schedule_iteration/data/ir_config_parameter_data.xml create mode 100644 resource_calendar_schedule_iteration/hooks.py create mode 100644 resource_calendar_schedule_iteration/model/__init__.py create mode 100644 resource_calendar_schedule_iteration/model/resource_calendar.py create mode 100644 resource_calendar_schedule_iteration/readme/CONFIGURE.rst create mode 100644 resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst create mode 100644 resource_calendar_schedule_iteration/readme/DESCRIPTION.rst create mode 100644 resource_calendar_schedule_iteration/static/description/icon.png create mode 100644 resource_calendar_schedule_iteration/static/description/index.html diff --git a/resource_calendar_schedule_iteration/README.rst b/resource_calendar_schedule_iteration/README.rst new file mode 100644 index 000000000..62e67700e --- /dev/null +++ b/resource_calendar_schedule_iteration/README.rst @@ -0,0 +1,95 @@ +==================================== +Resource Calendar Schedule Iteration +==================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/11.0/resource_calendar_schedule_iterations + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-11-0/server-tools-11-0-resource_calendar_schedule_iterations + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/149/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +When you want to plan a number of days in the past or in the future consiering +a working calendar, Odoo limits the number of days/hours that you can plan +ahead. + +In case that you want to plan days forward/backward, it currently restricts +to 100 iterations. + +In case that you want to plan hours forward/backward, it currently restricts +to 100 iterations. + +This module allows you to increase the iteration limit used in the resource +calendar to schedule days or hours by means of a system parameter defined +by the administrator. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +#. Go to *Settings* and activate the developer mode. + +#. Go to *Settings / Technical / Parameters / System Parameters* and define, + new values for the parameters *resource.calendar.schedule.days.iteration.limit* + and/or *resource.calendar.schedule.hours.iteration.limit* + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Eficent + +Contributors +~~~~~~~~~~~~ + +* Jordi Ballester Alomar + (https://www.eficent.com) + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/resource_calendar_schedule_iteration/__init__.py b/resource_calendar_schedule_iteration/__init__.py new file mode 100644 index 000000000..cd4cb62c7 --- /dev/null +++ b/resource_calendar_schedule_iteration/__init__.py @@ -0,0 +1,2 @@ +from . import model +from .hooks import post_load_hook diff --git a/resource_calendar_schedule_iteration/__manifest__.py b/resource_calendar_schedule_iteration/__manifest__.py new file mode 100644 index 000000000..9b64b1e5e --- /dev/null +++ b/resource_calendar_schedule_iteration/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Resource Calendar Schedule Iteration", + "author": "Eficent, Odoo Community Association (OCA)", + "version": "11.0.1.0.0", + 'category': 'Hidden', + "website": "https://github.com/OCA/server-tools", + "depends": [ + 'resource', + ], + "data": [ + 'data/ir_config_parameter_data.xml', + ], + "license": 'LGPL-3', + "post_load": "post_load_hook", + "installable": True +} diff --git a/resource_calendar_schedule_iteration/data/ir_config_parameter_data.xml b/resource_calendar_schedule_iteration/data/ir_config_parameter_data.xml new file mode 100644 index 000000000..7432a3d3e --- /dev/null +++ b/resource_calendar_schedule_iteration/data/ir_config_parameter_data.xml @@ -0,0 +1,18 @@ + + + + + + resource.calendar.schedule.days.iteration.limit + 100 + + + + resource.calendar.schedule.hours.iteration.limit + 1000 + + + diff --git a/resource_calendar_schedule_iteration/hooks.py b/resource_calendar_schedule_iteration/hooks.py new file mode 100644 index 000000000..a09a680c8 --- /dev/null +++ b/resource_calendar_schedule_iteration/hooks.py @@ -0,0 +1,126 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +import pytz +import datetime + +from datetime import timedelta + +from odoo.addons.resource.models.resource import ResourceCalendar +from odoo.tools.float_utils import float_compare + + +def to_naive_user_tz(datetime, record): + tz_name = record._context.get('tz') or record.env.user.tz + tz = tz_name and pytz.timezone(tz_name) or pytz.UTC + return pytz.UTC.localize(datetime.replace( + tzinfo=None), is_dst=False).astimezone(tz).replace(tzinfo=None) + + +def post_load_hook(): + + def _new_schedule_days(self, days, day_dt, compute_leaves=False, + resource_id=None): + if not hasattr(self, '_get_schedule_days_iteration_limit'): + return self._schedule_days_original( + days, day_dt, compute_leaves=compute_leaves, + resource_id=resource_id) + # START OF HOOK: Introduce here the iterations limit + iterations_limit = self._get_schedule_days_iteration_limit() or 100 + # END OF HOOK + backwards = (days < 0) + intervals = [] + planned_days, iterations = 0, 0 + + day_dt_tz = to_naive_user_tz(day_dt, self.env.user) + current_datetime = day_dt_tz.replace( + hour=0, minute=0, second=0, microsecond=0) + + # HOOK. Use the iterations_limit here + while planned_days < abs(days) and iterations < iterations_limit: + working_intervals = self._get_day_work_intervals( + current_datetime.date(), + compute_leaves=compute_leaves, resource_id=resource_id) + if not self or working_intervals: + # no calendar -> no working hours, but day is + # considered as worked + planned_days += 1 + intervals += working_intervals + # get next day + if backwards: + current_datetime = self._get_previous_work_day( + current_datetime) + else: + current_datetime = self._get_next_work_day(current_datetime) + # avoid infinite loops + iterations += 1 + + return intervals + + def _new_schedule_hours(self, hours, day_dt, compute_leaves=False, + resource_id=None): + if not hasattr(self, '_get_schedule_hours_iteration_limit'): + return self._schedule_hours_original( + hours, day_dt, compute_leaves=compute_leaves, + resource_id=resource_id) + self.ensure_one() + # START OF HOOK: Introduce here the iterations limit + iterations_limit = self._get_schedule_hours_iteration_limit() or 1000 + # END OF HOOK + backwards = (hours < 0) + intervals = [] + remaining_hours, iterations = abs(hours * 1.0), 0 + + day_dt_tz = to_naive_user_tz(day_dt, self.env.user) + current_datetime = day_dt_tz + + call_args = dict(compute_leaves=compute_leaves, + resource_id=resource_id) + + # HOOK. Use the iterations_limit here + while float_compare(remaining_hours, 0.0, precision_digits=2) in ( + 1, 0) and iterations < 1000: + if backwards: + call_args['end_time'] = current_datetime.time() + else: + call_args['start_time'] = current_datetime.time() + + working_intervals = self._get_day_work_intervals( + current_datetime.date(), **call_args) + + if working_intervals: + new_working_intervals = self._interval_schedule_hours( + working_intervals, remaining_hours, backwards=backwards) + + res = timedelta() + for interval in working_intervals: + res += interval[1] - interval[0] + remaining_hours -= res.total_seconds() / 3600.0 + + intervals = intervals + new_working_intervals if \ + not backwards else new_working_intervals + intervals + # get next day + if backwards: + current_datetime = datetime.datetime.combine( + self._get_previous_work_day(current_datetime), + datetime.time(23, 59, 59)) + else: + current_datetime = datetime.datetime.combine( + self._get_next_work_day(current_datetime), + datetime.time()) + # avoid infinite loops + iterations += 1 + + return intervals + + if not hasattr(ResourceCalendar, '_schedule_days_original'): + ResourceCalendar._schedule_days_original = \ + ResourceCalendar._schedule_days + + ResourceCalendar._schedule_days = _new_schedule_days + + if not hasattr(ResourceCalendar, '_schedule_hours_original'): + ResourceCalendar._schedule_hours_original = \ + ResourceCalendar._schedule_hours + + ResourceCalendar._schedule_hours = _new_schedule_hours diff --git a/resource_calendar_schedule_iteration/model/__init__.py b/resource_calendar_schedule_iteration/model/__init__.py new file mode 100644 index 000000000..81793ddba --- /dev/null +++ b/resource_calendar_schedule_iteration/model/__init__.py @@ -0,0 +1 @@ +from . import resource_calendar diff --git a/resource_calendar_schedule_iteration/model/resource_calendar.py b/resource_calendar_schedule_iteration/model/resource_calendar.py new file mode 100644 index 000000000..605bffa1d --- /dev/null +++ b/resource_calendar_schedule_iteration/model/resource_calendar.py @@ -0,0 +1,22 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import api, models + + +class ResourceCalendar(models.Model): + _inherit = 'resource.calendar' + + @api.multi + def _get_schedule_days_iteration_limit(self): + self.ensure_one() + limit = self.env['ir.config_parameter'].sudo().get_param( + 'resource.calendar.schedule.days.iteration.limit', default=False) + return int(limit) or False + + @api.multi + def _get_schedule_hours_iteration_limit(self): + self.ensure_one() + limit = self.env['ir.config_parameter'].sudo().get_param( + 'resource.calendar.schedule.hours.iteration.limit', default=False) + return int(limit) or False diff --git a/resource_calendar_schedule_iteration/readme/CONFIGURE.rst b/resource_calendar_schedule_iteration/readme/CONFIGURE.rst new file mode 100644 index 000000000..471402c08 --- /dev/null +++ b/resource_calendar_schedule_iteration/readme/CONFIGURE.rst @@ -0,0 +1,5 @@ +#. Go to *Settings* and activate the developer mode. + +#. Go to *Settings / Technical / Parameters / System Parameters* and define, + new values for the parameters *resource.calendar.schedule.days.iteration.limit* + and/or *resource.calendar.schedule.hours.iteration.limit* diff --git a/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst b/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..2c7d5869b --- /dev/null +++ b/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Jordi Ballester Alomar + (https://www.eficent.com) diff --git a/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst b/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst new file mode 100644 index 000000000..b60db4a25 --- /dev/null +++ b/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst @@ -0,0 +1,13 @@ +When you want to plan a number of days in the past or in the future consiering +a working calendar, Odoo limits the number of days/hours that you can plan +ahead. + +In case that you want to plan days forward/backward, it currently restricts +to 100 iterations. + +In case that you want to plan hours forward/backward, it currently restricts +to 100 iterations. + +This module allows you to increase the iteration limit used in the resource +calendar to schedule days or hours by means of a system parameter defined +by the administrator. diff --git a/resource_calendar_schedule_iteration/static/description/icon.png b/resource_calendar_schedule_iteration/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/resource_calendar_schedule_iteration/static/description/index.html b/resource_calendar_schedule_iteration/static/description/index.html new file mode 100644 index 000000000..ad0d5a040 --- /dev/null +++ b/resource_calendar_schedule_iteration/static/description/index.html @@ -0,0 +1,417 @@ + + + + + + +Resource Calendar Schedule Iterations + + + +
+

Resource Calendar Schedule Iterations

+ + +

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

+

When you want to plan a number of days in the past or in the future consiering +a working calendar, Odoo limits the number of days/hours that you can plan +ahead.

+

In case that you want to plan days forward/backward, it currently restricts +to 100 iterations.

+

In case that you want to plan hours forward/backward, it currently restricts +to 100 iterations.

+

This module allows you to increase the iteration limit used in the resource +calendar to schedule days or hours by means of a system parameter defined +by the administrator.

+

Table of contents

+ +
+

Configuration

+
    +
  1. Go to Ŝettings and activate the developer mode.
  2. +
  3. Go to Settings / Technical / Parameters / System Parameters and define, +new values for the parameters resource.calendar.schedule.days.iteration.limit +and/or resource.calendar.schedule.hours.iteration.limit
  4. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Eficent
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-tools project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From a74a4bbfe7a5f36d553f79da0d79530e3ee9a49c Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 19 Mar 2019 10:11:41 +0100 Subject: [PATCH 2/2] [11.0] resourece_calendar_schedule_iteration: add tests and some minor corrections --- .../README.rst | 19 +++---- resource_calendar_schedule_iteration/hooks.py | 15 ++--- .../readme/CONTRIBUTORS.rst | 6 +- .../readme/DESCRIPTION.rst | 5 +- .../static/description/index.html | 55 +++++++++++++------ .../tests/__init__.py | 1 + ...st_resource_calendar_schedule_iteration.py | 46 ++++++++++++++++ 7 files changed, 104 insertions(+), 43 deletions(-) create mode 100644 resource_calendar_schedule_iteration/tests/__init__.py create mode 100644 resource_calendar_schedule_iteration/tests/test_resource_calendar_schedule_iteration.py diff --git a/resource_calendar_schedule_iteration/README.rst b/resource_calendar_schedule_iteration/README.rst index 62e67700e..20e9df858 100644 --- a/resource_calendar_schedule_iteration/README.rst +++ b/resource_calendar_schedule_iteration/README.rst @@ -14,10 +14,10 @@ Resource Calendar Schedule Iteration :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github - :target: https://github.com/OCA/server-tools/tree/11.0/resource_calendar_schedule_iterations + :target: https://github.com/OCA/server-tools/tree/11.0/resource_calendar_schedule_iteration :alt: OCA/server-tools .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-tools-11-0/server-tools-11-0-resource_calendar_schedule_iterations + :target: https://translation.odoo-community.org/projects/server-tools-11-0/server-tools-11-0-resource_calendar_schedule_iteration :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png :target: https://runbot.odoo-community.org/runbot/149/11.0 @@ -25,16 +25,13 @@ Resource Calendar Schedule Iteration |badge1| |badge2| |badge3| |badge4| |badge5| -When you want to plan a number of days in the past or in the future consiering +When you want to plan a number of days in the past or in the future considering a working calendar, Odoo limits the number of days/hours that you can plan ahead. In case that you want to plan days forward/backward, it currently restricts to 100 iterations. -In case that you want to plan hours forward/backward, it currently restricts -to 100 iterations. - This module allows you to increase the iteration limit used in the resource calendar to schedule days or hours by means of a system parameter defined by the administrator. @@ -59,7 +56,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -74,8 +71,10 @@ Authors Contributors ~~~~~~~~~~~~ -* Jordi Ballester Alomar - (https://www.eficent.com) +* Eficent (https://www.eficent.com) + + * Jordi Ballester Alomar + * Lois Rilo Antelo Maintainers ~~~~~~~~~~~ @@ -90,6 +89,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/server-tools `_ project on GitHub. +This module is part of the `OCA/server-tools `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/resource_calendar_schedule_iteration/hooks.py b/resource_calendar_schedule_iteration/hooks.py index a09a680c8..f8140501f 100644 --- a/resource_calendar_schedule_iteration/hooks.py +++ b/resource_calendar_schedule_iteration/hooks.py @@ -1,22 +1,15 @@ # Copyright 2019 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -import pytz import datetime from datetime import timedelta from odoo.addons.resource.models.resource import ResourceCalendar +from odoo.addons.resource.models.resource import to_naive_user_tz from odoo.tools.float_utils import float_compare -def to_naive_user_tz(datetime, record): - tz_name = record._context.get('tz') or record.env.user.tz - tz = tz_name and pytz.timezone(tz_name) or pytz.UTC - return pytz.UTC.localize(datetime.replace( - tzinfo=None), is_dst=False).astimezone(tz).replace(tzinfo=None) - - def post_load_hook(): def _new_schedule_days(self, days, day_dt, compute_leaves=False, @@ -79,7 +72,7 @@ def post_load_hook(): # HOOK. Use the iterations_limit here while float_compare(remaining_hours, 0.0, precision_digits=2) in ( - 1, 0) and iterations < 1000: + 1, 0) and iterations < iterations_limit: if backwards: call_args['end_time'] = current_datetime.time() else: @@ -117,10 +110,10 @@ def post_load_hook(): ResourceCalendar._schedule_days_original = \ ResourceCalendar._schedule_days - ResourceCalendar._schedule_days = _new_schedule_days + ResourceCalendar._patch_method("_schedule_days", _new_schedule_days) if not hasattr(ResourceCalendar, '_schedule_hours_original'): ResourceCalendar._schedule_hours_original = \ ResourceCalendar._schedule_hours - ResourceCalendar._schedule_hours = _new_schedule_hours + ResourceCalendar._patch_method("_schedule_hours", _new_schedule_hours) diff --git a/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst b/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst index 2c7d5869b..149826cd3 100644 --- a/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst +++ b/resource_calendar_schedule_iteration/readme/CONTRIBUTORS.rst @@ -1,2 +1,4 @@ -* Jordi Ballester Alomar - (https://www.eficent.com) +* Eficent (https://www.eficent.com) + + * Jordi Ballester Alomar + * Lois Rilo Antelo diff --git a/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst b/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst index b60db4a25..46c4754a0 100644 --- a/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst +++ b/resource_calendar_schedule_iteration/readme/DESCRIPTION.rst @@ -1,13 +1,10 @@ -When you want to plan a number of days in the past or in the future consiering +When you want to plan a number of days in the past or in the future considering a working calendar, Odoo limits the number of days/hours that you can plan ahead. In case that you want to plan days forward/backward, it currently restricts to 100 iterations. -In case that you want to plan hours forward/backward, it currently restricts -to 100 iterations. - This module allows you to increase the iteration limit used in the resource calendar to schedule days or hours by means of a system parameter defined by the administrator. diff --git a/resource_calendar_schedule_iteration/static/description/index.html b/resource_calendar_schedule_iteration/static/description/index.html index ad0d5a040..99c5db03a 100644 --- a/resource_calendar_schedule_iteration/static/description/index.html +++ b/resource_calendar_schedule_iteration/static/description/index.html @@ -3,13 +3,13 @@ - -Resource Calendar Schedule Iterations + +Resource Calendar Schedule Iteration -
-

Resource Calendar Schedule Iterations

+
+

Resource Calendar Schedule Iteration

-

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

-

When you want to plan a number of days in the past or in the future consiering +

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

+

When you want to plan a number of days in the past or in the future considering a working calendar, Odoo limits the number of days/hours that you can plan ahead.

In case that you want to plan days forward/backward, it currently restricts to 100 iterations.

-

In case that you want to plan hours forward/backward, it currently restricts -to 100 iterations.

This module allows you to increase the iteration limit used in the resource calendar to schedule days or hours by means of a system parameter defined by the administrator.

@@ -372,7 +392,7 @@ by the administrator.

Configuration

    -
  1. Go to Ŝettings and activate the developer mode.
  2. +
  3. Go to Settings and activate the developer mode.
  4. Go to Settings / Technical / Parameters / System Parameters and define, new values for the parameters resource.calendar.schedule.days.iteration.limit and/or resource.calendar.schedule.hours.iteration.limit
  5. @@ -383,7 +403,7 @@ and/or resource.calendar.schedule.hours.iteration.limit

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

@@ -397,8 +417,11 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Contributors

@@ -408,7 +431,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/server-tools project on GitHub.

+

This module is part of the OCA/server-tools project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/resource_calendar_schedule_iteration/tests/__init__.py b/resource_calendar_schedule_iteration/tests/__init__.py new file mode 100644 index 000000000..b839f4dd5 --- /dev/null +++ b/resource_calendar_schedule_iteration/tests/__init__.py @@ -0,0 +1 @@ +from . import test_resource_calendar_schedule_iteration diff --git a/resource_calendar_schedule_iteration/tests/test_resource_calendar_schedule_iteration.py b/resource_calendar_schedule_iteration/tests/test_resource_calendar_schedule_iteration.py new file mode 100644 index 000000000..74566f0eb --- /dev/null +++ b/resource_calendar_schedule_iteration/tests/test_resource_calendar_schedule_iteration.py @@ -0,0 +1,46 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from datetime import datetime, timedelta + +import odoo.tests.common as common + + +class TestResourceCalendarScheduleIteration(common.TransactionCase): + + def setUp(self): + super(TestResourceCalendarScheduleIteration, self).setUp() + + self.icp = self.env['ir.config_parameter'] + + self.calendar = self.env.ref('resource.resource_calendar_std') + self.icp.set_param( + "resource.calendar.schedule.days.iteration.limit", 200) + + def test_01_days_iteration(self): + days = 150 + calendar_day = self.calendar.plan_days(-1 * days - 1, datetime.today()) + aprox_date = datetime.today() - timedelta(days=days) + # Without more iteration limit the date returned will be only 100 + # days back using calendar (default iteration limit) instead of 150. + self.assertLess(calendar_day, aprox_date) + + def test_02_hours_iteration(self): + hours = 1500 * 8 + hours_2 = 1700 * 8 + limit_hour = self.calendar.plan_hours(-1 * hours - 1, datetime.today()) + limit_hour_2 = self.calendar.plan_hours( + -1 * hours_2 - 1, datetime.today()) + # Both hour computation exceeded the limit so they should be the + # same (which is incorrect). + self.assertEqual(limit_hour, limit_hour_2) + self.icp.set_param( + "resource.calendar.schedule.hours.iteration.limit", 2000) + correct_hour = self.calendar.plan_hours( + -1 * hours - 1, datetime.today()) + correct_hour_2 = self.calendar.plan_hours( + -1 * hours_2 - 1, datetime.today()) + self.assertNotEqual(correct_hour, correct_hour_2) + self.assertLess(correct_hour, limit_hour) + self.assertLess(correct_hour_2, limit_hour_2)