# HG changeset patch # User Sylvain Thénault # Date 1268401919 -3600 # Node ID 90203ec7b3e344444bd4a20cfc34b6057e402cef # Parent b54255f828121b756199229f1e2494fdc6a397a1 [url] new rebuild_url method on base request diff -r b54255f82812 -r 90203ec7b3e3 req.py --- a/req.py Fri Mar 12 14:50:54 2010 +0100 +++ b/req.py Fri Mar 12 14:51:59 2010 +0100 @@ -7,9 +7,10 @@ """ __docformat__ = "restructuredtext en" +from urlparse import urlsplit, urlunsplit from urllib import quote as urlquote, unquote as urlunquote from datetime import time, datetime, timedelta -from cgi import parse_qsl +from cgi import parse_qs, parse_qsl from logilab.common.decorators import cached from logilab.common.deprecation import deprecated @@ -270,6 +271,25 @@ except UnicodeDecodeError: # might occurs on manually typed URLs yield unicode(key, 'iso-8859-1'), unicode(val, 'iso-8859-1') + + def rebuild_url(self, url, **newparams): + """return the given url with newparams inserted. If any new params + is already specified in the url, it's overriden by the new value + + newparams may only be mono-valued. + """ + if isinstance(url, unicode): + url = url.encode(self.encoding) + schema, netloc, path, query, fragment = urlsplit(url) + query = parse_qs(query) + # sort for testing predictability + for key, val in sorted(newparams.iteritems()): + query[key] = (self.url_quote(val),) + query = '&'.join(u'%s=%s' % (param, value) + for param, values in query.items() + for value in values) + return urlunsplit((schema, netloc, path, query, fragment)) + # bound user related methods ############################################### @cached diff -r b54255f82812 -r 90203ec7b3e3 test/unittest_req.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/unittest_req.py Fri Mar 12 14:51:59 2010 +0100 @@ -0,0 +1,16 @@ +from logilab.common.testlib import TestCase, unittest_main +from cubicweb.req import RequestSessionBase + +class RebuildURLTC(TestCase): + def test(self): + rebuild_url = RequestSessionBase(None).rebuild_url + self.assertEquals(rebuild_url('http://logilab.fr?__message=pouet', __message='hop'), + 'http://logilab.fr?__message=hop') + self.assertEquals(rebuild_url('http://logilab.fr', __message='hop'), + 'http://logilab.fr?__message=hop') + self.assertEquals(rebuild_url('http://logilab.fr?vid=index', __message='hop'), + 'http://logilab.fr?__message=hop&vid=index') + + +if __name__ == '__main__': + unittest_main()