| | 919 | def object_tag(self, func): |
| | 920 | params, xx, xxx, defaults = getargspec(func) |
| | 921 | |
| | 922 | class ObjectNode(Node): |
| | 923 | def __init__(self, vars_to_resolve, var_name): |
| | 924 | self.vars_to_resolve = map(Variable, vars_to_resolve) |
| | 925 | self.var_name = var_name |
| | 926 | |
| | 927 | def render(self, context): |
| | 928 | resolved_vars = [var.resolve(context) for var in self.vars_to_resolve] |
| | 929 | obj = func(*resolved_vars) |
| | 930 | context[self.var_name] = obj |
| | 931 | return '' |
| | 932 | |
| | 933 | def object_tag_compiler(params, defaults, name, node_class, parser, token): |
| | 934 | bits = token.split_contents()[1:] |
| | 935 | |
| | 936 | if len(bits) < 2 or bits[-2] != 'as': |
| | 937 | raise TemplateSyntaxError("the next to last argument to %s must be 'as'" % name) |
| | 938 | |
| | 939 | var_name, bits = bits[-1], bits[:-2] |
| | 940 | match_number_of_arguments(bits, params, defaults, name) |
| | 941 | |
| | 942 | return node_class(bits, var_name) |
| | 943 | |
| | 944 | compile_func = curry(object_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, ObjectNode) |
| | 945 | compile_func.__doc__ = func.__doc__ |
| | 946 | |
| | 947 | self.tag(getattr(func, "_decorated_function", func).__name__, compile_func) |
| | 948 | |
| | 949 | return func |
| | 950 | |