[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">&nbsp;</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