From d54049425c4f627e1b79b39ab9f1be25778a72e9 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Mon, 8 Oct 2007 08:26:36 +0200 Subject: [PATCH] Accounts presence reflect its status (ie. disabled, in error, ...) darcs-hash:20071008062636-86b55-3e3745c1f162a7de630beb913a8aec38b677436b.gz --- src/jcl/jabber/presence.py | 9 +++- src/jcl/jabber/tests/presence.py | 84 +++++++++++++++++++++++++++++++- src/jcl/lang.py | 6 +++ src/jcl/model/account.py | 28 ++++++++++- src/jcl/tests/lang.py | 3 ++ 5 files changed, 126 insertions(+), 4 deletions(-) diff --git a/src/jcl/jabber/presence.py b/src/jcl/jabber/presence.py index 2686854..3afafa3 100644 --- a/src/jcl/jabber/presence.py +++ b/src/jcl/jabber/presence.py @@ -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())) diff --git a/src/jcl/jabber/tests/presence.py b/src/jcl/jabber/tests/presence.py index 5558de3..f271285 100644 --- a/src/jcl/jabber/tests/presence.py +++ b/src/jcl/jabber/tests/presence.py @@ -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__': diff --git a/src/jcl/lang.py b/src/jcl/lang.py index 6e8d068..60e11c1 100644 --- a/src/jcl/lang.py +++ b/src/jcl/lang.py @@ -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" diff --git a/src/jcl/model/account.py b/src/jcl/model/account.py index 90dbeaf..50a8bf3 100644 --- a/src/jcl/model/account.py +++ b/src/jcl/model/account.py @@ -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 diff --git a/src/jcl/tests/lang.py b/src/jcl/tests/lang.py index 7c95b37..931246a 100644 --- a/src/jcl/tests/lang.py +++ b/src/jcl/tests/lang.py @@ -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