/django/contrib/flatpages/templatetags/flatpages.py
Python | 98 lines | 88 code | 7 blank | 3 comment | 8 complexity | 6ae6fe1172ec2f0454dc2e30ab51eacb MD5 | raw file
Possible License(s): BSD-3-Clause
- from django import template
- from django.conf import settings
- from django.contrib.flatpages.models import FlatPage
- register = template.Library()
- class FlatpageNode(template.Node):
- def __init__(self, context_name, starts_with=None, user=None):
- self.context_name = context_name
- if starts_with:
- self.starts_with = template.Variable(starts_with)
- else:
- self.starts_with = None
- if user:
- self.user = template.Variable(user)
- else:
- self.user = None
- def render(self, context):
- flatpages = FlatPage.objects.filter(sites__id=settings.SITE_ID)
- # If a prefix was specified, add a filter
- if self.starts_with:
- flatpages = flatpages.filter(
- url__startswith=self.starts_with.resolve(context))
- # If the provided user is not authenticated, or no user
- # was provided, filter the list to only public flatpages.
- if self.user:
- user = self.user.resolve(context)
- if not user.is_authenticated():
- flatpages = flatpages.filter(registration_required=False)
- else:
- flatpages = flatpages.filter(registration_required=False)
- context[self.context_name] = flatpages
- return ''
- def get_flatpages(parser, token):
- """
- Retrieves all flatpage objects available for the current site and
- visible to the specific user (or visible to all users if no user is
- specified). Populates the template context with them in a variable
- whose name is defined by the ``as`` clause.
- An optional ``for`` clause can be used to control the user whose
- permissions are to be used in determining which flatpages are visible.
- An optional argument, ``starts_with``, can be applied to limit the
- returned flatpages to those beginning with a particular base URL.
- This argument can be passed as a variable or a string, as it resolves
- from the template context.
- Syntax::
- {% get_flatpages ['url_starts_with'] [for user] as context_name %}
- Example usage::
- {% get_flatpages as flatpages %}
- {% get_flatpages for someuser as flatpages %}
- {% get_flatpages '/about/' as about_pages %}
- {% get_flatpages prefix as about_pages %}
- {% get_flatpages '/about/' for someuser as about_pages %}
- """
- bits = token.split_contents()
- syntax_message = ("%(tag_name)s expects a syntax of %(tag_name)s "
- "['url_starts_with'] [for user] as context_name" %
- dict(tag_name=bits[0]))
- # Must have at 3-6 bits in the tag
- if len(bits) >= 3 and len(bits) <= 6:
- # If there's an even number of bits, there's no prefix
- if len(bits) % 2 == 0:
- prefix = bits[1]
- else:
- prefix = None
- # The very last bit must be the context name
- if bits[-2] != 'as':
- raise template.TemplateSyntaxError(syntax_message)
- context_name = bits[-1]
- # If there are 5 or 6 bits, there is a user defined
- if len(bits) >= 5:
- if bits[-4] != 'for':
- raise template.TemplateSyntaxError(syntax_message)
- user = bits[-3]
- else:
- user = None
- return FlatpageNode(context_name, starts_with=prefix, user=user)
- else:
- raise template.TemplateSyntaxError(syntax_message)
- register.tag('get_flatpages', get_flatpages)