Move ir customization from res module to ir module
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -5,5 +5,4 @@ xml:
|
||||
res.xml
|
||||
group.xml
|
||||
user.xml
|
||||
ir.xml
|
||||
message.xml
|
||||
|
||||
@@ -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,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"/>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user