Support for multiple feeder handlers
darcs-hash:20081104072233-86b55-e6450860c2c462f5007bdd173d493eef00f2dddc.gz
This commit is contained in:
@@ -27,20 +27,16 @@ JCL base component
|
|||||||
|
|
||||||
__revision__ = "$Id: component.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
|
__revision__ = "$Id: component.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import threading
|
import threading
|
||||||
import logging
|
import logging
|
||||||
import signal
|
import signal
|
||||||
import re
|
import re
|
||||||
import traceback
|
|
||||||
import string
|
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
|
import string
|
||||||
|
|
||||||
from Queue import Queue
|
from Queue import Queue
|
||||||
|
|
||||||
import pyxmpp.error as error
|
|
||||||
from pyxmpp.jid import JID
|
from pyxmpp.jid import JID
|
||||||
from pyxmpp.jabberd.component import Component
|
from pyxmpp.jabberd.component import Component
|
||||||
from pyxmpp.message import Message
|
from pyxmpp.message import Message
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ import logging
|
|||||||
from jcl.jabber import Handler
|
from jcl.jabber import Handler
|
||||||
from jcl.jabber.component import JCLComponent, AccountManager
|
from jcl.jabber.component import JCLComponent, AccountManager
|
||||||
from jcl.lang import Lang
|
from jcl.lang import Lang
|
||||||
import jcl.model as model
|
|
||||||
from jcl.model import account
|
|
||||||
from jcl.jabber.command import JCLCommandManager
|
from jcl.jabber.command import JCLCommandManager
|
||||||
|
|
||||||
from pyxmpp.message import Message
|
from pyxmpp.message import Message
|
||||||
@@ -66,15 +64,16 @@ class FeederComponent(JCLComponent):
|
|||||||
account_manager_class=account_manager_class,
|
account_manager_class=account_manager_class,
|
||||||
command_manager_class=command_manager_class)
|
command_manager_class=command_manager_class)
|
||||||
# Define default feeder and sender, can be override
|
# Define default feeder and sender, can be override
|
||||||
self.handler = FeederHandler(Feeder(self), Sender(self))
|
self.tick_handlers = [FeederHandler(Feeder(self), Sender(self))]
|
||||||
self.__logger = logging.getLogger("jcl.jabber.FeederComponent")
|
self.__logger = logging.getLogger("jcl.jabber.FeederComponent")
|
||||||
|
|
||||||
def handle_tick(self):
|
def handle_tick(self):
|
||||||
"""Implement main feed/send behavior"""
|
"""Implement main feed/send behavior"""
|
||||||
self.handler.handle(\
|
for handler in self.tick_handlers:
|
||||||
None, self.lang.get_default_lang_class(),
|
handler.handle(\
|
||||||
self.handler.filter(None,
|
None, self.lang.get_default_lang_class(),
|
||||||
self.lang.get_default_lang_class()))
|
handler.filter(None,
|
||||||
|
self.lang.get_default_lang_class()))
|
||||||
|
|
||||||
class Feeder(object):
|
class Feeder(object):
|
||||||
"""Abstract feeder class"""
|
"""Abstract feeder class"""
|
||||||
@@ -136,14 +135,6 @@ class FeederHandler(Handler):
|
|||||||
self.feeder = feeder
|
self.feeder = feeder
|
||||||
self.sender = sender
|
self.sender = sender
|
||||||
|
|
||||||
def filter(self, stanza, lang_class):
|
|
||||||
"""
|
|
||||||
Filter account to be processed by the handler
|
|
||||||
return all accounts.
|
|
||||||
"""
|
|
||||||
accounts = account.get_all_accounts()
|
|
||||||
return accounts
|
|
||||||
|
|
||||||
def handle(self, stanza, lang_class, data):
|
def handle(self, stanza, lang_class, data):
|
||||||
"""
|
"""
|
||||||
Apply actions to do on given accounts
|
Apply actions to do on given accounts
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ class AccountPresenceSubscribeHandler(Handler):
|
|||||||
filter = jabber.get_account_filter
|
filter = jabber.get_account_filter
|
||||||
|
|
||||||
def handle(self, stanza, lang_class, data):
|
def handle(self, stanza, lang_class, data):
|
||||||
"""Handle \"subscribe\" iq sent to an account JID"""
|
"""Handle 'subscribe' iq sent to an account JID"""
|
||||||
return [stanza.make_accept_response()]
|
return [stanza.make_accept_response()]
|
||||||
|
|
||||||
class RootPresenceSubscribeHandler(AccountPresenceSubscribeHandler):
|
class RootPresenceSubscribeHandler(AccountPresenceSubscribeHandler):
|
||||||
@@ -161,7 +161,7 @@ class RootPresenceSubscribeHandler(AccountPresenceSubscribeHandler):
|
|||||||
filter = jabber.get_accounts_root_filter
|
filter = jabber.get_accounts_root_filter
|
||||||
|
|
||||||
def handle(self, stanza, lang_class, data):
|
def handle(self, stanza, lang_class, data):
|
||||||
"""Handle \"subscribe\" iq sent to component JID"""
|
"""Handle 'subscribe' iq sent to component JID"""
|
||||||
if list(data) != []:
|
if list(data) != []:
|
||||||
return AccountPresenceSubscribeHandler.handle(self, stanza,
|
return AccountPresenceSubscribeHandler.handle(self, stanza,
|
||||||
lang_class, None)
|
lang_class, None)
|
||||||
@@ -174,7 +174,7 @@ class AccountPresenceUnsubscribeHandler(Handler):
|
|||||||
filter = jabber.get_account_filter
|
filter = jabber.get_account_filter
|
||||||
|
|
||||||
def handle(self, stanza, lang_class, data):
|
def handle(self, stanza, lang_class, data):
|
||||||
"""Handle \"unsubscribe\" iq sent to account JID"""
|
"""Handle 'unsubscribe' iq sent to account JID"""
|
||||||
from_jid = stanza.get_from()
|
from_jid = stanza.get_from()
|
||||||
_account = data
|
_account = data
|
||||||
return self.component.account_manager.remove_account(_account, from_jid)
|
return self.component.account_manager.remove_account(_account, from_jid)
|
||||||
@@ -185,7 +185,7 @@ class RootPresenceUnsubscribeHandler(Handler):
|
|||||||
filter = jabber.get_accounts_root_filter
|
filter = jabber.get_accounts_root_filter
|
||||||
|
|
||||||
def handle(self, stanza, lang_class, data):
|
def handle(self, stanza, lang_class, data):
|
||||||
"""Handle \"unsubscribe\" iq sent to account JID"""
|
"""Handle 'unsubscribe' iq sent to account JID"""
|
||||||
from_jid = stanza.get_from()
|
from_jid = stanza.get_from()
|
||||||
_account = data
|
_account = data
|
||||||
return self.component.account_manager.remove_all_accounts(from_jid)
|
return self.component.account_manager.remove_all_accounts(from_jid)
|
||||||
|
|||||||
@@ -107,12 +107,14 @@ class FeederComponent_TestCase(JCLComponent_TestCase):
|
|||||||
account2 = Account(user=User(jid="user2@test.com"),
|
account2 = Account(user=User(jid="user2@test.com"),
|
||||||
name="account2",
|
name="account2",
|
||||||
jid="account2@jcl.test.com")
|
jid="account2@jcl.test.com")
|
||||||
self.comp.handler.feeder = AccountFeeder(self.comp)
|
self.comp.tick_handlers = [FeederHandler(AccountFeeder(self.comp),
|
||||||
self.comp.handler.sender = MessageSender(self.comp)
|
MessageSender(self.comp)),
|
||||||
|
FeederHandler(AccountFeeder(self.comp),
|
||||||
|
MessageSender(self.comp))]
|
||||||
self.comp.handle_tick()
|
self.comp.handle_tick()
|
||||||
|
|
||||||
messages_sent = self.comp.stream.sent
|
messages_sent = self.comp.stream.sent
|
||||||
self.assertEquals(len(messages_sent), 6)
|
self.assertEquals(len(messages_sent), 12)
|
||||||
self.assertEquals(messages_sent[0].get_from(), "account11@jcl.test.com")
|
self.assertEquals(messages_sent[0].get_from(), "account11@jcl.test.com")
|
||||||
self.assertEquals(messages_sent[0].get_to(), "user1@test.com")
|
self.assertEquals(messages_sent[0].get_to(), "user1@test.com")
|
||||||
self.assertEquals(messages_sent[0].get_subject(),
|
self.assertEquals(messages_sent[0].get_subject(),
|
||||||
@@ -152,6 +154,45 @@ class FeederComponent_TestCase(JCLComponent_TestCase):
|
|||||||
self.assertEquals(messages_sent[5].get_body(),
|
self.assertEquals(messages_sent[5].get_body(),
|
||||||
"jid: account2@jcl.test.com")
|
"jid: account2@jcl.test.com")
|
||||||
|
|
||||||
|
self.assertEquals(messages_sent[6].get_from(), "account11@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[6].get_to(), "user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[6].get_subject(),
|
||||||
|
"Simple Message for account account11")
|
||||||
|
self.assertEquals(messages_sent[6].get_body(),
|
||||||
|
"user_jid: user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[7].get_from(), "account11@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[7].get_to(), "user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[7].get_subject(),
|
||||||
|
"Simple Message for account account11")
|
||||||
|
self.assertEquals(messages_sent[7].get_body(),
|
||||||
|
"jid: account11@jcl.test.com")
|
||||||
|
|
||||||
|
self.assertEquals(messages_sent[8].get_from(), "account12@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[8].get_to(), "user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[8].get_subject(),
|
||||||
|
"Simple Message for account account12")
|
||||||
|
self.assertEquals(messages_sent[8].get_body(),
|
||||||
|
"user_jid: user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[9].get_from(), "account12@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[9].get_to(), "user1@test.com")
|
||||||
|
self.assertEquals(messages_sent[9].get_subject(),
|
||||||
|
"Simple Message for account account12")
|
||||||
|
self.assertEquals(messages_sent[9].get_body(),
|
||||||
|
"jid: account12@jcl.test.com")
|
||||||
|
|
||||||
|
self.assertEquals(messages_sent[10].get_from(), "account2@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[10].get_to(), "user2@test.com")
|
||||||
|
self.assertEquals(messages_sent[10].get_subject(),
|
||||||
|
"Simple Message for account account2")
|
||||||
|
self.assertEquals(messages_sent[10].get_body(),
|
||||||
|
"user_jid: user2@test.com")
|
||||||
|
self.assertEquals(messages_sent[11].get_from(), "account2@jcl.test.com")
|
||||||
|
self.assertEquals(messages_sent[11].get_to(), "user2@test.com")
|
||||||
|
self.assertEquals(messages_sent[11].get_subject(),
|
||||||
|
"Simple Message for account account2")
|
||||||
|
self.assertEquals(messages_sent[11].get_body(),
|
||||||
|
"jid: account2@jcl.test.com")
|
||||||
|
|
||||||
class Feeder_TestCase(unittest.TestCase):
|
class Feeder_TestCase(unittest.TestCase):
|
||||||
def test_feed_exist(self):
|
def test_feed_exist(self):
|
||||||
feeder = Feeder()
|
feeder = Feeder()
|
||||||
@@ -208,7 +249,7 @@ class HeadlineSender_TestCase(MessageSender_TestCase):
|
|||||||
class FeederHandler_TestCase(JCLTestCase):
|
class FeederHandler_TestCase(JCLTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
JCLTestCase.setUp(self, tables=[Account, ExampleAccount, User])
|
JCLTestCase.setUp(self, tables=[Account, ExampleAccount, User])
|
||||||
self.handler = FeederHandler(FeederMock(), SenderMock())
|
self.tick_handlers = [FeederHandler(FeederMock(), SenderMock())]
|
||||||
|
|
||||||
def test_filter(self):
|
def test_filter(self):
|
||||||
model.db_connect()
|
model.db_connect()
|
||||||
@@ -218,7 +259,7 @@ class FeederHandler_TestCase(JCLTestCase):
|
|||||||
account11 = ExampleAccount(user=User(jid="user1@test.com"),
|
account11 = ExampleAccount(user=User(jid="user1@test.com"),
|
||||||
name="account11",
|
name="account11",
|
||||||
jid="account11@jcl.test.com")
|
jid="account11@jcl.test.com")
|
||||||
accounts = self.handler.filter(None, None)
|
accounts = self.tick_handlers[0].filter(None, None)
|
||||||
i = 0
|
i = 0
|
||||||
for _account in accounts:
|
for _account in accounts:
|
||||||
i += 1
|
i += 1
|
||||||
@@ -237,8 +278,8 @@ class FeederHandler_TestCase(JCLTestCase):
|
|||||||
account12 = ExampleAccount(user=User(jid="user2@test.com"),
|
account12 = ExampleAccount(user=User(jid="user2@test.com"),
|
||||||
name="account12",
|
name="account12",
|
||||||
jid="account12@jcl.test.com")
|
jid="account12@jcl.test.com")
|
||||||
accounts = self.handler.handle(None, None, [account11, account12])
|
accounts = self.tick_handlers[0].handle(None, None, [account11, account12])
|
||||||
sent = self.handler.sender.sent
|
sent = self.tick_handlers[0].sender.sent
|
||||||
self.assertEquals(len(sent), 2)
|
self.assertEquals(len(sent), 2)
|
||||||
self.assertEquals(sent[0], (account11, ("subject", "body")))
|
self.assertEquals(sent[0], (account11, ("subject", "body")))
|
||||||
self.assertEquals(sent[1], (account12, ("subject", "body")))
|
self.assertEquals(sent[1], (account12, ("subject", "body")))
|
||||||
@@ -253,8 +294,8 @@ class FeederHandler_TestCase(JCLTestCase):
|
|||||||
account12 = ExampleAccount(user=User(jid="user2@test.com"),
|
account12 = ExampleAccount(user=User(jid="user2@test.com"),
|
||||||
name="account12",
|
name="account12",
|
||||||
jid="account12@jcl.test.com")
|
jid="account12@jcl.test.com")
|
||||||
accounts = self.handler.handle(None, None, [account11, account12])
|
accounts = self.tick_handlers[0].handle(None, None, [account11, account12])
|
||||||
sent = self.handler.sender.sent
|
sent = self.tick_handlers[0].sender.sent
|
||||||
self.assertEquals(len(sent), 1)
|
self.assertEquals(len(sent), 1)
|
||||||
self.assertEquals(sent[0], (account12, ("subject", "body")))
|
self.assertEquals(sent[0], (account12, ("subject", "body")))
|
||||||
model.db_disconnect()
|
model.db_disconnect()
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ def mandatory_field(field_name, field_value):
|
|||||||
if field_value is None or str(field_value) == "":
|
if field_value is None or str(field_value) == "":
|
||||||
raise MandatoryFieldError(field_name)
|
raise MandatoryFieldError(field_name)
|
||||||
return field_value
|
return field_value
|
||||||
|
|
||||||
class User(InheritableSQLObject):
|
class User(InheritableSQLObject):
|
||||||
_connection = model.hub
|
_connection = model.hub
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user