12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- from rest_framework.request import Request
- from django.utils import timezone
- from misago.users.models import Online
- def unwrap_drf_request(f):
- """utility decorator that unwraps django request from rest frameworks wrapper"""
- def unwrapped_request_view(request, *args, **kwargs):
- if isinstance(request, Request):
- request = request._request
- return f(request, *args, **kwargs)
- return unwrapped_request_view
- @unwrap_drf_request
- def start_request_tracker(request):
- if request.user.is_authenticated:
- try:
- request._misago_online_tracker = request.user.online_tracker
- except Online.DoesNotExist:
- start_tracking(request, request.user)
- else:
- request._misago_online_tracker = None
-
- @unwrap_drf_request
- def update_request_tracker(request):
- try:
- online_tracker = request._misago_online_tracker
- except AttributeError:
- return
- if online_tracker:
- if request.user.is_anonymous:
- stop_tracking(request, online_tracker)
- else:
- update_tracking(request, online_tracker)
- @unwrap_drf_request
- def clear_request_tracker(request):
- request._misago_online_tracker = None
- def start_tracking(request, user):
- online_tracker = Online.objects.create(
- user=user,
- current_ip=request.user_ip,
- )
- request.user.online_tracker = online_tracker
- request._misago_online_tracker = online_tracker
- def update_tracking(request, online_tracker):
- online_tracker.current_ip = request.user_ip
- online_tracker.last_click = timezone.now()
- online_tracker.save(update_fields=['last_click', 'current_ip'])
- def stop_tracking(request, online_tracker):
- user = online_tracker.user
- user.last_login = online_tracker.last_click
- user.last_ip = online_tracker.current_ip
- user.save(update_fields=['last_login', 'last_ip'])
- online_tracker.delete()
|