Changeset 5318

Show
Ignore:
Timestamp:
08/30/08 12:53:17 (4 months ago)
Author:
chrisz
Message:

Ported r5311-5317 from TG 1.0 to 1.1 and 1.5 (#1889, make paginate work with tg.strict_parameters=False).

Files:

Legend:

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

    r5241 r5318  
    371371            + config.get("tg.ignore_parameters", [])) 
    372372    else: 
     373        # get special parameters used by upstream decorators like paginate 
     374        try: 
     375            tg_kw = dict([(k, v) for k, v in kw.items() if k in func._tg_args]) 
     376        except AttributeError: 
     377            tg_kw = {} 
     378        # remove excessive parameters 
    373379        args, kw = tg_util.adapt_call(func, args, kw) 
     380        # add special parameters again 
     381        kw.update(tg_kw) 
    374382    if config.get('server.environment', 'development') == 'development': 
    375383        # Only output this in development mode: If it's a field storage object, 
  • branches/1.1/turbogears/paginate.py

    r5241 r5318  
    2222from formencode.variabledecode import variable_encode 
    2323from turbogears.widgets import PaginateDataGrid 
     24from turbogears.util import add_tg_args 
    2425 
    2526log = logging.getLogger("turbogears.paginate") 
     27 
    2628 
    2729# lists of databases that lack support for OFFSET 
     
    101103    def entangle(func): 
    102104 
     105        get = turbogears.config.get 
     106 
    103107        def decorated(func, *args, **kw): 
    104  
    105             get = turbogears.config.get 
    106108 
    107109            def kwpop(name, default=None): 
     
    135137            ordering = kwpop('ordering') 
    136138 
    137             log.debug("pagiante params: page=%s, limit=%s, order=%s", 
     139            log.debug("paginate params: page=%s, limit=%s, order=%s", 
    138140                page, limit_, order) 
    139141 
     
    268270 
    269271            return output 
     272 
     273        if not get('tg.strict_parameters', False): 
     274            # add hint that paginate parameters shall be left intact 
     275            add_tg_args(func, (var_name + '_tgp_' + arg 
     276                for arg in ('no', 'limit', 'order', 'ordering'))) 
    270277        return decorated 
     278 
    271279    return weak_signature_decorator(entangle) 
    272280 
  • branches/1.1/turbogears/tests/test_paginate.py

    r5276 r5318  
    1919query_methods = 'Q QA SO SL'.split() 
    2020 
    21 config.update({"tg.strict_parameters": True, 
    22                "sqlalchemy.dburi": "sqlite:///:memory:"}) 
     21config.update({"sqlalchemy.dburi": "sqlite:///:memory:"}) 
    2322 
    2423# sqlalchemy setup 
     
    420419        Spy.assert_ok(self.body, 'pages', xrange(4, 8)) 
    421420 
     421    def test_strict_parameters(self): 
     422        config.update({'tg.strict_parameters': True}) 
     423        try: 
     424            # check that paginate works with strict parameters as well 
     425            self.request("/basic?data_tgp_no=2", status=200) 
     426            assert '"data": [4, 5, 6, 7]' in self.body 
     427            Spy.assert_ok(self.body, 'current_page', 2) 
     428            self.request('/custom_limit?data_tgp_limit=2', status=200) 
     429            assert '"data": [0, 1]' in self.body 
     430            Spy.assert_ok(self.body, 'limit', 2) 
     431            self.request("/default_max_pages?data_tgp_no=5", status=200) 
     432            assert '"data": [40, 41, 42, ' in self.body 
     433            Spy.assert_ok(self.body, 'pages', xrange(3, 8)) 
     434            # check that wrong and old style parameters are not accepted 
     435            self.request("/basic?data_tgp_rubbish=2", status = 500) 
     436            assert ("basic() got an unexpected keyword argument" 
     437                " 'data_tgp_rubbish'") in self.body 
     438            self.request("/basic?tg_paginate_no=2", status=500) 
     439            assert ("basic() got an unexpected keyword argument" 
     440                " 'tg_paginate_no'") in self.body 
     441        finally: 
     442            config.update({'tg.strict_parameters': False}) 
     443 
    422444    def test_invalid_dynamic_limit(self): 
    423445        self.request("/invalid_dynamic", status=500) 
     
    778800                Spy.assert_ok(self.body, 'ordering', ['street']) 
    779801 
     802    def test_strict_parameters(self): 
     803        config.update({'tg.strict_parameters': True}) 
     804        try: 
     805            # check that paginate ordering works with strict parameters as well 
     806            self.request("/basic1?method=Q&data_tgp_ordering=street", status=200) 
     807            self.assert_order(16, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
     808            Spy.assert_ok(self.body, 'ordering', ['street']) 
     809            # check that old style ordering is not accepted any more 
     810            self.request("/basic1?method=Q&tg_paginate_ordering=street", status=500) 
     811            assert ("got an unexpected keyword argument" 
     812                " 'tg_paginate_ordering'") in self.body 
     813        finally: 
     814            config.update({'tg.strict_parameters': False}) 
     815 
    780816    def test_reversed(self): 
    781817        for test in "reversed1", "reversed2": 
  • branches/1.1/turbogears/util.py

    r4721 r5318  
    329329    args, kw = inject_args(func, injections, args, kw) 
    330330    return func(*args, **kw) 
     331 
     332 
     333def add_tg_args(func, args): 
     334    """Add hint for special arguments that shall not be removed.""" 
     335    try: 
     336        tg_args = func._tg_args 
     337    except AttributeError: 
     338        tg_args = set() 
     339    tg_args.update(args) 
     340    func._tg_args = tg_args 
    331341 
    332342 
     
    687697           "get_package_name", "get_model", "load_project_config", 
    688698           "ensure_sequence", "has_arg", "to_kw", "from_kw", "adapt_call", 
    689            "call_on_stack", "remove_keys", "arg_index", "inject_arg", 
    690            "inject_args", "bind_args", "recursive_update", "combine_contexts", 
     699           "call_on_stack", "remove_keys", "arg_index", 
     700           "inject_arg", "inject_args", "add_tg_args", "bind_args", 
     701           "recursive_update", "combine_contexts", 
    691702           "request_available", "flatten_sequence", "load_class", 
    692703           "parse_http_accept_header", "simplify_http_accept_header", 
  • branches/1.5/turbogears/controllers.py

    r5212 r5318  
    371371            + request.config.get("tg.ignore_parameters", [])) 
    372372    else: 
     373        # get special parameters used by upstream decorators like paginate 
     374        try: 
     375            tg_kw = dict([(k, v) for k, v in kw.items() if k in func._tg_args]) 
     376        except AttributeError: 
     377            tg_kw = {} 
     378        # remove excessive parameters 
    373379        args, kw = tg_util.adapt_call(func, args, kw) 
     380        # add special parameters again 
     381        kw.update(tg_kw) 
    374382    if request.config.get('server.environment', 'development') == 'development': 
    375383        # Only output this in development mode: If it's a field storage object, 
  • branches/1.5/turbogears/paginate.py

    r5026 r5318  
    2222from formencode.variabledecode import variable_encode 
    2323from turbogears.widgets import PaginateDataGrid 
     24from turbogears.util import add_tg_args 
    2425 
    2526log = logging.getLogger("turbogears.paginate") 
     27 
    2628 
    2729# lists of databases that lack support for OFFSET 
     
    135137            ordering = kwpop('ordering') 
    136138 
    137             log.debug("pagiante params: page=%s, limit=%s, order=%s", 
     139            log.debug("paginate params: page=%s, limit=%s, order=%s", 
    138140                page, limit_, order) 
    139141 
     
    268270 
    269271            return output 
     272 
     273        if not turbogears.config.server.get('tg.strict_parameters', False): 
     274            # add hint that paginate parameters shall be left intact 
     275            add_tg_args(func, (var_name + '_tgp_' + arg 
     276                for arg in ('no', 'limit', 'order', 'ordering'))) 
    270277        return decorated 
     278 
    271279    return weak_signature_decorator(entangle) 
    272280 
  • branches/1.5/turbogears/tests/test_paginate.py

    r5242 r5318  
    1919query_methods = 'Q QA SO SL'.split() 
    2020 
    21 config.update({"tg.strict_parameters": True, 
    22                "sqlalchemy.dburi": "sqlite:///:memory:"}) 
     21config.update({"sqlalchemy.dburi": "sqlite:///:memory:"}) 
    2322 
    2423# sqlalchemy setup 
     
    424423        Spy.assert_ok(self.body, 'pages', xrange(4, 8)) 
    425424 
     425    def test_strict_parameters(self): 
     426        config.update({'tg.strict_parameters': True}) 
     427        try: 
     428            # check that paginate works with strict parameters as well 
     429            self.request("/basic?data_tgp_no=2", status=200) 
     430            assert '"data": [4, 5, 6, 7]' in self.body 
     431            Spy.assert_ok(self.body, 'current_page', 2) 
     432            self.request('/custom_limit?data_tgp_limit=2', status=200) 
     433            assert '"data": [0, 1]' in self.body 
     434            Spy.assert_ok(self.body, 'limit', 2) 
     435            self.request("/default_max_pages?data_tgp_no=5", status=200) 
     436            assert '"data": [40, 41, 42, ' in self.body 
     437            Spy.assert_ok(self.body, 'pages', xrange(3, 8)) 
     438            # check that wrong and old style parameters are not accepted 
     439            self.request("/basic?data_tgp_rubbish=2", status = 500) 
     440            assert ("basic() got an unexpected keyword argument" 
     441                " 'data_tgp_rubbish'") in self.body 
     442            self.request("/basic?tg_paginate_no=2", status=500) 
     443            assert ("basic() got an unexpected keyword argument" 
     444                " 'tg_paginate_no'") in self.body 
     445        finally: 
     446            config.update({'tg.strict_parameters': False}) 
     447 
    426448    def test_invalid_dynamic_limit(self): 
    427449        self.request("/invalid_dynamic", status=500) 
     
    782804                Spy.assert_ok(self.body, 'ordering', ['street']) 
    783805 
     806    def test_strict_parameters(self): 
     807        config.update({'tg.strict_parameters': True}) 
     808        try: 
     809            # check that paginate ordering works with strict parameters as well 
     810            self.request("/basic1?method=Q&data_tgp_ordering=street", status=200) 
     811            self.assert_order(16, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
     812            Spy.assert_ok(self.body, 'ordering', ['street']) 
     813            # check that old style ordering is not accepted any more 
     814            self.request("/basic1?method=Q&tg_paginate_ordering=street", status=500) 
     815            assert ("got an unexpected keyword argument" 
     816                " 'tg_paginate_ordering'") in self.body 
     817        finally: 
     818            config.update({'tg.strict_parameters': False}) 
     819 
    784820    def test_reversed(self): 
    785821        for test in "reversed1", "reversed2": 
  • branches/1.5/turbogears/util.py

    r4963 r5318  
    329329    args, kw = inject_args(func, injections, args, kw) 
    330330    return func(*args, **kw) 
     331 
     332 
     333def add_tg_args(func, args): 
     334    """Add hint for special arguments that shall not be removed.""" 
     335    try: 
     336        tg_args = func._tg_args 
     337    except AttributeError: 
     338        tg_args = set() 
     339    tg_args.update(args) 
     340    func._tg_args = tg_args 
    331341 
    332342 
     
    684694           "get_package_name", "get_model", "load_project_config", 
    685695           "ensure_sequence", "has_arg", "to_kw", "from_kw", "adapt_call", 
    686            "call_on_stack", "remove_keys", "arg_index", "inject_arg", 
    687            "inject_args", "bind_args", "recursive_update", "combine_contexts", 
     696           "call_on_stack", "remove_keys", "arg_index", 
     697           "inject_arg", "inject_args", "add_tg_args", "bind_args", 
     698           "recursive_update", "combine_contexts", 
    688699           "request_available", "flatten_sequence", "load_class", 
    689700           "parse_http_accept_header", "simplify_http_accept_header",