You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

log.py 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from django import template
  2. from django.contrib.admin.models import LogEntry
  3. register = template.Library()
  4. class AdminLogNode(template.Node):
  5. def __init__(self, limit, varname, user):
  6. self.limit, self.varname, self.user = limit, varname, user
  7. def __repr__(self):
  8. return "<GetAdminLog Node>"
  9. def render(self, context):
  10. if self.user is None:
  11. entries = LogEntry.objects.all()
  12. else:
  13. user_id = self.user
  14. if not user_id.isdigit():
  15. user_id = context[self.user].pk
  16. entries = LogEntry.objects.filter(user__pk=user_id)
  17. context[self.varname] = entries.select_related('content_type', 'user')[:int(self.limit)]
  18. return ''
  19. @register.tag
  20. def get_admin_log(parser, token):
  21. """
  22. Populate a template variable with the admin log for the given criteria.
  23. Usage::
  24. {% get_admin_log [limit] as [varname] for_user [context_var_containing_user_obj] %}
  25. Examples::
  26. {% get_admin_log 10 as admin_log for_user 23 %}
  27. {% get_admin_log 10 as admin_log for_user user %}
  28. {% get_admin_log 10 as admin_log %}
  29. Note that ``context_var_containing_user_obj`` can be a hard-coded integer
  30. (user ID) or the name of a template context variable containing the user
  31. object whose ID you want.
  32. """
  33. tokens = token.contents.split()
  34. if len(tokens) < 4:
  35. raise template.TemplateSyntaxError(
  36. "'get_admin_log' statements require two arguments")
  37. if not tokens[1].isdigit():
  38. raise template.TemplateSyntaxError(
  39. "First argument to 'get_admin_log' must be an integer")
  40. if tokens[2] != 'as':
  41. raise template.TemplateSyntaxError(
  42. "Second argument to 'get_admin_log' must be 'as'")
  43. if len(tokens) > 4:
  44. if tokens[4] != 'for_user':
  45. raise template.TemplateSyntaxError(
  46. "Fourth argument to 'get_admin_log' must be 'for_user'")
  47. return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(tokens[5] if len(tokens) > 5 else None))