2008-02-28

objectqueue.py

  2008-02-28 00:25

...

### -*- coding: utf-8 -*- #############################################
#######################################################################
"""ObjectQueue class for the Zope 3 based objectqueue package

$Id: objectqueue.py 50217 2008-01-21 11:02:48Z corbeau $
"""
__author__  = "Yegor Shershnev, 2008"
__license__ = "GPL"
__version__ = "$Revision: 50217 $"

from zope.interface import Interface
from zope.interface import implements,implementedBy
from persistent import Persistent
from interfaces import IObjectQueue, IObjectQueueData
from persistent.list import PersistentList
from zope.app.zapi import getUtility
from zope.app.intid.interfaces import IIntIds

class ObjectQueue(Persistent) :
    """ ObjectQueue class represent queue of last modified objects
    """

    implements(IObjectQueueData, IObjectQueue)

    _maxlen = 5
    
    style = u"lifo"
    
    order = u"straight"
    
    length = 0

    def __init__(self, *kv, **args) :
        super(ObjectQueue, self).__init__(self, *kv, **args)
        self.queue = PersistentList()

    def __getitem__(self, key) :
        """ Get element of queue by id
        """
        if key not in self.queue:
            raise KeyError
        ## Надо убедиться в правильности исправления
        ## TODO: Контекст зачем убрал?
        ## Убрал потому что так работает, а с контексом он утилиту не находил
        #return getUtility(IIntIds, context=self).getObject(key)
        ### Прими решение что делать с этим. У меня с контексом не работает
        return getUtility(IIntIds).getObject(key)

    def __len__(self) :
        return len(self.queue)

    def __contains__(self, key) :
        return key in self.keys()

    def _setmaxlen(self, value) :
        if self.order == u"straight" :
            self.queue = self.queue[:value]
        elif self.order == u"reverse" :
            self.queue = self.queue[-value:]
        self.__maxlen = value
    
    def _getmaxlen(self) :
        return self._maxlen

    maxlen = property(_getmaxlen, _setmaxlen, u"Maximum length of queue")

    @property
    def length(self) :
        return len(self)
    
    def get(self, key, default=None) :
        try :
            return self[key]
        except KeyError :
            return default

    def keys(self) :
        """ Return the keys of the queue
        """
        return [x for x in self.queue]

    def items(self) :
        """ Returns queued elements as list of tuples (key, value)
        """
        return [ (x,self[x]) for x in self.keys() ]

    def __iter__(self) :
        return (x for x in self.queue)

    def values(self) :
        """ Return objects associated with elements in queue
        """
        return [ y for x,y in self.items()]
    
    def itemAdd(self, ob) :
        """ Add a key of object into queue
        """        
        try :
            uid = getUtility(IIntIds, context=ob).getId(ob)
        except (KeyError), msg :
            print "Can't add",ob,"because of", msg
        else :
            order = self.order
            style = self.style
            maxlen = self.maxlen
            
            if style == u"lifo" and order == u"straight" :
                self.queue.insert(0, uid)
                if len(self) > maxlen :
                    self.queue.pop()
            elif style == u"lifo" and order == u"reverse" :
                self.queue.append(uid)
                if len(self) > maxlen :
                    self.queue.remove(self.queue[0])
            elif style == u"fifo" and order == u"straight":
                if len(self) > maxlen :
                    self.queue.pop()
                self.queue.append(uid)
            elif style == u"fifo" and order == u"reverse" :
                if len(self) > maxlen :
                    self.queue.remove(self.queue[0])
                self.queue.insert(0, uid)
                
            print "\n\nAdd", self.keys()

    def itemRemove(self, ob) :
        """ Remove object from queue
        """
        try :
            uid = getUtility(IIntIds, context=ob).getId(ob)
        except (ValueError,KeyError), msg :
            print "Can't remove",ob,"because of",msg
        else :
            if uid not in self.keys():
                return
            self.queue.remove(uid)
            print "\n\nRemove:", self.keys()
        
    def itemModify(self, ob) :
        """ Modufy object in queue
        """
        self.itemRemove(ob)
        self.itemAdd(ob)
Официальный сайт Zope3 Московская группа изучения реактивного движения The Dream Bot Site noooxml