Ticket #6932: 6932-template-tag-for-flatpage-2.diff
File 6932-template-tag-for-flatpage-2.diff, 11.1 KB (added by , 14 years ago) |
---|
-
django/contrib/flatpages/tests/__init__.py
1 import os 2 3 from django.conf import settings 4 from django.contrib.auth.models import AnonymousUser, User 5 from django.http import HttpRequest 6 from django.template import Template, Context 7 from django.test import TestCase 8 from django.contrib.flatpages.models import FlatPage 9 from django.contrib.flatpages.middleware import FlatpageFallbackMiddleware 10 from django.contrib.sites.models import Site 11 12 13 class FlatpageTests(TestCase): 14 def setUp(self): 15 self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS 16 settings.TEMPLATE_DIRS = ( 17 os.path.join( 18 os.path.dirname(__file__), 19 'templates' 20 ) 21 ,) 22 23 page = FlatPage( 24 url='/page1/', 25 title='Some page', 26 content="<p>Some text that shouldn't be automatically escaped</p>", 27 registration_required=False, 28 ) 29 page.save() 30 page.sites.add(Site.objects.get_current()) 31 page.save() 32 33 registrationPage = FlatPage( 34 url='/registered/page2/', 35 title='Secret page', 36 content="<p>Great, you are registered</p>", 37 registration_required=True, 38 ) 39 registrationPage.save() 40 registrationPage.sites.add(Site.objects.get_current()) 41 registrationPage.save() 42 43 def tearDown(self): 44 settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS 45 46 def render(self, t, **c): 47 ctx = Context(c) 48 out = Template(t).render(ctx) 49 return ctx, out 50 51 def testFlatpage(self): 52 original_response = self.client.get('/page1/') 53 fake_request = HttpRequest() 54 fake_request.path_info = original_response.request['PATH_INFO'] 55 flatpage = FlatpageFallbackMiddleware().process_response(fake_request, 56 original_response) 57 self.assertContains(flatpage, 58 "<p>Some text that shouldn't be automatically escaped</p>") 59 60 def testRegistrationRequiredRedirect(self): 61 original_response = self.client.get('/registered/page2/') 62 fake_request = HttpRequest() 63 fake_request.path = original_response.request['PATH_INFO'] 64 fake_request.path_info = original_response.request['PATH_INFO'] 65 fake_request.user = AnonymousUser() 66 flatpage = FlatpageFallbackMiddleware().process_response(fake_request, 67 original_response) 68 self.assertEquals(flatpage.status_code, 302) 69 self.assertEquals(flatpage['Location'], 70 '/accounts/login/?next=/registered/page2/') 71 72 def testRegistrationRequiredRender(self): 73 self.client.login(username='testuser', password='testpw') 74 original_response = self.client.get('/registered/page2/') 75 fake_request = HttpRequest() 76 fake_request.path = original_response.request['PATH_INFO'] 77 fake_request.path_info = original_response.request['PATH_INFO'] 78 fake_request.user = User.objects.create_user('testuser', 79 'test@example.com', 'testpw') 80 flatpage = FlatpageFallbackMiddleware().process_response(fake_request, 81 original_response) 82 self.assertContains(flatpage, "<p>Great, you are registered</p>") 83 84 def testGetFlatpagesTag(self): 85 ctx, out = self.render("{% load flatpages %}" 86 "{% get_flatpages as flatpages %}" 87 "{% for page in flatpages %}" 88 "{{ page.title }}," 89 "{% endfor %}") 90 self.assertEquals(out, "Some page,Secret page,") 91 92 def testGetFlatpagesTagUsingStartsWithString(self): 93 ctx, out = self.render( 94 "{% load flatpages %}" 95 "{% get_flatpages '/registered/' as registered_flatpages %}" 96 "{% for page in registered_flatpages %}" 97 "{{ page.title }}," 98 "{% endfor %}") 99 self.assertEquals(out, "Secret page,") 100 101 def testGetFlatpagesTagUsingStartsWithVariable(self): 102 ctx, out = self.render( 103 "{% load flatpages %}" 104 "{% get_flatpages registered_prefix as registered_flatpages %}" 105 "{% for page in registered_flatpages %}" 106 "{{ page.title }}," 107 "{% endfor %}", 108 registered_prefix='/registered/') 109 self.assertEquals(out, "Secret page,") -
django/contrib/flatpages/tests/templates/flatpages/default.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" 2 "http://www.w3.org/TR/REC-html40/loose.dtd"> 3 <html> 4 <head> 5 <title>{{ flatpage.title }}</title> 6 </head> 7 <body> 8 {{ flatpage.content }} 9 </body> 10 </html> -
django/contrib/flatpages/tests/templates/404.html
1 <p>Not Found</p> -
django/contrib/flatpages/templatetags/__init__.py
1 2 -
django/contrib/flatpages/templatetags/flatpages.py
1 from django import template 2 from django.contrib.flatpages.models import FlatPage 3 from django.utils.translation import ugettext as _ 4 from django.conf import settings 5 6 7 register = template.Library() 8 9 10 class FlatpageNode(template.Node): 11 def __init__(self, context_name, starts_with=None): 12 self.context_name, self.starts_with = context_name, starts_with 13 if self.starts_with: 14 self.starts_with = template.Variable(starts_with) 15 16 def render(self, context): 17 flatpages = FlatPage.objects.filter(sites__id=settings.SITE_ID) 18 if self.starts_with: 19 flatpages = flatpages.filter( 20 url__startswith=self.starts_with.resolve(context)) 21 context[self.context_name] = flatpages 22 return '' 23 24 25 def get_flatpages(parser, token): 26 """ 27 Retrieves all flatpage objects available for the current site and 28 populates the template context with them in a variable whose name 29 is defined by the 'as' clause. 30 31 An optional argument, ``starts_with``, can be applied to limit the 32 returned flatpages to those beginning with a particular base URL. 33 This argument can be passed as a variable or a string, as it resolves 34 from the template context. 35 36 Syntax:: 37 38 {% get_flatpages ['url_starts_with'] as context_name %} 39 40 Example usage:: 41 42 {% get_flatpages as flatpages %} 43 {% get_flatpages '/about/' as about_pages %} 44 {% get_flatpages about_prefix as about_pages %} 45 """ 46 bits = token.split_contents() 47 if len(bits) is 3: 48 if bits[1] != 'as': 49 raise template.TemplateSyntaxError, _("%s expects a syntax of %s " 50 "['url_starts_with'] as context_name" % (bits[0], bits[0])) 51 return FlatpageNode(bits[2]) 52 elif len(bits) is 4: 53 if bits[2] != 'as': 54 raise template.TemplateSyntaxError, _("%s expects a syntax of %s " 55 "['url_starts_with'] as context_name" % (bits[0], bits[0])) 56 return FlatpageNode(bits[3], bits[1]) 57 else: 58 raise template.TemplateSyntaxError, _("%s expects a syntax of %s " 59 "['url_starts_with'] as context_name" % (bits[0], bits[0])) 60 61 register.tag('get_flatpages', get_flatpages) -
docs/ref/contrib/flatpages.txt
167 167 both ``flatpage.title`` and ``flatpage.content`` are marked as **not** 168 168 requiring :ref:`automatic HTML escaping <automatic-html-escaping>` in the 169 169 template. 170 171 Getting a list of :class:`~django.contrib.flatpages.models.Flatpage` objects in your templates 172 ============================================================================================== 173 174 .. versionadded:: 1.3 175 176 The flatpages app also comes with a template tag that allows you to iterate 177 over all of the available flatpages on the :ref:`current site <hooking-into-current-site-from-views>`. 178 179 Like all custom template tags, you'll need to :ref:`load its custom 180 tag library <loading-custom-template-libraries>` before you can use it: 181 182 .. code-block:: html+django 183 184 {% load flatpages %} 185 186 After loading the library, you can retrieve all current flatpages via the 187 :ttag:`get_flatpages` tag: 188 189 .. code-block:: html+django 190 191 {% get_flatpages as flatpages %} 192 <ul> 193 {% for page in flatpages %} 194 <li><a href="{{ page.url }}">{{ page.title }}</a></li> 195 {% endfor %} 196 </ul> 197 198 Limiting flatpages by base URL 199 ------------------------------ 200 201 An optional argument, ``starts_with``, can be applied to limit the 202 returned pages to those beginning with a particular base URL. This argument 203 may be passed as a string or a variable, as it is resolved from the context: 204 205 .. code-block:: html+django 206 207 {% get_flatpages ['url_starts_with'] as context_name %} 208 209 For example: 210 211 .. code-block:: html+django 212 213 {% get_flatpages '/about/' as about_pages %} 214 {% get_flatpages about_prefix as about_pages %} 215 216 Only displaying flatpages accessible to anonymous users 217 ------------------------------------------------------- 218 219 If you wish to filter flatpages out by :attr:`registration_required`, you 220 can place an if statement around your for loop: 221 222 .. code-block:: html+django 223 224 {% get_flatpages '/contact/' as contact_pages %} 225 {% for page in contact_pages %} 226 {% if not user.is_authenticated and page.registration_required %} 227 <h3><a href="{{page.url}}">{{page.title}}</a></h3> 228 {% endif %} 229 {% endfor %} -
docs/ref/contrib/sites.txt
104 104 105 105 This has the same benefits as described in the last section. 106 106 107 .. _hooking-into-current-site-from-views: 108 107 109 Hooking into the current site from views 108 110 ---------------------------------------- 109 111