Skip to content

Commit

Permalink
Add back ZCacheable templates.
Browse files Browse the repository at this point in the history
  • Loading branch information
hannosch committed Oct 30, 2016
1 parent 52983a8 commit 7b8e55c
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 5 deletions.
52 changes: 50 additions & 2 deletions src/OFS/Cache.py
Expand Up @@ -27,6 +27,7 @@
from Acquisition import aq_get
from Acquisition import aq_inner
from Acquisition import aq_parent
from App.special_dtml import DTMLFile

ZCM_MANAGERS = '__ZCacheManager_ids__'

Expand Down Expand Up @@ -84,11 +85,18 @@ class Cacheable(object):
'''Mix-in for cacheable objects.
'''

manage_options = ()
manage_options = (
{'label': 'Cache', 'action': 'ZCacheable_manage',
'filter': filterCacheTab},
)

security = ClassSecurityInfo()
security.setPermissionDefault(ChangeCacheSettingsPermission, ('Manager',))

security.declareProtected(ViewManagementScreensPermission,
'ZCacheable_manage')
ZCacheable_manage = DTMLFile('dtml/cacheable', globals())

_v_ZCacheable_cache = None
_v_ZCacheable_manager_timestamp = 0
__manager_id = None
Expand Down Expand Up @@ -199,6 +207,11 @@ def ZCacheable_invalidate(self, view_name='', REQUEST=None):
exc = None
else:
message = 'This object is not associated with a cache manager.'

if REQUEST is not None:
return self.ZCacheable_manage(
self, REQUEST, management_view='Cache',
manage_tabs_message=message)
return message

security.declarePrivate('ZCacheable_getModTime')
Expand Down Expand Up @@ -270,6 +283,11 @@ def ZCacheable_setManagerId(self, manager_id, REQUEST=None):
self.__manager_id = manager_id
self._v_ZCacheable_cache = None

if REQUEST is not None:
return self.ZCacheable_manage(
self, REQUEST, management_view='Cache',
manage_tabs_message='Cache settings changed.')

security.declareProtected(ViewManagementScreensPermission,
'ZCacheable_enabled')
def ZCacheable_enabled(self):
Expand All @@ -283,6 +301,18 @@ def ZCacheable_setEnabled(self, enabled=0, REQUEST=None):
'''Changes the enabled flag.'''
self.__enabled = enabled and 1 or 0

if REQUEST is not None:
return self.ZCacheable_manage(
self, REQUEST, management_view='Cache',
manage_tabs_message='Cache settings changed.')

security.declareProtected(ViewManagementScreensPermission,
'ZCacheable_configHTML')
def ZCacheable_configHTML(self):
'''Override to provide configuration of caching
behavior that can only be specific to the cacheable object.
'''
return ''

InitializeClass(Cacheable)

Expand Down Expand Up @@ -385,7 +415,9 @@ def ZCacheManager_getCache(self):

_isCacheManager = 1

manage_options = ()
manage_options = (
{'label': 'Associate', 'action': 'ZCacheManager_associate'},
)

def manage_afterAdd(self, item, container):
# Adds self to the list of cache managers in the container.
Expand All @@ -411,6 +443,10 @@ def manage_beforeDelete(self, item, container):
global manager_timestamp
manager_timestamp = time.time()

security.declareProtected(ChangeCacheSettingsPermission,
'ZCacheManager_associate')
ZCacheManager_associate = DTMLFile('dtml/cmassoc', globals())

