Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Copyright 2022 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import logging
import werkzeug
from odoo import _, fields, models
from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
class ResPartner(models.Model):
_inherit = "res.partner"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
is_portal = fields.Boolean("Est un utilisateur portail")
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def acces_portal_app(self):
for partner in self:
if not partner.email:
raise UserError(
_(
"Vous devez renseigner une adresse e-mail "
"sur le contact pour la création d'un utilisateur."
)
)
group_portal = self.env.ref("base.group_portal")
# Vérifier si le contact a un utilisateur lié
user = (
self.env["res.users"]
.sudo()
.with_context(active_test=False)
.search([("login", "=ilike", partner.email)])
)
if not partner.is_portal:
# ajouter un groupe de portail à l'utilisateur
# relatif des contacts sélectionnés
user_portal = None
# create a user if necessary, and make sure it is in the portal group
if not user:
if partner.company_id:
company_id = partner.company_id.id
else:
company_id = self.env.company.id
user_portal = partner.sudo().with_company(company_id)._create_user()
else:
user_portal = user
partner.is_portal = True
user_portal.write({"active": True, "groups_id": [(4, group_portal.id)]})
# prepare for the signup process
partner.signup_prepare()
partner.with_context(active_test=True)._send_email(user_portal)
else:
# remove the user (if it exists) from the portal group
if user and group_portal in user.groups_id:
partner.is_portal = False
# if user belongs to portal only, deactivate it
if len(user.groups_id) <= 1:
user.write(
{"groups_id": [(3, group_portal.id)], "active": False}
)
else:
user.write({"groups_id": [(3, group_portal.id)]})
def _create_user(self):
"""Création d'un nouveal utilisateur pour un contact
:returns enregistrement res.users
"""
return (
self.env["res.users"]
.with_context(no_reset_password=True)
._create_user_from_template(
{
"email": self.email,
"login": self.email,
"partner_id": self.id,
"company_id": self.env.company.id,
"company_ids": [(6, 0, self.env.company.ids)],
}
)
)
def _send_email(self, user_portal):
""" envoi d'un mail au nouvel utilisateur portail """
if not self.env.user.email:
raise UserError(
_(
"Vous devez avoir une adresse e-mail dans vos "
"Préférences utilisateur pour envoyer des e-mails."
)
)
# determine subject and body in the portal user's language
template = self.env.ref("acc_portal.acc_mail_template_data_portal_welcome")
lang = user_portal.lang
company_id = self.env.company
portal_url = self.with_context(
signup_force_type_in_url="", lang=lang
)._get_signup_url_app()[self.id]
self.signup_prepare()
if template:
template.with_context(
dbname=self._cr.dbname,
portal_url=portal_url,
company_id=company_id,
user_signup_url=user_portal.signup_url,
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
lang=lang,
).send_mail(self.id, force_send=True)
else:
_logger.warning(
"Aucun modèle d'e-mail trouvé pour l'envoi "
"d'e-mails à l'utilisateur du portail"
)
return True
def _get_signup_url_app(
self,
url=None,
action=None,
view_type=None,
menu_id=None,
res_id=None,
model=None,
):
res = dict.fromkeys(self.ids, False)
for partner in self:
base_url = self.env.company.url_app
# when required, make sure the partner has a valid signup token
if self.env.context.get("signup_valid") and not partner.user_ids:
partner.sudo().signup_prepare()
route = "signup"
# the parameters to encode for the query
query = dict(db=self.env.cr.dbname)
signup_type = self.env.context.get(
"signup_force_type_in_url", partner.sudo().signup_type or ""
)
if signup_type:
route = "reset_password" if signup_type == "reset" else signup_type
if partner.sudo().signup_token and signup_type:
query["token"] = partner.sudo().signup_token
elif partner.user_ids:
query["login"] = partner.user_ids[0].login
else:
continue # no signup token, no user, thus no signup url!
signup_url = "/%s?%s" % (route, werkzeug.urls.url_encode(query))
if not self.env.context.get("relative_url"):
signup_url = werkzeug.urls.url_join(base_url, signup_url)
res[partner.id] = signup_url
return res
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------