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
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,12 @@ conversation.reply(
conversation.reply(
type='admin', email='bob@example.com',
message_type='comment', body='bar')
# Admin (identified by id) opens a conversation
conversation.open_conversation(admin_id=7)
# Admin (identified by id) closes a conversation
conversation.close_conversation(admin_id=7)
# Admin (identified by id) assigns a conversation to an assignee
conversation.assign(assignee_id=8, admin_id=7)

# MARKING A CONVERSATION AS READ
conversation.read = True
Expand Down
18 changes: 18 additions & 0 deletions intercom/extended_api_operations/reply.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@
class Reply(object):

def reply(self, **reply_data):
return self.__reply(reply_data)

def close_conversation(self, **reply_data):
reply_data['type'] = 'admin'
reply_data['message_type'] = 'close'
return self.__reply(reply_data)

def open_conversation(self, **reply_data):
reply_data['type'] = 'admin'
reply_data['message_type'] = 'open'
return self.__reply(reply_data)

def assign(self, **reply_data):
reply_data['type'] = 'admin'
reply_data['message_type'] = 'assignment'
return self.__reply(reply_data)

def __reply(self, reply_data):
from intercom import Intercom
collection = utils.resource_class_to_collection_name(self.__class__)
url = "/%s/%s/reply" % (collection, self.id)
Expand Down
29 changes: 28 additions & 1 deletion tests/integration/test_conversations.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ def test_conversation_parts(self):
# There is a part_type
self.assertIsNotNone(part.part_type)
# There is a body
self.assertIsNotNone(part.body)
if not part.part_type == 'assignment':
self.assertIsNotNone(part.body)

def test_reply(self):
# REPLYING TO CONVERSATIONS
Expand All @@ -127,6 +128,32 @@ def test_reply(self):
conversation = Conversation.find(id=self.admin_conv.id)
self.assertEqual(num_parts + 2, len(conversation.conversation_parts))

def test_open(self):
# OPENING CONVERSATIONS
conversation = Conversation.find(id=self.admin_conv.id)
conversation.close_conversation(admin_id=self.admin.id, body='Closing message')
self.assertFalse(conversation.open)
conversation.open_conversation(admin_id=self.admin.id, body='Opening message')
conversation = Conversation.find(id=self.admin_conv.id)
self.assertTrue(conversation.open)

def test_close(self):
# CLOSING CONVERSATIONS
conversation = Conversation.find(id=self.admin_conv.id)
self.assertTrue(conversation.open)
conversation.close_conversation(admin_id=self.admin.id, body='Closing message')
conversation = Conversation.find(id=self.admin_conv.id)
self.assertFalse(conversation.open)

def test_assignment(self):
# ASSIGNING CONVERSATIONS
conversation = Conversation.find(id=self.admin_conv.id)
num_parts = len(conversation.conversation_parts)
conversation.assign(assignee_id=self.admin.id, admin_id=self.admin.id)
conversation = Conversation.find(id=self.admin_conv.id)
self.assertEqual(num_parts + 1, len(conversation.conversation_parts))
self.assertEqual("assignment", conversation.conversation_parts[-1].part_type)

def test_mark_read(self):
# MARKING A CONVERSATION AS READ
conversation = Conversation.find(id=self.admin_conv.id)
Expand Down