Update presence status when sending an error

darcs-hash:20080514061608-86b55-c4e4b28df57c96915d9f4d661e9cf26e124e8147.gz
This commit is contained in:
David Rousselie
2008-05-14 08:16:08 +02:00
parent 5b868287d5
commit 9760b58737
3 changed files with 51 additions and 17 deletions

View File

@@ -219,8 +219,8 @@ class AccountManager(object):
getattr(_account, "populate_handler")() getattr(_account, "populate_handler")()
except Exception, exception: except Exception, exception:
self.__logger.error("Error in timer thread:", exc_info=True) self.__logger.error("Error in timer thread:", exc_info=True)
result.extend(self.send_error_from_account(_account, result.extend(self.get_account_error_stanzas(_account,
exception)) exception))
if first_account: if first_account:
# component subscribe user presence when registering the first # component subscribe user presence when registering the first
@@ -388,7 +388,6 @@ class AccountManager(object):
if necessary""" if necessary"""
result = [] result = []
model.db_connect() model.db_connect()
_account.default_lang_class = lang_class
old_status = _account.status old_status = _account.status
_account.status = account.ONLINE _account.status = account.ONLINE
if _account.error is not None: if _account.error is not None:
@@ -553,20 +552,29 @@ class AccountManager(object):
model.db_disconnect() model.db_disconnect()
return result return result
def send_error_from_account(self, _account, exception): def get_account_error_stanzas(self, _account, exception):
"""Send an error message only one time until _account.error """Send an error message only one time until _account.error
has been reset to None""" has been reset to None"""
result = [] result = []
if _account.error == None: str_exception = str(exception)
_account.error = str(exception) if _account.error != str_exception:
_account.error = str_exception
result.append(Message(from_jid=_account.jid, result.append(Message(from_jid=_account.jid,
to_jid=_account.user.jid, to_jid=_account.user.jid,
stanza_type="error", stanza_type="error",
subject=_account.default_lang_class.error_subject, subject=_account.default_lang_class.error_subject,
body=_account.default_lang_class.error_body \ body=_account.default_lang_class.error_body \
% (exception))) % (exception)))
result.extend(self.get_account_presence_available(\
_account, _account.default_lang_class))
return result return result
def cancel_account_error(self, _account):
"""Reset Account error status and send new available presence"""
_account.error = None
return self.get_account_presence_available(_account,
_account.default_lang_class)
############################################################################### ###############################################################################
# JCL implementation # JCL implementation
############################################################################### ###############################################################################
@@ -1054,7 +1062,8 @@ class JCLComponent(Component, object):
########################################################################### ###########################################################################
def send_error(self, _account, exception): def send_error(self, _account, exception):
""" """ """ """
self.send_stanzas(self.account_manager.send_error_from_account(_account, exception)) self.send_stanzas(self.account_manager.get_account_error_stanzas(\
_account, exception))
self.__logger.debug("Error: ", exc_info=True) self.__logger.debug("Error: ", exc_info=True)
def get_config_parameter(self, section, parameter): def get_config_parameter(self, section, parameter):

View File

@@ -82,6 +82,7 @@ class AccountPresenceHandler(Handler):
class AccountPresenceAvailableHandler(AccountPresenceHandler): class AccountPresenceAvailableHandler(AccountPresenceHandler):
def get_account_presence(self, stanza, lang_class, _account): def get_account_presence(self, stanza, lang_class, _account):
_account.default_lang_class = lang_class
return self.component.account_manager.get_account_presence_available(\ return self.component.account_manager.get_account_presence_available(\
_account, lang_class) _account, lang_class)

View File

