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) conversation.read = False conversation.save() conversation = Conversation.find(id=self.admin_conv.id) self.assertFalse(conversation.read) conversation.read = True conversation.save() conversation = Conversation.find(id=self.admin_conv.id) self.assertTrue(conversation.read)
def test_reply(self): # REPLYING TO CONVERSATIONS conversation = Conversation.find(id=self.admin_conv.id) num_parts = len(conversation.conversation_parts) # User (identified by email) replies with a comment conversation.reply( type='user', email=self.email, message_type='comment', body='foo') # Admin (identified by admin_id) replies with a comment conversation.reply( type='admin', admin_id=self.admin.id, message_type='comment', body='bar') conversation = Conversation.find(id=self.admin_conv.id) self.assertEqual(num_parts + 2, len(conversation.conversation_parts))
def test_reply(self): # REPLYING TO CONVERSATIONS conversation = Conversation.find(id=self.admin_conv.id) num_parts = len(conversation.conversation_parts) # User (identified by email) replies with a comment conversation.reply(type='user', email=self.email, message_type='comment', body='foo') # Admin (identified by admin_id) replies with a comment conversation.reply(type='admin', admin_id=self.admin.id, message_type='comment', body='bar') conversation = Conversation.find(id=self.admin_conv.id) self.assertEqual(num_parts + 2, len(conversation.conversation_parts))
def _predict(self, conversation_id, assignee_id=None): """ Predict the assignee """ conversation = Conversation.find(id=conversation_id) messages = [conversation.conversation_message ] + conversation.conversation_parts for message in messages: if SECRET_MENTION_ID in (message.body or ""): # we've already suggested an Admin, don't suggest again return collection = Collection(COLLECTION_NAME, domain='topics') text = extract_messages_text(messages) results = collection.predict(text) best_prediction = sorted(results.items(), key=itemgetter(1))[-1] if best_prediction[1] > ASSIGNMENT_THRESHOLD: if assignee_id is not None: self._suggest_assignee(conversation, best_prediction[0]) else: self._assign_assignee(conversation, best_prediction[0]) elif best_prediction[1] > SUGGESTION_THRESHOLD: self._suggest_assignee(conversation, best_prediction[0]) else: LOGGER.debug( "Prediction did not produce high enough results for conversation {id} with {results}" .format(id=conversation_id, results=results))
def _add_data_to_collection(self, conversation_id, assignee_id): """ Add data to the collection when a conversation gets assigned """ conversation = Conversation.find(id=conversation_id) messages = [conversation.conversation_message ] + conversation.conversation_parts for message in messages: if SECRET_MENTION_ID in (message.body or ""): # we've already suggested an Admin, don't suggest again return LOGGER.info("Adding data to collections for assignee {id}".format( id=assignee_id)) messages = filter(lambda msg: not isinstance(msg.author, Admin), messages) message_text = extract_messages_text(messages) collection = Collection(COLLECTION_NAME, domain='topics') collection.add_data([message_text, assignee_id]) try: collection.train() except IndicoError as e: pass
def test_conversation_parts(self): # INTERACTING WITH THE PARTS OF A CONVERSATION convo_id = Conversation.find_all(type='admin', id=self.admin.id)[0].id conversation = Conversation.find(id=convo_id) # Getting the subject of a part (only applies to email-based # conversations) self.assertEqual(conversation.conversation_message.subject, "") for part in conversation.conversation_parts: # There is a part_type self.assertIsNotNone(part.part_type) # There is a body self.assertIsNotNone(part.body)
def test_find_single_conversation(self): # FINDING A SINGLE CONVERSATION convo_id = Conversation.find_all(type='admin', id=self.admin.id)[0].id conversation = Conversation.find(id=convo_id) self.assertEqual(conversation.id, convo_id)
def reply_to_user(conversation_id, reply_msg): conversation = Conversation.find(id=conversation_id) conversation.reply( type='admin', id=str(ADMIN_BOT_ID), message_type='comment', body=reply_msg)
def tokenize_conversation_body(cid): conversation = Conversation.find(id=cid) conversation_body = strip_tags(conversation.conversation_message.body) print conversation_body words = word_tokenize(conversation_body) return words