51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
from inspect import getfullargspec, unwrap
|
|
from django.template.library import parse_bits, SimpleNode
|
|
from functools import wraps
|
|
|
|
class SimpleBlockNode(SimpleNode):
|
|
def __init__(self, nodelist, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.nodelist = nodelist
|
|
|
|
def get_resolved_arguments(self, context):
|
|
resolved_args, resolved_kwargs = super().get_resolved_arguments(context)
|
|
resolved_args.insert(1 if self.takes_context else 0, self.nodelist.render(context))
|
|
return resolved_args, resolved_kwargs
|
|
|
|
|
|
def simple_block_tag(register, takes_context=None, name=None):
|
|
def dec(func):
|
|
argspec = getfullargspec(unwrap(func))
|
|
function_name = name or func.__name__
|
|
|
|
@wraps(func)
|
|
def tag_compiler(parser, token):
|
|
bits = token.split_contents()[1:]
|
|
target_var = None
|
|
if len(bits) >= 2 and bits[-2] == "as":
|
|
target_var = bits[-1]
|
|
bits = bits[:-2]
|
|
|
|
params = argspec.args
|
|
del params[1 if takes_context else 0]
|
|
|
|
args, kwargs = parse_bits(
|
|
parser=parser,
|
|
bits=bits,
|
|
params=params,
|
|
varargs=argspec.varargs,
|
|
varkw=argspec.varkw,
|
|
defaults=argspec.defaults,
|
|
kwonly=argspec.kwonlyargs,
|
|
kwonly_defaults=argspec.kwonlydefaults,
|
|
takes_context=takes_context,
|
|
name=function_name
|
|
)
|
|
|
|
nodelist = parser.parse((f'end{function_name}',))
|
|
parser.delete_first_token()
|
|
return SimpleBlockNode(nodelist, func, takes_context, args, kwargs, target_var)
|
|
|
|
register.tag(function_name, tag_compiler)
|
|
return func
|
|
return dec
|