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

controllers.py

Blame
  • route_exposition.py 4,31 Kio
    # © 2024 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import hashlib
    import json
    import re
    from datetime import datetime
    
    from odoo import _, api, fields, models
    from odoo.exceptions import ValidationError
    from odoo.tools.safe_eval import safe_eval
    
    
    class RouteExposition(models.Model):
        _name = "route.exposition"
        _inherit = ["mail.thread", "mail.activity.mixin"]
        _description = (
            "Model exposition model, used in api framework to show given fields"
            "for a given odoo model"
        )
    
        # ------------------------------------------------------
        # Fields declaration
        # ------------------------------------------------------
        name = fields.Char(string="Nom", required=True)
        description = fields.Text()
        model_id = fields.Many2one(comodel_name="ir.model", string="Modèle")
        model_id_name = fields.Char(related="model_id.model")
        field_ids = fields.One2many(
            comodel_name="route.exposition.field",
            inverse_name="exposition_id",
            string="Champs",
        )
        active = fields.Boolean(default=True)
        route_name = fields.Char(
            string="Endpoint", readonly=True, store=True, compute="_compute_route_name", tracking=1
        )
        route_link = fields.Char(string="Lien", compute="_compute_route_link")
        domain = fields.Text("Domaine")
        ip_address = fields.Char(
            string="Adresse IP distante", help="The IP address of the authorised emitter"
        )
        api_key = fields.Char(string="Clé d'API", readonly=True, tracking=1)
        active_test = fields.Boolean(string="Inclure les éléments archivés", default=False)
    
        _sql_constraints = [
            (
                "unique_name",
                "UNIQUE(name,model_id)",
                "The combination of model and name already exists",
            )
        ]
    
        # ------------------------------------------------------
        # Onchange
        # ------------------------------------------------------
        @api.onchange("model_id")
        def _onchange_model_id(self):
            self.field_ids = None
    
        # ------------------------------------------------------
        # Compute
        # ------------------------------------------------------
        @api.depends("name", "model_id")
        def _compute_route_name(self):
            for exposition in self:
                if exposition.name and exposition.model_id:
                    route_name = exposition.name.replace("'", "_").replace(" ", "_").lower()
                    if not re.match(r"^[a-z_-]+$", route_name):
                        raise ValidationError(
                            _(
                                "La route ne peut pas être générée, "
                                "supprimer les caractères spéciaux"
                            )
                        )
                    else:
                        exposition.route_name = route_name
                else:
                    exposition.route_name = ""
    
        def _compute_route_link(self):
            for exposition in self:
                exposition.route_link = f"{exposition.get_base_url()}/{exposition.model_id.model}/api/{exposition.route_name}"
    
        # ------------------------------------------------------
        # Actions
        # ------------------------------------------------------
        def refresh_api_key(self):
            self.api_key = self.generate_key()
    
        def delete_api_key(self):
            self.api_key = False
    
        # ------------------------------------------------------
        # Business Method
        # ------------------------------------------------------
        def get_domain(self):
            """
            Evaluate the domain of an exposition, meaning it transforms the string domain to
            tuple domain
    
            :return: Domain of the exposition
            :rtype: List[Tuple(str,str,str)]
            """
            self.ensure_one()
            return safe_eval(self.domain) if self.domain else []
    
        def generate_key(self) -> str:
            """
            Generate an API key based on
                The user generating the key
                The date and time when the key is generated
    
            All information are hashed, this hash will then be stored in the database
            and used as API key
            """
            datas = {"usr": self.env.user, "date": datetime.now()}
            encoded_data = json.dumps(datas, sort_keys=True, default=str).encode()
            h = hashlib.sha256()
            h.update(encoded_data)
            hashed = h.hexdigest()
            return hashed