context_processors.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # PermWrapper and PermLookupDict proxy the permissions system into objects that
  2. # the template system can understand.
  3. class PermLookupDict(object):
  4. def __init__(self, user, app_label):
  5. self.user, self.app_label = user, app_label
  6. def __repr__(self):
  7. return str(self.user.get_all_permissions())
  8. def __getitem__(self, perm_name):
  9. return self.user.has_perm("%s.%s" % (self.app_label, perm_name))
  10. def __iter__(self):
  11. # To fix 'item in perms.someapp' and __getitem__ iteraction we need to
  12. # define __iter__. See #18979 for details.
  13. raise TypeError("PermLookupDict is not iterable.")
  14. def __bool__(self):
  15. return self.user.has_module_perms(self.app_label)
  16. def __nonzero__(self): # Python 2 compatibility
  17. return type(self).__bool__(self)
  18. class PermWrapper(object):
  19. def __init__(self, user):
  20. self.user = user
  21. def __getitem__(self, app_label):
  22. return PermLookupDict(self.user, app_label)
  23. def __iter__(self):
  24. # I am large, I contain multitudes.
  25. raise TypeError("PermWrapper is not iterable.")
  26. def __contains__(self, perm_name):
  27. """
  28. Lookup by "someapp" or "someapp.someperm" in perms.
  29. """
  30. if '.' not in perm_name:
  31. # The name refers to module.
  32. return bool(self[perm_name])
  33. app_label, perm_name = perm_name.split('.', 1)
  34. return self[app_label][perm_name]
  35. def auth(request):
  36. """
  37. Returns context variables required by apps that use Django's authentication
  38. system.
  39. If there is no 'user' attribute in the request, uses AnonymousUser (from
  40. django.contrib.auth).
  41. """
  42. if hasattr(request, 'user'):
  43. user = request.user
  44. else:
  45. from django.contrib.auth.models import AnonymousUser
  46. user = AnonymousUser()
  47. return {
  48. 'user': user,
  49. 'perms': PermWrapper(user),
  50. }