IMPL calls super in group_backend res_users compute_share

FIX applies pre-commit
IMPL adds test for share of backend user
FIX pre-commit pass
IMPL removes mail.activity.mixin from dummy model because it is not needed for the test
IMPL renames and divide the base_group_backend into 2 groups one that provide the basic rights and another that allow login in the app
IMPL changes backend ui users to a user type
FIX pre-commit pass
FIX removes useless imports
FIX adds share to group_backend_ui_users
IMPL adds mail_channel to access rights
FIX tests now working
FIX pre-commit pass
This commit is contained in:
Francois Poizat
2023-08-17 14:38:52 +02:00
committed by David Beal
parent 48a8d4eec1
commit 93eafb5001
17 changed files with 182 additions and 71 deletions

View File

@@ -7,7 +7,7 @@ Group backend
!! This file is generated by oca-gen-addon-readme !! !! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !! !! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:6aed3105c0a4c58cc34c910e88d34a68e14d38a8d549160bbc5b8f276320cda4 !! source digest: sha256:c7397d2b2e542e6918527090ab259d68f9d3b6a25386feccdc38002e51be4e31
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png

View File

@@ -8,14 +8,21 @@
"license": "LGPL-3", "license": "LGPL-3",
"maintainers": ["oca"], "maintainers": ["oca"],
"website": "https://github.com/OCA/server-backend", "website": "https://github.com/OCA/server-backend",
"depends": ["base", "mail"], "depends": [
"base",
"base_install_request", # weird module, we need to survive with it
"mail",
],
"demo": [ "demo": [
"demo/test-model.xml", "demo/test-model.xml",
"demo/ir.model.access.csv", "demo/ir.model.access.csv",
"demo/backend_dummy_model.xml", "demo/backend_dummy_model.xml",
"demo/res_partners.xml",
"demo/res_users.xml",
], ],
"data": [ "data": [
"data/res-groups.xml", "data/res_groups.xml",
"data/ir_ui_menu.xml",
"security/ir.model.access.csv", "security/ir.model.access.csv",
], ],
"installable": True, "installable": True,

View File

@@ -0,0 +1,8 @@
<odoo>
<record model="ir.ui.menu" id="base.menu_management">
<!-- Allow to avoid to display App menu for backend users -->
<field name="groups_id" eval="[(4, ref('base.group_user'), 0)]" />
</record>
</odoo>

View File

@@ -1,18 +0,0 @@
<odoo>
<record model="res.groups" id="group_backend">
<field name="name">Backend user</field>
<field name="category_id" ref="base.module_category_user_type" />
<field name="comment">
This group is used to gives user backend access.
While users in `base.group_user` gets a lot of default access
which makes hard to define properly records/rules/menu access.
So for maintainability you shouldn't linked any access right, rules,
menu, and so on to this group directly.
The only intent of this groups is to be able to get a session
to Odoo backend (`/web`).
</field>
</record>
</odoo>

View File

@@ -0,0 +1,43 @@
<odoo>
<record model="res.groups" id="base_group_backend">
<field name="name">Backend user</field>
<field name="category_id" ref="base.module_category_user_type" />
<field name="comment">
This group is used to gives user backend access.
While users in `base.group_user` gets a lot of default access
which makes hard to define properly records/rules/menu access.
So for maintainability you shouldn't linked any access right, rules,
menu, and so on to this group directly.
The only intent of this groups is to be able to get a session
to Odoo backend (`/web`).
</field>
</record>
<record model="res.groups" id="group_backend_ui_users">
<field name="name">Backend UI user</field>
<field name="category_id" ref="base.module_category_user_type" />
<field name="comment">
This group is used to gives user basic ui access.
</field>
<field
name="rule_groups"
eval="[
(6, 0,[
ref('base.ir_default_user_rule'),
ref('base.ir_filters_delete_own_rule'),
ref('base.ir_filters_employee_rule'),
ref('base.res_company_rule_employee'),
ref('mail.ir_rule_mail_notifications_group_user'),
ref('mail.ir_rule_mail_channel_member_group_user'),
ref('mail.mail_activity_rule_user'),
ref('mail.mail_channel_rule'),
]),
]"
/>
</record>
</odoo>

