问题描述
我制作了一个模块配置文件以将组添加到配置文件中。 创建新用户时,我们可以为用户配置文件添加配置文件,用户将在配置文件中自动授权组。 但我不能让用户从个人资料中自动添加组。 不能有人帮我请。 多谢。 我有这个错误:TypeError:update_groups() 缺少 1 个必需的位置参数:'uids'。
这是我的代码: profile.py:
# -*- coding: utf-8 -*-
from odoo import models,fields,api,tools
import string
from odoo.tools.translate import _
class Users(models.Model):
_inherit = 'res.users'
profile_id = fields.Many2one('res.profiles',string="Profile")
profiles_ids = fields.Many2many('res.profiles','profile_user_rel','user_id','profile_id',string='Profile Name')
def update_groups(self,uids):
users_pool = self.env["res.profiles"]
if uids:
for user in users_pool.browse(uids):
if not user.profiles_ids and user.id != 2:
user.write({'groups_id':[[6,[]]]})
if user.profiles_ids:
sql = """UPDATE FROM res_groups_users_rel WHERE uid = %s"""%(user.id)
self._cr.execute(sql)
groups_ids = []
for profile in user.profiles_ids:
groups_ids += [x.id for x in profile.groups_ids if x.id not in groups_ids]
user.write({'groups_id':[[6,groups_ids]]})
return True
def update_profile(self):
self.env["user.profiles"].update_groups(self.ids)
return True
class GroupInherit(models.Model):
_inherit = 'res.groups'
profiles_groups_ids = fields.Many2many('res.profiles','profile_group_rel','group_id',string='Profile Name')
class UserProfile(models.Model):
_name = 'res.profiles'
_description = 'Profile Record'
_rec_name = 'profile_name'
_sql_constraints = [('name_uniq','unique(name)','Profile name must be unique!'),]
_order = "profile_name"
profile_name = fields.Char(string='Name',required=True)
groups_ids = fields.Many2many('res.groups',string='Authorized Group')
user_ids = fields.Many2many('res.users',string='User Name')
```
profile.xml:
```
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<!-- tree view -->
<record id="profile_tree" model="ir.ui.view">
<field name="name">user.profile.tree</field>
<field name="model">res.profiles</field>
<field name="arch" type="xml">
<tree string= "profile">
<field name="profile_name"/>
<field name="user_ids"/>
<field name="groups_ids"/>
</tree>
</field>
</record>
<!-- view form -->
<record id="student_form" model="ir.ui.view">
<field name="name">user.profile.form</field>
<field name="model">res.profiles</field>
<field name="arch" type="xml">
<form string="Profile">
<sheet>
<div class="oe_title">
</div>
<group>
<group><field name="profile_name"/></group>
<group><field name="user_ids" widget="many2many_tags"/></group>
<group><field name="groups_ids"/></group>
</group>
</sheet>
</form>
</field>
</record>
<!--action of the student menu-->
<record id="action_profile" model="ir.actions.act_window">
<field name="name">Profile</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.profiles</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create First profile !
</p>
</field>
</record>
<!-- profile name in group view -->
<record id="group_inherit" model="ir.ui.view">
<field name="name">group.inherit</field>
<field name="model">res.groups</field>
<field name="inherit_id" ref="base.view_groups_form"></field>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="profiles_groups_ids"/>
</field>
</field>
</record>
<!-- profile name in user view -->
<record id="user_inherit" model="ir.ui.view">
<field name="name">user.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"></field>
<field name="arch" type="xml">
<field name="login" position="after">
<field name="profiles_ids"/>
</field>
<field name="profiles_ids" position="after">
<div class='oe_button_Box' name="button_Box"><button name='update_groups'
type="object" class="oe_stat_button" string="update"></button></div>
</field>
<button name="action_show_groups" position="attributes">
<attribute name="invisible">1</attribute>
</button>
<field name="groups_count" position="attributes">
<attribute name="invisible">1</attribute>
</field>
</field>
</record>
<menuitem id="profiles" name="User Profile" parent="base.menu_users" sequence="4" action="action_profile"/>
<menuitem id="user_root" name="Profile" sequence="0"/>
<menuitem id="user_profile" name ="Profile" parent="user_root" action="action_profile"/>
</odoo>
```
解决方法
如果您像 self.env["user.profiles"].
那样在没有记录集的情况下调用它(即直接从模型调用它),则应使用 @api.model
:
@api.model
def update_groups(self,uids):
users_pool = self.env["res.profiles"]
#...
否则,它期望隐式传递 ids
参数,而您的 self.ids
用于隐藏的参数。
你也用过 "users.profile"
self.env["user.profiles"].update_groups(self.ids)```
I think it is a typo.
But why you don't use recordsets?:
```python
def update_groups(self):
for user in self:
if not user.profiles_ids and user.id != 2:
user.write({'groups_id':[[6,[]]]})
if user.profiles_ids:
sql = """UPDATE FROM res_groups_users_rel WHERE uid = %s"""%(user.id)
self._cr.execute(sql)
groups_ids = []
for profile in user.profiles_ids:
groups_ids += [x.id for x in profile.groups_ids if x.id not in groups_ids]
user.write({'groups_id':[[6,groups_ids]]})
def update_profile(self):
self.update_groups()