Package: python-toscawidgets Version: 0.9.7.2-1.1 Severity: normal Tags: patch upstream Forwarded: http://toscawidgets.org/trac/tw/ticket/30
Hello, While trying to use AutoComplete from tw.jquery, I had the issue reported there[0]. Applying this "patch" seems to fix the issue. I have attached to this email a patch for the Debian package. Regards, Arnaud Fontaine -- System Information: Debian Release: squeeze/sid APT prefers experimental APT policy: (990, 'experimental'), (500, 'unstable') Architecture: i386 (i686) Kernel: Linux 2.6.31-rc6 Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages python-toscawidgets depends on: ii python-formencode 1.2.2-1 validation and form generation Pyt ii python-simplejson 2.0.9-1 Simple, fast, extensible JSON enco ii python-support 1.0.3 automated rebuilding support for P ii python-webob 0.9.6.1-1.1 Python module providing WSGI reque python-toscawidgets recommends no packages. Versions of packages python-toscawidgets suggests: ii python-cheetah 2.2.1-1 text-based template engine and Pyt ii python-genshi 0.5.1-1 Python XML-based template engine ii python-kid 0.9.6-1 simple Pythonic template language -- no debconf information
diff -urN python-toscawidgets-0.9.7.2.orig/debian/patches/00list python-toscawidgets-0.9.7.2/debian/patches/00list --- python-toscawidgets-0.9.7.2.orig/debian/patches/00list 2009-09-17 17:57:59.000000000 +0100 +++ python-toscawidgets-0.9.7.2/debian/patches/00list 2009-09-17 16:55:33.000000000 +0100 @@ -1 +1,2 @@ force-init_py +fix-js-quote diff -urN python-toscawidgets-0.9.7.2.orig/debian/patches/fix-js-quote python-toscawidgets-0.9.7.2/debian/patches/fix-js-quote --- python-toscawidgets-0.9.7.2.orig/debian/patches/fix-js-quote 1970-01-01 01:00:00.000000000 +0100 +++ python-toscawidgets-0.9.7.2/debian/patches/fix-js-quote 2009-09-17 17:19:39.000000000 +0100 @@ -0,0 +1,173 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## force-init_py.dpatch by srlindermann: +## http://toscawidgets.org/trac/tw/ticket/30 +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: avoid removal of apparently useless __init__.py by pysupport + +...@dpatch@ +--- a/ToscaWidgets-0.9.7.2/tw/core/js.py 2009-04-27 19:31:51.000000000 +0100 ++++ b/ToscaWidgets-0.9.7.2/tw/core/js.py 2009-09-17 16:56:04.000000000 +0100 +@@ -1,7 +1,7 @@ + """ + Python-JS interface to dynamically create JS function calls from your widgets. + +-This moudle doesn't aim to serve as a Python-JS "translator". You should code ++This module doesn't aim to serve as a Python-JS "translator". You should code + your client-side code in JavaScript and make it available in static files which + you include as JSLinks or inline using JSSources. This module is only intended + as a "bridge" or interface between Python and JavaScript so JS function +@@ -11,9 +11,10 @@ + + import logging + from itertools import imap ++import re + import simplejson.encoder + +-__all__ = ["js_callback", "js_function", "js_symbol", "encode"] ++__all__ = ["js_callback", "js_function", "js_symbol"] + + log = logging.getLogger(__name__) + +@@ -31,40 +32,56 @@ + >>> w = Widget("foo") + >>> args = {'onLoad': js_callback(js_function('jQuery')(w).click(js_symbol('onClick')))} + >>> print encode(args) +- {"onLoad": function(){jQuery(\\"foo\\").click(onClick)}} ++ {"onLoad": function(){jQuery("foo").click(onClick)}} + >>> print encode({'args':args}) +- {"args": {"onLoad": function(){jQuery(\\"foo\\").click(onClick)}}} +- +- ++ {"args": {"onLoad": function(){jQuery("foo").click(onClick)}}} + ++ Technical note: simplejson does not support arbitrary js injection, which ++ is needed in this module. We work around this by inserting distinct ++ tokens into the JSON encoding stream that can later be replaced with the ++ objects' js representations. ++ + """ + def __init__(self, *args, **kw): +- self.pass_through = (_js_call, js_callback, js_symbol, js_function) + super(TWEncoder, self).__init__(*args, **kw) + + def default(self, obj): +- if isinstance(obj, self.pass_through): ++ if hasattr(obj, 'get_js_repr'): + return self.mark_for_escape(obj) + elif hasattr(obj, '_id'): + return str(obj.id) + return super(TWEncoder, self).default(obj) + + def encode(self, obj): ++ self.unescape_symbols = {} + encoded = super(TWEncoder, self).encode(obj) +- return self.unescape_marked(encoded) ++ unescaped = self.unescape_marked(encoded) ++ self.unescape_symbols = {} ++ return unescaped + + def mark_for_escape(self, obj): +- return '*#*%s*#*' % obj ++ self.unescape_symbols[id(obj)] = obj ++ return 'TWEncoder_unescape_' + str(id(obj)) + + def unescape_marked(self, encoded): +- return encoded.replace('"*#*','').replace('*#*"', '') +- ++ unescape_pattern = re.compile('"TWEncoder_unescape_([0-9]*)"') ++ def unescape(match): ++ try: ++ obj_id = int(match.group(1)) ++ obj = self.unescape_symbols[obj_id] ++ return obj.get_js_repr() ++ except: ++ # Simply return the match if there is a problem ++ return match.group(0) ++ return unescape_pattern.sub(unescape, encoded) + + class js_symbol(object): + def __init__(self, name): + self._name = name +- def __str__(self): ++ def get_js_repr(self): + return str(self._name) ++ def __str__(self): ++ return self.get_js_repr() + + class js_callback(object): + """A js function that can be passed as a callback to be called +@@ -97,7 +114,7 @@ + >>> on_doc_load = jQuery('#foo').bind('click', my_cb) + >>> call = jQuery(js_callback(on_doc_load)) + >>> print call +- jQuery(function(){jQuery(\\"#foo\\").bind(\\"click\\", function() { alert(this.text)})}) ++ jQuery(function(){jQuery("#foo").bind("click", function() { alert(this.text)})}) + + """ + def __init__(self, cb, *args): +@@ -113,9 +130,12 @@ + def __call__(self, *args): + raise TypeError("A js_callback cannot be called from Python") + +- def __str__(self): ++ def get_js_repr(self): + return self.cb + ++ def __str__(self): ++ return self.get_js_repr() ++ + class js_function(object): + """A JS function that can be "called" from python and and added to + a widget by widget.add_call() so it get's called every time the widget +@@ -191,6 +211,12 @@ + + def __call__(self, *args): + return _js_call(self.__name, [], args, called=True) ++ ++ def get_js_repr(self): ++ return str(self.__name) ++ ++ def __str__(self): ++ return self.get_js_repr() + + + class _js_call(object): +@@ -199,8 +225,8 @@ + def __init__(self, name, call_list, args=None, called=False): + self.__name = name + self.__args = args +- call_list.append(self) +- self.__call_list = call_list ++ self.__call_list = call_list[:] ++ self.__call_list.append(self) + self.__called = called + + def __getattr__(self, name): +@@ -211,19 +237,21 @@ + self.__called = True + return self + +- def __get_js_repr(self): ++ def get_js_repr(self): ++ encoder = TWEncoder() ++ return '.'.join(c.__get_js_repr_fragment(encoder) for c in self.__call_list) ++ ++ def __get_js_repr_fragment(self, encoder): + if self.__called: + args = self.__args +- return '%s(%s)' % (self.__name, ', '.join(imap(encode, args))) ++ return '%s(%s)' % (self.__name, ', '.join(imap(encoder.encode, args))) + else: + return self.__name + + def __str__(self): + if not self.__called: + raise TypeError('Last element in the chain has to be called') +- return '.'.join(c.__get_js_repr() for c in self.__call_list) ++ return self.get_js_repr() + + def __unicode__(self): + return str(self).decode(sys.getdefaultencoding()) +- +-encode = TWEncoder().encode
pgpHnLHmArGt2.pgp
Description: PGP signature
_______________________________________________ Python-modules-team mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/python-modules-team

