From a41d5bc3ce6b5bf85ad97b26e19ec66f188c3c58 Mon Sep 17 00:00:00 2001 From: David Beal Date: Tue, 5 Jan 2016 09:18:39 +0100 Subject: [PATCH 1/4] [ADD] calendar usability --- calendar_usability/__init__.py | 1 + calendar_usability/__openerp__.py | 27 +++++++++++ calendar_usability/resource.py | 75 +++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 calendar_usability/__init__.py create mode 100644 calendar_usability/__openerp__.py create mode 100644 calendar_usability/resource.py diff --git a/calendar_usability/__init__.py b/calendar_usability/__init__.py new file mode 100644 index 0000000..364a06e --- /dev/null +++ b/calendar_usability/__init__.py @@ -0,0 +1 @@ +from . import resource diff --git a/calendar_usability/__openerp__.py b/calendar_usability/__openerp__.py new file mode 100644 index 0000000..7788261 --- /dev/null +++ b/calendar_usability/__openerp__.py @@ -0,0 +1,27 @@ +# coding: utf-8 +# © 2015 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Calendar Usability', + 'summary': 'Make calendar creation quicker', + 'description': """ +Calendar Usability +================== + +Define opening hours for each day of week at calendar creation. + +Override map_day() and get_my_calendar_data() method to customize behavior. + +""", + 'version': '8.0.1.0.0', + 'author': 'Akretion', + 'category': 'base', + 'depends': [ + 'resource', + ], + 'website': 'http://www.akretion.com/', + 'data': [ + ], + 'license': 'AGPL-3', +} diff --git a/calendar_usability/resource.py b/calendar_usability/resource.py new file mode 100644 index 0000000..ac567ed --- /dev/null +++ b/calendar_usability/resource.py @@ -0,0 +1,75 @@ +# coding: utf-8 +# © 2015 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import collections +from openerp import models, fields, api + + +class ResourceCalendar(models.Model): + _inherit = 'resource.calendar' + + name = fields.Char(compute='_compute_name', store=True) + + @api.multi + @api.depends('attendance_ids') + def _compute_name(self): + for rec in self: + if rec.attendance_ids: + info = [] + for day in rec.attendance_ids: + selection = day._fields['dayofweek'].selection + string_day = self.map_day()[ + selection[int(day.dayofweek)][1]] + info.append( + '%s %s/%s' + % (string_day, int(day.hour_from), int(day.hour_to))) + rec.name = ', '.join(info) or '_' + else: + rec.name = '_' + + @api.model + def map_day(self): + 'Override me to customize calendar name' + return {'Monday': 'L', 'Tuesday': 'Ma', 'Wednesday': 'Me', + 'Thursday': 'J', 'Friday': 'V', 'Saturday': 'S', + 'Sunday': 'D'} + + @api.model + def get_my_calendar_data(self): + 'Override me according to your opening hours' + Params = collections.namedtuple( + 'Params', 'hour_from hour_to hour_from2 hour_to2 endday') + return Params( + endday=5, + hour_from=8, + hour_to=12, + # put hour_to/from to False if you don't want use them + hour_from2=13, + hour_to2=17, + ) + + @api.model + def _populate_attendance(self, day, hour_from, hour_to): + return { + 'hour_from': hour_from, + 'hour_to': hour_to, + 'name': '.', + 'dayofweek': str(day), + } + + @api.model + def create(self, vals): + if not vals.get('attendance_ids'): + values = [] + params = self.get_my_calendar_data() + for day in range(0, params.endday): + mapping = self._populate_attendance( + day, params.hour_from, params.hour_to) + values.append((0, 0, mapping)) + if params.hour_from2 and params.hour_to2: + mapping = self._populate_attendance( + day, params.hour_from2, params.hour_to2) + values.append((0, 0, mapping)) + vals['attendance_ids'] = values + return super(ResourceCalendar, self).create(vals) From 490b20394392a7375bce7ca89d43533bb29afa76 Mon Sep 17 00:00:00 2001 From: David Beal Date: Tue, 5 Jan 2016 15:27:34 +0100 Subject: [PATCH 2/4] [IMP] attendance_ids at default value --- calendar_usability/resource.py | 81 +++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/calendar_usability/resource.py b/calendar_usability/resource.py index ac567ed..77d1299 100644 --- a/calendar_usability/resource.py +++ b/calendar_usability/resource.py @@ -11,29 +11,64 @@ class ResourceCalendar(models.Model): name = fields.Char(compute='_compute_name', store=True) + @api.model + def default_get(self, fields_list): + "'attendance_ids' field default value" + values = super(ResourceCalendar, self).default_get(fields_list) + vals = [] + params = self.get_my_calendar_data() + for hours in range(0, params.endday): + mapping = self._populate_attendance( + hours, params.hour_from, params.hour_to) + vals.append((0, 0, mapping)) + if params.hour_from2 and params.hour_to2: + mapping = self._populate_attendance( + hours, params.hour_from2, params.hour_to2) + vals.append((0, 0, mapping)) + values['attendance_ids'] = vals + return values + @api.multi @api.depends('attendance_ids') def _compute_name(self): for rec in self: if rec.attendance_ids: info = [] - for day in rec.attendance_ids: - selection = day._fields['dayofweek'].selection - string_day = self.map_day()[ - selection[int(day.dayofweek)][1]] - info.append( - '%s %s/%s' - % (string_day, int(day.hour_from), int(day.hour_to))) - rec.name = ', '.join(info) or '_' - else: - rec.name = '_' + dayofweek = '' + for hours in rec.attendance_ids: + if hours.dayofweek != dayofweek: + selection = hours._fields['dayofweek'].selection + str_day = self.map_day()[ + selection[int(hours.dayofweek)][1]] + info.append( + self.string_format(main_string=True) % ( + str_day, int(hours.hour_from), + int(hours.hour_to))) + else: + # We are on the same day but with another hour range + # we concatenate on the first string of the day + position = info.index(info[-1:][0]) + info[position] = self.string_format() % ( + info[-1:][0], int(hours.hour_from), + int(hours.hour_to)) + dayofweek = hours.dayofweek + rec.name = ', '.join(info) + + @api.model + def string_format(self, main_string=None): + 'Override me to customize calendar name' + if main_string: + # ie: 'Lu 8-12' + return '%s %s-%s' + # ie: 'Lu 8-12 and 13-17' + return '%s / %s-%s' @api.model def map_day(self): 'Override me to customize calendar name' - return {'Monday': 'L', 'Tuesday': 'Ma', 'Wednesday': 'Me', - 'Thursday': 'J', 'Friday': 'V', 'Saturday': 'S', - 'Sunday': 'D'} + return {'Monday': 'Lu', 'Tuesday': 'Ma', 'Wednesday': 'Me', + 'Thursday': 'Je', 'Friday': 'Ve', 'Saturday': 'Sa', + 'Sunday': 'Di'} @api.model def get_my_calendar_data(self): @@ -50,26 +85,10 @@ class ResourceCalendar(models.Model): ) @api.model - def _populate_attendance(self, day, hour_from, hour_to): + def _populate_attendance(self, hours, hour_from, hour_to): return { 'hour_from': hour_from, 'hour_to': hour_to, 'name': '.', - 'dayofweek': str(day), + 'dayofweek': str(hours), } - - @api.model - def create(self, vals): - if not vals.get('attendance_ids'): - values = [] - params = self.get_my_calendar_data() - for day in range(0, params.endday): - mapping = self._populate_attendance( - day, params.hour_from, params.hour_to) - values.append((0, 0, mapping)) - if params.hour_from2 and params.hour_to2: - mapping = self._populate_attendance( - day, params.hour_from2, params.hour_to2) - values.append((0, 0, mapping)) - vals['attendance_ids'] = values - return super(ResourceCalendar, self).create(vals) From 623dca3cbfb6a6e6b56970dd37b845f3f55c3364 Mon Sep 17 00:00:00 2001 From: David Beal Date: Tue, 5 Jan 2016 18:51:04 +0100 Subject: [PATCH 3/4] =?UTF-8?q?[FIX]=C2=A0module=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__init__.py | 0 .../__openerp__.py | 15 ++-- calendar_default_value/calendar_view.xml | 29 +++++++ .../i18n/calendar_default_value.pot | 37 +++++++++ calendar_default_value/i18n/fr_FR.po | 38 +++++++++ .../resource.py | 77 ++++++++++++------- 6 files changed, 162 insertions(+), 34 deletions(-) rename {calendar_usability => calendar_default_value}/__init__.py (100%) rename {calendar_usability => calendar_default_value}/__openerp__.py (60%) create mode 100644 calendar_default_value/calendar_view.xml create mode 100644 calendar_default_value/i18n/calendar_default_value.pot create mode 100644 calendar_default_value/i18n/fr_FR.po rename {calendar_usability => calendar_default_value}/resource.py (77%) diff --git a/calendar_usability/__init__.py b/calendar_default_value/__init__.py similarity index 100% rename from calendar_usability/__init__.py rename to calendar_default_value/__init__.py diff --git a/calendar_usability/__openerp__.py b/calendar_default_value/__openerp__.py similarity index 60% rename from calendar_usability/__openerp__.py rename to calendar_default_value/__openerp__.py index 7788261..2cf4e6c 100644 --- a/calendar_usability/__openerp__.py +++ b/calendar_default_value/__openerp__.py @@ -3,15 +3,19 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': 'Calendar Usability', - 'summary': 'Make calendar creation quicker', + 'name': 'Calendar Default Values', + 'summary': 'Makes calendar creation quicker', 'description': """ -Calendar Usability -================== +Calendar Default Values +======================= Define opening hours for each day of week at calendar creation. -Override map_day() and get_my_calendar_data() method to customize behavior. +Method to override for behavior customization: + + - get_my_calendar_data() + - map_day() + - string_format() """, 'version': '8.0.1.0.0', @@ -22,6 +26,7 @@ Override map_day() and get_my_calendar_data() method to customize behavior. ], 'website': 'http://www.akretion.com/', 'data': [ + 'calendar_view.xml', ], 'license': 'AGPL-3', } diff --git a/calendar_default_value/calendar_view.xml b/calendar_default_value/calendar_view.xml new file mode 100644 index 0000000..1b7d199 --- /dev/null +++ b/calendar_default_value/calendar_view.xml @@ -0,0 +1,29 @@ + + + + + + + + resource.calendar + + + + + + + + + + resource.calendar + + + + + + + + + + + diff --git a/calendar_default_value/i18n/calendar_default_value.pot b/calendar_default_value/i18n/calendar_default_value.pot new file mode 100644 index 0000000..dabeeb5 --- /dev/null +++ b/calendar_default_value/i18n/calendar_default_value.pot @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * calendar_default_value +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-01-05 17:42+0000\n" +"PO-Revision-Date: 2016-01-05 17:42+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: calendar_default_value +#: field:resource.calendar,hour_range:0 +msgid "Hour Range" +msgstr "" + +#. module: calendar_default_value +#: model:ir.model,name:calendar_default_value.model_resource_calendar +msgid "Resource Calendar" +msgstr "" + +#. module: calendar_default_value +#: help:resource.calendar,hour_range:0 +msgid "String representation of working hours" +msgstr "" + +#. module: calendar_default_value +#: model:ir.model,name:calendar_default_value.model_resource_calendar_attendance +msgid "Work Detail" +msgstr "" + diff --git a/calendar_default_value/i18n/fr_FR.po b/calendar_default_value/i18n/fr_FR.po new file mode 100644 index 0000000..93dcf3c --- /dev/null +++ b/calendar_default_value/i18n/fr_FR.po @@ -0,0 +1,38 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * calendar_default_value +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-01-05 18:43+0100\n" +"PO-Revision-Date: 2016-01-05 18:44+0100\n" +"Last-Translator: David BEAL \n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 1.8.4\n" + +#. module: calendar_default_value +#: field:resource.calendar,hour_range:0 +msgid "Hour Range" +msgstr "Plage Horaire" + +#. module: calendar_default_value +#: model:ir.model,name:calendar_default_value.model_resource_calendar +msgid "Resource Calendar" +msgstr "Calendrier de la ressource" + +#. module: calendar_default_value +#: help:resource.calendar,hour_range:0 +msgid "String representation of working hours" +msgstr "Représentation en chaîne de caractères des heures de travail" + +#. module: calendar_default_value +#: model:ir.model,name:calendar_default_value.model_resource_calendar_attendance +msgid "Work Detail" +msgstr "Détail du travail" diff --git a/calendar_usability/resource.py b/calendar_default_value/resource.py similarity index 77% rename from calendar_usability/resource.py rename to calendar_default_value/resource.py index 77d1299..3da47b0 100644 --- a/calendar_usability/resource.py +++ b/calendar_default_value/resource.py @@ -6,10 +6,29 @@ import collections from openerp import models, fields, api +class ResourceCalendarAttendance(models.Model): + _inherit = 'resource.calendar.attendance' + + # PR is done for v9 + # https://github.com/odoo/odoo/pull/10310 + calendar_id = fields.Many2one(ondelete='cascade') + + class ResourceCalendar(models.Model): _inherit = 'resource.calendar' + _rec_name = 'display_name' - name = fields.Char(compute='_compute_name', store=True) + hour_range = fields.Char( + string='Hour Range', compute='_compute_hour_range', + readonly=True, store=True, + help="String representation of working hours") + display_name = fields.Char(compute='_compute_display_name', store=True) + + @api.multi + @api.depends('name', 'hour_range') + def _compute_display_name(self): + for rec in self: + rec.display_name = "%s: %s" % (rec.name, rec.hour_range) @api.model def default_get(self, fields_list): @@ -28,9 +47,32 @@ class ResourceCalendar(models.Model): values['attendance_ids'] = vals return values + @api.model + def _populate_attendance(self, hours, hour_from, hour_to): + return { + 'hour_from': hour_from, + 'hour_to': hour_to, + 'name': '.', + 'dayofweek': str(hours), + } + + @api.model + def get_my_calendar_data(self): + 'Override me according to your opening hours' + Params = collections.namedtuple( + 'Params', 'hour_from hour_to hour_from2 hour_to2 endday') + return Params( + endday=5, + hour_from=8, + hour_to=12, + # put hour_to/from to False if you don't want use them + hour_from2=13, + hour_to2=17, + ) + @api.multi @api.depends('attendance_ids') - def _compute_name(self): + def _compute_hour_range(self): for rec in self: if rec.attendance_ids: info = [] @@ -52,43 +94,20 @@ class ResourceCalendar(models.Model): info[-1:][0], int(hours.hour_from), int(hours.hour_to)) dayofweek = hours.dayofweek - rec.name = ', '.join(info) + rec.hour_range = ', '.join(info) @api.model def string_format(self, main_string=None): - 'Override me to customize calendar name' + 'Override me to customize calendar hour_range' if main_string: # ie: 'Lu 8-12' return '%s %s-%s' - # ie: 'Lu 8-12 and 13-17' + # ie: 'Lu 8-12 / 13-17' return '%s / %s-%s' @api.model def map_day(self): - 'Override me to customize calendar name' + 'Override me to customize calendar hour_range' return {'Monday': 'Lu', 'Tuesday': 'Ma', 'Wednesday': 'Me', 'Thursday': 'Je', 'Friday': 'Ve', 'Saturday': 'Sa', 'Sunday': 'Di'} - - @api.model - def get_my_calendar_data(self): - 'Override me according to your opening hours' - Params = collections.namedtuple( - 'Params', 'hour_from hour_to hour_from2 hour_to2 endday') - return Params( - endday=5, - hour_from=8, - hour_to=12, - # put hour_to/from to False if you don't want use them - hour_from2=13, - hour_to2=17, - ) - - @api.model - def _populate_attendance(self, hours, hour_from, hour_to): - return { - 'hour_from': hour_from, - 'hour_to': hour_to, - 'name': '.', - 'dayofweek': str(hours), - } From 15c0400805e782c5745fe913f25fd411b17428f9 Mon Sep 17 00:00:00 2001 From: David Beal Date: Wed, 6 Jan 2016 18:36:32 +0100 Subject: [PATCH 4/4] =?UTF-8?q?[FIX]=C2=A0variable=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calendar_default_value/resource.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/calendar_default_value/resource.py b/calendar_default_value/resource.py index 3da47b0..f434858 100644 --- a/calendar_default_value/resource.py +++ b/calendar_default_value/resource.py @@ -36,24 +36,24 @@ class ResourceCalendar(models.Model): values = super(ResourceCalendar, self).default_get(fields_list) vals = [] params = self.get_my_calendar_data() - for hours in range(0, params.endday): + for day in range(0, params.endday): mapping = self._populate_attendance( - hours, params.hour_from, params.hour_to) + day, params.hour_from, params.hour_to) vals.append((0, 0, mapping)) if params.hour_from2 and params.hour_to2: mapping = self._populate_attendance( - hours, params.hour_from2, params.hour_to2) + day, params.hour_from2, params.hour_to2) vals.append((0, 0, mapping)) values['attendance_ids'] = vals return values @api.model - def _populate_attendance(self, hours, hour_from, hour_to): + def _populate_attendance(self, day, hour_from, hour_to): return { 'hour_from': hour_from, 'hour_to': hour_to, 'name': '.', - 'dayofweek': str(hours), + 'dayofweek': str(day), } @api.model