send error implementation

send an error to a user only if he has not already been notified

darcs-hash:20070222172740-86b55-7032fdab46f54932c222c36a68bad0915120e92c.gz
This commit is contained in:
David Rousselie
2007-02-22 18:27:40 +01:00
parent 826d045b41
commit d83ad1debe
5 changed files with 72 additions and 7 deletions

View File

@@ -58,7 +58,7 @@ if __name__ == '__main__':
jcl_suite = unittest.TestSuite()
# jcl_suite.addTest(FeederComponent_TestCase('test_handle_tick'))
# jcl_suite.addTest(JCLComponent_TestCase('test_handle_get_register_exist_complex'))
# jcl_suite.addTest(JCLComponent_TestCase('test_send_error_second'))
# jcl_suite = unittest.TestSuite((component_suite))
# jcl_suite = unittest.TestSuite((presence_account_suite))
jcl_suite = unittest.TestSuite((component_suite, \

View File

@@ -33,6 +33,7 @@ import time
import logging
import signal
import re
import traceback
from Queue import Queue
@@ -328,11 +329,12 @@ class JCLComponent(Component, object):
def get_reg_form_for_account(_account_class, name, base_from_jid):
self.db_connect()
# TODO : do it only one time
for _account in _account_class.select(\
_accounts = _account_class.select(\
AND(_account_class.q.name == name, \
_account_class.q.user_jid == base_from_jid)):
_account_class.q.user_jid == base_from_jid))
if _accounts is not None:
self.get_reg_form_init(lang_class, \
_account).as_xml(query)
_accounts[0]).as_xml(query)
self.db_disconnect()
self.__logger.debug("GET_REGISTER")
@@ -719,6 +721,23 @@ class JCLComponent(Component, object):
(_account.name))
self.stream.send(msg)
def _send_error(self, _account, exception):
"""Send an error message only one time until _account.in_error
has been reset to False"""
if _account.in_error == False:
_account.in_error = True
msg = Message(from_jid = _account.jid, \
to_jid = _account.user_jid, \
stanza_type = "error", \
subject = _account.default_lang_class.check_error_subject, \
body = _account.default_lang_class.check_error_body \
% (exception))
self.stream.send(msg)
type, value, stack = sys.exc_info()
self.__logger.debug("Error while first checking mail : %s\n%s" \
% (exception, "".join(traceback.format_exception
(type, value, stack, 5))))
def get_jid(self, _account):
"""Return account jid based on account instance and component jid
"""

View File

@@ -107,8 +107,8 @@ class Lang:
# connection_label = u"%s connection '%s'"
# update_account_message_subject = u"Updated account '%s'"
# update_account_message_body = u"Updated account"
# check_error_subject = u"Error while checking emails."
# check_error_body = u"An error appears while checking emails:\n\t%s"
check_error_subject = u"Error while checking emails."
check_error_body = u"An error appears while checking emails:\n\t%s"
# new_mail_subject = u"New email from %s"
# new_digest_subject = u"%i new email(s)"

View File

@@ -27,7 +27,7 @@
__revision__ = "$Id: account.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
from sqlobject.inheritance import InheritableSQLObject
from sqlobject.col import StringCol, EnumCol, IntCol
from sqlobject.col import StringCol, EnumCol, IntCol, BoolCol
from sqlobject.dbconnection import ConnectionHub
from jcl.lang import Lang
@@ -68,6 +68,7 @@ class Account(InheritableSQLObject):
jid = StringCol()
## Not yet used first_check = BoolCol(default = True)
__status = StringCol(default = OFFLINE, dbName = "status")
in_error = BoolCol(default = False)
## Use these attributs to support volatile password
## login = StringCol(default = "")
@@ -211,3 +212,17 @@ class PresenceAccount(Account):
is_action_possible, mandatory_field)]
get_register_fields = classmethod(_get_register_fields)
def get_action(self):
"""Get apropriate action depending on current status"""
mapping = {"online": self.online_action,
"chat": self.chat_action,
"away": self.away_action,
"xa": self.xa_action,
"dnd": self.dnd_action,
"offline": self.offline_action}
if mapping.has_key(self.status):
return mapping[self.status]
return PresenceAccount.DO_NOTHING
action = property(get_action)

View File

@@ -1836,3 +1836,34 @@ class JCLComponent_TestCase(unittest.TestCase):
def test_handle_tick(self):
self.assertRaises(NotImplementedError, self.comp.handle_tick)
def test_send_error_first(self):
self.comp.stream = MockStream()
self.comp.stream_class = MockStream
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
_account = Account(user_jid = "user1@test.com", \
name = "account11", \
jid = "account11@jcl.test.com")
exception = Exception("test exception")
self.comp._send_error(_account, exception)
self.assertEqual(len(self.comp.stream.sent), 1)
error_sent = self.comp.stream.sent[0]
self.assertEqual(error_sent.get_to(), _account.user_jid)
self.assertEqual(error_sent.get_from(), _account.jid)
self.assertEqual(error_sent.get_type(), "error")
self.assertEqual(error_sent.get_subject(), _account.default_lang_class.check_error_subject)
self.assertEqual(error_sent.get_body(), _account.default_lang_class.check_error_body \
% (exception))
del account.hub.threadConnection
def test_send_error_second(self):
self.comp.stream = MockStream()
self.comp.stream_class = MockStream
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
_account = Account(user_jid = "user1@test.com", \
name = "account11", \
jid = "account11@jcl.test.com")
_account.in_error = True
exception = Exception("test exception")
self.comp._send_error(_account, exception)
self.assertEqual(len(self.comp.stream.sent), 0)