View File

@@ -3,7 +3,6 @@ from odoo import fields, models
class BackendDummyModel(models.Model): class BackendDummyModel(models.Model):
_name = "backend.dummy.model" _name = "backend.dummy.model"
_inherit = ["mail.activity.mixin"]
_description = "Backend Dummy Model demo" _description = "Backend Dummy Model demo"
my_value = fields.Char(name="Value", required=True) my_value = fields.Char(name="Value", required=True)

View File

@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo noupdate="1">
<record id="backend_dummy_model_tree_view" model="ir.ui.view"> <record id="backend_dummy_model_tree_view" model="ir.ui.view">
<field name="name">Backend dummy tree view</field> <field name="name">Backend dummy tree view</field>
<field name="model">backend.dummy.model</field> <field name="model">backend.dummy.model</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree create="false" delete="false"> <tree create="false" delete="false">
<field name="my_value" /> <field name="my_value" />
<field name="my_other_value" /> <field name="my_other_value" groups="base.group_user" />
</tree> </tree>
</field> </field>
</record> </record>
@@ -24,20 +23,20 @@
id="menu_dummy_root" id="menu_dummy_root"
name="Dummy" name="Dummy"
sequence="100" sequence="100"
groups="group_backend,base.group_user" groups="group_backend_ui_users,base.group_user"
/> />
<menuitem <menuitem
id="menu_dummy_menu" id="menu_dummy_menu"
name="Dummy" name="Dummy"
sequence="10" sequence="10"
groups="group_backend,base.group_user" groups="group_backend_ui_users,base.group_user"
parent="menu_dummy_root" parent="menu_dummy_root"
/> />
<menuitem <menuitem
id="menu_dummy_list" id="menu_dummy_list"
name="Dummy list" name="Dummy list"
sequence="100" sequence="100"
groups="group_backend,base.group_user" groups="group_backend_ui_users,base.group_user"
parent="menu_dummy_root" parent="menu_dummy_root"
action="action_dummy_list" action="action_dummy_list"
/> />

View File

@@ -1,3 +1,3 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"backend_dummy_models","backend dummy.model","model_backend_dummy_model",group_backend,1,0,0,0 "backend_dummy_models","backend dummy.model","model_backend_dummy_model",group_backend_ui_users,1,0,0,0
"backend_dummy_models_user_grp","backend dummy.model user grp","model_backend_dummy_model",base.group_user,1,0,0,0 "backend_dummy_models_user_grp","backend dummy.model user grp","model_backend_dummy_model",base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 backend_dummy_models backend dummy.model model_backend_dummy_model group_backend group_backend_ui_users 1 0 0 0
3 backend_dummy_models_user_grp backend dummy.model user grp model_backend_dummy_model base.group_user 1 0 0 0

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="demo_partner" model="res.partner">
<field name="name">Demo partner backend</field>
</record>
<record id="demo_partner1" model="res.partner">
<field name="name">Demo partner backend 1</field>
</record>
<record id="demo_partner2" model="res.partner">
<field name="name">Demo partner backend 2</field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="user_demo" model="res.users">
<field name="login">demo backend user</field>
<field name="groups_id" eval="[Command.set([ref('base.group_user')])]" />
<field name="partner_id" ref="base_group_backend.demo_partner" />
</record>
<record id="user_demo_external" model="res.users">
<field name="login">demo backend user 1</field>
<field name="groups_id" eval="[Command.set([ref('base.group_portal')])]" />
<field name="partner_id" ref="base_group_backend.demo_partner1" />
</record>
<record id="user_demo_external_with_ui" model="res.users">
<field name="login">demo backend user 2</field>
<field
name="groups_id"
eval="[Command.set([ref('base_group_backend.group_backend_ui_users')])]"
/>
<field name="partner_id" ref="base_group_backend.demo_partner2" />
</record>
</odoo>

View File

