不能调用这个函数:类型错误:update_groups() 缺少 1 个必需的位置参数:'uids'

问题描述

我制作了一个模块配置文件以将组添加配置文件中。 创建新用户时,我们可以为用户配置文件添加配置文件用户将在配置文件自动授权组。 但我不能让用户从个人资料中自动添加组。 不能有人帮我请。 多谢。 我有这个错误: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()