Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 386e1749c9f0429dc8ef00b3a687b4b82ce98c3e
  • 14.0 par défaut protégée
  • 16.0
3 résultats

res_partner.py

Blame
  • res_partner.py 6,89 Kio
    # 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,
                    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
        # ------------------------------------------------------