diff -r b758351d191f -r cc9b7e14412b web/lib/django/views/decorators/cache.py --- a/web/lib/django/views/decorators/cache.py Wed May 19 17:43:59 2010 +0200 +++ b/web/lib/django/views/decorators/cache.py Tue May 25 02:43:45 2010 +0200 @@ -14,26 +14,51 @@ try: from functools import wraps except ImportError: - from django.utils.functional import wraps # Python 2.3, 2.4 fallback. + from django.utils.functional import wraps # Python 2.4 fallback. -from django.utils.decorators import decorator_from_middleware +from django.utils.decorators import decorator_from_middleware_with_args, available_attrs from django.utils.cache import patch_cache_control, add_never_cache_headers from django.middleware.cache import CacheMiddleware -cache_page = decorator_from_middleware(CacheMiddleware) + +def cache_page(*args, **kwargs): + # We need backwards compatibility with code which spells it this way: + # def my_view(): pass + # my_view = cache_page(my_view, 123) + # and this way: + # my_view = cache_page(123)(my_view) + # and this: + # my_view = cache_page(my_view, 123, key_prefix="foo") + # and this: + # my_view = cache_page(123, key_prefix="foo")(my_view) + # and possibly this way (?): + # my_view = cache_page(123, my_view) + + # We also add some asserts to give better error messages in case people are + # using other ways to call cache_page that no longer work. + key_prefix = kwargs.pop('key_prefix', None) + assert not kwargs, "The only keyword argument accepted is key_prefix" + if len(args) > 1: + assert len(args) == 2, "cache_page accepts at most 2 arguments" + if callable(args[0]): + return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[1], key_prefix=key_prefix)(args[0]) + elif callable(args[1]): + return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)(args[1]) + else: + assert False, "cache_page must be passed either a single argument (timeout) or a view function and a timeout" + else: + return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix) + def cache_control(**kwargs): - def _cache_controller(viewfunc): - def _cache_controlled(request, *args, **kw): response = viewfunc(request, *args, **kw) patch_cache_control(response, **kwargs) return response + return wraps(viewfunc, assigned=available_attrs(viewfunc))(_cache_controlled) + return _cache_controller - return wraps(viewfunc)(_cache_controlled) - - return _cache_controller def never_cache(view_func): """ @@ -44,4 +69,4 @@ response = view_func(request, *args, **kwargs) add_never_cache_headers(response) return response - return wraps(view_func)(_wrapped_view_func) + return wraps(view_func, assigned=available_attrs(view_func))(_wrapped_view_func)