Abraham Kalungi
Abraham Kalungi

Reputation: 55

How to Create a Related User in Odoo 15 with Python Code

Good day, I am asking for help.

I am trying to create a user in Odoo 15 with python code. I want when an HR creates an Employee the related user is also created. This related user should belong to Internal User Group. The code below gives me "The user cannot have more than one user types."

class Doctors(models.Model):
    _inherit = "hr.employee"
    
    @api.model
    def create(self, values):
        employee = super(Doctors, self).create(values)
        company_id = self.company_id or self.env.user.sudo().company_id
        if employee.work_email and not employee.user_id:
            employee.sudo().create_employee_related_user()
        return employee

    def create_employee_related_user(self):
        for record in self:
            company_id = record.company_id or self.env.user.sudo().company_id
            if not record.work_email:
                raise UserError(_('Please define valid email for the Employee'))
            group_user = self.env.ref('base.group_user') or False
            user = record.user_id[0] if record.user_id else None
            # update partner email, if a new one was introduced also add internal group to relative user of selected partners
            user_internal = None
            # create a user and make sure it is in the internal group
            if not user:
                user_internal = record.sudo().with_context(company_id=company_id)._create_user()
            else:
                user_internal = user
            if group_user not in user_internal.groups_id:
                user_internal.write({'active': True, 'groups_id': [(4, group_user.id)]})

    def _create_user(self):
        company_id = self.env.context.get('company_id')
        get_user = self.env['res.users'].sudo().search([('email','=',self.work_email)], limit=1)
        if get_user:
            raise UserError(_('Employee/User already registered with given email address.'))

        return self.env['res.users'].with_context(no_reset_password=True)._create_user_from_template({
            'email': self.work_email,
            'login': self.work_email,
            'name': self.name,
            'company_id': company_id.id,
            'company_ids': [(6, 0, [company_id.id])],
        })

Upvotes: 0

Views: 1647

Answers (1)

Waleed Mohsen
Waleed Mohsen

Reputation: 1055

Replace the below line of code:

user_internal.write({'active': True, 'groups_id': [(4, group_user.id)]})

With

user_internal.write({'active': True, 'groups_id': [(6, 0, [group_user.id)]})

This will replace all user groups and add it to Internal User group.

Use Default user template :

BTW you are using _create_user_from_template method to create a user from Default user template and you can edit the Default user template by going to users and filter (Active = False) and open Default user template and change the user type to Internal User and apps permissions as well. This will help you to create internal user with apps permissions you assigned in Default user template.

So you can delete the below lines from your code:

if group_user not in user_internal.groups_id:
     user_internal.write({'active': True, 'groups_id': [(4,group_user.id)]})

Create user without using Default user template

If you want to create a user (Internal User) without any permissions to any apps without using Default user template, you can do it as below:

class Doctors(models.Model):
    _inherit = "hr.employee"
    
    @api.model
    def create(self, values):
        employee = super(Doctors, self).create(values)
        company_id = self.company_id or self.env.user.sudo().company_id
        if employee.work_email and not employee.user_id:
            employee.sudo().create_employee_related_user()
        return employee

    def create_employee_related_user(self):
        for record in self:
            company_id = record.company_id or self.env.user.sudo().company_id
            if not record.work_email:
                raise UserError(_('Please define valid email for the Employee'))
            group_user = self.env.ref('base.group_user') or False
            # You already check that the employee not linked to a user in Create method
            #user = record.user_id[0] if record.user_id else None
            # update partner email, if a new one was introduced also add internal group to relative user of selected partners
            user_internal = None
            # create a user and make sure it is in the internal group
            #if not user:
            user_internal = record.sudo().with_context(company_id=company_id)._create_user()
            #else:
            #    user_internal = user
            
            # No need for that, I already assigned groups in _create_user method
            #if group_user not in user_internal.groups_id:
            #    user_internal.write({'active': True, 'groups_id': [(4, group_user.id)]})

    def _create_user(self):
        company_id = self.env.context.get('company_id')
        get_user = self.env['res.users'].sudo().search([('email','=',self.work_email)], limit=1)
        if get_user:
            raise UserError(_('Employee/User already registered with given email address.'))

        return self.env['res.users'].with_context(no_reset_password=True).sudo().create({
            'email': self.work_email,
            'login': self.work_email,
            'name': self.name,
            'company_id': company_id.id,
            'company_ids': [(6, 0, [company_id.id])],
            'groups_id': [(6, 0, [self.env.ref('base.group_user').id])],
        })

Upvotes: 0

Related Questions