from BTrees.Length import Length from threading import RLock from OFS.SimpleItem import SimpleItem from Acquisition import Implicit from AccessControl import ClassSecurityInfo import Globals manage_addSuperFooCounterForm = Globals.DTMLFile('dtml/addCounter', globals()) def manage_addSuperFooCounter(self id, title, start=1, callback_url='', REQUEST ): id=str(id) title=str(title) start=int(start) # raises ob = Counter(id, title, start) self._setObject(id, ob) if REQUEST is not None: if callback_url: REQUEST.RESPONSE.redirect(callback_url) else: REQUEST.RESPONSE.redirect('manage_main') # conflict resistant counter class Counter(SimpleItem, Implicit): meta_type = "Super Foo Counter" security = ClassSecurityInfo() def __init__(self, id, title, start=1): self.id = id self.title = title self._counter = Length(start) security.declarePublic('next') def next(self): val = self._counter() self._counter.change(1) return val Globals.InitializeClass(Counter) # the above doesn't do mutual exclusion though...