116 lines
3.4 KiB
Python
116 lines
3.4 KiB
Python
# Copyright 2025 Bemade
|
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.html)
|
|
|
|
"""Queue de synchronisation pour Odoo to Bemade Customer.
|
|
|
|
Ce module gère la file d'attente des opérations de synchronisation
|
|
entre Odoo client et Bemade.
|
|
"""
|
|
|
|
from datetime import datetime, timedelta
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class OdooToBemadeCustomerSyncQueue(models.Model):
|
|
"""File d'attente de synchronisation.
|
|
|
|
Gère les opérations de synchronisation en file d'attente entre Odoo client et Bemade.
|
|
"""
|
|
|
|
_name = 'odoo.to.bemade.customer.sync.queue'
|
|
_description = 'File d\'attente de synchronisation Bemade'
|
|
_inherit = 'odoo.sync.queue'
|
|
_order = 'priority desc, create_date'
|
|
|
|
name = fields.Char(
|
|
string='Nom',
|
|
compute='_compute_name',
|
|
store=True,
|
|
)
|
|
model_id = fields.Many2one(
|
|
comodel_name='odoo.to.bemade.customer.sync.model',
|
|
string='Modèle',
|
|
required=True,
|
|
ondelete='cascade',
|
|
)
|
|
record_id = fields.Integer(
|
|
string='ID Enregistrement',
|
|
required=True,
|
|
)
|
|
operation = fields.Selection(
|
|
selection=[
|
|
('sync', 'Synchroniser'),
|
|
('delete', 'Supprimer'),
|
|
],
|
|
default='sync',
|
|
string='Opération',
|
|
required=True,
|
|
)
|
|
state = fields.Selection(
|
|
selection=[
|
|
('pending', 'En attente'),
|
|
('processing', 'En cours'),
|
|
('done', 'Terminé'),
|
|
('error', 'Erreur'),
|
|
],
|
|
default='pending',
|
|
string='État',
|
|
)
|
|
priority = fields.Integer(
|
|
string='Priorité',
|
|
default=10,
|
|
help='Priorité de l\'opération (les valeurs plus élevées sont prioritaires)',
|
|
)
|
|
retry_count = fields.Integer(
|
|
string='Tentatives',
|
|
default=0,
|
|
)
|
|
max_retries = fields.Integer(
|
|
string='Tentatives max',
|
|
default=3,
|
|
)
|
|
error_message = fields.Text(
|
|
string='Message d\'erreur',
|
|
)
|
|
next_retry = fields.Datetime(
|
|
string='Prochaine tentative',
|
|
)
|
|
result = fields.Text(
|
|
string='Résultat',
|
|
)
|
|
execution_time = fields.Float(
|
|
string='Temps d\'exécution (s)',
|
|
digits=(10, 3),
|
|
)
|
|
|
|
@api.depends('model_id', 'record_id', 'operation')
|
|
def _compute_name(self):
|
|
"""Génère un nom descriptif pour l'entrée de la file d'attente."""
|
|
for queue in self:
|
|
if queue.model_id and queue.record_id:
|
|
queue.name = f"{queue.operation} - {queue.model_id.name} #{queue.record_id}"
|
|
else:
|
|
queue.name = f"Nouvelle entrée {queue.id}"
|
|
|
|
def action_reset(self):
|
|
"""Réinitialise une entrée de file d'attente en erreur à l'état en attente."""
|
|
return self.write({
|
|
'state': 'pending',
|
|
'retry_count': 0,
|
|
'error_message': False,
|
|
'next_retry': False
|
|
})
|
|
|
|
def action_cancel(self):
|
|
"""Annule une entrée de file d'attente."""
|
|
return self.unlink()
|
|
|
|
def action_retry_now(self):
|
|
"""Force la tentative immédiate de traitement d'une entrée en erreur."""
|
|
self.ensure_one()
|
|
self.write({
|
|
'state': 'pending',
|
|
'next_retry': fields.Datetime.now(),
|
|
})
|
|
return self.env['odoo.to.bemade.customer.sync.manager'].process_queue(queue_ids=self.ids)
|