def read_item(self, user, now=None): """Notice that user has accessed this item. If we are a comment, we pass this on to our parent item, to catch up based on comment's submission date. """ if not hasattr(self, "_BlogItem__user_access"): # we don't keep track of user access -- we're a comment, # so just pass this on to our parent. if self.parent_blogitem: return self.parent_blogitem.read_item(user, self.date) return if not user: return now = now or datetime.utcnow() user_oid = unpack_oid(user._p_oid) dt, count = self.__user_access.get(user_oid, (never, 0)) now = max(now, dt) # increment hit count self.__user_access[user_oid] = (now, count + 1)
def up_to_date(self, target, observer): """Return true if observer is up to date with respect to key. Returns true if observe(key, observer) has been called more recently than notify_changed(key). """ assert hasattr(target, '_p_oid'), 'target must be Persistent.' assert hasattr(observer, '_p_oid'), 'observer must be Persistent.' key = unpack_oid(target._p_oid) observer_oid = unpack_oid(observer._p_oid) o_list = self.root.get(key, None) if o_list: return observer_oid in o_list return False
def stop_observing(self, target, observer): """Unregister observer as watching/dependent on target.""" assert hasattr(target, '_p_oid'), 'target must be Persistent.' assert hasattr(observer, '_p_oid'), 'observer must be Persistent.' # newly-created objects that are uncommitted may not have OIDs yet if not target._p_oid or not observer._p_oid: return key = unpack_oid(target._p_oid) observer_oid = unpack_oid(observer._p_oid) o_list = self.root.get(key, None) if o_list: while observer_oid in o_list: o_list.remove(observer_oid)
def observe(self, target, observer): """Register observer as watching/dependent on target.""" assert hasattr(target, '_p_oid'), 'target must be Persistent.' assert hasattr(observer, '_p_oid'), 'observer must be Persistent.' # newly-created objects that are uncommitted may not have OIDs yet if not target._p_oid or not observer._p_oid: return key = unpack_oid(target._p_oid) observer_oid = unpack_oid(observer._p_oid) o_list = self.root.get(key, None) if o_list is not None: if not observer_oid in o_list: o_list.append(observer_oid) else: self[key] = PersistentList([observer_oid])
def notify_changed(self, target): """Called by target to notify that it has changed.""" assert hasattr(target, '_p_oid'), 'target must be Persistent.' # newly-created objects that are uncommitted may not have OIDs yet if not target._p_oid: return key = unpack_oid(target._p_oid) if self.root.has_key(key): del self[key]
def upgradeToVersion3(self): # move all data from ReaderList into BlogItems from qon.base import get_user_database user_db = get_user_database() for user_id, reader in self.__reader_list.readers.iteritems(): user = user_db.get_user(user_id) if not user: continue user_oid = unpack_oid(user._p_oid) for item_id, data in reader.read_items.iteritems(): dt, count = data item = self.get_item(item_id) item._BlogItem__user_access[user_oid] = (dt, count) del self.__reader_list self.version_upgrade_done()
def _get_user_access(self, user): if not hasattr(self, "_BlogItem__user_access"): return (never, 0) user_oid = unpack_oid(user._p_oid) return self.__user_access.get(user_oid, (never, 0))