Accounts presence reflect its status (ie. disabled, in error, ...)

darcs-hash:20071008062636-86b55-3e3745c1f162a7de630beb913a8aec38b677436b.gz
This commit is contained in:
David Rousselie
2007-10-08 08:26:36 +02:00
parent 79215719c0
commit d54049425c
5 changed files with 126 additions and 4 deletions

View File

@@ -82,8 +82,13 @@ class AccountPresenceHandler(Handler):
class AccountPresenceAvailableHandler(AccountPresenceHandler):
def get_account_presence(self, stanza, lang_class, _account):
show_status = account.ONLINE
if _account.in_error:
show_status = account.DND
elif not _account.enabled:
show_status = account.XA
return self.component.account_manager.send_presence_available(_account,
stanza.get_show(),
show_status,
lang_class)
class RootPresenceHandler(AccountPresenceHandler):
@@ -109,7 +114,7 @@ class RootPresenceAvailableHandler(RootPresenceHandler, AccountPresenceAvailable
from_jid = stanza.get_from()
result = self.component.account_manager.send_root_presence(from_jid,
"available",
stanza.get_show(),
"online",
str(nb_accounts) +
lang_class.message_status)
user = account.get_user(unicode(from_jid.bare()))

View File

@@ -31,7 +31,7 @@ from pyxmpp.message import Message
from jcl.jabber.component import JCLComponent
from jcl.jabber.presence import DefaultSubscribeHandler, \
DefaultUnsubscribeHandler, DefaultPresenceHandler, \
RootPresenceAvailableHandler
RootPresenceAvailableHandler, AccountPresenceAvailableHandler
from jcl.model.account import User, LegacyJID, Account
from jcl.lang import Lang
@@ -179,6 +179,87 @@ class RootPresenceAvailableHandler_TestCase(JCLTestCase):
self.assertTrue(isinstance(result[0], Presence))
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_from(), "jcl.test.com")
self.assertEquals(result[0].get_show(), "online")
self.assertEquals(result[0].get_status(), "2" + Lang.en.message_status)
class AccountPresenceAvailableHandler_TestCase(JCLTestCase):
def setUp(self):
JCLTestCase.setUp(self, tables=[User, LegacyJID, Account])
self.config = ConfigParser()
self.config_file = tempfile.mktemp(".conf", "jcltest", "/tmp")
self.config.read(self.config_file)
self.config.add_section("component")
self.config.set("component", "motd", "Message Of The Day")
self.comp = JCLComponent("jcl.test.com",
"password",
"localhost",
"5347",
self.config)
self.handler = AccountPresenceAvailableHandler(self.comp)
def tearDown(self):
JCLTestCase.tearDown(self)
if os.path.exists(self.config_file):
os.unlink(self.config_file)
def test_get_account_presence(self):
user1 = User(jid="user1@test.com")
account11 = Account(user=user1,
name="account11",
jid="account11@jcl.test.com")
account12 = Account(user=user1,
name="account12",
jid="account12@jcl.test.com")
presence = Presence(stanza_type="available",
from_jid="user1@test.com",
to_jid="account11@jcl.test.com")
result = self.handler.get_account_presence(presence, Lang.en, account11)
self.assertEquals(len(result), 1)
self.assertTrue(isinstance(result[0], Presence))
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_from(), "account11@jcl.test.com")
self.assertEquals(result[0].get_show(), "online")
self.assertEquals(result[0].get_status(), "account11")
def test_get_disabled_account_presence(self):
user1 = User(jid="user1@test.com")
account11 = Account(user=user1,
name="account11",
jid="account11@jcl.test.com")
account11.enabled = False
account12 = Account(user=user1,
name="account12",
jid="account12@jcl.test.com")
presence = Presence(stanza_type="available",
from_jid="user1@test.com",
to_jid="account11@jcl.test.com")
result = self.handler.get_account_presence(presence, Lang.en, account11)
self.assertEquals(len(result), 1)
self.assertTrue(isinstance(result[0], Presence))
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_from(), "account11@jcl.test.com")
self.assertEquals(result[0].get_show(), "xa")
self.assertEquals(result[0].get_status(), Lang.en.account_disabled)
def test_get_inerror_account_presence(self):
user1 = User(jid="user1@test.com")
account11 = Account(user=user1,
name="account11",
jid="account11@jcl.test.com")
account11.in_error = True
account12 = Account(user=user1,
name="account12",
jid="account12@jcl.test.com")
presence = Presence(stanza_type="available",
from_jid="user1@test.com",
to_jid="account11@jcl.test.com")
result = self.handler.get_account_presence(presence, Lang.en, account11)
self.assertEquals(len(result), 1)
self.assertTrue(isinstance(result[0], Presence))
self.assertEquals(result[0].get_to(), "user1@test.com")
self.assertEquals(result[0].get_from(), "account11@jcl.test.com")
self.assertEquals(result[0].get_show(), "dnd")
self.assertEquals(result[0].get_status(), Lang.en.account_error)
def suite():
test_suite = unittest.TestSuite()
@@ -186,6 +267,7 @@ def suite():
test_suite.addTest(unittest.makeSuite(DefaultUnsubscribeHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(DefaultPresenceHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(RootPresenceAvailableHandler_TestCase, 'test'))
test_suite.addTest(unittest.makeSuite(AccountPresenceAvailableHandler_TestCase, 'test'))
return test_suite
if __name__ == '__main__':

View File

@@ -234,6 +234,9 @@ class Lang:
welcome_message_subject = u"Welcome"
account_disabled = u"This account is disabled"
account_error = u"This account has an error"
class fr:
component_name = u"composant générique Jabber Component Library"
register_title = u"Enregistrement d'un nouveau compte"
@@ -413,6 +416,9 @@ class Lang:
welcome_message_subject = u"Bienvenue"
account_disabled = u"Ce compte est désactivé"
account_error = u"Ce compte est en erreur"
class nl:
# TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_nl_TestCase, 'test') line
register_title = u"Registratie van verbindingen voor Jabber Mail"

View File

@@ -39,6 +39,8 @@ import jcl.model as model
OFFLINE = "offline"
ONLINE = "online"
DND = "dnd"
XA = "xa"
def default_post_func(field_value, default_func, bare_from_jid):
"""Default post process function: do nothing"""
@@ -109,12 +111,36 @@ class Account(InheritableSQLObject):
long_name = property(get_long_name)
def get_status_msg(self):
def get_status_msg(self, lang_class=Lang.en):
"""Return current status"""
mapping = {"online": self.get_online_status_msg,
"chat": self.get_chat_status_msg,
"away": self.get_away_status_msg,
"xa": self.get_xa_status_msg,
"dnd": self.get_dnd_status_msg,
"offline": self.get_offline_status_msg}
if mapping.has_key(self.status):
return mapping[self.status](lang_class)
return self.name
status_msg = property(get_status_msg)
def get_default_status_msg(self, lang_class):
return self.name
def get_disabled_status_msg(self, lang_class):
return lang_class.account_disabled
def get_error_status_msg(self, lang_class):
return lang_class.account_error
get_online_status_msg = get_default_status_msg
get_chat_status_msg = get_default_status_msg
get_away_status_msg = get_default_status_msg
get_xa_status_msg = get_disabled_status_msg
get_dnd_status_msg = get_error_status_msg
get_offline_status_msg = get_default_status_msg
def get_status(self):
"""Return current Jabber status"""
return self._status

View File

@@ -236,6 +236,9 @@ class Language_TestCase(unittest.TestCase):
self.assertNotEquals(self.lang_class.welcome_message_subject, None)
self.assertNotEquals(self.lang_class.account_disabled, None)
self.assertNotEquals(self.lang_class.account_error, None)
class Language_fr_TestCase(Language_TestCase):
def setUp(self):
self.lang_class = Lang.fr