feat: enrich ticket update notifications
This commit is contained in:
@@ -12,6 +12,8 @@ CONFIG_FILE = "ticketing.ini"
|
||||
CONFIG_TEMPLATE_FILE = "ticketing.ini.example"
|
||||
STATE_FILE = "tickets_state.json"
|
||||
DEFAULT_TIMEOUT = 30
|
||||
DEFAULT_TICKET_FIELDS = ["id", "name", "stage_id", "partner_id", "user_id", "write_date"]
|
||||
DEFAULT_MAX_NOTIFIED_TICKETS = 50
|
||||
|
||||
|
||||
def get_config_path():
|
||||
@@ -33,12 +35,12 @@ def audit():
|
||||
conf_wapt = load_config()
|
||||
tickets = fetch_odoo_tickets(conf_wapt)
|
||||
previous_tickets_state = load_tickets_state(get_state_path())
|
||||
tickets_updated = get_updated_ticket_ids(tickets, previous_tickets_state)
|
||||
|
||||
if tickets_updated:
|
||||
message = "Les tickets suivants ont ete mis a jour depuis la derniere verification : %s" % tickets_updated
|
||||
else:
|
||||
message = "Aucun ticket n'a ete mis a jour depuis la derniere verification."
|
||||
tickets_updated = get_updated_tickets(tickets, previous_tickets_state)
|
||||
message = build_notification_message(
|
||||
tickets_updated,
|
||||
previous_tickets_state,
|
||||
get_max_notified_tickets(conf_wapt),
|
||||
)
|
||||
|
||||
send_to_rocket(message, conf_wapt=conf_wapt)
|
||||
save_tickets_state(get_state_path(), build_tickets_state(tickets))
|
||||
@@ -92,6 +94,22 @@ def get_http_timeout(conf_wapt):
|
||||
return conf_wapt.getint("http", "timeout", fallback=DEFAULT_TIMEOUT)
|
||||
|
||||
|
||||
def get_odoo_fields(conf_wapt):
|
||||
fields = [
|
||||
field.strip()
|
||||
for field in conf_wapt.get("odoo", "fields", fallback=",".join(DEFAULT_TICKET_FIELDS)).split(",")
|
||||
if field.strip()
|
||||
]
|
||||
for required_field in ["id", "write_date"]:
|
||||
if required_field not in fields:
|
||||
fields.append(required_field)
|
||||
return fields
|
||||
|
||||
|
||||
def get_max_notified_tickets(conf_wapt):
|
||||
return conf_wapt.getint("notification", "max_tickets", fallback=DEFAULT_MAX_NOTIFIED_TICKETS)
|
||||
|
||||
|
||||
def build_odoo_payload(service, method, args):
|
||||
return {
|
||||
"jsonrpc": "2.0",
|
||||
@@ -160,7 +178,7 @@ def fetch_odoo_tickets(conf_wapt):
|
||||
conf_wapt.get("odoo", "model", fallback="helpdesk.ticket"),
|
||||
"search_read",
|
||||
[[]],
|
||||
{"fields": ["id", "write_date"]},
|
||||
{"fields": get_odoo_fields(conf_wapt)},
|
||||
],
|
||||
)
|
||||
|
||||
@@ -186,6 +204,13 @@ def build_tickets_state(tickets):
|
||||
|
||||
|
||||
def get_updated_ticket_ids(tickets, previous_tickets_state):
|
||||
return [
|
||||
ticket["id"]
|
||||
for ticket in get_updated_tickets(tickets, previous_tickets_state)
|
||||
]
|
||||
|
||||
|
||||
def get_updated_tickets(tickets, previous_tickets_state):
|
||||
tickets_updated = []
|
||||
|
||||
for ticket in tickets:
|
||||
@@ -193,11 +218,65 @@ def get_updated_ticket_ids(tickets, previous_tickets_state):
|
||||
ticket_write_date = ticket["write_date"]
|
||||
|
||||
if previous_tickets_state.get(ticket_id) != ticket_write_date:
|
||||
tickets_updated.append(ticket["id"])
|
||||
tickets_updated.append(ticket)
|
||||
|
||||
return tickets_updated
|
||||
|
||||
|
||||
def display_odoo_value(value):
|
||||
if value in (False, None, ""):
|
||||
return "-"
|
||||
if isinstance(value, (list, tuple)):
|
||||
if len(value) >= 2:
|
||||
return str(value[1])
|
||||
if len(value) == 1:
|
||||
return str(value[0])
|
||||
return "-"
|
||||
return str(value)
|
||||
|
||||
|
||||
def format_ticket_line(ticket, previous_tickets_state):
|
||||
ticket_id = str(ticket["id"])
|
||||
previous_write_date = previous_tickets_state.get(ticket_id)
|
||||
change_type = "nouveau" if previous_write_date is None else "modifie"
|
||||
parts = [
|
||||
"#%s" % ticket["id"],
|
||||
display_odoo_value(ticket.get("name", "Sans titre")),
|
||||
"type: %s" % change_type,
|
||||
"statut: %s" % display_odoo_value(ticket.get("stage_id")),
|
||||
"client: %s" % display_odoo_value(ticket.get("partner_id")),
|
||||
"assigne: %s" % display_odoo_value(ticket.get("user_id")),
|
||||
"date: %s" % display_odoo_value(ticket.get("write_date")),
|
||||
]
|
||||
if previous_write_date is not None:
|
||||
parts.append("ancienne date: %s" % previous_write_date)
|
||||
return "- " + " | ".join(parts)
|
||||
|
||||
|
||||
def build_notification_message(tickets_updated, previous_tickets_state, max_tickets):
|
||||
if not tickets_updated:
|
||||
return "Aucun ticket n'a ete mis a jour depuis la derniere verification."
|
||||
|
||||
displayed_tickets = tickets_updated[:max_tickets]
|
||||
hidden_count = len(tickets_updated) - len(displayed_tickets)
|
||||
lines = [
|
||||
"Tickets Odoo mis a jour depuis la derniere verification : %s" % len(tickets_updated),
|
||||
"",
|
||||
]
|
||||
lines.extend([
|
||||
format_ticket_line(ticket, previous_tickets_state)
|
||||
for ticket in displayed_tickets
|
||||
])
|
||||
|
||||
if hidden_count > 0:
|
||||
lines.extend([
|
||||
"",
|
||||
"... %s ticket(s) supplementaire(s) non affiche(s)." % hidden_count,
|
||||
])
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def send_to_rocket(message_text, attachments=None, conf_wapt=None):
|
||||
"""
|
||||
Envoie un message a Rocket.Chat via un webhook.
|
||||
|
||||
Reference in New Issue
Block a user