From 56209ddff1d597ac230cdf4ab2831cc463c8163b Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Wed, 17 Jan 2007 18:34:08 +0100 Subject: [PATCH] Make component works with Account subclasses darcs-hash:20070117173408-86b55-eaf9be902109c4269dbbfc589e7284e55bc1d3eb.gz --- run_tests.py | 5 +++-- src/jcl/jabber/component.py | 42 ++++++++++++++++++++++++------------- src/jcl/jabber/feeder.py | 3 ++- src/jcl/model/account.py | 25 +++++++++++++++++++++- tests/jcl/model/account.py | 4 +++- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/run_tests.py b/run_tests.py index 90e76f2..b558176 100644 --- a/run_tests.py +++ b/run_tests.py @@ -63,7 +63,7 @@ if __name__ == '__main__': jcl_suite = unittest.TestSuite() # jcl_suite.addTest(FeederComponent_TestCase('test_handle_tick')) # jcl_suite.addTest(JCLComponent_TestCase('test_handle_set_register_new_field_mandatory')) -# jcl_suite = unittest.TestSuite((feeder_component_suite)) +# jcl_suite = unittest.TestSuite((component_suite)) # jcl_suite = unittest.TestSuite((presence_account_suite)) jcl_suite = unittest.TestSuite((component_suite, \ feeder_component_suite, \ @@ -74,7 +74,8 @@ if __name__ == '__main__': option_suite, \ lang_suite, \ account_module_suite, \ - account_suite)) + account_suite, \ + presence_account_suite)) test_support.run_suite(jcl_suite) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index a71c2bc..ea404c8 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -36,6 +36,7 @@ import re from Queue import Queue +from sqlobject.inheritance import InheritableSQLObject from sqlobject.sqlbuilder import AND from sqlobject.dbconnection import connectionForURI @@ -108,7 +109,12 @@ class JCLComponent(Component, object): create associated table via SQLObject""" self.__account_class = account_class self.db_connect() - self.__account_class.createTable(ifNotExists = True) + if account_class._inheritable: + while account_class != InheritableSQLObject: + account_class.createTable(ifNotExists = True) + account_class = account_class.__base__ + else: + self.__account_class.createTable(ifNotExists = True) self.db_disconnect() def get_account_class(self): @@ -150,8 +156,11 @@ class JCLComponent(Component, object): and self.stream.socket is not None: current_user_jid = None self.db_connect() + # Explicit reference to account table (clauseTables) to use + # "user_jid" column with Account subclasses for _account in \ - self.account_class.select(orderBy = "user_jid"): + self.account_class.select(clauseTables = ["account"], \ + orderBy = "user_jid"): if current_user_jid != _account.user_jid: current_user_jid = _account.user_jid self.stream.send(Presence(\ @@ -177,6 +186,7 @@ class JCLComponent(Component, object): pool) associated to the current thread""" account.hub.threadConnection = \ connectionForURI(self.db_connection_str) +# account.hub.threadConnection.debug = True def db_disconnect(self): """Delete connection associated to the current thread""" @@ -239,7 +249,8 @@ class JCLComponent(Component, object): self.handle_message) current_jid = None self.db_connect() - for _account in self.account_class.select(orderBy = "user_jid"): + for _account in self.account_class.select(clauseTables = ["account"], \ + orderBy = "user_jid"): if _account.user_jid != current_jid: presence = Presence(from_jid = unicode(self.jid), \ to_jid = _account.user_jid, \ @@ -662,18 +673,21 @@ class JCLComponent(Component, object): for (field, field_type, post_func, default_func) in \ self.account_class.get_register_fields(): - lang_label_attr = self.account_class.__name__.lower() \ - + "_" + field - if hasattr(lang_class, lang_label_attr): - label = getattr(lang_class, lang_label_attr) + if field is None: + # TODO : Add page when empty tuple given + pass else: - label = field - field = reg_form.add_field(field_type = field_type, \ - label = label, \ - var = field) - if default_func == account.mandatory_field: - field.required = True - ## TODO : Add page when empty tuple given + lang_label_attr = self.account_class.__name__.lower() \ + + "_" + field + if hasattr(lang_class, lang_label_attr): + label = getattr(lang_class, lang_label_attr) + else: + label = field + field = reg_form.add_field(field_type = field_type, \ + label = label, \ + var = field) + if default_func == account.mandatory_field: + field.required = True ## TODO : get default value if any return reg_form diff --git a/src/jcl/jabber/feeder.py b/src/jcl/jabber/feeder.py index 2a11d7d..2d51f97 100644 --- a/src/jcl/jabber/feeder.py +++ b/src/jcl/jabber/feeder.py @@ -58,7 +58,8 @@ class FeederComponent(JCLComponent): def handle_tick(self): """Implement main feed/send behavior""" self.db_connect() - for _account in self.account_class.select(orderBy = "user_jid"): + for _account in self.account_class.select(clauseTables = ["account"], \ + orderBy = "user_jid"): for data in self.feeder.feed(_account): self.sender.send(_account, data) self.db_disconnect() diff --git a/src/jcl/model/account.py b/src/jcl/model/account.py index 5f62d9c..203ba0e 100644 --- a/src/jcl/model/account.py +++ b/src/jcl/model/account.py @@ -183,5 +183,28 @@ class PresenceAccount(Account): PresenceAccount.DO_NOTHING)} get_presence_actions_fields = classmethod(_get_presence_actions_fields) - + def _get_register_fields(cls): + """ See Account._get_register_fields """ + def is_action_possible(action): + if action in cls.possibles_actions: + return action + raise FieldError # TODO : add translated message + + # TODO : check is_action_possible with presence_actions_fields (see partial eval function) + return Account.get_register_fields() + \ + [(None, None, None, None), \ + ("chat_action", "list-single", is_action_possible, \ + mandatory_field), \ + ("online_action", "list-single", is_action_possible, \ + mandatory_field), \ + ("away_action", "list-single", is_action_possible, \ + mandatory_field), \ + ("xa_action", "list-single", is_action_possible, \ + mandatory_field), \ + ("dnd_action", "list-single", is_action_possible, \ + mandatory_field), \ + ("offline_action", "list-single", is_action_possible, \ + mandatory_field)] + + get_register_fields = classmethod(_get_register_fields) diff --git a/tests/jcl/model/account.py b/tests/jcl/model/account.py index b5475c5..9c0ebe1 100644 --- a/tests/jcl/model/account.py +++ b/tests/jcl/model/account.py @@ -43,7 +43,8 @@ class AccountExample(Account): return None return password - return [("login", "text-single", account.string_not_null_post_func, \ + return Account.get_register_fields() + \ + [("login", "text-single", account.string_not_null_post_func, \ account.mandatory_field), \ ("password", "text-private", password_post_func, \ (lambda field_name: None)), \ @@ -78,3 +79,4 @@ class PresenceAccountExample(PresenceAccount): PresenceAccountExample.DO_SOMETHING_ELSE)} get_presence_actions_fields = classmethod(_get_presence_actions_fields) +