[Testbot] Plone 4.3 - Python 2.6 - Build # 2501 - Fixed! - 0 failure(s)

jenkins at plone.org jenkins at plone.org
Fri Oct 24 08:30:57 UTC 2014


-------------------------------------------------------------------------------
Plone 4.3 - Python 2.6 - Build # 2501 - Fixed!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-4.3-python-2.6/2501/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-03-23T20:23:51-07:00
Author: David Glick (davisagli) <david at glicksoftware.com>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/9c94e6b493a5a6f825e78969a64ac1008d625d5f

Merge pull request #15 from gyst/diazofix

work around bizarro Diazo encoding bug

Files changed:
M plone/formwidget/contenttree/widget.py

diff --git a/plone/formwidget/contenttree/widget.py b/plone/formwidget/contenttree/widget.py
index 00b6694..79ba05b 100644
--- a/plone/formwidget/contenttree/widget.py
+++ b/plone/formwidget/contenttree/widget.py
@@ -176,7 +176,7 @@ def js_extra(self):
         return """\
 
                 $('#%(id)s-widgets-query').each(function() {
-                    if($(this).siblings('input.searchButton').length > 0) { return; }
+                    if($(this).siblings('input.searchButton').length != 0) { return; }
                     $(document.createElement('input'))
                         .attr({
                             'type': 'button',


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-03-26T11:04:05+01:00
Author: Guido Stevens (gyst) <guido.stevens at cosent.net>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/c7bf6ba828dd639109a2003f555aeae0a5b81dde

Update HISTORY.txt

Files changed:
M docs/HISTORY.txt

diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt
index ba3366a..e6fdbf8 100644
--- a/docs/HISTORY.txt
+++ b/docs/HISTORY.txt
@@ -4,6 +4,9 @@ Changelog
 1.0.8 (unreleased)
 ------------------
 
+* Work around bizarro Diazo encoding bug
+  [gyst]
+
 1.0.7 (2013-06-30)
 ------------------
 


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-08-26T00:17:55+02:00
Author: Gil Forcada (gforcada) <gforcada at gnome.org>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/f6b9a6d6657f001b3299b6b4f8d048604163c90c

Whitespaces cleanup

Files changed:
M plone/formwidget/contenttree/TODO.txt

diff --git a/plone/formwidget/contenttree/TODO.txt b/plone/formwidget/contenttree/TODO.txt
index 901bab8..d884495 100644
--- a/plone/formwidget/contenttree/TODO.txt
+++ b/plone/formwidget/contenttree/TODO.txt
@@ -18,9 +18,9 @@ Tags: [x] Plone
       [x] Zope
       [x] Python
      [Search...       ]
-      | autocomplete | 
-      | autocomplete | 
-      | autocomplete | 
+      | autocomplete |
+      | autocomplete |
+      | autocomplete |
       |______________|
 
 
@@ -30,9 +30,9 @@ Tags: [x] Document 1
       [x] Document 2
       [x] Image 1
      [Search...       ] [Browse...]
-      | autocomplete | 
-      | autocomplete | 
-      | autocomplete | 
+      | autocomplete |
+      | autocomplete |
+      | autocomplete |
       |______________|
 
 Clicking [Browse...] gives you a lightbox-style (ie. not a real window)
@@ -57,7 +57,7 @@ Other notes:
  - Multiselect is still hard, but for now: if multiselect is supported, the
    buttons are: [Add] and [Close], if it's single-select, they are [Add] and
    [Cancel].
-   
- - Adding an item in the multiselect case shows a "Item X added" status 
+
+ - Adding an item in the multiselect case shows a "Item X added" status
    message, but doesn't close the window. Adding in the single-select case
    closes the window.
\ No newline at end of file


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-10-20T18:57:01+02:00
Author: Robert Niederreiter (rnixx) <office at squarewave.at>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/3467922b0dde3f362ddd19f9e6eb8ea4aa96c26f

housekeeping

Files changed:
M plone/formwidget/contenttree/jquery-contenttree/contenttree.js
M plone/formwidget/contenttree/widget.py

diff --git a/plone/formwidget/contenttree/jquery-contenttree/contenttree.js b/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
index 891187b..57fa2e3 100755
--- a/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
+++ b/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
@@ -3,8 +3,11 @@ if(jQuery) (function($){
 
     $.extend($.fn, {
         showDialog: function() {
-            $(document.body).append($(document.createElement("div")).addClass("contenttreeWindowBlocker"))
-            this[0].oldparent = $(this).parent()[0]; // store old parent element
+            $(document.body)
+                .append($(document.createElement("div"))
+                .addClass("contenttreeWindowBlocker"));
+            // store old parent element
+            this[0].oldparent = $(this).parent()[0];
             $(".contenttreeWindowBlocker").before(this);
             $(this).show();
             $(this).width($(window).width() * 0.75);
@@ -14,16 +17,22 @@ if(jQuery) (function($){
                 'top': $(window).height() * 0.125
             });
         },
+
         contentTreeAdd: function() {
             var contenttree_window = (this).parents(".contenttreeWindow");
-            var input_box = $('#'+ contenttree_window[0].id.replace(/-contenttree-window$/,"-widgets-query"));
+            var input_box = $('#'+ contenttree_window[0].id
+                .replace(/-contenttree-window$/,"-widgets-query"));
             contenttree_window.find('.navTreeCurrentItem > a').each(function () {
-                formwidget_autocomplete_new_value(input_box,$(this).attr('href'),$.trim($(this).text()));
+                formwidget_autocomplete_new_value(
+                    input_box,
+                    $(this).attr('href'),
+                    $.trim($(this).text())
+                );
             });
-
             $(this).contentTreeCancel();
             input_box.parents('.datagridwidget-cell').triggerHandler('change');
         },
+
         contentTreeCancel: function() {
             $(".contenttreeWindowBlocker").remove();
             var popup = $(this).parents(".contenttreeWindow");
@@ -31,46 +40,75 @@ if(jQuery) (function($){
             $(popup[0].oldparent).append(popup);
             popup[0].oldparent = null;
         },
-        contentTree: function(o, h) {
 
+        contentTree: function(o, h) {
             // Defaults
-            if(!o) var o = {};
-            if(o.script == undefined) o.script = 'fetch';
+            if (!o) {
+                var o = {};
+            }
+            if (o.script == undefined) {
+                o.script = 'fetch';
+            }
 
-            if(o.folderEvent == undefined) o.folderEvent = 'click';
-            if(o.selectEvent == undefined) o.selectEvent = 'click';
+            if (o.folderEvent == undefined) {
+                o.folderEvent = 'click';
+            }
+            if (o.selectEvent == undefined) {
+                o.selectEvent = 'click';
+            }
 
-            if(o.expandSpeed == undefined) o.expandSpeed = -1;
-            if(o.collapseSpeed == undefined) o.collapseSpeed = -1;
+            if (o.expandSpeed == undefined) {
+                o.expandSpeed = -1;
+            }
+            if (o.collapseSpeed == undefined) {
+                o.collapseSpeed = -1;
+            }
 
-            if(o.multiFolder == undefined) o.multiFolder = true;
-            if(o.multiSelect == undefined) o.multiSelect = false;
+            if (o.multiFolder == undefined) {
+                o.multiFolder = true;
+            }
+            if (o.multiSelect == undefined) {
+                o.multiSelect = false;
+            }
 
             function loadTree(c, t, r) {
                 $(c).addClass('wait');
-                $.post(o.script, { href: t, rel: r}, function(data) {
+                $.post(o.script, {href: t, rel: r}, function(data) {
                     $(c).removeClass('wait').append(data);
-                    $(c).find('ul:hidden').slideDown({ duration: o.expandSpeed });
+                    $(c).find('ul:hidden').slideDown({
+                        duration: o.expandSpeed
+                    });
                     bindTree(c);
                 });
             }
 
             function handleFolderEvent() {
                 var li = $(this).parent();
-                if(li.hasClass('collapsed')) {
-                    if(!o.multiFolder) {
-                        li.parent().find('ul:visible').slideUp({ duration: o.collapseSpeed });
-                        li.parent().find('li.navTreeFolderish').removeClass('expanded').addClass('collapsed');
+                if (li.hasClass('collapsed')) {
+                    if (!o.multiFolder) {
+                        li.parent().find('ul:visible').slideUp({
+                            duration: o.collapseSpeed
+                        });
+                        li.parent().find('li.navTreeFolderish')
+                            .removeClass('expanded')
+                            .addClass('collapsed');
                     }
 
-                    if(li.find('ul').length == 0)
-                        loadTree(li, escape($(this).attr('href')), escape($(this).attr('rel')));
+                    if (li.find('ul').length == 0)
+                        loadTree(
+                            li,
+                            escape($(this).attr('href')),
+                            escape($(this).attr('rel'))
+                        );
                     else
-                        li.find('ul:hidden').slideDown({ duration: o.expandSpeed });
-
+                        li.find('ul:hidden').slideDown({
+                            duration: o.expandSpeed
+                        });
                     li.removeClass('collapsed').addClass('expanded');
                 } else {
-                    li.find('ul').slideUp({ duration: o.collapseSpeed });
+                    li.find('ul').slideUp({
+                        duration: o.collapseSpeed
+                    });
                     li.removeClass('expanded').addClass('collapsed');
                 }
                 return false;
@@ -80,11 +118,15 @@ if(jQuery) (function($){
                 var li = $(this).parent();
                 var selected = true;
                 var root = $(this).parents('ul.navTree');
-                if(!li.hasClass('navTreeCurrentItem')) {
-                    var multi_key = ((event.ctrlKey) || (navigator.userAgent.toLowerCase().indexOf('macintosh') != -1 && event.metaKey));
-
-                    if(!o.multiSelect || !multi_key) {
-                        root.find('li.navTreeCurrentItem').removeClass('navTreeCurrentItem');
+                if (!li.hasClass('navTreeCurrentItem')) {
+                    var multi_key = (
+                        (event.ctrlKey) ||
+                        (navigator.userAgent.toLowerCase()
+                            .indexOf('macintosh') != -1 && event.metaKey));
+
+                    if (!o.multiSelect || !multi_key) {
+                        root.find('li.navTreeCurrentItem')
+                            .removeClass('navTreeCurrentItem');
                     }
 
                     li.addClass('navTreeCurrentItem');
@@ -100,15 +142,23 @@ if(jQuery) (function($){
             function bindTree(t) {
                 $(t).find('li.navTreeFolderish a').unbind(o.folderEvent);
                 $(t).find('li.selectable a').unbind(o.selectEvent);
-                $(t).find('li a').bind('click', function() { return false; });
-                $(t).find('li.navTreeFolderish a').bind(o.folderEvent, handleFolderEvent);
-                $(t).find('li.selectable a').bind(o.selectEvent, handleSelectEvent);
+                $(t).find('li a').bind('click', function() {
+                    return false;
+                });
+                $(t).find('li.navTreeFolderish a').bind(
+                    o.folderEvent,
+                    handleFolderEvent
+                );
+                $(t).find('li.selectable a').bind(
+                    o.selectEvent,
+                    handleSelectEvent
+                );
             }
 
             if ($(this).children('ul.navTree').length <= 0) {
-              $(this).each(function() {
-                  loadTree(this, o.rootUrl, 0);
-              });
+                $(this).each(function() {
+                    loadTree(this, o.rootUrl, 0);
+                });
             }
 
         }
diff --git a/plone/formwidget/contenttree/widget.py b/plone/formwidget/contenttree/widget.py
index 79ba05b..25a34c2 100644
--- a/plone/formwidget/contenttree/widget.py
+++ b/plone/formwidget/contenttree/widget.py
@@ -3,8 +3,11 @@
 from Acquisition.interfaces import IAcquirer
 
 from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
-from zope.interface import implementsOnly, implementer
+from zope.interface import implementsOnly
+from zope.interface import implementer
 from zope.component import getMultiAdapter
+from zope.pagetemplate.interfaces import IPageTemplate
+from zope.schema.vocabulary import SimpleTerm
 from zope.i18n import translate
 
 import z3c.form.interfaces
@@ -110,6 +113,52 @@ def __call__(self):
         return self.fragment_template(children=children, level=int(level))
 
 
+ADDITIONAL_JS = """\
+$('#%(id)s-widgets-query').each(function() {
+    if ($(this).siblings('input.searchButton').length != 0) {
+        return;
+    }
+    var input = document.createElement('input');
+    $(input)
+        .attr({
+            'type': 'button',
+            'value': '%(button_val)s'
+        })
+        .addClass('searchButton')
+        .click(function () {
+            var parent = $(this).parents("*[id$='-autocomplete']");
+            var window = parent.siblings("*[id$='-contenttree-window']");
+            window.showDialog('%(url)s', %(expandSpeed)d);
+            $('#' + parent.attr('id').replace(
+                    'autocomplete', 'contenttree')).contentTree({
+                script: '%(url)s',
+                folderEvent: '%(folderEvent)s',
+                selectEvent: '%(selectEvent)s',
+                expandSpeed: %(expandSpeed)d,
+                collapseSpeed: %(collapseSpeed)s,
+                multiFolder: %(multiFolder)s,
+                multiSelect: %(multiSelect)s,
+                rootUrl: '%(rootUrl)s'
+            },
+            function(event, selected, data, title) {
+            });
+        })
+        .insertAfter($(this));
+});
+$('#%(id)s-contenttree-window').find('.contentTreeAdd')
+                               .unbind('click')
+                               .click(function () {
+    $(this).contentTreeAdd();
+});
+$('#%(id)s-contenttree-window').find('.contentTreeCancel')
+                               .unbind('click')
+                               .click(function () {
+    $(this).contentTreeCancel();
+});
+$('#%(id)s-widgets-query').after(" ");
+"""
+
+
 class ContentTreeBase(Explicit):
     implementsOnly(IContentTreeWidget)
 
@@ -172,67 +221,29 @@ def js_extra(self):
         source = self.bound_source
         form_url = self.request.getURL()
         url = "%s/++widget++%s/@@contenttree-fetch" % (form_url, self.name)
-
-        return """\
-
-                $('#%(id)s-widgets-query').each(function() {
-                    if($(this).siblings('input.searchButton').length != 0) { return; }
-                    $(document.createElement('input'))
-                        .attr({
-                            'type': 'button',
-                            'value': '%(button_val)s'
-                        })
-                        .addClass('searchButton')
-                        .click( function () {
-                            var parent = $(this).parents("*[id$='-autocomplete']")
-                            var window = parent.siblings("*[id$='-contenttree-window']")
-                            window.showDialog('%(url)s', %(expandSpeed)d);
-                            $('#' + parent.attr('id').replace('autocomplete', 'contenttree')).contentTree(
-                    {
-                        script: '%(url)s',
-                        folderEvent: '%(folderEvent)s',
-                        selectEvent: '%(selectEvent)s',
-                        expandSpeed: %(expandSpeed)d,
-                        collapseSpeed: %(collapseSpeed)s,
-                        multiFolder: %(multiFolder)s,
-                        multiSelect: %(multiSelect)s,
-                        rootUrl: '%(rootUrl)s'
-                    },
-                    function(event, selected, data, title) {
-                        // alert(event + ', ' + selected + ', ' + data + ', ' + title);
-                    }
-                );
-                        }).insertAfter($(this));
-                });
-                $('#%(id)s-contenttree-window').find('.contentTreeAdd').unbind('click').click(function () {
-                    $(this).contentTreeAdd();
-                });
-                $('#%(id)s-contenttree-window').find('.contentTreeCancel').unbind('click').click(function () {
-                    $(this).contentTreeCancel();
-                });
-                $('#%(id)s-widgets-query').after(" ");
-
-        """ % dict(url=url,
-                   id=self.name.replace('.', '-'),
-                   folderEvent=self.folderEvent,
-                   selectEvent=self.selectEvent,
-                   expandSpeed=self.expandSpeed,
-                   collapseSpeed=self.collapseSpeed,
-                   multiFolder=str(self.multiFolder).lower(),
-                   multiSelect=str(self.multi_select).lower(),
-                   rootUrl=source.navigation_tree_query['path']['query'],
-                   name=self.name,
-                   klass=self.klass,
-                   title=self.title,
-                   button_val=translate(
-                       _(u'label_contenttree_browse', default=u'browse...'),
-                       context=self.request))
+        return ADDITIONAL_JS % dict(
+            url=url,
+            id=self.name.replace('.', '-'),
+            folderEvent=self.folderEvent,
+            selectEvent=self.selectEvent,
+            expandSpeed=self.expandSpeed,
+            collapseSpeed=self.collapseSpeed,
+            multiFolder=str(self.multiFolder).lower(),
+            multiSelect=str(self.multi_select).lower(),
+            rootUrl=source.navigation_tree_query['path']['query'],
+            name=self.name,
+            klass=self.klass,
+            title=self.title,
+            button_val=translate(
+                _(u'label_contenttree_browse', default=u'browse...'),
+                context=self.request
+            ),
+        )
 
 
 class ContentTreeWidget(ContentTreeBase, AutocompleteSelectionWidget):
     """ContentTree widget that allows single selection.
     """
-
     klass = u"contenttree-widget"
     display_template = ViewPageTemplateFile('display_single.pt')
 
@@ -240,7 +251,6 @@ class ContentTreeWidget(ContentTreeBase, AutocompleteSelectionWidget):
 class MultiContentTreeWidget(ContentTreeBase, AutocompleteMultiSelectionWidget):
     """ContentTree widget that allows multiple selection
     """
-
     klass = u"contenttree-widget"
     multi_select = True
     display_template = ViewPageTemplateFile('display_multiple.pt')


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-10-20T18:58:34+02:00
Author: Robert Niederreiter (rnixx) <office at squarewave.at>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/bf0f6cba57ec4424d348d989da37da69f4398e9e

Implement ``renderForValue`` on ``ContentTreeBase`` in order to make single valued relation fields work.

Files changed:
M docs/HISTORY.txt
M plone/formwidget/contenttree/widget.py

diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt
index e6fdbf8..394ddc5 100644
--- a/docs/HISTORY.txt
+++ b/docs/HISTORY.txt
@@ -4,6 +4,10 @@ Changelog
 1.0.8 (unreleased)
 ------------------
 
+* Implement ``renderForValue`` on ``ContentTreeBase`` in order to make
+  single valued relation fields work.
+  [rnixx]
+
 * Work around bizarro Diazo encoding bug
   [gyst]
 
diff --git a/plone/formwidget/contenttree/widget.py b/plone/formwidget/contenttree/widget.py
index 25a34c2..be2ea62 100644
--- a/plone/formwidget/contenttree/widget.py
+++ b/plone/formwidget/contenttree/widget.py
@@ -216,6 +216,24 @@ def render(self):
         else:
             return self.input_template(self)
 
+    def renderForValue(self, value):
+        try:
+            return super(ContentTreeBase, self).renderForValue(value)
+        except LookupError, e:
+            if value != z3c.form.widget.SequenceWidget.noValueToken:
+                raise e
+        item = {
+            'id': '%s-0' % self.id,
+            'name': self.name,
+            'value': '',
+            'checked': 'checked',
+        }
+        template = getMultiAdapter(
+            (self.context, self.request, self.form, self.field, self),
+            IPageTemplate, name=self.mode + '_single'
+        )
+        return template(self, item)
+
     def js_extra(self):
         # Get bound source to extract path
         source = self.bound_source


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-10-22T09:31:04+02:00
Author: Robert Niederreiter (rnixx) <office at squarewave.at>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/b4f6081701deb4cdfb82bba4667e6f672a6afb1c

resolve

Files changed:
M docs/HISTORY.txt
M setup.py

diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt
index 394ddc5..49deaae 100644
--- a/docs/HISTORY.txt
+++ b/docs/HISTORY.txt
@@ -1,13 +1,16 @@
 Changelog
 =========
 
-1.0.8 (unreleased)
+1.0.9 (unreleased)
 ------------------
 
 * Implement ``renderForValue`` on ``ContentTreeBase`` in order to make
   single valued relation fields work.
   [rnixx]
 
+1.0.8 (2014-10-21)
+------------------
+
 * Work around bizarro Diazo encoding bug
   [gyst]
 
diff --git a/setup.py b/setup.py
index 982e0bb..59f6159 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 import os
 
-version = '1.0.8.dev0'
+version = '1.0.9.dev0'
 
 setup(name='plone.formwidget.contenttree',
       version=version,


Repository: plone.formwidget.contenttree
Branch: refs/heads/master
Date: 2014-10-24T09:20:04+02:00
Author: Philip Bauer (pbauer) <bauer at starzel.de>
Commit: https://github.com/plone/plone.formwidget.contenttree/commit/8da81da2429b4251c6c1ee86ad36196f6a560dec

Merge pull request #17 from plone/rnixx_single_valued_relation_field

Rnixx single valued relation field

Files changed:
M docs/HISTORY.txt
M plone/formwidget/contenttree/jquery-contenttree/contenttree.js
M plone/formwidget/contenttree/widget.py

diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt
index 2fce632..49deaae 100644
--- a/docs/HISTORY.txt
+++ b/docs/HISTORY.txt
@@ -4,8 +4,9 @@ Changelog
 1.0.9 (unreleased)
 ------------------
 
-- Nothing changed yet.
-
+* Implement ``renderForValue`` on ``ContentTreeBase`` in order to make
+  single valued relation fields work.
+  [rnixx]
 
 1.0.8 (2014-10-21)
 ------------------
diff --git a/plone/formwidget/contenttree/jquery-contenttree/contenttree.js b/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
index 891187b..57fa2e3 100755
--- a/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
+++ b/plone/formwidget/contenttree/jquery-contenttree/contenttree.js
@@ -3,8 +3,11 @@ if(jQuery) (function($){
 
     $.extend($.fn, {
         showDialog: function() {
-            $(document.body).append($(document.createElement("div")).addClass("contenttreeWindowBlocker"))
-            this[0].oldparent = $(this).parent()[0]; // store old parent element
+            $(document.body)
+                .append($(document.createElement("div"))
+                .addClass("contenttreeWindowBlocker"));
+            // store old parent element
+            this[0].oldparent = $(this).parent()[0];
             $(".contenttreeWindowBlocker").before(this);
             $(this).show();
             $(this).width($(window).width() * 0.75);
@@ -14,16 +17,22 @@ if(jQuery) (function($){
                 'top': $(window).height() * 0.125
             });
         },
+
         contentTreeAdd: function() {
             var contenttree_window = (this).parents(".contenttreeWindow");
-            var input_box = $('#'+ contenttree_window[0].id.replace(/-contenttree-window$/,"-widgets-query"));
+            var input_box = $('#'+ contenttree_window[0].id
+                .replace(/-contenttree-window$/,"-widgets-query"));
             contenttree_window.find('.navTreeCurrentItem > a').each(function () {
-                formwidget_autocomplete_new_value(input_box,$(this).attr('href'),$.trim($(this).text()));
+                formwidget_autocomplete_new_value(
+                    input_box,
+                    $(this).attr('href'),
+                    $.trim($(this).text())
+                );
             });
-
             $(this).contentTreeCancel();
             input_box.parents('.datagridwidget-cell').triggerHandler('change');
         },
+
         contentTreeCancel: function() {
             $(".contenttreeWindowBlocker").remove();
             var popup = $(this).parents(".contenttreeWindow");
@@ -31,46 +40,75 @@ if(jQuery) (function($){
             $(popup[0].oldparent).append(popup);
             popup[0].oldparent = null;
         },
-        contentTree: function(o, h) {
 
+        contentTree: function(o, h) {
             // Defaults
-            if(!o) var o = {};
-            if(o.script == undefined) o.script = 'fetch';
+            if (!o) {
+                var o = {};
+            }
+            if (o.script == undefined) {
+                o.script = 'fetch';
+            }
 
-            if(o.folderEvent == undefined) o.folderEvent = 'click';
-            if(o.selectEvent == undefined) o.selectEvent = 'click';
+            if (o.folderEvent == undefined) {
+                o.folderEvent = 'click';
+            }
+            if (o.selectEvent == undefined) {
+                o.selectEvent = 'click';
+            }
 
-            if(o.expandSpeed == undefined) o.expandSpeed = -1;
-            if(o.collapseSpeed == undefined) o.collapseSpeed = -1;
+            if (o.expandSpeed == undefined) {
+                o.expandSpeed = -1;
+            }
+            if (o.collapseSpeed == undefined) {
+                o.collapseSpeed = -1;
+            }
 
-            if(o.multiFolder == undefined) o.multiFolder = true;
-            if(o.multiSelect == undefined) o.multiSelect = false;
+            if (o.multiFolder == undefined) {
+                o.multiFolder = true;
+            }
+            if (o.multiSelect == undefined) {
+                o.multiSelect = false;
+            }
 
             function loadTree(c, t, r) {
                 $(c).addClass('wait');
-                $.post(o.script, { href: t, rel: r}, function(data) {
+                $.post(o.script, {href: t, rel: r}, function(data) {
                     $(c).removeClass('wait').append(data);
-                    $(c).find('ul:hidden').slideDown({ duration: o.expandSpeed });
+                    $(c).find('ul:hidden').slideDown({
+                        duration: o.expandSpeed
+                    });
                     bindTree(c);
                 });
             }
 
             function handleFolderEvent() {
                 var li = $(this).parent();
-                if(li.hasClass('collapsed')) {
-                    if(!o.multiFolder) {
-                        li.parent().find('ul:visible').slideUp({ duration: o.collapseSpeed });
-                        li.parent().find('li.navTreeFolderish').removeClass('expanded').addClass('collapsed');
+                if (li.hasClass('collapsed')) {
+                    if (!o.multiFolder) {
+                        li.parent().find('ul:visible').slideUp({
+                            duration: o.collapseSpeed
+                        });
+                        li.parent().find('li.navTreeFolderish')
+                            .removeClass('expanded')
+                            .addClass('collapsed');
                     }
 
-                    if(li.find('ul').length == 0)
-                        loadTree(li, escape($(this).attr('href')), escape($(this).attr('rel')));
+                    if (li.find('ul').length == 0)
+                        loadTree(
+                            li,
+                            escape($(this).attr('href')),
+                            escape($(this).attr('rel'))
+                        );
                     else
-                        li.find('ul:hidden').slideDown({ duration: o.expandSpeed });
-
+                        li.find('ul:hidden').slideDown({
+                            duration: o.expandSpeed
+                        });
                     li.removeClass('collapsed').addClass('expanded');
                 } else {
-                    li.find('ul').slideUp({ duration: o.collapseSpeed });
+                    li.find('ul').slideUp({
+                        duration: o.collapseSpeed
+                    });
                     li.removeClass('expanded').addClass('collapsed');
                 }
                 return false;
@@ -80,11 +118,15 @@ if(jQuery) (function($){
                 var li = $(this).parent();
                 var selected = true;
                 var root = $(this).parents('ul.navTree');
-                if(!li.hasClass('navTreeCurrentItem')) {
-                    var multi_key = ((event.ctrlKey) || (navigator.userAgent.toLowerCase().indexOf('macintosh') != -1 && event.metaKey));
-
-                    if(!o.multiSelect || !multi_key) {
-                        root.find('li.navTreeCurrentItem').removeClass('navTreeCurrentItem');
+                if (!li.hasClass('navTreeCurrentItem')) {
+                    var multi_key = (
+                        (event.ctrlKey) ||
+                        (navigator.userAgent.toLowerCase()
+                            .indexOf('macintosh') != -1 && event.metaKey));
+
+                    if (!o.multiSelect || !multi_key) {
+                        root.find('li.navTreeCurrentItem')
+                            .removeClass('navTreeCurrentItem');
                     }
 
                     li.addClass('navTreeCurrentItem');
@@ -100,15 +142,23 @@ if(jQuery) (function($){
             function bindTree(t) {
                 $(t).find('li.navTreeFolderish a').unbind(o.folderEvent);
                 $(t).find('li.selectable a').unbind(o.selectEvent);
-                $(t).find('li a').bind('click', function() { return false; });
-                $(t).find('li.navTreeFolderish a').bind(o.folderEvent, handleFolderEvent);
-                $(t).find('li.selectable a').bind(o.selectEvent, handleSelectEvent);
+                $(t).find('li a').bind('click', function() {
+                    return false;
+                });
+                $(t).find('li.navTreeFolderish a').bind(
+                    o.folderEvent,
+                    handleFolderEvent
+                );
+                $(t).find('li.selectable a').bind(
+                    o.selectEvent,
+                    handleSelectEvent
+                );
             }
 
             if ($(this).children('ul.navTree').length <= 0) {
-              $(this).each(function() {
-                  loadTree(this, o.rootUrl, 0);
-              });
+                $(this).each(function() {
+                    loadTree(this, o.rootUrl, 0);
+                });
             }
 
         }
diff --git a/plone/formwidget/contenttree/widget.py b/plone/formwidget/contenttree/widget.py
index 79ba05b..be2ea62 100644
--- a/plone/formwidget/contenttree/widget.py
+++ b/plone/formwidget/contenttree/widget.py
@@ -3,8 +3,11 @@
 from Acquisition.interfaces import IAcquirer
 
 from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
-from zope.interface import implementsOnly, implementer
+from zope.interface import implementsOnly
+from zope.interface import implementer
 from zope.component import getMultiAdapter
+from zope.pagetemplate.interfaces import IPageTemplate
+from zope.schema.vocabulary import SimpleTerm
 from zope.i18n import translate
 
 import z3c.form.interfaces
@@ -110,6 +113,52 @@ def __call__(self):
         return self.fragment_template(children=children, level=int(level))
 
 
+ADDITIONAL_JS = """\
+$('#%(id)s-widgets-query').each(function() {
+    if ($(this).siblings('input.searchButton').length != 0) {
+        return;
+    }
+    var input = document.createElement('input');
+    $(input)
+        .attr({
+            'type': 'button',
+            'value': '%(button_val)s'
+        })
+        .addClass('searchButton')
+        .click(function () {
+            var parent = $(this).parents("*[id$='-autocomplete']");
+            var window = parent.siblings("*[id$='-contenttree-window']");
+            window.showDialog('%(url)s', %(expandSpeed)d);
+            $('#' + parent.attr('id').replace(
+                    'autocomplete', 'contenttree')).contentTree({
+                script: '%(url)s',
+                folderEvent: '%(folderEvent)s',
+                selectEvent: '%(selectEvent)s',
+                expandSpeed: %(expandSpeed)d,
+                collapseSpeed: %(collapseSpeed)s,
+                multiFolder: %(multiFolder)s,
+                multiSelect: %(multiSelect)s,
+                rootUrl: '%(rootUrl)s'
+            },
+            function(event, selected, data, title) {
+            });
+        })
+        .insertAfter($(this));
+});
+$('#%(id)s-contenttree-window').find('.contentTreeAdd')
+                               .unbind('click')
+                               .click(function () {
+    $(this).contentTreeAdd();
+});
+$('#%(id)s-contenttree-window').find('.contentTreeCancel')
+                               .unbind('click')
+                               .click(function () {
+    $(this).contentTreeCancel();
+});
+$('#%(id)s-widgets-query').after(" ");
+"""
+
+
 class ContentTreeBase(Explicit):
     implementsOnly(IContentTreeWidget)
 
@@ -167,72 +216,52 @@ def render(self):
         else:
             return self.input_template(self)
 
+    def renderForValue(self, value):
+        try:
+            return super(ContentTreeBase, self).renderForValue(value)
+        except LookupError, e:
+            if value != z3c.form.widget.SequenceWidget.noValueToken:
+                raise e
+        item = {
+            'id': '%s-0' % self.id,
+            'name': self.name,
+            'value': '',
+            'checked': 'checked',
+        }
+        template = getMultiAdapter(
+            (self.context, self.request, self.form, self.field, self),
+            IPageTemplate, name=self.mode + '_single'
+        )
+        return template(self, item)
+
     def js_extra(self):
         # Get bound source to extract path
         source = self.bound_source
         form_url = self.request.getURL()
         url = "%s/++widget++%s/@@contenttree-fetch" % (form_url, self.name)
-
-        return """\
-
-                $('#%(id)s-widgets-query').each(function() {
-                    if($(this).siblings('input.searchButton').length != 0) { return; }
-                    $(document.createElement('input'))
-                        .attr({
-                            'type': 'button',
-                            'value': '%(button_val)s'
-                        })
-                        .addClass('searchButton')
-                        .click( function () {
-                            var parent = $(this).parents("*[id$='-autocomplete']")
-                            var window = parent.siblings("*[id$='-contenttree-window']")
-                            window.showDialog('%(url)s', %(expandSpeed)d);
-                            $('#' + parent.attr('id').replace('autocomplete', 'contenttree')).contentTree(
-                    {
-                        script: '%(url)s',
-                        folderEvent: '%(folderEvent)s',
-                        selectEvent: '%(selectEvent)s',
-                        expandSpeed: %(expandSpeed)d,
-                        collapseSpeed: %(collapseSpeed)s,
-                        multiFolder: %(multiFolder)s,
-                        multiSelect: %(multiSelect)s,
-                        rootUrl: '%(rootUrl)s'
-                    },
-                    function(event, selected, data, title) {
-                        // alert(event + ', ' + selected + ', ' + data + ', ' + title);
-                    }
-                );
-                        }).insertAfter($(this));
-                });
-                $('#%(id)s-contenttree-window').find('.contentTreeAdd').unbind('click').click(function () {
-                    $(this).contentTreeAdd();
-                });
-                $('#%(id)s-contenttree-window').find('.contentTreeCancel').unbind('click').click(function () {
-                    $(this).contentTreeCancel();
-                });
-                $('#%(id)s-widgets-query').after(" ");
-
-        """ % dict(url=url,
-                   id=self.name.replace('.', '-'),
-                   folderEvent=self.folderEvent,
-                   selectEvent=self.selectEvent,
-                   expandSpeed=self.expandSpeed,
-                   collapseSpeed=self.collapseSpeed,
-                   multiFolder=str(self.multiFolder).lower(),
-                   multiSelect=str(self.multi_select).lower(),
-                   rootUrl=source.navigation_tree_query['path']['query'],
-                   name=self.name,
-                   klass=self.klass,
-                   title=self.title,
-                   button_val=translate(
-                       _(u'label_contenttree_browse', default=u'browse...'),
-                       context=self.request))
+        return ADDITIONAL_JS % dict(
+            url=url,
+            id=self.name.replace('.', '-'),
+            folderEvent=self.folderEvent,
+            selectEvent=self.selectEvent,
+            expandSpeed=self.expandSpeed,
+            collapseSpeed=self.collapseSpeed,
+            multiFolder=str(self.multiFolder).lower(),
+            multiSelect=str(self.multi_select).lower(),
+            rootUrl=source.navigation_tree_query['path']['query'],
+            name=self.name,
+            klass=self.klass,
+            title=self.title,
+            button_val=translate(
+                _(u'label_contenttree_browse', default=u'browse...'),
+                context=self.request
+            ),
+        )
 
 
 class ContentTreeWidget(ContentTreeBase, AutocompleteSelectionWidget):
     """ContentTree widget that allows single selection.
     """
-
     klass = u"contenttree-widget"
     display_template = ViewPageTemplateFile('display_single.pt')
 
@@ -240,7 +269,6 @@ class ContentTreeWidget(ContentTreeBase, AutocompleteSelectionWidget):
 class MultiContentTreeWidget(ContentTreeBase, AutocompleteMultiSelectionWidget):
     """ContentTree widget that allows multiple selection
     """
-
     klass = u"contenttree-widget"
     multi_select = True
     display_template = ViewPageTemplateFile('display_multiple.pt')




-------------------------------------------------------------------------------


More information about the Testbot mailing list