Move ir customization from res module to ir module

This commit is contained in:
Cédric Krier
2024-11-10 02:14:34 +01:00
parent ceb299a96a
commit d7f89c8cba
38 changed files with 681 additions and 786 deletions
+26 -3
View File
@@ -7,7 +7,7 @@ CREATE TABLE ir_configuration (
);
CREATE TABLE ir_model (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 3) NOT NULL
CONSTRAINT ir_model_id_positive CHECK(id >= 0),
name VARCHAR NOT NULL,
string VARCHAR,
@@ -18,6 +18,9 @@ CREATE TABLE ir_model (
ALTER TABLE ir_model ADD CONSTRAINT ir_model_name_unique UNIQUE (name);
INSERT INTO ir_model (id, name, module) VALUES (1, 'res.user', 'res');
INSERT INTO ir_model (id, name, module) VALUES (2, 'res.group', 'res');
CREATE TABLE ir_model_field (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
CONSTRAINT ir_model_field_id_positive CHECK(id >= 0),
@@ -35,6 +38,23 @@ CREATE TABLE ir_model_field (
ALTER TABLE ir_model_field ADD CONSTRAINT ir_model_field_name_model_uniq UNIQUE (name, model);
CREATE TABLE ir_model_data (
id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 3) NOT NULL
CONSTRAINT ir_model_id_positive CHECK(id >= 0),
db_id INTEGER,
fs_id VARCHAR,
model VARCHAR NOT NULL,
module VARCHAR NOT NULL,
noupdate BOOL,
fs_values TEXT,
"values" TEXT,
PRIMARY KEY(id),
FOREIGN KEY (model) REFERENCES ir_model(name) ON DELETE CASCADE
);
INSERT INTO ir_model_data (id, db_id, fs_id, model, module, noupdate, fs_values, "values") VALUES (1, 1, 'user_admin', 'res.user', 'res', False, '[["login","admin"],["name","Administrator"]]', '[["login","admin"],["name","Administrator"]]');
INSERT INTO ir_model_data (id, db_id, fs_id, model, module, noupdate, fs_values, "values") VALUES (2, 1, 'group_admin', 'res.group', 'res', False, '[["name","Administrator"]]', '[["name","Administrator"]]');
CREATE TABLE ir_ui_view (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
CONSTRAINT ir_ui_view_id_positive CHECK(id >= 0),
@@ -83,7 +103,7 @@ CREATE TABLE ir_lang (
);
CREATE TABLE res_user (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 2) NOT NULL
CONSTRAINT res_user_id_positive CHECK(id >= 0),
name VARCHAR,
active BOOLEAN NOT NULL,
@@ -95,14 +115,17 @@ CREATE TABLE res_user (
ALTER TABLE res_user ADD CONSTRAINT res_user_login_key UNIQUE (login);
INSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', False);
INSERT INTO res_user (id, login, password, name, active) VALUES (1, 'admin', NULL, 'Administrator', True);
CREATE TABLE res_group (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 2) NOT NULL
CONSTRAINT res_group_id_positive CHECK(id >= 0),
name VARCHAR NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO res_group (id, name) VALUES (1, 'Administration');
CREATE TABLE "res_user-res_group" (
id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL
CONSTRAINT "res_user-res_group_id_positive" CHECK(id >= 0),
+19
View File
@@ -14,6 +14,9 @@ CREATE TABLE ir_model (
CREATE UNIQUE INDEX ir_model_name_unique ON ir_model (name);
INSERT INTO ir_model (id, name, module) VALUES (1, 'res.user', 'res');
INSERT INTO ir_model (id, name, module) VALUES (2, 'res.group', 'res');
CREATE TABLE ir_model_field (
id INTEGER PRIMARY KEY AUTOINCREMENT,
model VARCHAR NOT NULL,
@@ -26,6 +29,19 @@ CREATE TABLE ir_model_field (
"access" BOOLEAN
);
CREATE TABLE ir_model_data (
id INTEGER PRIMARY KEy AUTOINCREMENT,
db_id INTEGER,
fs_id VARCHAR,
model VARCHAR NOT NULL,
module VARCHAR NOT NULL,
noupdate BOOL,
fs_values TEXT,
"values" TEXT
);
INSERT INTO ir_model_data (id, db_id, fs_id, model, module, noupdate, fs_values, "values") VALUES (1, 1, 'user_admin', 'res.user', 'res', False, '[["login","admin"],["name","Administrator"]]', '[["login","admin"],["name","Administrator"]]');
INSERT INTO ir_model_data (id, db_id, fs_id, model, module, noupdate, fs_values, "values") VALUES (2, 1, 'group_admin', 'res.group', 'res', False, '[["name","Administrator"]]', '[["name","Administrator"]]');
CREATE TABLE ir_ui_view (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -79,12 +95,15 @@ CREATE TABLE res_user (
CREATE UNIQUE INDEX res_user_login_key ON res_user (login);
INSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', 0);
INSERT INTO res_user (id, login, password, name, active) VALUES (1, 'admin', NULL, 'Administrator', 1);
CREATE TABLE res_group (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR
);
INSERT INTO res_group (id, name) VALUES (1, 'Administration');
CREATE TABLE "res_user-res_group" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
"user" INTEGER NOT NULL,
+7
View File
@@ -23,9 +23,11 @@ def register():
translation.TranslationExportStart,
translation.TranslationExportResult,
sequence.SequenceType,
sequence.SequenceTypeGroup,
sequence.Sequence,
sequence.SequenceStrict,
ui.menu.UIMenu,
ui.menu.UIMenuGroup,
ui.menu.UIMenuFavorite,
ui.view.View,
ui.view.ShowViewStart,
@@ -35,6 +37,7 @@ def register():
ui.view.ViewSearch,
ui.icon.Icon,
action.Action,
action.ActionGroup,
action.ActionKeyword,
action.ActionReport,
action.ActionActWindow,
@@ -46,6 +49,7 @@ def register():
model.ModelAccess,
model.ModelFieldAccess,
model.ModelButton,
model.ModelButtonGroup,
model.ModelButtonRule,
model.ModelButtonClick,
model.ModelButtonReset,
@@ -63,7 +67,10 @@ def register():
lang.LangConfigStart,
export.Export,
export.ExportLine,
export.ExportGroup,
export.ExportWriteGroup,
rule.RuleGroup,
rule.RuleGroup_Group,
rule.Rule,
module.Module,
module.ModuleDependency,
+76
View File
@@ -66,6 +66,9 @@ class Action(DeactivableMixin, ModelSQL, ModelView):
keywords = fields.One2Many('ir.action.keyword', 'action',
'Keywords')
icon = fields.Many2One('ir.ui.icon', 'Icon')
groups = fields.Many2Many(
'ir.action-res.group', 'action', 'group', "Groups")
_groups_cache = Cache('ir.action.get_groups', context=False)
@classmethod
def __setup__(cls):
@@ -148,6 +151,47 @@ class Action(DeactivableMixin, ModelSQL, ModelView):
return self.get_action_values(self.type, [action_id])[0]
class ActionGroup(ModelSQL):
"Action - Group"
__name__ = 'ir.action-res.group'
action = fields.Many2One(
'ir.action', "Action", ondelete='CASCADE', required=True)
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
@classmethod
def create(cls, vlist):
pool = Pool()
Action = pool.get('ir.action')
vlist = [x.copy() for x in vlist]
for vals in vlist:
if vals.get('action'):
vals['action'] = Action.get_action_id(vals['action'])
Action._groups_cache.clear()
return super().create(vlist)
@classmethod
def write(cls, records, values, *args):
pool = Pool()
Action = pool.get('ir.action')
actions = iter((records, values) + args)
args = []
for records, values in zip(actions, actions):
if values.get('action'):
values = values.copy()
values['action'] = Action.get_action_id(values['action'])
args.extend((records, values))
Action._groups_cache.clear()
super().write(*args)
@classmethod
def delete(cls, records):
pool = Pool()
Action = pool.get('ir.action')
Action._groups_cache.clear()
super().delete(records)
class ActionKeyword(ModelSQL, ModelView):
__name__ = 'ir.action.keyword'
keyword = fields.Selection([
@@ -160,6 +204,10 @@ class ActionKeyword(ModelSQL, ModelView):
model = fields.Reference('Model', selection='models_get')
action = fields.Many2One('ir.action', 'Action',
ondelete='CASCADE')
groups = fields.Function(
fields.One2Many('res.group', None, "Groups"),
'get_groups', searcher='search_groups')
_get_keyword_cache = Cache(
'ir_action_keyword.get_keyword', context=False)
@@ -219,6 +267,13 @@ class ActionKeyword(ModelSQL, ModelView):
Model = pool.get('ir.model')
return [(None, '')] + Model.get_name_items(ModelView)
def get_groups(self, name):
return [g.id for g in self.action.groups]
@classmethod
def search_groups(cls, name, clause):
return [('action.' + clause[0],) + tuple(clause[1:])]
@classmethod
def delete(cls, keywords):
ModelView._view_toolbar_get_cache.clear()
@@ -380,6 +435,27 @@ class ActionMixin(ModelSQL):
def search_action(cls, name, clause):
return [('action.' + clause[0],) + tuple(clause[1:])]
@classmethod
@without_check_access
def get_groups(cls, name, action_id=None):
pool = Pool()
Action = pool.get('ir.action')
key = (name, action_id)
groups = Action._groups_cache.get(key)
if groups is not None:
return set(groups)
domain = [
(cls._action_name, '=', name),
]
if action_id:
domain.append(('id', '=', action_id))
actions = cls.search(domain)
groups = {g.id for a in actions for g in a.groups}
Action._groups_cache.set(key, list(groups))
return groups
@classmethod
def create(cls, vlist):
pool = Pool()
+30
View File
@@ -41,6 +41,36 @@ this repository contains the full copyright notices and license terms. -->
sequence="10"
id="menu_act_action"/>
<record model="ir.model.access" id="access_action">
<field name="model">ir.action</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_action_admin">
<field name="model">ir.action</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.rule.group" id="rule_group_action">
<field name="name">User in groups</field>
<field name="model">ir.action</field>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_action1">
<field name="domain" eval="[('groups', 'in', Eval('groups', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_action"/>
</record>
<record model="ir.rule" id="rule_action2">
<field name="domain" eval="[('groups', '=', None)]" pyson="1"/>
<field name="rule_group" ref="rule_group_action"/>
</record>
<record model="ir.ui.view" id="action_keyword_view_list">
<field name="model">ir.action.keyword</field>
<field name="type">tree</field>
+20
View File
@@ -47,6 +47,26 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">run_once</field>
<field name="string">Run Once</field>
</record>
<record model="ir.model.button-res.group" id="cron_run_once_button_group_admin">
<field name="button" ref="cron_run_once_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.access" id="access_cron">
<field name="model">ir.cron</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_cron_admin">
<field name="model">ir.cron</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="cron_log_view_list">
<field name="model">ir.cron.log</field>
+16
View File
@@ -95,5 +95,21 @@ this repository contains the full copyright notices and license terms. -->
action="act_email_template_form"
sequence="50"
id="menu_email_template_form"/>
<record model="ir.model.access" id="access_email_template">
<field name="model">ir.email.template</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_email_template_admin">
<field name="model">ir.email.template</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
</tryton>
+16
View File
@@ -73,6 +73,22 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">solve</field>
<field name="string">Solve</field>
</record>
<record model="ir.model.access" id="access_error">
<field name="model">ir.error</field>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_error_admin">
<field name="model">ir.error</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
<data noupdate="1">
+31
View File
@@ -3,6 +3,7 @@
"Exports"
from trytond.model import ModelSQL, ModelView, fields
from trytond.pool import Pool
from trytond.pyson import Eval
from trytond.rpc import RPC
from trytond.transaction import Transaction
@@ -30,6 +31,19 @@ class Export(_ClearCache, ModelSQL, ModelView):
resource = fields.Char('Resource')
user = fields.Many2One(
'res.user', "User", required=True, ondelete='CASCADE')
groups = fields.Many2Many(
'ir.export-res.group', 'export', 'group', "Groups",
help="The user groups that can use the export.")
write_groups = fields.Many2Many(
'ir.export-write-res.group', 'export', 'group',
"Modification Groups",
domain=[
('id', 'in', Eval('groups', [])),
],
states={
'invisible': ~Eval('groups'),
},
help="The user groups that can modify the export.")
header = fields.Boolean(
"Header",
help="Check to include field names on the export.")
@@ -139,3 +153,20 @@ class ExportLine(_ClearCache, ModelSQL, ModelView):
def __setup__(cls):
super().__setup__()
cls.__access__.add('export')
class ExportGroup(ModelSQL):
"Export Group"
__name__ = 'ir.export-res.group'
export = fields.Many2One(
'ir.export', "Export", required=True, ondelete='CASCADE')
group = fields.Many2One(
'res.group', "Group", required=True, ondelete='CASCADE')
class ExportWriteGroup(ExportGroup):
"Export Modification Group"
__name__ = 'ir.export-write-res.group'
__string__ = None
_table = None # Needed to reset Export_Group._table
+16
View File
@@ -36,6 +36,22 @@ this repository contains the full copyright notices and license terms. -->
sequence="50"
id="menu_export_form"/>
<record model="ir.model.access" id="access_export">
<field name="model">ir.export</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_export_admin">
<field name="model">ir.export</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="export_line_view_form">
<field name="model">ir.export.line</field>
<field name="type">form</field>
+20
View File
@@ -606,6 +606,22 @@ this repository contains the full copyright notices and license terms. -->
<field name="confirm">Are you sure you want to remove languages' translations?</field>
</record>
<record model="ir.model.access" id="access_lang">
<field name="model">ir.lang</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_lang_admin">
<field name="model">ir.lang</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="lang_config_start_view_form">
<field name="model">ir.lang.config.start</field>
<field name="type">form</field>
@@ -617,6 +633,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="wiz_name">ir.lang.config</field>
<field name="window" eval="True"/>
</record>
<record model="ir.action-res.group" id="act_lang_config_group_admin">
<field name="action" ref="act_lang_config"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.module.config_wizard.item" id="config_wizard_item_lang">
<field name="action" ref="act_lang_config"/>
+16
View File
@@ -32,6 +32,22 @@ this repository contains the full copyright notices and license terms. -->
action="act_message_form"
sequence="20"
id="menu_message_form"/>
<record model="ir.model.access" id="access_message">
<field name="model">ir.message</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_message_group_admin">
<field name="model">ir.message</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
<data grouped="1">
<record model="ir.message" id="msg_ID">
+60
View File
@@ -982,6 +982,9 @@ class ModelButton(
('id', '!=', Eval('id', -1)),
])
_reset_cache = Cache('ir.model.button.reset')
groups = fields.Many2Many(
'ir.model.button-res.group', 'button', 'group', "Groups")
_groups_cache = Cache('ir.model.button.groups')
_view_attributes_cache = Cache(
'ir.model.button.view_attributes', context=False)
@@ -1029,6 +1032,7 @@ class ModelButton(
result = super(ModelButton, cls).create(vlist)
cls._rules_cache.clear()
cls._reset_cache.clear()
cls._groups_cache.clear()
cls._view_attributes_cache.clear()
return result
@@ -1037,6 +1041,7 @@ class ModelButton(
super(ModelButton, cls).write(buttons, values, *args)
cls._rules_cache.clear()
cls._reset_cache.clear()
cls._groups_cache.clear()
cls._view_attributes_cache.clear()
@classmethod
@@ -1044,6 +1049,7 @@ class ModelButton(
super(ModelButton, cls).delete(buttons)
cls._rules_cache.clear()
cls._reset_cache.clear()
cls._groups_cache.clear()
cls._view_attributes_cache.clear()
@classmethod
@@ -1097,6 +1103,27 @@ class ModelButton(
cls._reset_cache.set(key, reset)
return reset
@classmethod
def get_groups(cls, model, name):
'''
Return a set of group ids for the named button on the model.
'''
key = (model, name)
groups = cls._groups_cache.get(key)
if groups is not None:
return groups
buttons = cls.search([
('model.name', '=', model),
('name', '=', name),
])
if not buttons:
groups = set()
else:
button, = buttons
groups = set(g.id for g in button.groups)
cls._groups_cache.set(key, groups)
return groups
@classmethod
def get_view_attributes(cls, model, name):
"Return the view attributes of the named button of the model"
@@ -1121,6 +1148,37 @@ class ModelButton(
return attributes
class ModelButtonGroup(DeactivableMixin, ModelSQL):
"Model Button - Group"
__name__ = 'ir.model.button-res.group'
button = fields.Many2One(
'ir.model.button', "Button", ondelete='CASCADE', required=True)
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
@classmethod
def create(cls, vlist):
pool = Pool()
result = super().create(vlist)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
return result
@classmethod
def write(cls, records, values, *args):
pool = Pool()
super().write(records, values, *args)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
@classmethod
def delete(cls, records):
pool = Pool()
super().delete(records)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
class ModelButtonRule(ModelSQL, ModelView):
__name__ = 'ir.model.button.rule'
button = fields.Many2One(
@@ -1131,6 +1189,7 @@ class ModelButtonRule(ModelSQL, ModelView):
"Condition",
help='A PYSON statement evaluated with the record represented by '
'"self"\nIt activate the rule if true.')
group = fields.Many2One('res.group', "Group", ondelete='CASCADE')
@classmethod
def __setup__(cls):
@@ -1205,6 +1264,7 @@ class ModelButtonClick(DeactivableMixin, ModelSQL, ModelView):
button = fields.Many2One(
'ir.model.button', "Button", required=True, ondelete='CASCADE')
record_id = fields.Integer("Record ID", required=True)
user = fields.Many2One('res.user', "User", ondelete='CASCADE')
@classmethod
def __setup__(cls):
+25
View File
@@ -39,6 +39,23 @@ this repository contains the full copyright notices and license terms. -->
action="act_model_form"
sequence="10"
id="menu_model_form"/>
<record model="ir.model.access" id="access_model">
<field name="model">ir.model</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_model_admin">
<field name="model">ir.model</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="model_fields_view_form">
<field name="model">ir.model.field</field>
<field name="type">form</field>
@@ -304,5 +321,13 @@ this repository contains the full copyright notices and license terms. -->
action="act_model_log_form"
sequence="50"
id="menu_model_log_form"/>
<record model="ir.model.access" id="access_model_log">
<field name="model">ir.model.log</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
</data>
</tryton>
+50
View File
@@ -47,31 +47,76 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">activate</field>
<field name="string">Mark for Activation</field>
</record>
<record model="ir.model.button-res.group" id="module_activate_button_group_admin">
<field name="button" ref="module_activate_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="module_activate_cancel_button">
<field name="model">ir.module</field>
<field name="name">activate_cancel</field>
<field name="string">Cancel Activation</field>
</record>
<record model="ir.model.button-res.group" id="module_activate_cancel_button_group_admin">
<field name="button" ref="module_activate_cancel_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="module_deactivate_button">
<field name="model">ir.module</field>
<field name="name">deactivate</field>
<field name="string">Mark for Deactivation (beta)</field>
</record>
<record model="ir.model.button-res.group" id="module_deactivate_button_group_admin">
<field name="button" ref="module_deactivate_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="module_deactivate_cancel_button">
<field name="model">ir.module</field>
<field name="name">deactivate_cancel</field>
<field name="string">Cancel Deactivation</field>
</record>
<record model="ir.model.button-res.group" id="module_deactivate_cancel_button_group_admin">
<field name="button" ref="module_deactivate_cancel_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="module_upgrade_button">
<field name="model">ir.module</field>
<field name="name">upgrade</field>
<field name="string">Mark for Upgrade</field>
</record>
<record model="ir.model.button-res.group" id="module_upgrade_button_group_admin">
<field name="button" ref="module_upgrade_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="module_upgrade_cancel_button">
<field name="model">ir.module</field>
<field name="name">upgrade_cancel</field>
<field name="string">Cancel Upgrade</field>
</record>
<record model="ir.model.button-res.group" id="module_upgrade_cancel_button_group_admin">
<field name="button" ref="module_upgrade_cancel_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.access" id="access_module">
<field name="model">ir.module</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_module_admin">
<field name="model">ir.module</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="module_dependency_view_form">
<field name="model">ir.module.dependency</field>
@@ -140,6 +185,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Perform Pending Activation/Upgrade</field>
<field name="wiz_name">ir.module.activate_upgrade</field>
</record>
<record model="ir.action-res.group" id="act_module_activate_upgrade_group_admin">
<field name="action" ref="act_module_activate_upgrade"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.action.keyword" id="act_module_activate_upgrade_keyword1">
<field name="action" ref="act_module_activate_upgrade"/>
<field name="keyword">form_action</field>
+11
View File
@@ -66,6 +66,8 @@ class RuleGroup(
()),
],
help="Add this rule to all users by default.")
groups = fields.Many2Many(
'ir.rule.group-res.group', 'rule_group', 'group', "Groups")
rules = fields.One2Many('ir.rule', 'rule_group', 'Tests',
help="The rule is satisfied if at least one test is True.\n"
"If there is no test defined, "
@@ -161,6 +163,15 @@ class RuleGroup(
Pool().get('ir.rule')._domain_get_cache.clear()
class RuleGroup_Group(ModelSQL):
"Rule Group - Group"
__name__ = 'ir.rule.group-res.group'
rule_group = fields.Many2One(
'ir.rule.group', "Rule Group", ondelete='CASCADE', required=True)
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
class Rule(ModelSQL, ModelView):
__name__ = 'ir.rule'
rule_group = fields.Many2One('ir.rule.group', 'Group',
+17
View File
@@ -34,6 +34,23 @@ this repository contains the full copyright notices and license terms. -->
action="act_rule_group_form"
sequence="30"
id="menu_rule_group_form"/>
<record model="ir.model.access" id="access_rule_group">
<field name="model">ir.rule.group</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_rule_group_admin">
<field name="model">ir.rule.group</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="rule_view_form">
<field name="model">ir.rule</field>
<field name="type">form</field>
+12
View File
@@ -35,6 +35,9 @@ class SequenceType(ModelSQL, ModelView):
__name__ = 'ir.sequence.type'
name = fields.Char('Sequence Name', required=True, translate=True)
groups = fields.Many2Many(
'ir.sequence.type-res.group', 'sequence_type', 'group', "Groups",
help="Groups allowed to edit the sequences of this type.")
@classmethod
def __register__(cls, module):
@@ -46,6 +49,15 @@ class SequenceType(ModelSQL, ModelView):
table_h.not_null_action('code', action='remove')
class SequenceTypeGroup(ModelSQL):
'Sequence Type - Group'
__name__ = 'ir.sequence.type-res.group'
sequence_type = fields.Many2One(
'ir.sequence.type', "Sequence Type", ondelete='CASCADE', required=True)
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
class Sequence(DeactivableMixin, ModelSQL, ModelView):
__name__ = 'ir.sequence'
+38
View File
@@ -43,6 +43,17 @@ this repository contains the full copyright notices and license terms. -->
sequence="10"
id="menu_sequence_form"/>
<record model="ir.rule.group" id="rule_group_sequence">
<field name="name">User in groups</field>
<field name="model">ir.sequence</field>
<field name="global_p" eval="True"/>
<field name="perm_read" eval="False"/>
</record>
<record model="ir.rule" id="rule_sequence">
<field name="domain" eval="[('sequence_type.groups', 'in', Eval('groups', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_sequence"/>
</record>
<record model="ir.ui.view" id="sequence_strict_view_form">
<field name="model">ir.sequence.strict</field>
<field name="type" eval="None"/>
@@ -78,6 +89,17 @@ this repository contains the full copyright notices and license terms. -->
id="menu_sequence_strict_form"
icon="tryton-list"/>
<record model="ir.rule.group" id="rule_group_sequence_strict">
<field name="name">User in groups</field>
<field name="model">ir.sequence.strict</field>
<field name="global_p" eval="True"/>
<field name="perm_read" eval="False"/>
</record>
<record model="ir.rule" id="rule_sequence_strict">
<field name="domain" eval="[('sequence_type.groups', 'in', Eval('groups', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_sequence_strict"/>
</record>
<record model="ir.ui.view" id="sequence_type_view_form">
<field name="model">ir.sequence.type</field>
<field name="type">form</field>
@@ -111,5 +133,21 @@ this repository contains the full copyright notices and license terms. -->
action="act_sequence_type_form"
sequence="20"
id="menu_ir_sequence_type"/>
<record model="ir.model.access" id="access_sequence_type">
<field name="model">ir.sequence.type</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_sequence_type_admin">
<field name="model">ir.sequence.type</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
</tryton>
+24
View File
@@ -50,6 +50,22 @@ this repository contains the full copyright notices and license terms. -->
sequence="20"
id="menu_translation_form"/>
<record model="ir.model.access" id="access_translation">
<field name="model">ir.translation</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_translation_admin">
<field name="model">ir.translation</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.action.wizard" id="wizard_translation_report">
<field name="name">Translations</field>
<field name="wiz_name">ir.translation.report</field>
@@ -131,6 +147,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Synchronize Translations</field>
<field name="wiz_name">ir.translation.update</field>
</record>
<record model="ir.action-res.group" id="act_translation_update_group_admin">
<field name="action" ref="act_translation_update"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.action.keyword"
id="act_translation_update_keyword_report">
<field name="keyword">form_action</field>
@@ -165,6 +185,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Export Translations</field>
<field name="wiz_name">ir.translation.export</field>
</record>
<record model="ir.action-res.group" id="act_translation_export_group_admin">
<field name="action" ref="act_translation_export"/>
<field name="group" ref="res.group_admin"/>
</record>
<menuitem
parent="menu_localization"
action="act_translation_export"
+22
View File
@@ -33,5 +33,27 @@ this repository contains the full copyright notices and license terms. -->
sequence="50"
id="menu_trigger_form"/>
<record model="ir.model.access" id="access_trigger">
<field name="model">ir.trigger</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_trigger_admin">
<field name="model">ir.trigger</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
<data noupdate="1">
<record model="ir.cron" id="cron_trigger_time">
<field name="method">ir.trigger|trigger_time</field>
<field name="interval_number" eval="5"/>
<field name="interval_type">minutes</field>
</record>
</data>
</tryton>
+16
View File
@@ -34,5 +34,21 @@
action="act_icon_form"
sequence="20"
id="menu_icon_form"/>
<record model="ir.model.access" id="access_ui_icon">
<field name="model">ir.ui.icon</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ui_icon_admin">
<field name="model">ir.ui.icon</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
</tryton>
+11
View File
@@ -106,6 +106,8 @@ class UIMenu(
filter=[
('keyword', '=', 'tree_open'),
])
groups = fields.Many2Many(
'ir.ui.menu-res.group', 'menu', 'group', "Groups")
favorite = fields.Function(fields.Boolean('Favorite'), 'get_favorite')
favorites = fields.Many2Many(
'ir.ui.menu.favorite', 'menu', 'user', "Favorites")
@@ -262,6 +264,15 @@ class UIMenu(
return menu2favorite
class UIMenuGroup(ModelSQL):
"UI Menu - Group"
__name__ = 'ir.ui.menu-res.group'
menu = fields.Many2One(
'ir.ui.menu', "Menu", ondelete='CASCADE', required=True)
group = fields.Many2One(
'res.group', "Group", ondelete='CASCADE', required=True)
class UIMenuFavorite(ModelSQL):
"Menu Favorite"
__name__ = 'ir.ui.menu.favorite'
+30
View File
@@ -59,5 +59,35 @@ this repository contains the full copyright notices and license terms. -->
action="act_menu_list"
sequence="10"
id="menu_menu_list"/>
<record model="ir.model.access" id="access_ui_menu">
<field name="model">ir.ui.menu</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ui_menu_admin">
<field name="model">ir.ui.menu</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.rule.group" id="rule_group_ui_menu">
<field name="name">User in groups</field>
<field name="model">ir.ui.menu</field>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_ui_menu1">
<field name="domain" eval="[('groups', 'in', Eval('groups', []))]" pyson="1"/>
<field name="rule_group" ref="rule_group_ui_menu"/>
</record>
<record model="ir.rule" id="rule_ui_menu2">
<field name="domain" eval="[('groups', '=', None)]" pyson="1"/>
<field name="rule_group" ref="rule_group_ui_menu"/>
</record>
</data>
</tryton>
+4
View File
@@ -45,6 +45,10 @@ this repository contains the full copyright notices and license terms. -->
sequence="9999"
id="menu_administration"
icon="tryton-settings"/>
<record model="ir.ui.menu-res.group" id="menu_administration_group_admin">
<field name="menu" ref="menu_administration"/>
<field name="group" ref="res.group_admin"/>
</record>
<menuitem
name="User Interface"
parent="menu_administration"
+52
View File
@@ -55,6 +55,26 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">show</field>
<field name="string">Show</field>
</record>
<record model="ir.model.button-res.group" id="view_show_button_group_admin">
<field name="button" ref="view_show_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.access" id="access_ui_view">
<field name="model">ir.ui.view</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ui_view_admin">
<field name="model">ir.ui.view</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="view_tree_width_view_form">
<field name="model">ir.ui.view_tree_width</field>
@@ -158,6 +178,22 @@ this repository contains the full copyright notices and license terms. -->
<field name="action" ref="act_view_tree_state"/>
</record>
<record model="ir.model.access" id="rule_default_view_tree_state">
<field name="model">ir.ui.view_tree_state</field>
<field name="perm_read" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_delete" eval="False" />
</record>
<record model="ir.model.access" id="rule_group_view_tree_state">
<field name="model">ir.ui.view_tree_state</field>
<field name="group" ref="res.group_admin" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_delete" eval="True" />
</record>
<record model="ir.ui.view" id="view_search_form">
<field name="model">ir.ui.view_search</field>
<field name="type">form</field>
@@ -191,5 +227,21 @@ this repository contains the full copyright notices and license terms. -->
<field name="model">ir.model,-1</field>
<field name="action" ref="act_view_search"/>
</record>
<record model="ir.model.access" id="access_view_search">
<field name="model">ir.ui.view_search</field>
<field name="perm_read" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_delete" eval="False" />
</record>
<record model="ir.model.access" id="access_view_search_admin">
<field name="model">ir.ui.view_search</field>
<field name="group" ref="res.group_admin" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_delete" eval="True" />
</record>
</data>
</tryton>
+4
View File
@@ -15,5 +15,9 @@ this repository contains the full copyright notices and license terms. -->
<label name="user"/>
<field name="user"/>
<field name="groups" colspan="4"/>
<field name="write_groups" colspan="4"/>
<field name="export_fields" colspan="4"/>
</form>
+2
View File
@@ -5,4 +5,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name" expand="1"/>
<field name="resource" expand="1"/>
<field name="user"/>
<field name="groups"/>
<field name="write_groups"/>
</tree>
@@ -4,4 +4,6 @@ this repository contains the full copyright notices and license terms. -->
<form>
<label name="name"/>
<field name="name"/>
<field name="groups" colspan="4"/>
</form>
-20
View File
@@ -18,27 +18,7 @@ def register():
user.Warning_,
user.UserApplication,
user.UserConfigStart,
ir.UIMenu,
ir.UIMenuGroup,
ir.ActionGroup,
ir.Action,
ir.ActionReport,
ir.ActionActWindow,
ir.ActionWizard,
ir.ActionURL,
ir.ActionKeyword,
ir.ModelButton,
ir.ModelButtonGroup,
ir.ModelButtonRule,
ir.ModelButtonClick,
ir.RuleGroup,
ir.RuleGroupGroup,
ir.Rule,
ir.SequenceType,
ir.SequenceTypeGroup,
ir.Export,
ir.Export_Group,
ir.Export_Write_Group,
module='res', type_='model')
Pool.register(
user.UserConfig,
+2 -270
View File
@@ -1,228 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.cache import Cache
from trytond.model import DeactivableMixin, ModelSQL, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction, without_check_access
class UIMenu(metaclass=PoolMeta):
__name__ = 'ir.ui.menu'
groups = fields.Many2Many(
'ir.ui.menu-res.group', 'menu', 'group', "Groups")
class UIMenuGroup(ModelSQL):
__name__ = 'ir.ui.menu-res.group'
menu = fields.Many2One('ir.ui.menu', 'Menu', ondelete='CASCADE',
required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
class ActionGroup(ModelSQL):
__name__ = 'ir.action-res.group'
action = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',
required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
@classmethod
def create(cls, vlist):
pool = Pool()
Action = pool.get('ir.action')
vlist = [x.copy() for x in vlist]
for vals in vlist:
if vals.get('action'):
vals['action'] = Action.get_action_id(vals['action'])
Action._groups_cache.clear()
return super().create(vlist)
@classmethod
def write(cls, records, values, *args):
pool = Pool()
Action = pool.get('ir.action')
actions = iter((records, values) + args)
args = []
for records, values in zip(actions, actions):
if values.get('action'):
values = values.copy()
values['action'] = Action.get_action_id(values['action'])
args.extend((records, values))
Action._groups_cache.clear()
super().write(*args)
@classmethod
def delete(cls, records):
pool = Pool()
Action = pool.get('ir.action')
Action._groups_cache.clear()
super().delete(records)
class Action(metaclass=PoolMeta):
__name__ = 'ir.action'
groups = fields.Many2Many(
'ir.action-res.group', 'action', 'group', "Groups")
_groups_cache = Cache('ir.action.get_groups', context=False)
class ActionMixin(metaclass=PoolMeta):
@classmethod
@without_check_access
def get_groups(cls, name, action_id=None):
pool = Pool()
Action = pool.get('ir.action')
key = (name, action_id)
groups = Action._groups_cache.get(key)
if groups is not None:
return set(groups)
domain = [
(cls._action_name, '=', name),
]
if action_id:
domain.append(('id', '=', action_id))
actions = cls.search(domain)
groups = {g.id for a in actions for g in a.groups}
Action._groups_cache.set(key, list(groups))
return groups
class ActionReport(ActionMixin):
__name__ = 'ir.action.report'
class ActionActWindow(ActionMixin):
__name__ = 'ir.action.act_window'
class ActionWizard(ActionMixin):
__name__ = 'ir.action.wizard'
class ActionURL(ActionMixin):
__name__ = 'ir.action.url'
class ActionKeyword(metaclass=PoolMeta):
__name__ = 'ir.action.keyword'
groups = fields.Function(fields.One2Many('res.group', None, 'Groups'),
'get_groups', searcher='search_groups')
def get_groups(self, name):
return [g.id for g in self.action.groups]
@classmethod
def search_groups(cls, name, clause):
return [('action.' + clause[0],) + tuple(clause[1:])]
class ModelButton(metaclass=PoolMeta):
__name__ = 'ir.model.button'
groups = fields.Many2Many(
'ir.model.button-res.group', 'button', 'group', "Groups")
_groups_cache = Cache('ir.model.button.groups')
@classmethod
def create(cls, vlist):
result = super().create(vlist)
cls._groups_cache.clear()
return result
@classmethod
def write(cls, buttons, values, *args):
super().write(buttons, values, *args)
cls._groups_cache.clear()
@classmethod
def delete(cls, buttons):
super().delete(buttons)
cls._groups_cache.clear()
@classmethod
def get_groups(cls, model, name):
'''
Return a set of group ids for the named button on the model.
'''
key = (model, name)
groups = cls._groups_cache.get(key)
if groups is not None:
return groups
buttons = cls.search([
('model.name', '=', model),
('name', '=', name),
])
if not buttons:
groups = set()
else:
button, = buttons
groups = set(g.id for g in button.groups)
cls._groups_cache.set(key, groups)
return groups
class ModelButtonGroup(DeactivableMixin, ModelSQL):
__name__ = 'ir.model.button-res.group'
button = fields.Many2One('ir.model.button', 'Button',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
@classmethod
def create(cls, vlist):
pool = Pool()
result = super(ModelButtonGroup, cls).create(vlist)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
return result
@classmethod
def write(cls, records, values, *args):
pool = Pool()
super(ModelButtonGroup, cls).write(records, values, *args)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
@classmethod
def delete(cls, records):
pool = Pool()
super(ModelButtonGroup, cls).delete(records)
# Restart the cache for get_groups
pool.get('ir.model.button')._groups_cache.clear()
class ModelButtonRule(metaclass=PoolMeta):
__name__ = 'ir.model.button.rule'
group = fields.Many2One('res.group', "Group", ondelete='CASCADE')
class ModelButtonClick(metaclass=PoolMeta):
__name__ = 'ir.model.button.click'
user = fields.Many2One('res.user', "User", ondelete='CASCADE')
class RuleGroup(metaclass=PoolMeta):
__name__ = 'ir.rule.group'
groups = fields.Many2Many(
'ir.rule.group-res.group', 'rule_group', 'group', "Groups")
class RuleGroupGroup(ModelSQL):
__name__ = 'ir.rule.group-res.group'
rule_group = fields.Many2One('ir.rule.group', 'Rule Group',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
required=True)
from trytond.pool import PoolMeta
from trytond.transaction import Transaction
class Rule(metaclass=PoolMeta):
@@ -241,51 +21,3 @@ class Rule(metaclass=PoolMeta):
if model_names & {'res.user.warning', 'res.user.application'}:
key = (*key, Transaction().user)
return key
class SequenceType(metaclass=PoolMeta):
__name__ = 'ir.sequence.type'
groups = fields.Many2Many('ir.sequence.type-res.group', 'sequence_type',
'group', 'User Groups',
help='Groups allowed to edit the sequences of this type.')
class SequenceTypeGroup(ModelSQL):
__name__ = 'ir.sequence.type-res.group'
sequence_type = fields.Many2One('ir.sequence.type', 'Sequence Type',
ondelete='CASCADE', required=True)
group = fields.Many2One('res.group', 'User Groups',
ondelete='CASCADE', required=True)
class Export(metaclass=PoolMeta):
__name__ = 'ir.export'
groups = fields.Many2Many(
'ir.export-res.group', 'export', 'group', "Groups",
help="The user groups that can use the export.")
write_groups = fields.Many2Many(
'ir.export-write-res.group', 'export', 'group',
"Modification Groups",
domain=[
('id', 'in', Eval('groups', [])),
],
states={
'invisible': ~Eval('groups'),
},
depends=['groups'],
help="The user groups that can modify the export.")
class Export_Group(ModelSQL):
__name__ = 'ir.export-res.group'
export = fields.Many2One(
'ir.export', "Export", required=True, ondelete='CASCADE')
group = fields.Many2One(
'res.group', "Group", required=True, ondelete='CASCADE')
class Export_Write_Group(Export_Group):
__name__ = 'ir.export-write-res.group'
__string__ = None
_table = None # Needed to reset Export_Group._table
-463
View File
@@ -1,463 +0,0 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.model.access" id="access_ir_sequence_type">
<field name="model">ir.sequence.type</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_sequence_type_admin">
<field name="model">ir.sequence.type</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_ui_icon">
<field name="model">ir.ui.icon</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_ui_icon_admin">
<field name="model">ir.ui.icon</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_ui_menu">
<field name="model">ir.ui.menu</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_ui_menu_admin">
<field name="model">ir.ui.menu</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_ui_view">
<field name="model">ir.ui.view</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_ui_view_admin">
<field name="model">ir.ui.view</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_action">
<field name="model">ir.action</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_action_admin">
<field name="model">ir.action</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_model">
<field name="model">ir.model</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_model_admin">
<field name="model">ir.model</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_model_data">
<field name="model">ir.model.data</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_model_log">
<field name="model">ir.model.log</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_cron">
<field name="model">ir.cron</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_cron_admin">
<field name="model">ir.cron</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_queue">
<field name="model">ir.queue</field>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_queue_admin">
<field name="model">ir.queue</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_lang">
<field name="model">ir.lang</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_lang_admin">
<field name="model">ir.lang</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_translation">
<field name="model">ir.translation</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_translation_admin">
<field name="model">ir.translation</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_rule_group">
<field name="model">ir.rule.group</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_rule_group_admin">
<field name="model">ir.rule.group</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_module">
<field name="model">ir.module</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_module_admin">
<field name="model">ir.module</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_trigger">
<field name="model">ir.trigger</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_trigger_admin">
<field name="model">ir.trigger</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.rule.group" id="rule_group_menu">
<field name="name">User in groups</field>
<field name="model">ir.ui.menu</field>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_menu1">
<field name="domain"
eval="[('groups', 'in', Eval('groups', []))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_menu"/>
</record>
<record model="ir.rule" id="rule_menu2">
<field name="domain" eval="[('groups', '=', None)]" pyson="1"/>
<field name="rule_group" ref="rule_group_menu"/>
</record>
<record model="ir.rule.group" id="rule_group_action">
<field name="name">User in groups</field>
<field name="model">ir.action</field>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_action1">
<field name="domain"
eval="[('groups', 'in', Eval('groups', []))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_action"/>
</record>
<record model="ir.rule" id="rule_action2">
<field name="domain" eval="[('groups', '=', None)]" pyson="1"/>
<field name="rule_group" ref="rule_group_action"/>
</record>
<record model="ir.action-res.group" id="act_module_activate_upgrade_group_admin">
<field name="action" ref="ir.act_module_activate_upgrade"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.action-res.group" id="act_translation_update_group_admin">
<field name="action" ref="ir.act_translation_update"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.action-res.group" id="act_translation_export_group_admin">
<field name="action" ref="ir.act_translation_export"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.action-res.group" id="act_lang_config">
<field name="action" ref="ir.act_lang_config"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_administration_group_admin">
<field name="menu" ref="ir.menu_administration"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_activate_button_group_admin">
<field name="button" ref="ir.module_activate_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_activate_cancel_button_group_admin">
<field name="button" ref="ir.module_activate_cancel_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_deactivate_button_group_admin">
<field name="button" ref="ir.module_deactivate_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_deactivate_cancel_button_group_admin">
<field name="button" ref="ir.module_deactivate_cancel_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_upgrade_button_group_admin">
<field name="button" ref="ir.module_upgrade_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="module_upgrade_cancel_button_group_admin">
<field name="button" ref="ir.module_upgrade_cancel_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="cron_run_once_button_group_admin">
<field name="button" ref="ir.cron_run_once_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.model.button-res.group"
id="view_show_button_group_admin">
<field name="button" ref="ir.view_show_button"/>
<field name="group" ref="group_admin"/>
</record>
<record model="ir.ui.view" id="sequence_type_view_form">
<field name="model">ir.sequence.type</field>
<field name="inherit" ref="ir.sequence_type_view_form"/>
<field name="name">sequence_type_form</field>
</record>
<record model="ir.rule.group" id="rule_group_sequence">
<field name="name">User in groups</field>
<field name="model">ir.sequence</field>
<field name="global_p" eval="True"/>
<field name="perm_read" eval="False"/>
</record>
<record model="ir.rule" id="rule_sequence">
<field name="domain"
eval="[('sequence_type.groups', 'in', Eval('groups', []))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_sequence"/>
</record>
<record model="ir.rule.group" id="rule_group_sequence_strict">
<field name="name">User in groups</field>
<field name="model">ir.sequence.strict</field>
<field name="global_p" eval="True"/>
<field name="perm_read" eval="False"/>
</record>
<record model="ir.rule" id="rule_sequence_strict">
<field name="domain"
eval="[('sequence_type.groups', 'in', Eval('groups', []))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_sequence_strict"/>
</record>
<record model="ir.model.access" id="rule_default_view_tree_state">
<field name="model">ir.ui.view_tree_state</field>
<field name="perm_read" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_delete" eval="False" />
</record>
<record model="ir.model.access" id="rule_group_view_tree_state">
<field name="model">ir.ui.view_tree_state</field>
<field name="group" ref="res.group_admin" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_delete" eval="True" />
</record>
<record model="ir.model.access" id="access_ir_ui_view_search">
<field name="model">ir.ui.view_search</field>
<field name="perm_read" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_delete" eval="False" />
</record>
<record model="ir.model.access" id="access_ir_ui_view_search_admin">
<field name="model">ir.ui.view_search</field>
<field name="group" ref="res.group_admin" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_delete" eval="True" />
</record>
<record model="ir.model.access" id="access_message">
<field name="model">ir.message</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_message_group_admin">
<field name="model">ir.message</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.view" id="export_view_form">
<field name="model">ir.export</field>
<field name="inherit" ref="ir.export_view_form"/>
<field name="name">export_form</field>
</record>
<record model="ir.ui.view" id="export_view_list">
<field name="model">ir.export</field>
<field name="inherit" ref="ir.export_view_tree"/>
<field name="name">export_list</field>
</record>
<record model="ir.model.access" id="access_ir_export">
<field name="model">ir.export</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_export_admin">
<field name="model">ir.export</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_email_template">
<field name="model">ir.email.template</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_email_template_admin">
<field name="model">ir.email.template</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_ir_error">
<field name="model">ir.error</field>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_ir_error_admin">
<field name="model">ir.error</field>
<field name="group" ref="group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
<data noupdate="1">
<record model="ir.cron" id="cron_trigger_time">
<field name="method">ir.trigger|trigger_time</field>
<field name="interval_number" eval="5"/>
<field name="interval_type">minutes</field>
</record>
</data>
</tryton>
-1
View File
@@ -5,5 +5,4 @@ xml:
res.xml
group.xml
user.xml
ir.xml
message.xml
+4
View File
@@ -354,6 +354,10 @@ class User(avatar_mixin(100, 'login'), DeactivableMixin, ModelSQL, ModelView):
vals['email'] = normalize_email(vals['email'])
return vals
@classmethod
def check_xml_record(cls, records, values):
pass
@classmethod
def read(cls, ids, fields_names):
result = super(User, cls).read(ids, fields_names)
+2 -3
View File
@@ -2,14 +2,13 @@
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data noupdate="1">
<data>
<record model="res.user" id="user_admin">
<field name="login">admin</field>
<field name="name">Administrator</field>
<field name="menu" ref="ir.act_menu_tree"/>
</record>
</data>
<data>
<record model="res.user-res.group" id="user_admin_group_admin">
<field name="user" ref="user_admin"/>
<field name="group" ref="group_admin"/>
-9
View File
@@ -1,9 +0,0 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='user']" position="after">
<field name="groups" colspan="4"/>
<field name="write_groups" colspan="4"/>
</xpath>
</data>
-9
View File
@@ -1,9 +0,0 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='user']" position="after">
<field name="groups"/>
<field name="write_groups"/>
</xpath>
</data>
@@ -1,8 +0,0 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="/form" position="inside">
<field name="groups" colspan="4"/>
</xpath>
</data>