@@ -1,8 +1,7 @@
<odoo> <?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record model="backend.dummy.model" id="dummy_model_1"> <record model="backend.dummy.model" id="dummy_model_1">
<field name="my_value">hello</field> <field name="my_value">hello</field>
<field name="my_other_value">hello</field> <field name="my_other_value">hello</field>
</record> </record>
</odoo> </odoo>

View File

@@ -1,2 +1 @@
from odoo.tools import config
from . import res_users from . import res_users

View File

@@ -8,7 +8,6 @@ _logger = logging.getLogger(__name__)
class Users(models.Model): class Users(models.Model):
_inherit = "res.users" _inherit = "res.users"
# TODO: (franz) make it clear why we test with "." group and why the share = True
@api.model @api.model
def has_group(self, group_ext_id): def has_group(self, group_ext_id):
"""While ensuring a user is part of `base.group_user` this code will """While ensuring a user is part of `base.group_user` this code will
@@ -25,21 +24,27 @@ class Users(models.Model):
res = super().has_group(group_ext_id) res = super().has_group(group_ext_id)
if not res and (group_ext_id == "base.group_user"): if not res and (group_ext_id == "base.group_user"):
has_base_group_backend = super().has_group( has_base_group_backend = super().has_group(
"base_group_backend.group_backend" "base_group_backend.base_group_backend"
) ) or super().has_group("base_group_backend.group_backend_ui_users")
if has_base_group_backend: if has_base_group_backend:
_logger.warning("Forcing has_group to return True for group_backend") _logger.warning(
"Forcing has_group to return True"
+ " for group_backend and base_group_backend_ui_users"
)
return has_base_group_backend return has_base_group_backend
return res return res
@api.depends("groups_id") @api.depends("groups_id")
def _compute_share(self): def _compute_share(self):
user_group_id = self.env["ir.model.data"]._xmlid_to_res_id("base.group_user") res = super()._compute_share()
backend_user_group_id = self.env["ir.model.data"]._xmlid_to_res_id( backend_user_group_id = self.env["ir.model.data"]._xmlid_to_res_id(
"base_group_backend.group_backend" "base_group_backend.base_group_backend"
)
backend_ui_user_group_id = self.env["ir.model.data"]._xmlid_to_res_id(
"base_group_backend.group_backend_ui_users"
) )
internal_users = self.filtered_domain( internal_users = self.filtered_domain(
[("groups_id", "in", [user_group_id, backend_user_group_id])] [("groups_id", "in", [backend_user_group_id, backend_ui_user_group_id])]
) )
internal_users.share = False internal_users.share = False
(self - internal_users).share = True return res

View File

@@ -0,0 +1,5 @@
Current module depends on `base_install_request` instead of `base`.
We don't need `base_install_request` auto install module but we must override it to set a security group on `App` menu.
This dependency should be remove if possible in future versions.

View File

