1 | #Idea and implementation by Anton Berezin
|
---|
2 |
|
---|
3 | from django.http import HttpResponse
|
---|
4 | from django.template import Context, loader
|
---|
5 | import re #regexp
|
---|
6 |
|
---|
7 |
|
---|
8 | #The response object that can hold the context
|
---|
9 | class HttpResponseHolder(HttpResponse):
|
---|
10 | context = {} #make sure that it is a dictianory
|
---|
11 |
|
---|
12 |
|
---|
13 | #Adds a template to a view
|
---|
14 | class template(object):
|
---|
15 |
|
---|
16 | def __init__(self, template_name = None):
|
---|
17 | self.template_name = template_name
|
---|
18 |
|
---|
19 | def __call__(self, function):
|
---|
20 | def function_wrapper(*args):
|
---|
21 | return_val = function(*args)
|
---|
22 | #get a proper template name
|
---|
23 | if self.template_name == None: #if template name is not defined derive it from package name and view function name
|
---|
24 | array = re.split("\.", function.__module__) #split into array with elements like [0]=project_name, [1]=package_name, [2]=file_name (where the function lives)
|
---|
25 | package_name = array[1]
|
---|
26 | self.template_name = "%s/%s.html" %(package_name, function.__name__)
|
---|
27 | #compose the response
|
---|
28 | template = loader.get_template(str(self.template_name))
|
---|
29 | if isinstance(return_val, HttpResponseHolder):
|
---|
30 | return HttpResponse(template.render(Context(return_val.context)))
|
---|
31 | elif isinstance(return_val, dict):
|
---|
32 | context = Context(return_val)
|
---|
33 | return HttpResponse(template.render(context))
|
---|
34 | elif isinstance(return_val, HttpResponse):
|
---|
35 | return return_val
|
---|
36 | else:
|
---|
37 | return
|
---|
38 | return function_wrapper
|
---|