Correct get_register_fields inheritance usage

PresenceAccount subclasses called PresenceAccount.get_register_fields but
the "cls" parameter was always PresenceAccount. Now subclasses pass a "real_class"
parameter which contains the class type on which get_register_fields was called.

darcs-hash:20070325122936-86b55-fb6db014fbdeaa2fa1a423b935df5e72ffe6a20a.gz
This commit is contained in:
David Rousselie
2007-03-25 14:29:36 +02:00
parent 289e1f2c36
commit 0fad164e57
5 changed files with 38 additions and 19 deletions

View File

@@ -59,7 +59,7 @@ if __name__ == '__main__':
jcl_suite = unittest.TestSuite() jcl_suite = unittest.TestSuite()
# jcl_suite.addTest(FeederComponent_TestCase('test_handle_tick')) # 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_handle_get_register_exist_complex'))
# jcl_suite.addTest(AccountModule_TestCase('test_mandatory_field')) # jcl_suite.addTest(PresenceAccount_TestCase('test_possibles_actions'))
# jcl_suite = unittest.TestSuite((account_module_suite)) # jcl_suite = unittest.TestSuite((account_module_suite))
# jcl_suite = unittest.TestSuite((presence_account_suite)) # jcl_suite = unittest.TestSuite((presence_account_suite))

View File

@@ -435,12 +435,11 @@ class JCLComponent(Component, object):
_account = new_account_class(user_jid = unicode(base_from_jid), \ _account = new_account_class(user_jid = unicode(base_from_jid), \
name = name, \ name = name, \
jid = name + u"@" + unicode(self.jid)) jid = name + u"@" + unicode(self.jid))
self.__logger.debug("Account '" + str(name) + "' created: " + str(_account))
field = None field = None
try: try:
self.__logger.debug("Populating " + str(_account))
for (field, field_type, field_options, field_post_func, \ for (field, field_type, field_options, field_post_func, \
field_default_func) in _account.get_register_fields(): field_default_func) in _account.get_register_fields():
self.__logger.debug("Testing " + field)
if field is not None: if field is not None:
if field in x_data: if field in x_data:
value = x_data[field].value value = x_data[field].value
@@ -571,9 +570,11 @@ class JCLComponent(Component, object):
accounts = None accounts = None
self.db_connect() self.db_connect()
if not name: if not name:
self.__logger.debug("subscribe request on main jid")
accounts = self.account_classes[0].select(\ accounts = self.account_classes[0].select(\
self.account_classes[0].q.user_jid == base_from_jid) self.account_classes[0].q.user_jid == base_from_jid)
else: else:
self.__logger.debug("subscribe request on '" + name + "' account")
accounts = self.account_classes[0].select(\ accounts = self.account_classes[0].select(\
AND(self.account_classes[0].q.name == name, \ AND(self.account_classes[0].q.name == name, \
self.account_classes[0].q.user_jid == base_from_jid)) self.account_classes[0].q.user_jid == base_from_jid))
@@ -581,6 +582,10 @@ class JCLComponent(Component, object):
and accounts.count() > 0): and accounts.count() > 0):
presence = stanza.make_accept_response() presence = stanza.make_accept_response()
self.stream.send(presence) self.stream.send(presence)
else:
self.__logger.debug("Account '" + str(name) + "' for user '" + \
str(base_from_jid) + "' was not found. " + \
"Refusing subscription")
self.db_disconnect() self.db_disconnect()
return 1 return 1

View File

