Changeset 3707
- Timestamp:
- 09/02/06 04:26:24 (2 years ago)
- Files:
-
- django/trunk/django/template/defaulttags.py (modified) (1 diff)
- django/trunk/django/template/__init__.py (modified) (4 diffs)
- django/trunk/django/template/loader.py (modified) (1 diff)
- django/trunk/django/template/loader_tags.py (modified) (1 diff)
- django/trunk/django/test/client.py (modified) (4 diffs)
- django/trunk/django/test/signals.py (added)
- django/trunk/django/test/simple.py (modified) (3 diffs)
- django/trunk/django/test/utils.py (modified) (3 diffs)
- django/trunk/django/views/debug.py (modified) (3 diffs)
- django/trunk/django/views/static.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/template/defaulttags.py
r3666 r3707 252 252 if self.parsed: 253 253 try: 254 t = Template(output )254 t = Template(output, name=self.filepath) 255 255 return t.render(context) 256 256 except TemplateSyntaxError, e: django/trunk/django/template/__init__.py
r3680 r3707 61 61 from django.utils.functional import curry 62 62 from django.utils.text import smart_split 63 from django.dispatch import dispatcher 64 from django.template import signals 63 65 64 66 __all__ = ('Template', 'Context', 'RequestContext', 'compile_string') … … 138 140 139 141 class Template(object): 140 def __init__(self, template_string, origin=None ):142 def __init__(self, template_string, origin=None, name='<Unknown Template>'): 141 143 "Compilation stage" 142 144 if settings.TEMPLATE_DEBUG and origin == None: … … 145 147 # came from... 146 148 self.nodelist = compile_string(template_string, origin) 149 self.name = name 147 150 148 151 def __iter__(self): … … 153 156 def render(self, context): 154 157 "Display stage -- can be called many times" 158 dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context) 155 159 return self.nodelist.render(context) 156 160 django/trunk/django/template/loader.py
r3666 r3707 77 77 handling template inheritance recursively. 78 78 """ 79 return get_template_from_string(*find_template_source(template_name)) 79 source, origin = find_template_source(template_name) 80 template = get_template_from_string(source, origin, template_name) 81 return template 80 82 81 def get_template_from_string(source, origin=None ):83 def get_template_from_string(source, origin=None, name=None): 82 84 """ 83 85 Returns a compiled Template object for the given template code, 84 86 handling template inheritance recursively. 85 87 """ 86 return Template(source, origin )88 return Template(source, origin, name) 87 89 88 90 def render_to_string(template_name, dictionary=None, context_instance=None): django/trunk/django/template/loader_tags.py
r3666 r3707 58 58 raise TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent 59 59 else: 60 return get_template_from_string(source, origin )60 return get_template_from_string(source, origin, parent) 61 61 62 62 def render(self, context): django/trunk/django/test/client.py
r3658 r3707 1 1 from cStringIO import StringIO 2 from django.contrib.admin.views.decorators import LOGIN_FORM_KEY, _encode_post_data3 2 from django.core.handlers.base import BaseHandler 4 3 from django.core.handlers.wsgi import WSGIRequest 5 4 from django.dispatch import dispatcher 6 5 from django.http import urlencode, SimpleCookie 7 from django.te mplateimport signals6 from django.test import signals 8 7 from django.utils.functional import curry 9 8 … … 97 96 """ 98 97 def __init__(self, **defaults): 99 self.handler = TestHandler()98 self.handler = ClientHandler() 100 99 self.defaults = defaults 101 100 self.cookie = SimpleCookie() … … 127 126 on_template_render = curry(store_rendered_templates, data) 128 127 dispatcher.connect(on_template_render, signal=signals.template_rendered) 129 128 130 129 response = self.handler(environ) 131 130 … … 181 180 """ 182 181 A specialized sequence of GET and POST to log into a view that 183 is protected by @login_required or a similaraccess decorator.184 185 path should be the URL of the login page, or of any page that186 is login protected.187 188 Returns True if login was successful; False if otherwise.189 """ 190 # First, GET the login page.191 # This is required to establish the session.182 is protected by a @login_required access decorator. 183 184 path should be the URL of the page that is login protected. 185 186 Returns the response from GETting the requested URL after 187 login is complete. Returns False if login process failed. 188 """ 189 # First, GET the page that is login protected. 190 # This page will redirect to the login page. 192 191 response = self.get(path) 192 if response.status_code != 302: 193 return False 194 195 login_path, data = response['Location'].split('?') 196 next = data.split('=')[1] 197 198 # Second, GET the login page; required to set up cookies 199 response = self.get(login_path, **extra) 193 200 if response.status_code != 200: 194 201 return False 195 196 # Set up the block of form data required by the login page.202 203 # Last, POST the login data. 197 204 form_data = { 198 205 'username': username, 199 206 'password': password, 200 'this_is_the_login_form': 1, 201 'post_data': _encode_post_data({LOGIN_FORM_KEY: 1}) 207 'next' : next, 202 208 } 203 response = self.post(path, data=form_data, **extra) 204 205 # login page should give response 200 (if you requested the login 206 # page specifically), or 302 (if you requested a login 207 # protected page, to which the login can redirect). 208 return response.status_code in (200,302) 209 response = self.post(login_path, data=form_data, **extra) 210 211 # Login page should 302 redirect to the originally requested page 212 if response.status_code != 302 or response['Location'] != path: 213 return False 214 215 # Since we are logged in, request the actual page again 216 return self.get(path) django/trunk/django/test/simple.py
r3689 r3707 2 2 from django.conf import settings 3 3 from django.core import management 4 from django.test.utils import setup_test_environment, teardown_test_environment 4 5 from django.test.utils import create_test_db, destroy_test_db 5 6 from django.test.testcases import OutputChecker, DocTestRunner … … 52 53 will be added to the test suite. 53 54 """ 55 setup_test_environment() 54 56 55 57 settings.DEBUG = False … … 67 69 unittest.TextTestRunner(verbosity=verbosity).run(suite) 68 70 destroy_test_db(old_name, verbosity) 71 72 teardown_test_environment() django/trunk/django/test/utils.py
r3706 r3707 2 2 from django.conf import settings 3 3 from django.db import connection, transaction, backend 4 from django.dispatch import dispatcher 5 from django.test import signals 6 from django.template import Template 4 7 5 8 # The prefix to put on the default database name when creating … … 7 10 TEST_DATABASE_PREFIX = 'test_' 8 11 12 def instrumented_test_render(self, context): 13 """An instrumented Template render method, providing a signal 14 that can be intercepted by the test system Client 15 16 """ 17 dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context) 18 return self.nodelist.render(context) 19 20 def setup_test_environment(): 21 """Perform any global pre-test setup. This involves: 22 23 - Installing the instrumented test renderer 24 25 """ 26 Template.original_render = Template.render 27 Template.render = instrumented_test_render 28 29 def teardown_test_environment(): 30 """Perform any global post-test teardown. This involves: 31 32 - Restoring the original test renderer 33 34 """ 35 Template.render = Template.original_render 36 del Template.original_render 37 9 38 def _set_autocommit(connection): 10 39 "Make sure a connection is in autocommit mode." … … 76 105 cursor.execute("DROP DATABASE %s" % backend.quote_name(TEST_DATABASE_NAME)) 77 106 connection.close() 78 django/trunk/django/views/debug.py
r3666 r3707 116 116 'lineno': '?', 117 117 }] 118 t = Template(TECHNICAL_500_TEMPLATE )118 t = Template(TECHNICAL_500_TEMPLATE, name='Technical 500 Template') 119 119 c = Context({ 120 120 'exception_type': exc_type.__name__, … … 142 142 return empty_urlconf(request) 143 143 144 t = Template(TECHNICAL_404_TEMPLATE )144 t = Template(TECHNICAL_404_TEMPLATE, name='Technical 404 Template') 145 145 c = Context({ 146 146 'root_urlconf': settings.ROOT_URLCONF, … … 155 155 def empty_urlconf(request): 156 156 "Create an empty URLconf 404 error response." 157 t = Template(EMPTY_URLCONF_TEMPLATE )157 t = Template(EMPTY_URLCONF_TEMPLATE, name='Empty URLConf Template') 158 158 c = Context({ 159 159 'project_name': settings.SETTINGS_MODULE.split('.')[0] django/trunk/django/views/static.py
r3666 r3707 82 82 t = loader.get_template('static/directory_index') 83 83 except TemplateDoesNotExist: 84 t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE )84 t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE, name='Default Directory Index Template') 85 85 files = [] 86 86 for f in os.listdir(fullpath):
