agdj/utils.py
author Adam Gomaa <code@adam.gomaa.us>
Sun Feb 01 01:35:02 2009 -0500
changeset 416 5a586a8c2f8f
parent 415 5e48e2725b18
child 451 88b49087ec1a
permissions -rw-r--r--
Switch to date-based URLs everywhere except the feed URLs of old posts, so I don't spam everyone's feedreader.
code@331
     1
from functools import wraps
code@331
     2
code@342
     3
from django.core.cache import cache
code@331
     4
from django.shortcuts import render_to_response
code@331
     5
from django.template import RequestContext
code@331
     6
code@331
     7
code@415
     8
def use_template(template_name, request_context=True):
code@415
     9
    """A view decorator that wraps render_to_response and uses RequestContext by default"""
code@415
    10
    from functools import wraps
code@415
    11
    from django.template import RequestContext
code@415
    12
    from django.shortcuts import render_to_response
code@331
    13
code@331
    14
    def _decorator(func):
code@331
    15
        @wraps(func)
code@415
    16
        def _closure(request, *args, **kwargs):
code@415
    17
            # Use a different variable to avoid 'referenced before
code@415
    18
            # assignment'. 'template' is the kwarg used by
code@415
    19
            # direct_to_template; copy its interface for consistency.
code@415
    20
            actual_template = kwargs.pop("template", template_name)
code@415
    21
            actual_rc = kwargs.pop("request_context", request_context)
code@415
    22
            val = func(request, *args, **kwargs)
code@415
    23
            if isinstance(val, dict) and template_name is not None:
code@415
    24
                if actual_rc:
code@415
    25
                    context = RequestContext(request)
code@415
    26
                    return render_to_response(actual_template, val,
code@415
    27
                                              context_instance=context)
code@331
    28
                else:
code@415
    29
                    return render_to_response(actual_template, val)
code@415
    30
            return val
code@331
    31
        return _closure
code@331
    32
    return _decorator
code@331
    33
code@331
    34
code@331
    35
def iso8601(dt):
code@331
    36
    "Format a datetime object as ISO8601"
code@331
    37
code@331
    38
    return dt.strftime("%Y-%m-%dT%H:%M:%SZ")
code@331
    39
code@342
    40
code@342
    41
def cached_property(func):
code@342
    42
    @wraps(func)
code@342
    43
    def _closure(self):
code@342
    44
        try:
code@342
    45
            cache_key = self.get_cache_key()
code@342
    46
        except Exception:
code@342
    47
            cache_key = "%s.%s.%s(%s)" % (self.__class__.__module__,
code@342
    48
                                          self.__class__.__name__,
code@342
    49
                                          func.__name__,
code@342
    50
                                          self.pk)
code@342
    51
        val = cache.get(cache_key)
code@342
    52
code@342
    53
        if val is None:
code@342
    54
            val = func(self)
code@342
    55
            cache.set(cache_key, val)
code@342
    56
code@342
    57
        return val
code@342
    58
    return property(_closure)
code@416
    59
code@416
    60
code@416
    61
def dictproperty(method):
code@416
    62
    """Turn dictionary or attribute access into a function call"""
code@416
    63
code@416
    64
    class _Object(object):
code@416
    65
        def __init__(self, obj):
code@416
    66
            self.obj = obj
code@416
    67
        def __getattr__(self, attr):
code@416
    68
            return method(self.obj, attr)
code@416
    69
        __getitem__ = __getattr__
code@416
    70
    _Object.__name__ = method.__name__
code@416
    71
code@416
    72
    return property(_Object)