from django import template from django.template import resolve_variable from django.contrib.auth.models import Group register = template.Library() # # TODO: There must be a shorter way to do this... # @register.tag() def ifusergroup(parser, token): """ Check to see if the currently logged in user belongs to a specific group. Requires the Django authentication contrib app and middleware. Usage: {% ifusergroup Admins %} ... {% endifusergroup %} """ try: tag, group = token.split_contents() except ValueError: raise template.TemplateSyntaxError("Tag 'ifusergroup' requires 1 argument.") nodelist = parser.parse(('endifusergroup',)) parser.delete_first_token() return GroupCheckNode(group, nodelist) @register.tag() def ifuser(parser, token): """ Check to see if user is currently logged in. Usage: {% ifuser %} ... {% endifusergroup %} """ nodelist = parser.parse(('endifuser',)) parser.delete_first_token() return UserCheckNode(nodelist) @register.tag() def ifnotuser(parser, token): """ Check to see if user is currently logged in. Usage: {% ifuser %} ... {% endifusergroup %} """ nodelist = parser.parse(('endifnotuser',)) parser.delete_first_token() return NotUserCheckNode(nodelist) class NotUserCheckNode(template.Node): def __init__(self, nodelist): self.nodelist = nodelist def render(self, context): user = resolve_variable('user', context) if user.is_authenticated(): return '' return self.nodelist.render(context) class UserCheckNode(template.Node): def __init__(self, nodelist): self.nodelist = nodelist def render(self, context): user = resolve_variable('user', context) if not user.is_authenticated(): return '' return self.nodelist.render(context) class GroupCheckNode(template.Node): def __init__(self, group, nodelist): self.group = group self.nodelist = nodelist def render(self, context): user = resolve_variable('user', context) if not user.is_authenticated(): return '' try: group = Group.objects.get(name=self.group) except Group.DoesNotExist: return '' if group in user.groups.all(): return self.nodelist.render(context) return ''