Changeset 5311

Show
Ignore:
Timestamp:
08/30/08 11:06:39 (4 months ago)
Author:
chrisz
Message:

Make paginate work with tg.strict_parameters=False (#1889).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.0/turbogears/controllers.py

    r5241 r5311  
    395395            + config.get("tg.ignore_parameters", [])) 
    396396    else: 
     397        # get special parameters used by upstream decorators like paginate 
     398        try: 
     399            tg_kw = dict([(k, v) for k, v in kw.items() if k in func._tg_args]) 
     400        except AttributeError: 
     401            tg_kw = {} 
     402        # remove excessive parameters 
    397403        args, kw = tg_util.adapt_call(func, args, kw) 
     404        # add special parameters again 
     405        kw.update(tg_kw) 
    398406    if config.get('server.environment', 'development') == 'development': 
    399407        # Only output this in development mode: If it's a field storage object, 
  • branches/1.0/turbogears/paginate.py

    r5241 r5311  
    113113    def entangle(func): 
    114114 
     115        get = turbogears.config.get 
     116 
    115117        def decorated(func, *args, **kw): 
    116  
    117             get = turbogears.config.get 
    118118 
    119119            def kwpop(name, default=None): 
     
    299299 
    300300            return output 
     301        if not get('tg.strict_parameters', False): 
     302            # add hint that paginate parameters shall be left intact 
     303            try: 
     304                args = func._tg_args 
     305            except AttributeError: 
     306                args = set() 
     307            for arg in 'no', 'limit', 'order', 'ordering': 
     308                args.add(var_name + '_tgp_' + arg) 
     309                args.add('tg_paginate_' + arg) 
     310            func._tg_args = args 
    301311        return decorated 
    302312    return weak_signature_decorator(entangle) 
  • branches/1.0/turbogears/tests/test_paginate.py

    r5241 r5311  
    2525    query_methods.remove('SR') 
    2626 
    27 config.update({"tg.strict_parameters": True, 
    28                "sqlalchemy.dburi": "sqlite:///:memory:"}) 
     27config.update({"sqlalchemy.dburi": "sqlite:///:memory:"}) 
    2928 
    3029# sqlalchemy setup 
     
    270269        create_request(url) 
    271270        self.body = cherrypy.response.body[0] 
     271        self.status = cherrypy.response.status 
    272272        if "fail: " in self.body: 
    273273            print self.body 
     
    469469        Spy.assert_ok(self.body, 'pages', xrange(4, 8)) 
    470470 
     471    def test_strict_parameters(self): 
     472        config.update({'tg.strict_parameters': True}) 
     473        try: 
     474            self.request("/basic?tg_paginate_no=2") 
     475            assert self.status.startswith('200') 
     476            assert '"data": [4, 5, 6, 7]' in self.body 
     477            Spy.assert_ok(self.body, 'current_page', 2) 
     478            self.request("/basic?data_tgp_no=2") 
     479            assert self.status.startswith('200') 
     480            assert '"data": [4, 5, 6, 7]' in self.body 
     481            Spy.assert_ok(self.body, 'current_page', 2) 
     482            self.request('/custom_limit?tg_paginate_limit=2') 
     483            assert self.status.startswith('200') 
     484            assert '"data": [0, 1]' in self.body 
     485            Spy.assert_ok(self.body, 'limit', 2) 
     486            self.request('/custom_limit?data_tgp_limit=2') 
     487            assert self.status.startswith('200') 
     488            assert '"data": [0, 1]' in self.body 
     489            Spy.assert_ok(self.body, 'limit', 2) 
     490            self.request("/default_max_pages?data_tgp_no=5") 
     491            assert self.status.startswith('200') 
     492            assert '"data": [40, 41, 42, ' in self.body 
     493            Spy.assert_ok(self.body, 'pages', xrange(3, 8)) 
     494            self.request("/default_max_pages?tg_paginate_no=5") 
     495            assert self.status.startswith('200') 
     496            assert '"data": [40, 41, 42, ' in self.body 
     497            Spy.assert_ok(self.body, 'pages', xrange(3, 8)) 
     498            self.request("/basic?data_tgp_rubbish=2") 
     499            assert self.status.startswith('500') 
     500            assert ("basic() got an unexpected keyword argument" 
     501                " 'data_tgp_rubbish'") in self.body 
     502            self.request("/basic?tg_paginate_rubbish=2") 
     503            assert self.status.startswith('500') 
     504            assert ("basic() got an unexpected keyword argument" 
     505                " 'tg_paginate_rubbish'") in self.body 
     506        finally: 
     507            config.update({'tg.strict_parameters': False}) 
     508 
    471509    def test_invalid_dynamic_limit(self): 
    472510        self.request("/invalid_dynamic") 
    473         assert cherrypy.response.status.startswith("500") 
     511        assert self.status.startswith("500") 
    474512        assert 'paginate: dynamic_limit (foobar) not found in output dict' in self.body 
    475513 
     
    851889                Spy.assert_ok(self.body, 'ordering', ['street']) 
    852890 
     891    def test_strict_parameters(self): 
     892        config.update({'tg.strict_parameters': True}) 
     893        try: 
     894            self.request("/basic1?method=Q&data_tgp_ordering=street") 
     895            assert self.status.startswith('200') 
     896            self.assert_order(16, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
     897            Spy.assert_ok(self.body, 'ordering', ['street']) 
     898            self.request("/basic1?method=Q&tg_paginate_ordering=street") 
     899            self.assert_order(16, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
     900            Spy.assert_ok(self.body, 'ordering', ['street']) 
     901        finally: 
     902            config.update({'tg.strict_parameters': False}) 
     903 
    853904    def test_default_reversed(self): 
    854905        for test in "reversed1", "reversed2", "reversed3": 
     
    871922        for method in query_methods: 
    872923            self.request("/wrong_reversed?method=%s" % method) 
    873             assert cherrypy.response.status.startswith("500") 
     924            assert self.status.startswith("500") 
    874925            assert ('paginate: default_reversed (deprecated) only allowed' 
    875926                ' when default_order is a basestring') in self.body