From 9dfde4d687c1c4be9ab994ecbe2e7961c30c7357 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Sun, 3 Jan 2016 17:36:46 +0100 Subject: [PATCH] [RFR] Expose as a user preference --- base_technical_features/README.rst | 19 ++++-- base_technical_features/__openerp__.py | 8 ++- base_technical_features/data/res_users.xml | 6 ++ base_technical_features/i18n/nl.po | 25 +++++++- base_technical_features/models/__init__.py | 1 + .../models/basemodel_monkeypatch.py | 2 + base_technical_features/models/ir_ui_menu.py | 4 +- base_technical_features/models/res_users.py | 59 ++++++++++++++++++ .../security/res_groups.xml | 1 - .../static/description/user_preferences.png | Bin 0 -> 30961 bytes .../tests/test_base_technical_features.py | 36 ++++++++--- base_technical_features/views/res_users.xml | 16 +++++ 12 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 base_technical_features/data/res_users.xml create mode 100644 base_technical_features/models/res_users.py create mode 100644 base_technical_features/static/description/user_preferences.png create mode 100644 base_technical_features/views/res_users.xml diff --git a/base_technical_features/README.rst b/base_technical_features/README.rst index 1d35fb35e..a6a2987a9 100644 --- a/base_technical_features/README.rst +++ b/base_technical_features/README.rst @@ -8,17 +8,26 @@ Access to technical features without activating debug mode In Odoo 9.0, the debug mode grants every employee user access to the technical features. This module enables persistent access to technical features based on -group access. +user preference. Configuration ============= After installation of this module, every employee can still access technical features for the applications that they have access to by enabling debug mode. -Additionally, users can be assigned the *Technical feature (w/o debug mode)* -access right on their user form which will enable technical features at any -time. As an Odoo administrator, you might want to review who to grant this -access to. +Additionally, users can check the *Technical feature* field in their +preferences to gain permanent access to the menus and views that fall under +this category. + +.. figure:: static/description/user_preferences.png + :alt: User preferences + +Upon installation of this module, this preference is already +set for the administrator user of the database. + +In the background, this preference is mapped to the *Technical feature (w/o +debug mode)* group that this module adds. As an administrator, you can +therefore manage this preference from the regular Users and Groups menu items. Usage ===== diff --git a/base_technical_features/__openerp__.py b/base_technical_features/__openerp__.py index 3fa65b707..14383e9f5 100644 --- a/base_technical_features/__openerp__.py +++ b/base_technical_features/__openerp__.py @@ -1,15 +1,17 @@ -# -*- coding: utf-8 -*- -# © 2016 Opener B.V. +# coding: utf-8 +# © 2016 Opener B.V. () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Technical features group", "summary": "Access to technical features without activating debug mode", "version": "9.0.1.0.0", "category": "Usability", - "website": "https://odoo-community.org/", + "website": "https://github.com/oca/server-tools", "author": "Opener B.V., Odoo Community Association (OCA)", "data": [ 'security/res_groups.xml', + 'views/res_users.xml', + 'data/res_users.xml', ], "license": "AGPL-3", "installable": True, diff --git a/base_technical_features/data/res_users.xml b/base_technical_features/data/res_users.xml new file mode 100644 index 000000000..e9f87e586 --- /dev/null +++ b/base_technical_features/data/res_users.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/base_technical_features/i18n/nl.po b/base_technical_features/i18n/nl.po index 4f180b0b7..8d7ef8f31 100644 --- a/base_technical_features/i18n/nl.po +++ b/base_technical_features/i18n/nl.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 9.0c\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-01 17:57+0000\n" -"PO-Revision-Date: 2016-01-01 17:57+0000\n" +"POT-Creation-Date: 2016-01-03 16:11+0000\n" +"PO-Revision-Date: 2016-01-03 16:11+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,7 +15,28 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: base_technical_features +#: model:ir.model.fields,field_description:base_technical_features.field_res_users_show_technical_features +msgid "Show field Technical Features" +msgstr "Toon veld Technische mogelijkheden" + #. module: base_technical_features #: model:res.groups,name:base_technical_features.group_technical_features msgid "Technical Features (w/o debug mode)" msgstr "Technische mogelijkheden (zonder debugmodus)" + +#. module: base_technical_features +#: model:ir.model.fields,field_description:base_technical_features.field_res_users_technical_features +msgid "Technical features" +msgstr "Technische mogelijkheden" + +#. module: base_technical_features +#: code:addons/base_technical_features/models/res_users.py:45 +#, python-format +msgid "The user does not have access to technical features." +msgstr "De gebruiker heeft geen toegang tot technische mogelijkheden." + +#. module: base_technical_features +#: model:ir.model.fields,help:base_technical_features.field_res_users_show_technical_features +msgid "Whether to display the technical features field in the user preferences." +msgstr "Geeft aan of het veld Technische mogelijkheden wordt getoond in de voorkeuren van de gebruiker." diff --git a/base_technical_features/models/__init__.py b/base_technical_features/models/__init__.py index 7c5b68460..b26f7f495 100644 --- a/base_technical_features/models/__init__.py +++ b/base_technical_features/models/__init__.py @@ -1,2 +1,3 @@ from . import basemodel_monkeypatch from . import ir_ui_menu +from . import res_users diff --git a/base_technical_features/models/basemodel_monkeypatch.py b/base_technical_features/models/basemodel_monkeypatch.py index 9cc0bfd17..0652a12cd 100644 --- a/base_technical_features/models/basemodel_monkeypatch.py +++ b/base_technical_features/models/basemodel_monkeypatch.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +# © 2016 Opener B.V. () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, api diff --git a/base_technical_features/models/ir_ui_menu.py b/base_technical_features/models/ir_ui_menu.py index 878507fca..112fe3957 100644 --- a/base_technical_features/models/ir_ui_menu.py +++ b/base_technical_features/models/ir_ui_menu.py @@ -1,4 +1,6 @@ -# -*- coding: utf-8 -*- +# coding: utf-8 +# © 2016 Opener B.V. () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import api, models diff --git a/base_technical_features/models/res_users.py b/base_technical_features/models/res_users.py new file mode 100644 index 000000000..824caefac --- /dev/null +++ b/base_technical_features/models/res_users.py @@ -0,0 +1,59 @@ +# coding: utf-8 +# © 2016 Opener B.V. () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openerp import api, fields, models +from openerp.exceptions import AccessError +from openerp.tools.translate import _ + + +class ResUsers(models.Model): + _inherit = 'res.users' + + technical_features = fields.Boolean( + compute='get_technical_features', + inverse='set_technical_features') + show_technical_features = fields.Boolean( + string='Show field Technical Features', + compute='get_show_technical_features', + help=('Whether to display the technical features field in the user ' + 'preferences.')) + + @api.multi + @api.depends('groups_id') + def get_show_technical_features(self): + """ Only display the technical features checkbox in the user + preferences if the user has access to them """ + users = self.env.ref('base.group_no_one').users + for user in self: + user.show_technical_features = user in users + + @api.multi + @api.depends('groups_id') + def get_technical_features(self): + """ Map user membership to boolean field value """ + users = self.env.ref( + 'base_technical_features.group_technical_features').users + for user in self: + user.technical_features = user in users + + @api.multi + def set_technical_features(self): + """ Map boolean field value to group membership, but checking + access """ + group = self.env.ref( + 'base_technical_features.group_technical_features') + for user in self: + if self.env.ref('base.group_no_one') not in user.groups_id: + raise AccessError( + _('The user does not have access to technical ' + 'features.')) + if user.technical_features: + self.sudo().write({'groups_id': [(4, group.id)]}) + else: + self.sudo().write({'groups_id': [(3, group.id)]}) + + def __init__(self, pool, cr): + super(ResUsers, self).__init__(pool, cr) + self.SELF_READABLE_FIELDS += [ + 'technical_features', 'show_technical_features'] + self.SELF_WRITEABLE_FIELDS.append('technical_features') diff --git a/base_technical_features/security/res_groups.xml b/base_technical_features/security/res_groups.xml index d61ffc5c5..12846ece2 100644 --- a/base_technical_features/security/res_groups.xml +++ b/base_technical_features/security/res_groups.xml @@ -3,6 +3,5 @@ Technical Features (w/o debug mode) - diff --git a/base_technical_features/static/description/user_preferences.png b/base_technical_features/static/description/user_preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..c30837e1382f248e4c902f6779d02c75d7ffa420 GIT binary patch literal 30961 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 + + + Add technical features checkbox to user preferences form + res.users + + + + + + + + + +