security.declareProtected(ChangeCacheSettingsPermission,
'ZCacheManager_locate')
def ZCacheManager_locate(self, require_assoc, subfolders,
Expand All @@ -425,6 +461,11 @@ def ZCacheManager_locate(self, require_assoc, subfolders,
meta_types = []
findCacheables(ob, manager_id, require_assoc, subfolders,
meta_types, rval, ())

if REQUEST is not None:
return self.ZCacheManager_associate(
self, REQUEST, show_results=1, results=rval,
management_view="Associate")
return rval

security.declareProtected(ChangeCacheSettingsPermission,
Expand Down Expand Up @@ -459,4 +500,11 @@ def ZCacheManager_setAssociations(self, props=None, REQUEST=None):
ob.ZCacheable_setManagerId(None)
remcount = remcount + 1

if REQUEST is not None:
return self.ZCacheManager_associate(
self, REQUEST, management_view="Associate",
manage_tabs_message='%d association(s) made, %d removed.' %
(addcount, remcount)
)

InitializeClass(CacheManager)
11 changes: 8 additions & 3 deletions src/OFS/DTMLMethod.py
Expand Up @@ -39,7 +39,6 @@
from OFS.SimpleItem import Item_w__name__
from ZPublisher.Iterators import IStreamIterator


if sys.version_info >= (3, ):
basestring = str

Expand All @@ -55,8 +54,8 @@ class DTMLMethod(RestrictedDTML,
HTML,
Implicit,
RoleManager,
Cacheable,
Item_w__name__):
Item_w__name__,
Cacheable):
""" DocumentTemplate.HTML objects that act as methods of their containers.
"""
meta_type = 'DTML Method'
Expand Down Expand Up @@ -190,6 +189,9 @@ def ZDocumentTemplate_afterRender(self, md, result):
kw[key] = val
self.ZCacheable_set(result, keywords=kw)

security.declareProtected(change_dtml_methods, 'ZCacheable_configHTML')
ZCacheable_configHTML = DTMLFile('dtml/cacheNamespaceKeys', globals())

security.declareProtected(change_dtml_methods, 'getCacheNamespaceKeys')
def getCacheNamespaceKeys(self):
# Return the cacheNamespaceKeys.
Expand All @@ -205,6 +207,9 @@ def setCacheNamespaceKeys(self, keys, REQUEST=None):
ks.append(key)
self._cache_namespace_keys = tuple(ks)

if REQUEST is not None:
return self.ZCacheable_manage(self, REQUEST)

security.declareProtected(View, 'get_size')
def get_size(self):
return len(self.raw)
Expand Down
11 changes: 11 additions & 0 deletions src/OFS/dtml/cacheNamespaceKeys.dtml
@@ -0,0 +1,11 @@
<p class="form-text">
Names from the DTML namespace to use as cache keys:
</p>
<textarea name="keys:lines" cols="40" rows="5"><dtml-in
getCacheNamespaceKeys>&dtml-sequence-item;
</dtml-in></textarea>
<br>
<div class="form-element">
<input class="form-element" type="submit"
name="setCacheNamespaceKeys:method" value="Save Changes">
</div>
40 changes: 40 additions & 0 deletions src/OFS/dtml/cacheable.dtml
@@ -0,0 +1,40 @@
<dtml-var manage_page_header>
<dtml-var manage_tabs>

<form action="&dtml-absolute_url;" method="POST">

<div class="form-element">
<span class="form-label">
Cache this object using:
</span>

<select name="manager_id">
<option value="">(None)</option>
<dtml-in ZCacheable_getManagerIds mapping>
<option value="&dtml-id;" <dtml-if
expr="id == ZCacheable_getManagerId()"
>selected="selected"</dtml-if>>&dtml-id;
<dtml-if title>(&dtml-title;)</dtml-if></option>
</dtml-in>
</select>
<br />
<input class="form-element" type="submit"
name="ZCacheable_setManagerId:method" value="Save Changes">
</div>

<dtml-if ZCacheable_getManagerURL>
<p class="form-text">
<a href="&dtml-ZCacheable_getManagerURL;/manage_main">Cache Settings</a>
</p>

<div class="form-element">
<input class="form-element" type="submit"
name="ZCacheable_invalidate:method" value="Invalidate">
</div>
</dtml-if>

<dtml-var ZCacheable_configHTML>

</form>

<dtml-var manage_page_footer>
112 changes: 112 additions & 0 deletions src/OFS/dtml/cmassoc.dtml
@@ -0,0 +1,112 @@
<dtml-var manage_page_header>
<dtml-var manage_tabs>

<form action="&dtml-URL1;" name="objectItems" method="POST">

<dtml-if show_results>
<dtml-if results>
<p class="form-help">
Select which objects should be cached using this cache manager. Only
those objects for which you have the "Change cache settings" permission
are shown.
</p>

<table width="100%" cellspacing="0" cellpadding="2" border="0">
<dtml-in results mapping sort=sortkey>
<dtml-if sequence-odd>
<tr class="row-normal">
<dtml-else>
<tr class="row-hilite">
</dtml-if>
<td align="left" valign="top">
<input type="checkbox" name="associate_&dtml-path;:int" value="1"<dtml-if
associated> checked="checked"</dtml-if>>
<input type="hidden" name="associate_&dtml-path;:int:default" value="0">
</td>
<td align="left" valign="top">
<div class="form-text">
<a href="../&dtml-path;/manage_main">&dtml-path;</a><dtml-if
title>(&dtml-title;)</dtml-if>
</div>
</td>
</tr>
</dtml-in>
<tr>
<td></td>
<td align="left" valign="top">
<div class="form-element">
<input type="submit" name="ZCacheManager_setAssociations:method"
value="Save Changes">
</div>
</td>
</tr>
</table>
</form>

<dtml-else>
<p class="form-text">
No objects matched your query.
</p>
</dtml-if>
<hr>
</dtml-if>

<form target="&dtml-URL1;" method="post">
<table cellspacing="0" cellpadding="2" border="0">
<tr>
<td align="left" valign="top">
<div class="form-label">
Locate cacheable objects:
</div>
</td>
<td align="left" valign="top">
<div class="form-text">
<input type="radio" name="require_assoc:int" value="0"
checked="checked"> All
<input type="radio" name="require_assoc:int" value="1">
Associated with this cache manager
</div>
</td>
</tr>
<tr>
<td align="left" valign="top">
<div class="form-label">
Of the type(s):
</div>
</td>
<td align="left" valign="top">
<div class="form-element">
<select multiple="multiple" name="meta_types:list" size="5">
<option value="" selected>All</option>
<dtml-in all_meta_types mapping sort=name>
<option value="&dtml-name;">&dtml-name;</option>
</dtml-in>
</select>
</div>
</td>
</tr>
<tr>
<td align="left" valign="top">
</td>
<td align="left" valign="top">
<div class="form-text">
<input type="checkbox" name="subfolders:int" value="1" checked="checked">
<input type="hidden" name="subfolders:int" value="0">
Search subfolders
</div>
</td>
</tr>
<tr>
<td align="left" valign="top">
</td>
<td align="left" valign="top">
<div class="form-element">
<br>
<input type="submit" name="ZCacheManager_locate:method" value="Locate">
</div>
</td>
</tr>
</table>
</form>

<dtml-var manage_page_footer>
1 change: 1 addition & 0 deletions src/OFS/tests/testFileAndImage.py
Expand Up @@ -53,6 +53,7 @@ def aputrequest(file, content_type):


class DummyCache(object):

def __init__(self):
self.clear()

Expand Down

0 comments on commit 7b8e55c

Please sign in to comment.