Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/session_ops/zendesk/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,11 @@ def has_open_chat(session, subdomain, ticket_id):

def unassign(session, subdomain, ticket_id):
"""Clear the ticket's assignee, which is what lets Zendesk end its live chat.
Returns whether Zendesk took it."""
Returns whether the ticket Zendesk sent back has no assignee.

A 200 is not enough: on a ticket with a live chat open, Zendesk can answer 200 and
keep the assignee.
"""
url = f"https://{subdomain}.zendesk.com/api/v2/tickets/{ticket_id}.json"
try:
resp = session.request("PUT", url, json={"ticket": {"assignee_id": None}})
Expand All @@ -246,6 +250,13 @@ def unassign(session, subdomain, ticket_id):
if resp.status_code >= 400:
print(f"Note: unassigning #{ticket_id} returned {resp.status_code}.")
return False
try:
ticket = resp.json().get("ticket") or {}
except ValueError:
ticket = {}
if "assignee_id" not in ticket or ticket["assignee_id"] is not None:
print(f"Note: Zendesk accepted unassigning #{ticket_id} but kept its assignee.")
return False
return True


Expand Down
8 changes: 6 additions & 2 deletions tests/zendesk/test_triage.py
Original file line number Diff line number Diff line change
Expand Up @@ -809,9 +809,13 @@ def test_released_tickets_are_listed_apart_from_stuck_ones(self):
self.assertIn("[#2]", lines[1])

def test_release_unassigns_each_and_keeps_what_zendesk_took(self):
session = FakeSession([FakeResponse({}), FakeResponse({}, status_code=403)])
session = FakeSession([
FakeResponse({"ticket": {"id": 4, "assignee_id": None}}),
FakeResponse({}, status_code=403),
FakeResponse({"ticket": {"id": 6, "assignee_id": 77}}),
FakeResponse({})])
with contextlib.redirect_stdout(io.StringIO()):
released = triage.release_open_chats(session, "acme", [4, 5])
released = triage.release_open_chats(session, "acme", [4, 5, 6, 7])
self.assertEqual(released, {4})
method, url, kwargs = session.calls[0]
self.assertEqual(method, "PUT")
Expand Down
Loading