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>
73 lines
3.1 KiB
Python
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()
|