fix: detect odoo chatter updates
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user