@@ -1,13 +1,33 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
res_users_backend,backend user res.users,base.model_res_users,group_backend,1,0,0,0 backend_ui_users_ir_default,backend_ui_users_ir_default,base.model_ir_default,group_backend_ui_users,1,1,1,1
res_partner_backend,backend user res.partner,base.model_res_partner,group_backend,1,0,0,0 backend_ui_users_ir_filters,backend_ui_users_ir_filters,base.model_ir_filters,group_backend_ui_users,1,1,1,1
ir_ui_menu_backend,backend user ir.ui.menu,base.model_ir_ui_menu,group_backend,1,0,0,0 backend_ui_users_ir_model,backend_ui_users_ir_model,base.model_ir_model,group_backend_ui_users,1,0,0,0
ir_filter_backend,backend user ir.filters,base.model_ir_filters,group_backend,1,1,1,1 backend_ui_users_ir_model_fields,backend_ui_users_ir_model_fields,base.model_ir_model_fields,group_backend_ui_users,1,0,0,0
bus_presence_backend,backend user bus.presence,bus.model_bus_presence,group_backend,1,1,1,1 backend_ui_users_ir_model_data,backend_ui_users_ir_model_data,base.model_ir_model_data,group_backend_ui_users,1,0,1,0
mail_channel_member_backend,backend user mail.channel.member,mail.model_mail_channel_member,group_backend,1,1,1,0 backend_ui_users_ir_model_fields_selection,backend_ui_users_ir_model_fields_selection,base.model_ir_model_fields_selection,group_backend_ui_users,1,0,0,0
mail_channel_backend,backend user mail.group,mail.model_mail_channel,group_backend,1,1,1,0 backend_ui_users_ir_sequence,backend_ui_users_ir_sequence,base.model_ir_sequence,group_backend_ui_users,1,0,0,0
mail_notification_backend,backend user mail.notification,mail.model_mail_notification,group_backend,1,1,1,0 backend_ui_users_ir_sequence_date_range,backend_ui_users_ir_sequence_date_range,base.model_ir_sequence_date_range,group_backend_ui_users,1,0,0,0
mail_activity_backend,backend user mail.activity,mail.model_mail_activity,group_backend,1,1,1,1 backend_ui_users_ir_ui_menu,backend_ui_users_ir_ui_menu,base.model_ir_ui_menu,group_backend_ui_users,1,0,0,0
mail_activity_type_backend,backend user mail.activity.type,mail.model_mail_activity_type,group_backend,1,0,0,0 backend_ui_users_ir_attachment,backend_ui_users_ir_attachment,base.model_ir_attachment,group_backend_ui_users,1,0,1,0
ir_attachment_group_backend,backend user ir.attachment,base.model_ir_attachment,group_backend,1,0,0,0 backend_ui_users_res_partner,backend_ui_users_res_partner,base.model_res_partner,group_backend_ui_users,1,0,0,0
mail_followers_backend,backend user mail.followers,mail.model_mail_followers,group_backend,1,0,0,0 backend_ui_users_bus_presence,backend_ui_users_bus_presence,bus.model_bus_presence,group_backend_ui_users,1,1,1,1
backend_ui_users_mail_channel_member_public,backend_ui_users_mail_channel_member,mail.model_mail_channel_member,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_channel_public,backend_ui_users_mail_channel_member,mail.model_mail_channel,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_activity,backend_ui_users_mail_activity,mail.model_mail_activity,group_backend_ui_users,1,1,1,1
backend_ui_users_mail_activity_type,backend_ui_users_mail_activity_type,mail.model_mail_activity_type,group_backend_ui_users,1,0,0,0
backend_ui_users_mail_followers,backend_ui_users_mail_followers,mail.model_mail_followers,group_backend_ui_users,1,0,0,0
backend_ui_users_mail_mail,backend_ui_users_mail_mail,mail.model_mail_mail,group_backend_ui_users,0,0,0,0
backend_ui_users_mail_compose_message,backend_ui_users_mail_compose_message,mail.model_mail_compose_message,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_wizard_invite,backend_ui_users_mail_wizard_invite,mail.model_mail_wizard_invite,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_template,backend_ui_users_mail_template,mail.model_mail_template,group_backend_ui_users,1,0,0,0
backend_ui_users_mail_template_preview,backend_ui_users_mail_template_preview,mail.model_mail_template_preview,group_backend_ui_users,1,0,0,0
backend_ui_users_mail_message,backend_ui_users_mail_message,mail.model_mail_message,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_resend_message,backend_ui_users_mail_resend_message,mail.model_mail_resend_message,group_backend_ui_users,1,1,1,0
backend_ui_users_mail_notification,backend_ui_users_mail_notification,mail.model_mail_notification,group_backend_ui_users,1,1,1,1
backend_ui_users_mail_alias,backend_ui_users_mail_alias,mail.model_mail_alias,group_backend_ui_users,1,0,0,0
backend_ui_users_res_groups,backend_ui_users_res_groups,base.model_res_groups,group_backend_ui_users,1,0,0,0
backend_ui_users_res_partner_category,backend_ui_users_res_partner_category,base.model_res_partner_category,group_backend_ui_users,1,0,0,0
backend_ui_users_res_partner_industry,backend_ui_users_res_partner_industry,base.model_res_partner_industry,group_backend_ui_users,1,0,0,0
backend_ui_users_res_users_identitycheck,backend_ui_users_res_users_identitycheck,base.model_res_users_identitycheck,group_backend_ui_users,1,1,1,0
backend_ui_users_res_bank,backend_ui_users_res_bank,base.model_res_bank,group_backend_ui_users,1,0,0,0
backend_ui_users_res_partner_bank,backend_ui_users_res_partner_bank,base.model_res_partner_bank,group_backend_ui_users,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 res_users_backend backend_ui_users_ir_default backend user res.users backend_ui_users_ir_default base.model_res_users base.model_ir_default group_backend group_backend_ui_users 1 0 1 0 1 0 1
3 res_partner_backend backend_ui_users_ir_filters backend user res.partner backend_ui_users_ir_filters base.model_res_partner base.model_ir_filters group_backend group_backend_ui_users 1 0 1 0 1 0 1
4 ir_ui_menu_backend backend_ui_users_ir_model backend user ir.ui.menu backend_ui_users_ir_model base.model_ir_ui_menu base.model_ir_model group_backend group_backend_ui_users 1 0 0 0
5 ir_filter_backend backend_ui_users_ir_model_fields backend user ir.filters backend_ui_users_ir_model_fields base.model_ir_filters base.model_ir_model_fields group_backend group_backend_ui_users 1 1 0 1 0 1 0
6 bus_presence_backend backend_ui_users_ir_model_data backend user bus.presence backend_ui_users_ir_model_data bus.model_bus_presence base.model_ir_model_data group_backend group_backend_ui_users 1 1 0 1 1 0
7 mail_channel_member_backend backend_ui_users_ir_model_fields_selection backend user mail.channel.member backend_ui_users_ir_model_fields_selection mail.model_mail_channel_member base.model_ir_model_fields_selection group_backend group_backend_ui_users 1 1 0 1 0 0
8 mail_channel_backend backend_ui_users_ir_sequence backend user mail.group backend_ui_users_ir_sequence mail.model_mail_channel base.model_ir_sequence group_backend group_backend_ui_users 1 1 0 1 0 0
9 mail_notification_backend backend_ui_users_ir_sequence_date_range backend user mail.notification backend_ui_users_ir_sequence_date_range mail.model_mail_notification base.model_ir_sequence_date_range group_backend group_backend_ui_users 1 1 0 1 0 0
10 mail_activity_backend backend_ui_users_ir_ui_menu backend user mail.activity backend_ui_users_ir_ui_menu mail.model_mail_activity base.model_ir_ui_menu group_backend group_backend_ui_users 1 1 0 1 0 1 0
11 mail_activity_type_backend backend_ui_users_ir_attachment backend user mail.activity.type backend_ui_users_ir_attachment mail.model_mail_activity_type base.model_ir_attachment group_backend group_backend_ui_users 1 0 0 1 0
12 ir_attachment_group_backend backend_ui_users_res_partner backend user ir.attachment backend_ui_users_res_partner base.model_ir_attachment base.model_res_partner group_backend group_backend_ui_users 1 0 0 0
13 mail_followers_backend backend_ui_users_bus_presence backend user mail.followers backend_ui_users_bus_presence mail.model_mail_followers bus.model_bus_presence group_backend group_backend_ui_users 1 0 1 0 1 0 1
14 backend_ui_users_mail_channel_member_public backend_ui_users_mail_channel_member mail.model_mail_channel_member group_backend_ui_users 1 1 1 0
15 backend_ui_users_mail_channel_public backend_ui_users_mail_channel_member mail.model_mail_channel group_backend_ui_users 1 1 1 0
16 backend_ui_users_mail_activity backend_ui_users_mail_activity mail.model_mail_activity group_backend_ui_users 1 1 1 1
17 backend_ui_users_mail_activity_type backend_ui_users_mail_activity_type mail.model_mail_activity_type group_backend_ui_users 1 0 0 0
18 backend_ui_users_mail_followers backend_ui_users_mail_followers mail.model_mail_followers group_backend_ui_users 1 0 0 0
19 backend_ui_users_mail_mail backend_ui_users_mail_mail mail.model_mail_mail group_backend_ui_users 0 0 0 0
20 backend_ui_users_mail_compose_message backend_ui_users_mail_compose_message mail.model_mail_compose_message group_backend_ui_users 1 1 1 0
21 backend_ui_users_mail_wizard_invite backend_ui_users_mail_wizard_invite mail.model_mail_wizard_invite group_backend_ui_users 1 1 1 0
22 backend_ui_users_mail_template backend_ui_users_mail_template mail.model_mail_template group_backend_ui_users 1 0 0 0
23 backend_ui_users_mail_template_preview backend_ui_users_mail_template_preview mail.model_mail_template_preview group_backend_ui_users 1 0 0 0
24 backend_ui_users_mail_message backend_ui_users_mail_message mail.model_mail_message group_backend_ui_users 1 1 1 0
25 backend_ui_users_mail_resend_message backend_ui_users_mail_resend_message mail.model_mail_resend_message group_backend_ui_users 1 1 1 0
26 backend_ui_users_mail_notification backend_ui_users_mail_notification mail.model_mail_notification group_backend_ui_users 1 1 1 1
27 backend_ui_users_mail_alias backend_ui_users_mail_alias mail.model_mail_alias group_backend_ui_users 1 0 0 0
28 backend_ui_users_res_groups backend_ui_users_res_groups base.model_res_groups group_backend_ui_users 1 0 0 0
29 backend_ui_users_res_partner_category backend_ui_users_res_partner_category base.model_res_partner_category group_backend_ui_users 1 0 0 0
30 backend_ui_users_res_partner_industry backend_ui_users_res_partner_industry base.model_res_partner_industry group_backend_ui_users 1 0 0 0
31 backend_ui_users_res_users_identitycheck backend_ui_users_res_users_identitycheck base.model_res_users_identitycheck group_backend_ui_users 1 1 1 0
32 backend_ui_users_res_bank backend_ui_users_res_bank base.model_res_bank group_backend_ui_users 1 0 0 0
33 backend_ui_users_res_partner_bank backend_ui_users_res_partner_bank base.model_res_partner_bank group_backend_ui_users 1 0 0 0

