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