r13756 - in MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk: . Products/MasterSelectWidget docs

"Thomas Desvenain" <[email protected]> Thu, 18 Aug 2011 22:17:38 +0000
Newsgroups gmane.comp.web.zope.plone.archetypes.cvs
Message-ID <[email protected]>
Author: thomasdesvenain
Date: Thu Aug 18 22:17:36 2011
New Revision: 13756

Modified:
   MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/Products/MasterSelectWidget/browser.py
   MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/README.txt
   MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/docs/HISTORY.txt
Log:
When used with archetypes.schemaextender, the vocabulary method can be
defined on schema extension class.

Modified: MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/Products/MasterSelectWidget/browser.py
==============================================================================
--- MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/Products/MasterSelectWidget/browser.py	(original)
+++ MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/Products/MasterSelectWidget/browser.py	Thu Aug 18 22:17:36 2011
@@ -1,9 +1,17 @@
 # -*- coding: utf-8 -*-
 import simplejson as json
 from zope.i18n import translate
+from zope.component import getAdapters
 from Products.Archetypes import DisplayList
 from Products.Five import BrowserView
 
+try:
+    from archetypes.schemaextender.interfaces import ISchemaExtender
+    HAS_SCHEMAEXTENDER = True
+except:
+    HAS_SCHEMAEXTENDER = False
+
+
 SELECT = "$('#archetypes-fieldname-%(master)s')"
 
 BINDERS = dict(
@@ -26,11 +34,11 @@
 
 class SetupSlaves(BrowserView):
     """Generate Javascript to bind masters to slaves"""
-    
+
     def getSlaves(self, field):
         for slave in getattr(field.widget, 'slave_fields', ()):
             yield slave.copy()
-        
+
     def renderJS(self, field):
         master = field.getName()
         for slave in self.getSlaves(field):
@@ -49,58 +57,74 @@
                     values = [str(v) for v in values]
                 hidden = json.dumps(values)
             slave['hidden'] = hidden
-            
+
             template = BINDERS.get(slave.get('action')) or BINDERS['toggle']
             yield template % slave
-    
+
     def __call__(self, field):
-        """render javascript"""            
+        """render javascript"""
         return JQUERY_ONLOAD % '\n'.join(self.renderJS(field))
 
 class MasterSelectJSONValue(BrowserView):
     """JSON vocabulary or value for the given slave field"""
-    
+
     def getSlaves(self, fieldname):
-        return getattr(self.context.Schema()[fieldname].widget, 
+        return getattr(self.context.Schema()[fieldname].widget,
             'slave_fields', ())
-    
+
     def getVocabulary(self, slave, value):
         kw = { slave['control_param']: value }
-        result = getattr(self.context, slave['vocab_method'])(**kw)
+        vocab_method = slave['vocab_method']
+        method = getattr(self.context, vocab_method, None)
+        if not method and HAS_SCHEMAEXTENDER:
+            extenders = [adapter for name, adapter
+                               in getAdapters((self.context,), ISchemaExtender)]
+            for extender in extenders:
+                method = getattr(extender, vocab_method, None)
+                if method:
+                    break
+
+        result = method(**kw)
         return result
-    
+
     def __call__(self):
         self.request.response.setHeader(
             'Content-Type', 'application/json; charset=utf-8')
-        
+
         field = self.request['field']
         slaveid = self.request['slave']
         value = self.request['value']
-        
+
+        schema = self.context.Schema()
         for slave in self.getSlaves(field):
             if slave['name'] != slaveid:
                 continue
-            
+
             action = slave.get('action')
             if action not in ['vocabulary', 'value']:
                 raise ValueError('Invalid master-slave action')
-            
+
             result = self.getVocabulary(slave, value)
-            
+
             if action == 'value':
                 return json.dumps(translate(result, self.request))
-            
+
             if isinstance(result, (tuple, list)):
                 result = DisplayList(zip(result, result))
-            actualValue = self.context.Schema()[slave.get('name')].get(self.context)
-            if  not isinstance(actualValue,list):
+
+            slave_name = slave.get('name')
+            field = schema[slave_name]
+
+            actualValue = field.getAccessor(self.context)()
+            if not isinstance(actualValue,list):
                 actualValue = [actualValue,]
+
             return json.dumps([
                 dict(
                     value=item,
                     label=translate(result.getValue(item), self.request),
                     selected=(item in actualValue) and 'selected' or '',
                 ) for item in result
-            ])       
+            ])
 
         raise ValueError('No such master-slave combo')

Modified: MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/README.txt
==============================================================================
--- MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/README.txt	(original)
+++ MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/README.txt	Thu Aug 18 22:17:36 2011
@@ -84,6 +84,8 @@
   name of this parameter defaults to 'master_value', but any name may be
   used as long as it is specified using the control_param element. Used
   only with 'action':'vocabulary' or 'action':'value'.
+  When used with archetypes.schemaextender, the vocabulary method can be
+  defined on schema extension class.
 
 control_param
   As described above, this is the name of the paramter used when

Modified: MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/docs/HISTORY.txt
==============================================================================
--- MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/docs/HISTORY.txt	(original)
+++ MoreFieldsAndWidgets/Products.MasterSelectWidget/trunk/docs/HISTORY.txt	Thu Aug 18 22:17:36 2011
@@ -1,6 +1,9 @@
 Changelog
 =========
 
+* Vocabulary ajax methods can be defined on archetypes.schemaextender extension class.
+  [thomasdesvenain]
+
 0.4.4 - 2010-04-16
 ------------------
 

------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2