fix: detect odoo chatter updates

This commit is contained in:
2026-07-24 10:43:02 +02:00
parent b10b82a141
commit e666571023
6 changed files with 177 additions and 25 deletions
+83 -4
View File
@@ -17,6 +17,8 @@ DEFAULT_MAX_NOTIFIED_TICKETS = 50
DEFAULT_MAX_MESSAGE_CHARS = 3500
DEFAULT_TICKET_URL_TEMPLATE = "{odoo_url}/web#id={id}&model={model}&view_type=form"
DEFAULT_ODOO_ORDER = "id asc"
DEFAULT_CHATTER_MODEL = "mail.message"
DEFAULT_CHATTER_ORDER = "res_id asc, id desc"
def get_config_path():
@@ -135,6 +137,14 @@ def get_odoo_order(conf_wapt):
return conf_wapt.get("odoo", "order", fallback=DEFAULT_ODOO_ORDER)
def should_track_chatter(conf_wapt):
return conf_wapt.getboolean("odoo", "track_chatter", fallback=True)
def get_chatter_model(conf_wapt):
return conf_wapt.get("odoo", "chatter_model", fallback=DEFAULT_CHATTER_MODEL)
def build_odoo_payload(service, method, args):
return {
"jsonrpc": "2.0",
@@ -192,7 +202,7 @@ def get_odoo_uid(conf_wapt):
def fetch_odoo_tickets(conf_wapt):
uid = get_odoo_uid(conf_wapt)
return call_odoo_jsonrpc(
tickets = call_odoo_jsonrpc(
conf_wapt,
"object",
"execute_kw",
@@ -210,6 +220,55 @@ def fetch_odoo_tickets(conf_wapt):
},
],
)
if should_track_chatter(conf_wapt) and tickets:
enrich_tickets_with_chatter_state(conf_wapt, uid, tickets)
return tickets
def fetch_ticket_chatter_messages(conf_wapt, uid, ticket_ids):
return call_odoo_jsonrpc(
conf_wapt,
"object",
"execute_kw",
[
conf_wapt.get("odoo", "database"),
uid,
conf_wapt.get("odoo", "api_key"),
get_chatter_model(conf_wapt),
"search_read",
[[
["model", "=", conf_wapt.get("odoo", "model", fallback="helpdesk.ticket")],
["res_id", "in", ticket_ids],
]],
{
"fields": ["id", "res_id", "write_date", "date"],
"limit": 0,
"order": DEFAULT_CHATTER_ORDER,
},
],
)
def build_chatter_marker(message):
message_date = message.get("write_date") or message.get("date") or ""
return "%s|%s" % (message_date, message.get("id"))
def enrich_tickets_with_chatter_state(conf_wapt, uid, tickets):
ticket_ids = [ticket["id"] for ticket in tickets]
messages = fetch_ticket_chatter_messages(conf_wapt, uid, ticket_ids)
latest_messages_by_ticket = {}
for message in messages:
ticket_id = str(message.get("res_id"))
marker = build_chatter_marker(message)
if marker > latest_messages_by_ticket.get(ticket_id, ""):
latest_messages_by_ticket[ticket_id] = marker
for ticket in tickets:
ticket_id = str(ticket["id"])
if ticket_id in latest_messages_by_ticket:
ticket["_last_chatter_update"] = latest_messages_by_ticket[ticket_id]
def load_tickets_state(state_path):
@@ -227,11 +286,30 @@ def save_tickets_state(state_path, tickets_state):
def build_tickets_state(tickets):
return {
str(ticket["id"]): ticket["write_date"]
str(ticket["id"]): build_ticket_state_value(ticket)
for ticket in tickets
}
def build_ticket_state_value(ticket):
return {
"write_date": ticket["write_date"],
"last_chatter_update": ticket.get("_last_chatter_update"),
}
def normalize_ticket_state_value(value):
if isinstance(value, dict):
return {
"write_date": value.get("write_date"),
"last_chatter_update": value.get("last_chatter_update"),
}
return {
"write_date": value,
"last_chatter_update": None,
}
def get_updated_ticket_ids(tickets, previous_tickets_state):
return [
ticket["id"]
@@ -244,9 +322,10 @@ def get_updated_tickets(tickets, previous_tickets_state):
for ticket in tickets:
ticket_id = str(ticket["id"])
ticket_write_date = ticket["write_date"]
previous_state = normalize_ticket_state_value(previous_tickets_state.get(ticket_id))
current_state = build_ticket_state_value(ticket)
if previous_tickets_state.get(ticket_id) != ticket_write_date:
if previous_state != current_state:
tickets_updated.append(ticket)
return tickets_updated