From bfbadc8e98d7cfbe0a716ba6c25cec62dabbc075 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Sun, 12 Aug 2007 21:23:49 +0200 Subject: [PATCH] 'get-registered-users-list' ad-hoc command implementation darcs-hash:20070812192349-86b55-bd12aec438cbf3194e4e7707779afd0052c359dd.gz --- src/jcl/jabber/command.py | 74 ++++++++---- src/jcl/jabber/tests/command.py | 180 ++++++++++++++++++++++++++---- src/jcl/jabber/tests/component.py | 2 +- src/jcl/model/account.py | 7 +- 4 files changed, 214 insertions(+), 49 deletions(-) diff --git a/src/jcl/jabber/command.py b/src/jcl/jabber/command.py index 6a91de2..802b65b 100644 --- a/src/jcl/jabber/command.py +++ b/src/jcl/jabber/command.py @@ -226,13 +226,17 @@ class JCLCommandManager(CommandManager): """ JCLCommandManager constructor Not implemented commands: - "http://jabber.org/protocol/admin#user-stats", - "http://jabber.org/protocol/admin#edit-blacklist", - "http://jabber.org/protocol/admin#add-to-blacklist-in", - "http://jabber.org/protocol/admin#add-to-blacklist-out", - "http://jabber.org/protocol/admin#edit-whitelist", - "http://jabber.org/protocol/admin#add-to-whitelist-in", - "http://jabber.org/protocol/admin#add-to-whitelist-out", + 'http://jabber.org/protocol/admin#user-stats', + 'http://jabber.org/protocol/admin#edit-blacklist', + 'http://jabber.org/protocol/admin#add-to-blacklist-in', + 'http://jabber.org/protocol/admin#add-to-blacklist-out', + 'http://jabber.org/protocol/admin#edit-whitelist', + 'http://jabber.org/protocol/admin#add-to-whitelist-in', + 'http://jabber.org/protocol/admin#add-to-whitelist-out', + 'http://jabber.org/protocol/admin#get-active-users-num', + 'http://jabber.org/protocol/admin#get-idle-users-num', + 'http://jabber.org/protocol/admin#get-active-users', + 'http://jabber.org/protocol/admin#get-idle-users', """ CommandManager.__init__(self, component, account_manager) self.__logger = logging.getLogger("jcl.jabber.command.JCLCommandManager") @@ -249,13 +253,9 @@ class JCLCommandManager(CommandManager): "http://jabber.org/protocol/admin#get-registered-users-num", "http://jabber.org/protocol/admin#get-disabled-users-num", "http://jabber.org/protocol/admin#get-online-users-num", - "http://jabber.org/protocol/admin#get-active-users-num", - "http://jabber.org/protocol/admin#get-idle-users-num", "http://jabber.org/protocol/admin#get-registered-users-list", "http://jabber.org/protocol/admin#get-disabled-users-list", "http://jabber.org/protocol/admin#get-online-users", - "http://jabber.org/protocol/admin#get-active-users", - "http://jabber.org/protocol/admin#get-idle-users", "http://jabber.org/protocol/admin#announce", "http://jabber.org/protocol/admin#set-motd", "http://jabber.org/protocol/admin#edit-motd", @@ -448,7 +448,7 @@ class JCLCommandManager(CommandManager): return (None, result) execute_disable_user_1 = select_user_jids_step_1 - + def execute_disable_user_2(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing 'disable-user' step 2") @@ -592,7 +592,7 @@ class JCLCommandManager(CommandManager): execute_get_user_lastlogin_1 = select_user_jid_step_1 execute_get_user_lastlogin_2 = select_account_step_2 - + def execute_get_user_lastlogin_3(self, info_query, session_context, command_node, lang_class): self.__logger.debug("Executing command 'get-user-roster' step 2") @@ -654,14 +654,50 @@ class JCLCommandManager(CommandManager): command_node.setProp("status", STATUS_COMPLETED) return (result_form, []) - def execute_get_active_users_num(self, info_query): + def add_form_list_accounts(self, command_node, lang_class, + filter=None, limit=None): + result_form = Form(xmlnode_or_type="result") + result_form.add_field(field_type="hidden", + name="FORM_TYPE", + value="http://jabber.org/protocol/admin") + accounts = account.get_all_accounts(filter=filter, limit=limit) + accounts_labels = [] + for _account in accounts: + accounts_labels += [_account.user_jid + " (" + _account.name + + " " + str(_account.__class__.__name__) + ")"] + result_form.fields.append(FieldNoType(name="registeredusers", + label="TODO", + values=accounts_labels)) + result_form.as_xml(command_node) + command_node.setProp("status", STATUS_COMPLETED) + return (result_form, []) + + def execute_get_registered_users_list_1(self, info_query, session_context, + command_node, lang_class): + num_accounts = account.get_all_accounts_count() + if num_accounts < 25: + return self.add_form_list_accounts(command_node, lang_class) + else: + self.add_actions(command_node, [ACTION_NEXT]) + result_form = Form(xmlnode_or_type="result") + result_form.add_field(field_type="hidden", + name="FORM_TYPE", + value="http://jabber.org/protocol/admin") + max_items_field = result_form.add_field(name="max_items", + field_type="list-single", + label="TODO") + for value in ["25", "50", "75", "100", "150", "200"]: + max_items_field.add_option(label=value, + values=[value]) + result_form.as_xml(command_node) + return (result_form, []) return [] - def execute_get_idle_users_num(self, info_query): - return [] - - def execute_get_registered_users_list(self, info_query): - return [] + def execute_get_registered_users_list_2(self, info_query, session_context, + command_node, lang_class): + limit = int(session_context["max_items"][0]) + return self.add_form_list_accounts(command_node, lang_class, + limit=limit) def execute_get_disabled_users_list(self, info_query): return [] diff --git a/src/jcl/jabber/tests/command.py b/src/jcl/jabber/tests/command.py index 7e5b51a..9cd2d4f 100644 --- a/src/jcl/jabber/tests/command.py +++ b/src/jcl/jabber/tests/command.py @@ -1635,32 +1635,164 @@ class JCLCommandManager_TestCase(JCLTestCase): self.assertEquals(fields[1].children.name, "value") self.assertEquals(fields[1].children.content, "3") -# def test_execute_get_active_users_num(self): -# #TODO : implement command -# info_query = Iq(stanza_type="set", -# from_jid="user1@test.com", -# to_jid="jcl.test.com") -# result = self.command_manager.execute_add_user(info_query) -# self.assertNotEquals(result, None) -# self.assertEquals(len(result), 1) + def test_execute_get_registered_users_list(self): + self.comp.account_manager.account_classes = (ExampleAccount, + Example2Account) + model.db_connect() + account11 = ExampleAccount(user_jid="test1@test.com", + name="account11", + jid="account11@jcl.test.com") + account12 = Example2Account(user_jid="test1@test.com", + name="account12", + jid="account12@jcl.test.com") + account21 = ExampleAccount(user_jid="test2@test.com", + name="account21", + jid="account21@jcl.test.com") + account22 = ExampleAccount(user_jid="test2@test.com", + name="account11", + jid="account11@jcl.test.com") + model.db_disconnect() + info_query = Iq(stanza_type="set", + from_jid="user1@test.com", + to_jid="jcl.test.com") + command_node = info_query.set_new_content(command.COMMAND_NS, "command") + command_node.setProp("node", "http://jabber.org/protocol/admin#get-registered-users-list") + result = self.command_manager.apply_command_action(info_query, + "http://jabber.org/protocol/admin#get-registered-users-list", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "completed") + self.assertNotEquals(xml_command.prop("sessionid"), None) + self.__check_actions(result[0]) + fields = result[0].xpath_eval("c:command/data:x/data:field", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(fields), 2) + self.assertEquals(fields[1].prop("var"), "registeredusers") + values = result[0].xpath_eval("c:command/data:x/data:field[2]/data:value", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(values), 4) + self.assertEquals(values[0].content, + "test1@test.com (account11 ExampleAccount)") + self.assertEquals(values[1].content, + "test1@test.com (account12 Example2Account)") + self.assertEquals(values[2].content, + "test2@test.com (account21 ExampleAccount)") + self.assertEquals(values[3].content, + "test2@test.com (account11 ExampleAccount)") -# def test_execute_get_idle_users_num(self): -# #TODO : implement command -# info_query = Iq(stanza_type="set", -# from_jid="user1@test.com", -# to_jid="jcl.test.com") -# result = self.command_manager.execute_add_user(info_query) -# self.assertNotEquals(result, None) -# self.assertEquals(len(result), 1) + def test_execute_get_registered_users_list_max(self): + self.comp.account_manager.account_classes = (ExampleAccount, + Example2Account) + model.db_connect() + for i in xrange(10): + ExampleAccount(user_jid="test1@test.com", + name="account11" + str(i), + jid="account11" + str(i) + "@jcl.test.com") + Example2Account(user_jid="test1@test.com", + name="account12" + str(i), + jid="account12" + str(i) + "@jcl.test.com") + ExampleAccount(user_jid="test2@test.com", + name="account2" + str(i), + jid="account2" + str(i) + "@jcl.test.com") + model.db_disconnect() + info_query = Iq(stanza_type="set", + from_jid="user1@test.com", + to_jid="jcl.test.com") + command_node = info_query.set_new_content(command.COMMAND_NS, "command") + command_node.setProp("node", "http://jabber.org/protocol/admin#get-registered-users-list") + result = self.command_manager.apply_command_action(info_query, + "http://jabber.org/protocol/admin#get-registered-users-list", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "executing") + self.assertNotEquals(xml_command.prop("sessionid"), None) + self.__check_actions(result[0], ["next"]) + fields = result[0].xpath_eval("c:command/data:x/data:field", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(fields), 2) + self.assertEquals(fields[1].prop("var"), "max_items") + self.assertEquals(fields[1].prop("type"), "list-single") + options = result[0].xpath_eval("c:command/data:x/data:field[2]/data:option", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(options), 6) + self.assertEquals(options[0].prop("label"), "25") + self.assertEquals(options[0].content, "25") + self.assertEquals(options[1].prop("label"), "50") + self.assertEquals(options[1].content, "50") + self.assertEquals(options[2].prop("label"), "75") + self.assertEquals(options[2].content, "75") + self.assertEquals(options[3].prop("label"), "100") + self.assertEquals(options[3].content, "100") + self.assertEquals(options[4].prop("label"), "150") + self.assertEquals(options[4].content, "150") + self.assertEquals(options[5].prop("label"), "200") + self.assertEquals(options[5].content, "200") -# def test_execute_get_registered_users_list(self): -# #TODO : implement command -# info_query = Iq(stanza_type="set", -# from_jid="user1@test.com", -# to_jid="jcl.test.com") -# result = self.command_manager.execute_add_user(info_query) -# self.assertNotEquals(result, None) -# self.assertEquals(len(result), 1) + # Second step + info_query = Iq(stanza_type="set", + from_jid="user1@test.com", + to_jid="jcl.test.com") + command_node = info_query.set_new_content(command.COMMAND_NS, "command") + command_node.setProp("node", + "http://jabber.org/protocol/admin#get-registered-users-list") + session_id = xml_command.prop("sessionid") + command_node.setProp("sessionid", session_id) + command_node.setProp("action", "next") + submit_form = Form(xmlnode_or_type="submit") + submit_form.add_field(field_type="list-single", + name="max_items", + value="25") + submit_form.as_xml(command_node) + result = self.command_manager.apply_command_action(\ + info_query, + "http://jabber.org/protocol/admin#get-registered-users-list", + "execute") + self.assertNotEquals(result, None) + self.assertEquals(len(result), 1) + xml_command = result[0].xpath_eval("c:command", + {"c": "http://jabber.org/protocol/commands"})[0] + self.assertEquals(xml_command.prop("status"), "completed") + self.assertEquals(xml_command.prop("sessionid"), session_id) + self.__check_actions(result[0]) + context_session = self.command_manager.sessions[session_id][1] + self.assertEquals(context_session["max_items"], + ["25"]) + fields = result[0].xpath_eval("c:command/data:x/data:field", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(fields), 2) + self.assertEquals(fields[0].prop("var"), "FORM_TYPE") + self.assertEquals(fields[0].prop("type"), "hidden") + self.assertEquals(fields[0].children.name, "value") + self.assertEquals(fields[0].children.content, + "http://jabber.org/protocol/admin") + self.assertEquals(fields[1].prop("var"), "registeredusers") + values = result[0].xpath_eval("c:command/data:x/data:field[2]/data:value", + {"c": "http://jabber.org/protocol/commands", + "data": "jabber:x:data"}) + self.assertEquals(len(values), 25) + while i < 7: + self.assertEquals(values[i * 3].content, + "test1@test.com (account11" + str(i) + + " ExampleAccount)") + self.assertEquals(values[i * 3 + 1].content, + "test1@test.com (account12" + str(i) + + " Example2Account)") + self.assertEquals(values[i * 3 + 2].content, + "test2@test.com (account2" + str(i) + + " ExampleAccount)") + self.assertEquals(values[24].content, + "test1@test.com (account118 ExampleAccount)") # def test_execute_get_disabled_users_list(self): # #TODO : implement command diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index 5b65d17..21be025 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -737,7 +737,7 @@ class JCLComponent_TestCase(JCLTestCase): to_jid="jcl.test.com") disco_items = self.comp.disco_get_items("http://jabber.org/protocol/commands", info_query) - self.assertEquals(len(disco_items.get_items()), 29) + self.assertEquals(len(disco_items.get_items()), 25) item = disco_items.get_items()[0] self.assertEquals(item.get_node(), "list") self.assertEquals(item.get_name(), Lang.en.command_list) diff --git a/src/jcl/model/account.py b/src/jcl/model/account.py index c3465b0..f50a9a1 100644 --- a/src/jcl/model/account.py +++ b/src/jcl/model/account.py @@ -170,12 +170,9 @@ def get_accounts(bare_user_jid, account_class=Account, filter=None): yield _account model.db_disconnect() -def get_all_accounts(account_class=Account): +def get_all_accounts(account_class=Account, filter=None, limit=None): model.db_connect() - accounts = account_class.select() - if accounts.count() == 0: - model.db_disconnect() - return + accounts = account_class.select(clause=filter, limit=limit) for _account in accounts: yield _account model.db_disconnect()