tracker.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from rest_framework.request import Request
  2. from django.utils import timezone
  3. from misago.users.models import Online
  4. def unwrap_drf_request(f):
  5. """utility decorator that unwraps django request from rest frameworks wrapper"""
  6. def unwrapped_request_view(request, *args, **kwargs):
  7. if isinstance(request, Request):
  8. request = request._request
  9. return f(request, *args, **kwargs)
  10. return unwrapped_request_view
  11. @unwrap_drf_request
  12. def start_request_tracker(request):
  13. if request.user.is_authenticated:
  14. try:
  15. request._misago_online_tracker = request.user.online_tracker
  16. except Online.DoesNotExist:
  17. start_tracking(request, request.user)
  18. else:
  19. request._misago_online_tracker = None
  20. @unwrap_drf_request
  21. def update_request_tracker(request):
  22. try:
  23. online_tracker = request._misago_online_tracker
  24. except AttributeError:
  25. return
  26. if online_tracker:
  27. if request.user.is_anonymous:
  28. stop_tracking(request, online_tracker)
  29. else:
  30. update_tracking(request, online_tracker)
  31. @unwrap_drf_request
  32. def clear_request_tracker(request):
  33. request._misago_online_tracker = None
  34. def start_tracking(request, user):
  35. online_tracker = Online.objects.create(
  36. user=user,
  37. current_ip=request.user_ip,
  38. )
  39. request.user.online_tracker = online_tracker
  40. request._misago_online_tracker = online_tracker
  41. def update_tracking(request, online_tracker):
  42. online_tracker.current_ip = request.user_ip
  43. online_tracker.last_click = timezone.now()
  44. online_tracker.save(update_fields=['last_click', 'current_ip'])
  45. def stop_tracking(request, online_tracker):
  46. user = online_tracker.user
  47. user.last_login = online_tracker.last_click
  48. user.last_ip = online_tracker.current_ip
  49. user.save(update_fields=['last_login', 'last_ip'])
  50. online_tracker.delete()