@@ -2772,28 +2772,31 @@ class JCLComponent_TestCase(JCLTestCase):
def test_send_error_first(self): def test_send_error_first(self):
self.comp.stream = MockStream() self.comp.stream = MockStream()
self.comp.stream_class = MockStream self.comp.stream_class = MockStream
model.db_connect()
_account = Account(user=User(jid="user1@test.com"), _account = Account(user=User(jid="user1@test.com"),
name="account11", name="account11",
jid="account11@jcl.test.com") jid="account11@jcl.test.com")
exception = Exception("test exception") exception = Exception("test exception")
self.assertEqual(_account.error, None) self.assertEqual(_account.error, None)
self.comp.send_error(_account, exception) self.comp.send_error(_account, exception)
self.assertEqual(len(self.comp.stream.sent), 1) self.assertEqual(len(self.comp.stream.sent), 2)
error_sent = self.comp.stream.sent[0] error_sent = self.comp.stream.sent[0]
self.assertEqual(error_sent.get_to(), _account.user.jid) self.assertEqual(error_sent.get_to(), _account.user.jid)
self.assertEqual(error_sent.get_from(), _account.jid) self.assertEqual(error_sent.get_from(), _account.jid)
self.assertEqual(error_sent.get_type(), "error") self.assertEqual(error_sent.get_type(), "error")
self.assertEqual(error_sent.get_subject(), _account.default_lang_class.error_subject) self.assertEqual(error_sent.get_subject(),
self.assertEqual(error_sent.get_body(), _account.default_lang_class.error_body \ _account.default_lang_class.error_subject)
% (exception)) self.assertEqual(error_sent.get_body(),
_account.default_lang_class.error_body % (exception))
new_presence = self.comp.stream.sent[1].xmlnode
self.assertEquals(new_presence.prop("to"), _account.user.jid)
self.assertEquals(new_presence.prop("from"), _account.jid)
self.assertEquals(new_presence.children.name, "show")
self.assertEquals(new_presence.children.content, "dnd")
self.assertEqual(_account.error, "test exception") self.assertEqual(_account.error, "test exception")
model.db_disconnect()
def test_send_error_second(self): def test_send_error_second(self):
self.comp.stream = MockStream() self.comp.stream = MockStream()
self.comp.stream_class = MockStream self.comp.stream_class = MockStream
model.db_connect()
_account = Account(user=User(jid="user1@test.com"), _account = Account(user=User(jid="user1@test.com"),
name="account11", name="account11",
jid="account11@jcl.test.com") jid="account11@jcl.test.com")
@@ -3156,15 +3159,36 @@ class AccountManager_TestCase(JCLTestCase):
self.assertFalse(account11.populate_handler_called) self.assertFalse(account11.populate_handler_called)
result = self.account_manager.populate_account(account11, Lang.en, result = self.account_manager.populate_account(account11, Lang.en,
x_data, False, False) x_data, False, False)
self.assertEquals(len(result), 2) self.assertEquals(len(result), 3)
self.assertEquals(result[0].get_type(), "error") self.assertEquals(result[0].get_type(), "error")
self.assertEquals(result[0].get_from(), "account11@jcl.test.com") self.assertEquals(result[0].get_from(), "account11@jcl.test.com")
self.assertEquals(result[0].get_to(), "test1@test.com") self.assertEquals(result[0].get_to(), "test1@test.com")
self.assertEquals(result[1].get_type(), None) self.assertEquals(result[1].xmlnode.name, "presence")
self.assertEquals(result[1].get_from(), "jcl.test.com") self.assertEquals(result[1].get_from(), "account11@jcl.test.com")
self.assertEquals(result[1].get_to(), "test1@test.com") self.assertEquals(result[1].get_to(), "test1@test.com")
self.assertEquals(result[1].xmlnode.children.name, "show")
self.assertEquals(result[1].xmlnode.children.content, "dnd")
self.assertEquals(result[2].get_type(), None)
self.assertEquals(result[2].get_from(), "jcl.test.com")
self.assertEquals(result[2].get_to(), "test1@test.com")
self.assertTrue(account11.populate_handler_called) self.assertTrue(account11.populate_handler_called)
def test_cancel_account_error(self):
"""Test Account error reset"""
_account = Account(user=User(jid="user1@test.com"),
name="account11",
jid="account11@jcl.test.com")
_account.error = "test exception"
result = self.account_manager.cancel_account_error(_account)
self.assertEquals(len(result), 1)
presence = result[0].xmlnode
self.assertEquals(presence.name, "presence")
self.assertEquals(presence.prop("type"), None)
self.assertEquals(presence.prop("from"), _account.jid)
self.assertEquals(presence.prop("to"), _account.user.jid)
self.assertEquals(presence.children.name, "show")
self.assertEquals(presence.children.content, "online")
def suite(): def suite():
test_suite = unittest.TestSuite() test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(JCLComponent_TestCase, 'test')) test_suite.addTest(unittest.makeSuite(JCLComponent_TestCase, 'test'))