adding ability to change content type when overriding template

This commit is contained in:
Mark McClain
2011-01-27 13:21:38 -05:00
parent d6e20d6f20
commit f8f437d953
2 changed files with 19 additions and 2 deletions

View File

@@ -41,8 +41,10 @@ request = proxy('request')
response = proxy('response')
def override_template(template):
def override_template(template, content_type=None):
request.override_template = template
if content_type:
request.override_content_type = content_type
def abort(status_code=None, detail='', headers=None, comment=None):
raise exc.status_map[status_code](detail=detail, headers=headers, comment=comment)
@@ -290,7 +292,10 @@ class Pecan(object):
# pull the template out based upon content type and handle overrides
template = cfg.get('content_types', {}).get(state.content_type)
# check if for controller override of template
template = getattr(request, 'override_template', template)
state.content_type = getattr(request, 'override_content_type', state.content_type)
# if there is a template, render it
if template:

View File

@@ -3,7 +3,7 @@ from paste.recursive import ForwardRequestException
from unittest import TestCase
from webtest import TestApp
from pecan import Pecan, expose, request, response, redirect, abort, make_app
from pecan import Pecan, expose, request, response, redirect, abort, make_app, override_template
from pecan.templating import _builtin_renderers as builtin_renderers
import os
@@ -620,3 +620,15 @@ class TestEngines(object):
assert r.status_int == 200
result = dict(loads(r.body))
assert result == expected_result
def test_override_template(self):
class RootController(object):
@expose('foo.html')
def index(self):
override_template(None, content_type='text/plain')
return 'Override'
app = TestApp(Pecan(RootController()))
r = app.get('/')
assert r.status_int == 200
assert 'Override' in r.body