[kupu-checkins] r35625 - in kupu/trunk/kupu/plone: . profiles/default xml
duncan at codespeak.net
duncan at codespeak.net
Tue Dec 12 12:43:56 CET 2006
Author: duncan
Date: Tue Dec 12 12:43:52 2006
New Revision: 35625
Modified:
kupu/trunk/kupu/plone/exportimport.py
kupu/trunk/kupu/plone/interfaces.py
kupu/trunk/kupu/plone/librarytool.py
kupu/trunk/kupu/plone/plonelibrarytool.py
kupu/trunk/kupu/plone/profiles/default/kupu.xml
kupu/trunk/kupu/plone/resource_types.pt
kupu/trunk/kupu/plone/xml/kupuExport.xml
Log:
Save default resource as well as default library. Implemented whitelist vs blacklist for resources
Modified: kupu/trunk/kupu/plone/exportimport.py
==============================================================================
--- kupu/trunk/kupu/plone/exportimport.py (original)
+++ kupu/trunk/kupu/plone/exportimport.py Tue Dec 12 12:43:52 2006
@@ -89,7 +89,8 @@
types = kupu.zmi_get_resourcetypes()
kupu.deleteResourceTypes([ t.name for t in types])
for k in resources:
- kupu.addResourceType(k['id'], k['types'])
+ kupu.addResourceType(k['id'], k['types'], k['mode'])
+ kupu.setDefaultResource(info['defaultresource'][0])
if info.has_key('generatepreviews'):
# This code generates preview URLs automatically from the most
@@ -114,7 +115,7 @@
# Set up libraries
libraries = info['libraries']
- deflib = info['default'][0]
+ deflib = info['defaultlibrary'][0]
libs = kupu.zmi_get_libraries()
kupu.deleteLibraries(range(len(libs)))
for lib in libraries:
@@ -191,8 +192,9 @@
{
'config': {},
'library': { KEY: 'libraries' },
- 'default': { DEFAULT: ('',) },
+ 'defaultlibrary': { DEFAULT: ('',) },
'resource': { KEY: 'resources' },
+ 'defaultresource': { DEFAULT: ('linkable',) },
'preview': { KEY: 'previews', DEFAULT: () },
'generatepreviews': {},
'globaltoolbar': { DEFAULT: ('',) },
@@ -228,13 +230,14 @@
'icon': {},
'title': {},
},
- 'default': { '#text': { KEY:None }, },
+ 'defaultlibrary': { '#text': { KEY:None }, },
'resource':
{
'mode': {},
'id': {},
'type': { KEY:'types' },
},
+ 'defaultresource': { '#text': { KEY:None }, },
'type':
{ '#text': { KEY: None },
},
Modified: kupu/trunk/kupu/plone/interfaces.py
==============================================================================
--- kupu/trunk/kupu/plone/interfaces.py (original)
+++ kupu/trunk/kupu/plone/interfaces.py Tue Dec 12 12:43:52 2006
@@ -72,7 +72,7 @@
Returns 'default' if resource_type is not found.
"""
- def addResourceType(resource_type, portal_types):
+ def addResourceType(resource_type, portal_types, mode='whitelist'):
"""Add a resource type pointing to a sequence of portal_types."""
def updateResourceTypes(type_mapping):
Modified: kupu/trunk/kupu/plone/librarytool.py
==============================================================================
--- kupu/trunk/kupu/plone/librarytool.py (original)
+++ kupu/trunk/kupu/plone/librarytool.py Tue Dec 12 12:43:52 2006
@@ -21,6 +21,7 @@
from Products.CMFCore.utils import getToolByName
class KupuError(Exception): pass
+NEWTYPE_IGNORE, NEWTYPE_ADD = 0, 1
class Resource:
"""Class to hold resources"""
@@ -128,15 +129,71 @@
libraries[new_index], libraries[index]
self._libraries = libraries
+ def getNewTypeHandler(self, resource_type):
+ """Should unknown portal types be added to the list or ignored"""
+ _res_newtype = getattr(self, '_res_newtype', None)
+ if _res_newtype is None:
+ for k in self._res_types:
+ if k in ('linkable', 'containsanchors', 'composable'):
+ _res_newtype[k] = NEWTYPE_ADD
+ else:
+ _res_newtype[k] = NEWTYPE_IGNORE
+ self._res_newtype = _res_newtype
+
+ return _res_newtype.get(resource_type, NEWTYPE_IGNORE)
+
+ def setNewTypeHandler(self, resource_type, mode):
+ """Update how unknown types are handled."""
+ if self.getNewTypeHandler(resource_type) != mode:
+ self._res_newtype[resource_type] = mode
+ self._res_newtype = self._res_newtype # Flag ourselves as modified.
+
+ def checkNewResourceTypes(self):
+ # Check for new types added. It would be nice if this
+ # was called automatically but not every time we query a
+ # resource.
+ handle_new = self.getNewTypeHandler(resource_type)
+ if handle_new != NEWTYPE_IGNORE:
+ typetool = getToolByName(self, 'portal_types')
+ new_portal_types = dict([ (t.id, 1) for t in typetool.listTypeInfo()])
+ if getattr(self, '_last_known_types', None) is None:
+ # Migrate from old version
+ self._last_known_types = all_portal_types
+ else:
+ for t in new_types:
+ if t in new_portal_types:
+ del new_portal_types[t]
+ if new_portal_types:
+ self._addNewTypesToResources()
+
+ def _addNewTypesToResources(self):
+ """This method is called when the list of types in the system has changed.
+ It updates all current resource types to include or exclude new types as
+ appropriate.
+ """
+ alltypes = typetool.listTypeInfo()
+ lastknown = self._last_known_types
+ newtypes = dict.fromkeys([ t.id for t in alltypes if t.id not in lastknown])
+
+ for resource_type in self._res_types.keys():
+ handle_new = self.getNewTypeHandler(resource_type)
+ if handle_new==NEWTYPE_ADD:
+ types = dict.fromkeys(self._res_types[resource_type])
+ types.update(newtypes)
+ self._res_types[resource_type] = types.keys()
+ self._res_types = self._res_types
+
def getPortalTypesForResourceType(self, resource_type):
"""See IResourceTypeMapper"""
- return self._res_types[resource_type][:]
+ self.checkNewResourceTypes()
+ types = self._res_types[resource_type]
+ return types[:]
def queryPortalTypesForResourceType(self, resource_type, default=None):
"""See IResourceTypeMapper"""
if not self._res_types.has_key(resource_type):
return default
- return self._res_types[resource_type][:]
+ return self.getPortalTypesForResourceType(resource_type)
def _validate_portal_types(self, resource_type, portal_types):
typetool = getToolByName(self, 'portal_types')
@@ -148,14 +205,28 @@
raise KupuError, "Resource type: %s, invalid type: %s" % (resource_type, p)
return portal_types
- def addResourceType(self, resource_type, portal_types):
+ def invertTypeList(self, types):
+ """Convert a list of portal_types to a list of all the types not in the list"""
+ typetool = getToolByName(self, 'portal_types')
+ portal_types = dict([ (t.id, 1) for t in typetool.listTypeInfo()])
+ res = [ name for name in portal_types if name not in types ]
+ res.sort()
+ return res
+
+ def addResourceType(self, resource_type, portal_types, mode='whitelist'):
"""See IResourceTypeMapper"""
+ newtype = NEWTYPE_IGNORE
+ if mode != 'whitelist':
+ portal_types = self.invertTypeList(portal_types)
+ newtype = NEWTYPE_ADD
portal_types = self._validate_portal_types(resource_type, portal_types)
self._res_types[resource_type] = tuple(portal_types)
+ self.setNewTypeHandler(resource_type, newtype)
def updateResourceTypes(self, type_info):
"""See IResourceTypeMapper"""
type_map = self._res_types
+
for type in type_info:
resource_type = type['resource_type']
if not resource_type:
@@ -165,6 +236,9 @@
if old_type:
del type_map[old_type]
type_map[resource_type] = tuple(portal_types)
+ nt = type.get('newtypes', None)
+ if nt is not None:
+ self.setNewTypeHandler(resource_type, nt)
def updatePreviewActions(self, preview_actions):
"""Now a misnomer: actually updates preview, normal, and scaling data"""
Modified: kupu/trunk/kupu/plone/plonelibrarytool.py
==============================================================================
--- kupu/trunk/kupu/plone/plonelibrarytool.py (original)
+++ kupu/trunk/kupu/plone/plonelibrarytool.py Tue Dec 12 12:43:52 2006
@@ -258,6 +258,10 @@
def getDefaultResource(self):
return getattr(self, 'default_resource', 'linkable')
+ security.declareProtected(permissions.ManageLibraries, "setDefaultResource")
+ def setDefaultResource(self, resource_type):
+ self.default_resource = resource_type
+
security.declareProtected('View', "installBeforeUnload")
def installBeforeUnload(self):
return getattr(self, 'install_beforeunload', False)
@@ -580,6 +584,22 @@
Old version of code. Returns name,types pairs plus a dummy"""
return [(t.name, t.types) for t in self.zmi_get_resourcetypes()] + [('',())]
+ security.declareProtected(permissions.ManageLibraries, "export_resource_types")
+ def export_resource_types(self):
+ """Build a list of resource types formatted for export.
+ 'blacklist' type lists are inverted so the listed types are the ones we don't want.
+ """
+ types = self.get_resourcetypes()
+ typetool = getToolByName(self, 'portal_types')
+ portal_types = dict([ (t.id, 1) for t in typetool.listTypeInfo()])
+ for t in types:
+ if t.newtype:
+ t.types = self.invertTypeList(t.types)
+ t.mode = 'blacklist'
+ else:
+ t.mode = 'whitelist'
+ return types
+
security.declareProtected(permissions.ManageLibraries, "get_resourcetypes")
def get_resourcetypes(self):
"""Return the type mapping, but without the ZMI dummy entry"""
@@ -588,7 +608,7 @@
real = []
for name in keys:
value = self._res_types[name]
- wrapped = Object(name=name, types=tuple(value))
+ wrapped = Object(name=name, types=tuple(value), newtype=self.getNewTypeHandler(name))
real.append(wrapped)
return real
Modified: kupu/trunk/kupu/plone/profiles/default/kupu.xml
==============================================================================
--- kupu/trunk/kupu/plone/profiles/default/kupu.xml (original)
+++ kupu/trunk/kupu/plone/profiles/default/kupu.xml Tue Dec 12 12:43:52 2006
@@ -47,27 +47,77 @@
icon="string:${portal_url}/kupuimages/kupusearch_icon.gif"
title="string:Recent items">
</library>
- <default>myitems</default>
- <resource mode="whitelist" id="collection">
+ <defaultlibrary>myitems</defaultlibrary>
+ <resource id="collection" mode="whitelist">
<type>Plone Site</type>
- <type>Folder</type>
<type>Large Plone Folder</type>
+ <type>Folder</type>
</resource>
- <resource mode="whitelist" id="containsanchors">
- <type>Document</type>
- <type>News Item</type>
- <type>Event</type>
- </resource>
- <resource mode="whitelist" id="linkable">
- <type>Document</type>
- <type>Image</type>
+ <resource id="containsanchors" mode="blacklist">
+ <type>ATBooleanCriterion</type>
+ <type>ATCurrentAuthorCriterion</type>
+ <type>ATDateCriteria</type>
+ <type>ATDateRangeCriterion</type>
+ <type>ATListCriterion</type>
+ <type>ATPathCriterion</type>
+ <type>ATPortalTypeCriterion</type>
+ <type>ATReferenceCriterion</type>
+ <type>ATSelectionCriterion</type>
+ <type>ATSimpleIntCriterion</type>
+ <type>ATSimpleStringCriterion</type>
+ <type>ATSortCriterion</type>
+ <type>CMF Document</type>
+ <type>CMF Event</type>
+ <type>CMF Favorite</type>
+ <type>CMF File</type>
+ <type>CMF Folder</type>
+ <type>CMF Image</type>
+ <type>CMF Large Plone Folder</type>
+ <type>CMF Link</type>
+ <type>CMF News Item</type>
+ <type>CMF Topic</type>
+ <type>Discussion Item</type>
+ <type>Favorite</type>
<type>File</type>
- <type>News Item</type>
- <type>Event</type>
+ <type>Folder</type>
+ <type>Image</type>
+ <type>Large Plone Folder</type>
+ <type>Link</type>
+ <type>Plone Site</type>
+ <type>TempFolder</type>
+ <type>Topic</type>
+ </resource>
+ <resource id="linkable" mode="blacklist">
+ <type>ATBooleanCriterion</type>
+ <type>ATCurrentAuthorCriterion</type>
+ <type>ATDateCriteria</type>
+ <type>ATDateRangeCriterion</type>
+ <type>ATListCriterion</type>
+ <type>ATPathCriterion</type>
+ <type>ATPortalTypeCriterion</type>
+ <type>ATReferenceCriterion</type>
+ <type>ATSelectionCriterion</type>
+ <type>ATSimpleIntCriterion</type>
+ <type>ATSimpleStringCriterion</type>
+ <type>ATSortCriterion</type>
+ <type>CMF Document</type>
+ <type>CMF Event</type>
+ <type>CMF Favorite</type>
+ <type>CMF File</type>
+ <type>CMF Image</type>
+ <type>CMF Link</type>
+ <type>CMF News Item</type>
+ <type>Discussion Item</type>
+ <type>Favorite</type>
+ <type>Folder</type>
+ <type>Link</type>
+ <type>Plone Site</type>
+ <type>TempFolder</type>
</resource>
<resource mode="whitelist" id="mediaobject">
<type>Image</type>
</resource>
+ <defaultresource>linkable</defaultresource>
<generatepreviews />
<toolbar>
<element visible="True" id="bg-basicmarkup"/>
Modified: kupu/trunk/kupu/plone/resource_types.pt
==============================================================================
--- kupu/trunk/kupu/plone/resource_types.pt (original)
+++ kupu/trunk/kupu/plone/resource_types.pt Tue Dec 12 12:43:52 2006
@@ -40,7 +40,7 @@
<tal:loop tal:repeat="resource here/zmi_get_resourcetypes">
<tbody
- tal:define="oddrow repeat/resource/odd;"
+ tal:define="oddrow repeat/resource/odd;name resource/name; types resource/types;"
tal:attributes="class python:test(oddrow, 'even', 'odd');"
align="left"
style="margin-top: 1em !important;"
@@ -51,15 +51,15 @@
<tr>
<td>
<input type="hidden" name="type_info.old_type:records"
- tal:attributes="value resource/name" />
+ tal:attributes="value name" />
<input type="checkbox" name="resource_types:list"
- tal:condition="resource/name"
- tal:attributes="value resource/name" />
+ tal:condition="name"
+ tal:attributes="value name" />
</td>
<th>Resource</th>
<td>
<input type="text" name="type_info.resource_type:records"
- tal:attributes="value resource/name" />
+ tal:attributes="value name" />
</td>
</tr>
<tr>
@@ -67,11 +67,11 @@
<th>Portal Types</th>
<td>
<select name="type_info.portal_types:list:records" size="5" multiple
- tal:attributes="size python:max(5,len(resource.types));">
+ tal:attributes="size python:max(5,len(types));">
<tal:block repeat="ti typeinfos">
<option tal:define="title python:path('string:${ti/Title}' + test(ti.Title()==ti.getId(),'',' (${ti/getId})'));
id ti/getId;
- selected python:id in resource.types;"
+ selected python:id in types;"
tal:content="title"
tal:condition="selected"
tal:attributes="value ti/getId;" selected></option>
@@ -80,7 +80,7 @@
<tal:block repeat="ti typeinfos">
<option tal:define="title python:path('string:${ti/Title}' + test(ti.Title()==ti.getId(),'',' (${ti/getId})'));
id ti/getId;
- selected python:id in resource.types;"
+ selected python:id in types;"
tal:content="title"
tal:condition="not:selected"
tal:attributes="value ti/getId;"></option>
@@ -89,6 +89,14 @@
</select>
</td>
</tr>
+ <tr><td></td><th>New types</th>
+ <td>
+ <select name="type_info.newtypes:int:records" size="1"
+ tal:define="newtype python:context.getNewTypeHandler(name)">
+ <option value="0" tal:attributes="selected python:test(newtype==0,True,None)">are not added to selection</option>
+ <option value="1" tal:attributes="selected python:test(newtype==1,True,None)">are added to selection</option>
+ </select>
+ </td>
<tr><td colspan="3"> </td></tr>
</tbody>
</tal:loop>
Modified: kupu/trunk/kupu/plone/xml/kupuExport.xml
==============================================================================
--- kupu/trunk/kupu/plone/xml/kupuExport.xml (original)
+++ kupu/trunk/kupu/plone/xml/kupuExport.xml Tue Dec 12 12:43:52 2006
@@ -21,11 +21,12 @@
tal:attributes="id lib/id; title lib/title; uri lib/uri;
src lib/src;icon lib/icon">
</library>
- <default tal:content="info/zmi_get_default_library" />
- <resource tal:repeat="res info/get_resourcetypes"
- tal:attributes="id res/name" mode="whitelist">
+ <defaultlibrary tal:content="info/zmi_get_default_library" />
+ <resource tal:repeat="res info/export_resource_types"
+ tal:attributes="id res/name;mode res/mode">
<type tal:repeat="t res/types" tal:content="t"/>
</resource>
+ <defaultresource tal:content="info/getDefaultResource" />
<preview tal:repeat="t context/getPreviews"
tal:attributes="portaltype t/portal_type;
preview t/previewaction; normal t/normalaction; scalefield t/scalefield" />
More information about the kupu-checkins
mailing list