@@ -25,7 +25,7 @@
""" """
__revision__ = "$Id: account.py,v 1.3 2005/09/18 20:24:07 dax Exp $" __revision__ = "$Id: account.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
2
from sqlobject.inheritance import InheritableSQLObject from sqlobject.inheritance import InheritableSQLObject
from sqlobject.col import StringCol, EnumCol, IntCol, BoolCol from sqlobject.col import StringCol, EnumCol, IntCol, BoolCol
from sqlobject.dbconnection import ConnectionHub from sqlobject.dbconnection import ConnectionHub
@@ -111,7 +111,7 @@ class Account(InheritableSQLObject):
status = property(get_status, set_status) status = property(get_status, set_status)
def _get_register_fields(cls): def _get_register_fields(cls, real_class = None):
"""Return a list of tuples for X Data Form composition """Return a list of tuples for X Data Form composition
A tuple is composed of: A tuple is composed of:
- field_name: might be the name of one of the class attribut - field_name: might be the name of one of the class attribut
@@ -181,10 +181,10 @@ class PresenceAccount(Account):
get_presence_actions_fields = classmethod(_get_presence_actions_fields) get_presence_actions_fields = classmethod(_get_presence_actions_fields)
def _get_register_fields(cls): def _get_register_fields(cls, real_class = None):
""" See Account._get_register_fields """ """ See Account._get_register_fields """
def get_possibles_actions(presence_action_field): def get_possibles_actions(presence_action_field):
return cls.get_presence_actions_fields()[presence_action_field][0] return real_class.get_presence_actions_fields()[presence_action_field][0]
def is_action_possible(presence_action_field, action, default_func): def is_action_possible(presence_action_field, action, default_func):
if int(action) in get_possibles_actions(presence_action_field): if int(action) in get_possibles_actions(presence_action_field):
@@ -192,9 +192,11 @@ class PresenceAccount(Account):
raise default_func() raise default_func()
def get_default_presence_action(presence_action_field): def get_default_presence_action(presence_action_field):
return cls.get_presence_actions_fields()[presence_action_field][1] return real_class.get_presence_actions_fields()[presence_action_field][1]
return Account.get_register_fields() + \ if real_class is None:
real_class = cls
return Account.get_register_fields(real_class) + \
[(None, None, None, None, None), \ [(None, None, None, None, None), \
("chat_action", "list-single", \ ("chat_action", "list-single", \
[str(action) for action in get_possibles_actions("chat_action")], \ [str(action) for action in get_possibles_actions("chat_action")], \

View File

@@ -37,13 +37,15 @@ class ExampleAccount(Account):
test_enum = EnumCol(default = "choice1", enumValues = ["choice1", "choice2", "choice3"]) test_enum = EnumCol(default = "choice1", enumValues = ["choice1", "choice2", "choice3"])
test_int = IntCol(default = 42) test_int = IntCol(default = 42)
def _get_register_fields(cls): def _get_register_fields(cls, real_class = None):
def password_post_func(password, default_func): def password_post_func(password, default_func):
if password is None or password == "": if password is None or password == "":
return None return None
return password return password
return Account.get_register_fields() + \ if real_class is None:
real_class = cls
return Account.get_register_fields(real_class) + \
[("login", "text-single", None, \ [("login", "text-single", None, \
lambda field_value, default_func: account.mandatory_field("login", \ lambda field_value, default_func: account.mandatory_field("login", \
field_value, \ field_value, \
@@ -64,8 +66,10 @@ class ExampleAccount(Account):
class Example2Account(Account): class Example2Account(Account):
test_new_int = IntCol(default = 42) test_new_int = IntCol(default = 42)
def _get_register_fields(cls): def _get_register_fields(cls, real_class = None):
return Account.get_register_fields() + \ if real_class is None:
real_class = cls
return Account.get_register_fields(real_class) + \
[("test_new_int", "text-single", None, account.int_post_func, \ [("test_new_int", "text-single", None, account.int_post_func, \
lambda : 43)] lambda : 43)]
get_register_fields = classmethod(_get_register_fields) get_register_fields = classmethod(_get_register_fields)
@@ -94,3 +98,12 @@ class PresenceAccountExample(PresenceAccount):
get_presence_actions_fields = classmethod(_get_presence_actions_fields) get_presence_actions_fields = classmethod(_get_presence_actions_fields)
test_new_int = IntCol(default = 42)
def _get_register_fields(cls, real_class = None):
if real_class is None:
real_class = cls
return PresenceAccount.get_register_fields(real_class) + \
[("test_new_int", "text-single", None, account.int_post_func, \
lambda : 43)]
get_register_fields = classmethod(_get_register_fields)

View File

@@ -162,10 +162,9 @@ class PresenceAccount_TestCase(unittest.TestCase):
possibles_actions, \ possibles_actions, \
post_func, \ post_func, \
default_func) in account11.get_register_fields()[1:]: default_func) in account11.get_register_fields()[1:]:
for possible_action in possibles_actions: if possibles_actions is not None:
self.assertEquals(post_func(possible_action, default_func), for possible_action in possibles_actions:
int(possible_action)) self.assertEquals(post_func(possible_action, default_func),
self.assertTrue(str(default_func()) in possibles_actions) int(possible_action))
self.assertTrue(str(default_func()) in possibles_actions)
del account.hub.threadConnection del account.hub.threadConnection
#TODO: test get_register_field with cls.possible_actions inheritance