[Zope-dev] Caching problems
Bob Pepin
bpe@iee.lu
Wed, 16 Aug 2000 16:31:49 +0200
--pf9I7BMVVzbSWLtt
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi,
I have a problem with a class I wrote where I have a list as an
attribute of the class. When I append something to that list, it stays
there at first, but only until I restart Zope. It disappears (==is set
to the value I assigned to it in __init__) and reappears as well when
I hit reload a few times very quickly. Whenever I flush the cache it
disappears immediately. There seems to be no transaction registered by
Zope, because it doesn't show up under 'Undo'. I observed this both
thru a dtml page and a debugging function written in python.
I attached the code below, the method and attributes I'm talking about
are IEEShare.read_access_roles, IEEShare.write_access_roles and
IEEShare.add_user_access()
The problem exists with both Zope 2.2.0 and 2.2.1b1. I'm running
2.2.1b1 right now on a SuSE Linux 6.4 default installation. (standard libc,
threads etc.)
Both versions of Zope are compiled from source.
--pf9I7BMVVzbSWLtt
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="IEEFolder.py"
__doc__ = """IEEFolder product module."""
__version__ = '0.1'
import string
from Globals import HTMLFile,MessageDialog,Persistent
import OFS.Folder
import OFS.PropertyManager
import Acquisition
import AccessControl
from AccessControl import getSecurityManager
manage_addIEEFolderForm = HTMLFile('ieefolderAdd', globals())
def manage_addIEEFolder(self, id, title=None, REQUEST=None):
"""Add an IEE Folder to a folder."""
ob=IEEFolder()
ob.id=str(id)
if title:
ob.title=title
self._setObject(id, ob)
if REQUEST is not None:
return self.manage_main(self, REQUEST, update_menu=1)
def findProperty(ids, props, searchterm, path='', all=0):
"""Find a property
"""
result=[]
checkPermission=getSecurityManager().checkPermission
for obj in ids:
if hasattr(obj, '_properties') and checkPermission('Access contents information', obj):
for md in getattr(obj, '_properties'):
propid=md['id']
if (all or (propid in props)) and \
(string.find(str(getattr(obj, propid)),searchterm) != -1):
result.append({'object': obj,
'id': path + obj.id,
'url': obj.absolute_url()})
if getattr(obj, 'isPrincipiaFolderish', None):
result.extend(findProperty(obj.objectValues(), props, searchterm, \
path=path+obj.id+'.', all=all))
return result
class IEEFolder(OFS.Folder.Folder,
Persistent,
Acquisition.Implicit,
AccessControl.Role.RoleManager,
OFS.PropertyManager.PropertyManager
):
meta_type = 'IEE Folder'
__ac_permissions__=(
('Read Access', ('manage_findPropertyForm', 'manage_findProperty',
'index_html', 'manage_main', 'manage_workspace',
'objectIds', 'objectValues', 'objectItems', '')),
('Write Access', ('manage_delObjects',)))
manage_workspace__roles__=('Read Access','Write Access')
manage_options = (
{'label': 'Folder View', 'action': 'index_html', 'image': 'folder-view'},
{'label': 'Search', 'action': 'manage_findPropertyForm',
'image': 'search'},
{'label': 'Undo', 'action': 'manage_UndoForm', 'image': 'undo'})
index_html = HTMLFile('index', globals())
manage_main = HTMLFile('index', globals())
manage_findPropertyForm=HTMLFile('findProperty', globals())
findPropertyResult=HTMLFile('findPropertyResult', globals())
manage_UndoForm=HTMLFile('undo', globals())
def filtered_objectIds(self):
map(lambda x: x.id, filter(lambda x: getSecurityManager().checkPermission('Read Access', x), self.objectValues()))
def manage_findProperty(self, searchterm, props=[], allprops='all'):
"""Find a property."""
if type(props) is type(''):
props=[props]
if allprops == 'all':
allprops = 1
else:
allprops = 0
return self.findPropertyResult(self, result=findProperty(self.objectValues(), props, searchterm, all=allprops), URL=self.absolute_url())
--pf9I7BMVVzbSWLtt
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="IEEShare.py"
__doc__ = """IEEShare product module."""
__version__ = '0.1'
import nis,traceback
from Globals import HTMLFile,MessageDialog,Persistent
from Products.CARS.IEEFolder import IEEFolder
from Products.CARS.NisLogin import NisLogin
from Products.LoginManager.LoginManager import manage_addLoginManager
from Globals import HTMLFile
manage_addIEEShareForm = HTMLFile('ieeshareAdd', globals())
def manage_addIEEShare(self, id, title=None, REQUEST=None):
"""Add an IEE Share to a folder."""
ob=IEEShare()
ob.id=str(id)
ob.title=title
self._setObject(id, ob)
ob=self._getOb(id)
ob.manage_role('Read Access', permissions=('Read Access',))
ob.manage_role('Write Access', permissions=('Write Access',))
# manage_addLoginManager(ob, usource='NIS User Source')
if REQUEST is not None:
return self.manage_main(self, REQUEST, update_menu=1)
class IEEShare(IEEFolder.IEEFolder):
meta_type = 'IEE Share'
read_access_roles=None
write_access_roles=None
def __init__(self):
self.read_access_roles=[]
self.write_access_roles=[]
def add_user_access(self, user, lst, access='Some'):
try: nis.match(user, 'passwd.byname')
except nis.error:
return MessageDialog(
title = 'Error!',
message = '%s: No such user' % user,
action = 'manage_main')
if user in lst:
return MessageDialog(
title = 'Error!',
message = 'User %s already has %s access.' % (access, user),
action = 'manage_main')
lst.append(str(user))
get_transaction().commit()
return MessageDialog(
title = 'Success!',
message = '%s access for %s has been successfully added.' \
% (access, user),
action = 'manage_main')
def manage_addReadAccess(self, user, REQUEST=None):
"""foo"""
return self.add_user_access(user, self.read_access_roles, access='Read')
def manage_addWriteAccess(self, user, REQUEST=None):
"""bar"""
return self.add_user_access(user, self.write_access_roles, access='Write')
manage_addReadAccessForm=HTMLFile('addAccessForm', globals(), type='Read')
manage_addWriteAccessForm=HTMLFile('addAccessForm', globals(), type='Write')
manage_showAccessForm=HTMLFile('showAccessForm', globals())
--pf9I7BMVVzbSWLtt--