Files
odoo_source/addons/project/wizard/project_share_wizard.py
T
Hugo Carlier (Huca) 825df5c5f5 [IMP] project: generate a portal user when sharing a project
Currently, when the creation of an user access is set to `invitation
only` in the website settings, a project shared to a partner with no
user account will not be accessible to that partner. The link sent to
this partner will instead redirect him to the homepage of the website.

This commit address this situation by allowing the partner that receive
the link to create a portal access. The user that share the project is
warned that partners will be able to create user accounts and offered
the option to proceed or not.

task-3356419

closes odoo/odoo#129790

Signed-off-by: Xavier Bol (xbo) <xbo@odoo.com>
2023-08-04 09:42:55 +02:00

73 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
class ProjectShareWizard(models.TransientModel):
_name = 'project.share.wizard'
_inherit = 'portal.share'
_description = 'Project Sharing'
@api.model
def default_get(self, fields):
# The project share action could be called in `project.collaborator`
# and so we have to check the active_model and active_id to use
# the right project.
active_model = self._context.get('active_model', '')
active_id = self._context.get('active_id', False)
if active_model == 'project.collaborator':
active_model = 'project.project'
active_id = self._context.get('default_project_id', False)
result = super(ProjectShareWizard, self.with_context(active_model=active_model, active_id=active_id)).default_get(fields)
if not result.get('access_mode'):
result.update(
access_mode='read',
display_access_mode=True,
)
return result
@api.model
def _selection_target_model(self):
project_model = self.env['ir.model']._get('project.project')
return [(project_model.model, project_model.name)]
access_mode = fields.Selection([('read', 'Readonly'), ('edit', 'Edit')])
display_access_mode = fields.Boolean()
@api.depends('res_model', 'res_id')
def _compute_resource_ref(self):
for wizard in self:
if wizard.res_model and wizard.res_model == 'project.project':
wizard.resource_ref = '%s,%s' % (wizard.res_model, wizard.res_id or 0)
else:
wizard.resource_ref = None
def action_share_record(self):
# Confirmation dialog is only opened if new portal user(s) need to be created in a 'on invitation' website
self.ensure_one()
on_invite = self.env['res.users']._get_signup_invitation_scope() == 'b2b'
new_portal_user = self.partner_ids.filtered(lambda p: not p.user_ids) and on_invite
if not new_portal_user:
return self.action_send_mail()
return {
'name': _('Confirmation'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'views': [(self.env.ref('project.project_share_wizard_confirm_form').id, 'form')],
'res_model': 'project.share.wizard',
'res_id': self.id,
'target': 'new',
'context': self.env.context,
}
def action_send_mail(self):
if self.access_mode == 'edit':
portal_partners = self.partner_ids.filtered('user_ids')
self.resource_ref._add_collaborators(self.partner_ids)
self._send_public_link(portal_partners)
self._send_signup_link(partners=self.with_context({'signup_valid': True}).partner_ids - portal_partners)
self.resource_ref.message_subscribe(partner_ids=self.partner_ids.ids)
return {'type': 'ir.actions.act_window_close'}
return super().action_send_mail()