Release v4928.1.4.2 stable
This commit is contained in:
113
app/operation_noise.py
Normal file
113
app/operation_noise.py
Normal file
@@ -0,0 +1,113 @@
|
||||
"""Noise detection helpers for the operator work queue.
|
||||
|
||||
These helpers are intentionally conservative. They identify messages that are
|
||||
not useful ClientFlow work items because they are system delivery reports,
|
||||
postmaster notifications, automatic bounces/NDRs, or similar mailbox noise.
|
||||
Chatwoot/Thunderbird remain the source for reading those emails; ClientFlow
|
||||
should not turn them into tasks/opportunities.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from typing import Any, Mapping
|
||||
|
||||
SYSTEM_SENDER_PATTERNS = [
|
||||
r"\bpostmaster\b",
|
||||
r"\bmailer[-_ ]daemon\b",
|
||||
r"\bmail delivery subsystem\b",
|
||||
r"\bmail delivery system\b",
|
||||
r"\bmicrosoft exchange\b",
|
||||
r"\boffice 365\b",
|
||||
r"\bmicrosoft outlook\b",
|
||||
]
|
||||
|
||||
BOUNCE_NDR_PATTERNS = [
|
||||
r"\bundeliverable\b",
|
||||
r"\breturned mail\b",
|
||||
r"\bmail delivery failed\b",
|
||||
r"\bdelivery status notification\b",
|
||||
r"\bnon[- ]delivery report\b",
|
||||
r"\bdelivery has failed\b",
|
||||
r"\bfailure notice\b",
|
||||
r"\bunknown to address\b",
|
||||
r"\brecipient (?:wasn['’]?t|was not) found\b",
|
||||
r"\byour message (?:to .* )?couldn['’]?t be delivered\b",
|
||||
r"\bremote server returned\b",
|
||||
r"\b550\s+5\.1\.1\b",
|
||||
r"\b5\.1\.10\b",
|
||||
r"\bwasn['’]?t found at\b",
|
||||
]
|
||||
|
||||
TECHNICAL_NOISE_ACTION_CODES = {
|
||||
"IGNORE_BOUNCE",
|
||||
"IGNORE_SPAM",
|
||||
"NO_ACTION",
|
||||
}
|
||||
|
||||
LOW_VALUE_NO_OPPORTUNITY_ACTION_CODES = {
|
||||
"REMOVE_FROM_LIST",
|
||||
}
|
||||
|
||||
|
||||
def normalize_noise_text(value: Any) -> str:
|
||||
"""Normalize text for deterministic noise matching."""
|
||||
text = str(value or "").casefold()
|
||||
text = re.sub(r"<[^>]+>", " ", text)
|
||||
text = re.sub(r"https?://\S+", " ", text)
|
||||
text = re.sub(r"\s+", " ", text).strip()
|
||||
return text
|
||||
|
||||
|
||||
def contains_any_pattern(text: str, patterns: list[str]) -> bool:
|
||||
normalized = normalize_noise_text(text)
|
||||
return any(re.search(pattern, normalized, flags=re.I) for pattern in patterns)
|
||||
|
||||
|
||||
def is_system_sender(value: Any) -> bool:
|
||||
return contains_any_pattern(str(value or ""), SYSTEM_SENDER_PATTERNS)
|
||||
|
||||
|
||||
def is_bounce_or_ndr_text(value: Any) -> bool:
|
||||
return contains_any_pattern(str(value or ""), SYSTEM_SENDER_PATTERNS + BOUNCE_NDR_PATTERNS)
|
||||
|
||||
|
||||
def _join_item_text(item: Mapping[str, Any]) -> str:
|
||||
return "\n".join(
|
||||
str(item.get(key) or "")
|
||||
for key in (
|
||||
"customer_name",
|
||||
"contact_display_name",
|
||||
"fiscal_customer_name",
|
||||
"message_subject",
|
||||
"title",
|
||||
"detail",
|
||||
"request_text",
|
||||
"source_system",
|
||||
"action_code",
|
||||
"queue",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def is_noise_operation_item(item: Mapping[str, Any]) -> bool:
|
||||
"""Return True for items that should not appear in Operations."""
|
||||
action_code = str(item.get("action_code") or "").strip().upper()
|
||||
status = str(item.get("status") or "").strip().lower()
|
||||
reason = str(item.get("no_opportunity_reason") or "").strip().lower()
|
||||
|
||||
if status in {"ignored", "skipped", "cancelled"}:
|
||||
return True
|
||||
if action_code in TECHNICAL_NOISE_ACTION_CODES:
|
||||
return True
|
||||
if reason in {"system_or_bounce_message", "bounce_ignored", "non_commercial_system"}:
|
||||
return True
|
||||
return is_bounce_or_ndr_text(_join_item_text(item))
|
||||
|
||||
|
||||
def is_low_value_no_opportunity_item(item: Mapping[str, Any]) -> bool:
|
||||
"""Return True for non-commercial work that can be hidden from the main queue."""
|
||||
action_code = str(item.get("action_code") or "").strip().upper()
|
||||
reason = str(item.get("no_opportunity_reason") or "").strip().lower()
|
||||
if action_code in LOW_VALUE_NO_OPPORTUNITY_ACTION_CODES:
|
||||
return True
|
||||
return reason in {"marketing_without_commercial_intent", "non_commercial"}
|
||||
Reference in New Issue
Block a user