View File

@@ -3,18 +3,18 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" /> <meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Group backend</title> <title>Group backend</title>
<style type="text/css"> <style type="text/css">
/* /*
:Author: David Goodger (goodger@python.org) :Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $ :Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain. :Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils. Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet. customize this style sheet.
*/ */
@@ -367,9 +367,9 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !! !! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !! !! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:6aed3105c0a4c58cc34c910e88d34a68e14d38a8d549160bbc5b8f276320cda4 !! source digest: sha256:c7397d2b2e542e6918527090ab259d68f9d3b6a25386feccdc38002e51be4e31
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-backend/tree/16.0/base_group_backend"><img alt="OCA/server-backend" src="https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-backend-16-0/server-backend-16-0-base_group_backend"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/builds?repo=OCA/server-backend&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p> <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/server-backend/tree/16.0/base_group_backend"><img alt="OCA/server-backend" src="https://img.shields.io/badge/github-OCA%2Fserver--backend-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-backend-16-0/server-backend-16-0-base_group_backend"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-backend&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module was written to extend the standard functionality regarding users <p>This module was written to extend the standard functionality regarding users
and groups management by adding a new <cite>Backend user</cite> group that only gives access and groups management by adding a new <cite>Backend user</cite> group that only gives access
to odoo backend (<cite>/web</cite>):</p> to odoo backend (<cite>/web</cite>):</p>
@@ -411,14 +411,14 @@ has been used.</p>
<p><strong>Table of contents</strong></p> <p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents"> <div class="contents local topic" id="contents">
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li> <li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li> <li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li> <li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a></li> <li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a></li>
</ul> </ul>
</div> </div>
<div class="section" id="configuration"> <div class="section" id="configuration">
<h2><a class="toc-backref" href="#id1">Configuration</a></h2> <h2><a class="toc-backref" href="#toc-entry-1">Configuration</a></h2>
<p>To allow <cite>group_backend</cite> to interact with a model you can either add access rules to the group <p>To allow <cite>group_backend</cite> to interact with a model you can either add access rules to the group
or you can add <cite>implied_ids</cite> to <cite>group_backend</cite>.</p> or you can add <cite>implied_ids</cite> to <cite>group_backend</cite>.</p>
<div class="admonition note"> <div class="admonition note">
@@ -429,7 +429,7 @@ internal users and backend users.</p>
</div> </div>
</div> </div>
<div class="section" id="usage"> <div class="section" id="usage">
<h2><a class="toc-backref" href="#id2">Usage</a></h2> <h2><a class="toc-backref" href="#toc-entry-2">Usage</a></h2>
<p>To use this module, you need to:</p> <p>To use this module, you need to:</p>
<ol class="arabic simple"> <ol class="arabic simple">
<li>Go to Configuration / Users / Users, choose a user and set the user type.</li> <li>Go to Configuration / Users / Users, choose a user and set the user type.</li>
@@ -439,7 +439,7 @@ can attach other groups that not implies other kind of users (<cite>portal</cite
<cite>internal users</cite>)</p> <cite>internal users</cite>)</p>
</div> </div>
<div class="section" id="bug-tracker"> <div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#id3">Bug Tracker</a></h2> <h2><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-backend/issues">GitHub Issues</a>. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-backend/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -447,7 +447,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p> <p>Do not contact contributors directly about support or help with technical issues.</p>
</div> </div>
<div class="section" id="credits"> <div class="section" id="credits">
<h2><a class="toc-backref" href="#id4">Credits</a></h2> <h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
</div> </div>
</div> </div>
<div class="section" id="authors"> <div class="section" id="authors">
@@ -472,7 +472,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use.</p> promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p> <p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/oca"><img alt="oca" src="https://github.com/oca.png?size=40px" /></a></p> <p><a class="reference external image-reference" href="https://github.com/oca"><img alt="oca" src="https://github.com/oca.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-backend/tree/16.0/base_group_backend">OCA/server-backend</a> project on GitHub.</p> <p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-backend/tree/16.0/base_group_backend">OCA/server-backend</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div> </div>

