def __init__(self, host='localhost', port=6379, db=0): cmd.Cmd.__init__(self) self.thoonk = Thoonk(host, port, db) self.lthoonk = Thoonk(host, port, db) self.intro = 'Thoonk.py v%s Client' % thoonk.__version__ self.prompt = '>>> ' self.lthoonk.register_handler('publish_notice', self.publish_notice) self.lthoonk.register_handler('retract_notice', self.retract_notice) self.lthoonk.register_handler('create_notice', self.create_notice) self.lthoonk.register_handler('delete_notice', self.delete_notice)
class CLInterface(cmd.Cmd): def __init__(self, host='localhost', port=6379, db=0): cmd.Cmd.__init__(self) self.thoonk = Thoonk(host, port, db) self.lthoonk = Thoonk(host, port, db) self.intro = 'Thoonk.py v%s Client' % thoonk.__version__ self.prompt = '>>> ' self.lthoonk.register_handler('publish_notice', self.publish_notice) self.lthoonk.register_handler('retract_notice', self.retract_notice) self.lthoonk.register_handler('create_notice', self.create_notice) self.lthoonk.register_handler('delete_notice', self.delete_notice) def start(self): self.thread = threading.Thread(target=self.lthoonk.listen) self.thread.daemon = True self.thread.start() self.lthoonk.listen_ready.wait() self.cmdloop() def parseline(self, line): line = cmd.Cmd.parseline(self, line) if line[0] != 'help': return (line[0], line[1].split(' '), line[2]) return line def do_EOF(self, line): return True def do_quit(self, line): return True def help_quit(self): print 'Quit' def do_create(self, args): try: self.thoonk.create_feed(args[0], {}) except FeedExists: print "Feed already exists" def help_create(self): print 'create [feed name]' print 'Create a new feed with the given name' def do_publish(self, args): self.thoonk[args[0]].publish(" ".join(args[1:])) def help_publish(self): print 'publish [item contents]' print 'Publish a string to the feed (may include spaces)' def do_delete(self, args): self.thoonk[args[0]].delete_feed() def help_delete(self): print 'delete [feed name]' print 'Delete the given feed' def do_retract(self, args): self.thoonk[args[0]].retract(args[1]) def help_retract(self): print 'retract [feed name] [item id]' print 'Remove an item from a feed.' def do_feeds(self, args): print self.thoonk.get_feeds() def help_feeds(self): print 'List existing feeds' def do_items(self, args): print self.thoonk[args[0]].get_all() def help_items(self): print 'items [feed name]' print 'List items in a given feed.' def do_item(self, args): if len(args) == 1: args.append(None) print self.thoonk[args[0]].get_item(args[1]) def help_item(self): print 'item [feed name] [id]' print 'Print the contents of a feed item' def do_getconfig(self, args): print self.thoonk[args[0]].config def help_getconfig(self): print 'getconfig [feed name]' print 'Show the JSON configuration for a feed' def do_setconfig(self, args): feed = args[0] config = ' '.join(args[1:]) self.thoonk[feed].config = config print "Ok." def help_setconfig(self): print 'setconfig [feed name] [config]' print 'Set the configuration for a feed' def publish_notice(self, feed, item, id): print "\npublish: %s[%s]: %s" % (feed, id, item) def retract_notice(self, feed, id): print "\nretract: %s[%s]" % (feed, id) def create_notice(self, feed): print "\ncreated: %s" % feed def delete_notice(self, feed): print "\ndeleted: %s" % feed def finish_notice(self, feed, id, item, result): print "\nfinished: %s[%s]: %s -> %s" % (feed, id, item, result)
def __init__(self, *args, **kwargs): self._thoonkfeeds = Thoonk( host=settings.REDIS['host'], port=settings.REDIS['port'], db=settings.REDIS['db']) super(AbstractEventResource, self).__init__(self, *args, **kwargs)
if __name__ == '__main__': optp = OptionParser() optp.add_option('--daemon', action="store_true", dest='daemonize', help="run as daemon") optp.add_option('-q','--quiet', help='set logging to ERROR', action='store_const', dest='loglevel', const=logging.ERROR, default=None) optp.add_option('-d','--debug', help='set logging to DEBUG', action='store_const', dest='loglevel', const=logging.DEBUG, default=None) optp.add_option('-v','--verbose', help='set logging to COMM', action='store_const', dest='loglevel', const=5, default=None) optp.add_option("-c","--config", dest="configfile", default="config.ini", help="set config file to use") opts,args = optp.parse_args() logging.basicConfig(level=opts.loglevel, format='%(levelname)-8s %(message)s') logging.info("Not daemonized") print "loaded modules" p = Thoonk(listen=True, db=10) print p.get_feeds() print p.feed_exists('test') print "pubsub" print "interface" xmpp = ComponentXMPP('pubsub.local', 'secreteating', '127.0.0.1', 5347) print "xmpp" sleekpubsub = SleekPubsub2(xmpp, p) print "Sleekpubsub" print "registered" print xmpp.connect() print "connected" xmpp.process(threaded=False) print "processed"
class AbstractEventResource(ModelResource): class Meta: queryset = Event.objects.all() resource_name = 'event' always_return_data = True filtering = { 'created_by': ALL, 'created_at': ALL, 'action': ALL, 'parent': ALL, 'id': ALL, 'feed': ALL, 'reference': ALL } ordering = [ 'created_by', 'created_at', 'action', 'parent', 'id', 'feed', 'reference' ] # TODO authentication = Authentication() authorization = Authorization() def __init__(self, *args, **kwargs): self._thoonkfeeds = Thoonk( host=settings.REDIS['host'], port=settings.REDIS['port'], db=settings.REDIS['db']) super(AbstractEventResource, self).__init__(self, *args, **kwargs) def _publish_on_thoonk(self, bundle): """ Notifies the corresponding Thoonk Feed of an Event instance """ if bundle.obj.feed is not None: feedname = bundle.obj.feed elif 'feed' in bundle.data: feedname = bundle.data['feed'] else: return if bundle.obj.action is not None: actionname = bundle.obj.action elif 'action' in bundle.data: actionname = bundle.data['action'] else: return feed = self._thoonkfeeds.feed(feedname) if bundle.obj.id is not None: eid = bundle.obj.id elif 'id' in bundle.data: eid = bundle.data['id'] else: return reference = None if bundle.obj.reference is not None: reference = bundle.obj.reference elif 'reference' in bundle.data: reference = bundle.data['reference'] parent = None if bundle.obj.parent is not None: parent = bundle.obj.parent elif 'parent' in bundle.data: parent = bundle.data['parent'] feed.publish(json.dumps({ 'id': eid, 'action': actionname, 'feed': feedname, 'reference': reference, 'parent': parent }), str(eid)) def obj_create(self, bundle, request=None, **kwargs): """ A Resource-specific implementation of ``obj_create``. """ if request and request.user.is_authenticated(): bundle.data['created_by'] = request.user.id elif 'created_by' not in bundle.data: bundle.data['created_by'] = -1 bundle = super(AbstractEventResource, self).obj_create(bundle, request, **kwargs) self._publish_on_thoonk(bundle) return bundle def obj_update(self, bundle, request=None, **kwargs): """ A Resource-specific implementation of ``obj_update``. """ bundle = super(AbstractEventResource, self).obj_update(bundle, request, **kwargs) self._publish_on_thoonk(bundle) return bundle def obj_delete(self, request=None, **kwargs): """ A Resource-specific implementation of ``obj_delete``. """ obj = kwargs.pop('_obj', None) if not hasattr(obj, 'delete'): try: obj = self.obj_get(request, **kwargs) except ObjectDoesNotExist: raise NotFound("A model instance matching the provided arguments could not be found.") eid = obj.id copyobj = deepcopy(obj) actionname = obj.action + ".delete" obj.delete() feed = self._thoonkfeeds.feed(obj.feed) if feed: feed.publish(json.dumps({ 'id': eid, 'action': actionname, 'feed': obj.feed, 'reference': obj.reference, 'parent': obj.parent })) return copyobj