Skip to content

Commit 33b9f33

Browse files
committed
Added a middleware to handle all the requests
Cleaned up some code
1 parent 34ca322 commit 33b9f33

File tree

3 files changed

+35
-62
lines changed

3 files changed

+35
-62
lines changed

partial_load/decorators.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.template.response import TemplateResponse, HttpResponse
1+
from django.template.response import HttpResponse, SimpleTemplateResponse
22
from partial_load import loader
33
from json import dumps
44

@@ -8,12 +8,14 @@ def _inner(request, *args, **kwargs):
88
response = func(request, *args, **kwargs)
99

1010
if request.is_ajax() and request.META.has_key('HTTP_X_LOAD_BLOCKS'):
11-
if not isinstance(response, TemplateResponse):
11+
if not isinstance(response, SimpleTemplateResponse):
1212
raise Exception("The response must be an instance of TemplateResponse.")
1313

1414
block_list = request.META['HTTP_X_LOAD_BLOCKS'].split(',')
1515
result = loader.render_template_blocks(response.template, block_list, response.context)
1616

1717
return HttpResponse(dumps(result), mimetype="application/json")
18-
18+
19+
return response
20+
1921
return _inner

partial_load/loader.py

Lines changed: 11 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,35 @@
11
from django.template.loader_tags import BlockNode, ExtendsNode
2-
from django.template import loader, Context, RequestContext
3-
from django.http import HttpResponse
2+
from django.template import loader, Context
43

54

65

7-
class BlockNotFound(Exception):
8-
pass
9-
10-
116
def get_template(template):
127
if isinstance(template, (tuple, list)):
138
return loader.select_template(template)
149
return loader.get_template(template)
1510

1611
def render_template_blocks(template, block_list, context):
1712
"""
18-
Renders a single block from a template. This template should have previously been rendered.
13+
Renders a list of blocks from a template.
14+
Return a dictionary of rendered template blocks.
1915
"""
20-
return render_template_blocks_nodelist(template.nodelist, block_list, context)
16+
return render_blocks(template.nodelist, block_list, context)
2117

22-
def render_template_blocks_nodelist(nodelist, block_list, context):
18+
def render_blocks(nodelist, block_list, context):
2319
block_map = {}
24-
20+
2521
for node in nodelist:
2622
if isinstance(node, BlockNode) and node.name in block_list:
2723
block_map.setdefault(node.name, node.render(Context(context)))
2824

2925
for key in ('nodelist', 'nodelist_true', 'nodelist_false'):
3026
if hasattr(node, key):
31-
try:
32-
inner_block_map = render_template_blocks_nodelist(getattr(node, key), block_list, context)
33-
except:
34-
pass
35-
else:
36-
block_map.update(inner_block_map)
37-
inner_block_map = {}
27+
inner_block_map = render_blocks(getattr(node, key), block_list, context)
28+
block_map.update(inner_block_map)
3829

3930
for node in nodelist:
4031
if isinstance(node, ExtendsNode):
41-
try:
42-
inner_block_map = render_template_blocks(node.get_parent(context), block_list, context)
43-
except BlockNotFound:
44-
pass
45-
else:
46-
block_map.update(inner_block_map)
32+
inner_block_map = render_template_blocks(node.get_parent(context), block_list, context)
33+
block_map.update(inner_block_map)
4734

48-
return block_map
49-
50-
def render_block_to_string(template_name, block_list, dictionary={}, context_instance=None):
51-
"""
52-
Loads the given template_name and renders the given block with the given dictionary as
53-
context. Returns a string.
54-
"""
55-
template = get_template(template_name)
56-
57-
if context_instance is not None:
58-
context_instance.update(dictionary)
59-
else:
60-
context_instance = Context(dictionary)
61-
62-
template.render(context_instance)
63-
64-
return render_template_blocks(template, block_list, context_instance)
65-
66-
def direct_block_to_template(request, template, block_list, extra_context=None, mimetype=None, **kwargs):
67-
"""
68-
Render a given block in a given template with any extra URL parameters in the context as
69-
``{{ params }}``.
70-
"""
71-
if extra_context is None:
72-
extra_context = {}
73-
dictionary = {'params': kwargs}
74-
for key, value in extra_context.items():
75-
if callable(value):
76-
dictionary[key] = value()
77-
else:
78-
dictionary[key] = value
79-
c = RequestContext(request, dictionary)
80-
t = get_template(template)
81-
t.render(c)
82-
83-
return HttpResponse(render_template_blocks(t, block_list, c), mimetype=mimetype)
35+
return block_map

partial_load/middleware.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from json import dumps
2+
3+
from django.template.response import SimpleTemplateResponse
4+
from django.http import HttpResponse
5+
6+
from partial_load import loader
7+
8+
9+
class PartialLoadMiddleware(object):
10+
def process_response(self, request, response):
11+
# since the middleware is a most generic way of handling with the request/response process, let's check
12+
# if the response is a SimpleTemplateResponse instance first
13+
if request.is_ajax() and isinstance(response, SimpleTemplateResponse)\
14+
and request.META.has_key('HTTP_X_LOAD_BLOCKS'):
15+
16+
block_list = request.META['HTTP_X_LOAD_BLOCKS'].split(',')
17+
result = loader.render_template_blocks(response.template, block_list, response.context)
18+
19+
return HttpResponse(dumps(result), mimetype="application/json")

0 commit comments

Comments
 (0)