View File

@@ -6,14 +6,26 @@ class TestResUsers(TransactionCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
super().setUpClass() super().setUpClass()
cls.base_group_backend = cls.env.ref("base_group_backend.group_backend") cls.base_group_backend = cls.env.ref("base_group_backend.base_group_backend")
cls.internal_user = cls.env.ref("base.user_demo") cls.internal_user = cls.env.ref("base.user_demo")
cls.portal_user = cls.env.ref("base.demo_user0") cls.portal_user = cls.env.ref("base_group_backend.user_demo_external")
cls.portal_ui_user = cls.env.ref(
"base_group_backend.user_demo_external_with_ui"
)
def test_has_groups(self): def test_has_groups(self):
self.assertFalse(self.portal_user.has_group("base.group_user"))
self.assertTrue(self.internal_user.has_group("base.group_user")) self.assertTrue(self.internal_user.has_group("base.group_user"))
self.assertFalse(self.portal_user.has_group("base.group_user"))
self.assertTrue(self.portal_ui_user.has_group("base.group_user"))
self.portal_user.write( self.portal_user.write(
{"groups_id": [Command.set([self.base_group_backend.id])]} {"groups_id": [Command.set([self.base_group_backend.id])]}
) )
self.assertTrue(self.portal_user.has_group("base.group_user")) self.assertTrue(self.portal_user.has_group("base.group_user"))
def test_share(self):
self.assertTrue(self.portal_user.share)
self.portal_user.write(
{"groups_id": [Command.set([self.base_group_backend.id])]}
)
self.assertFalse(self.portal_user.share)
self.assertFalse(self.portal_ui_user.share)