« models/scop_revision.py » n'existait pas sur « 1e55fbcb10b96c51a5503bd758083ff1fa5c0bf4 »
Sélectionner une révision Git
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