utils.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from datetime import timedelta
  2. from django.utils import timezone
  3. from ..bans import get_user_ban
  4. from ..models import BanCache, Online
  5. ACTIVITY_CUTOFF = timedelta(minutes=2)
  6. def make_users_status_aware(request, users, fetch_state=False):
  7. users_dict = {}
  8. for user in users:
  9. users_dict[user.pk] = user
  10. if fetch_state:
  11. # Fill ban cache on users
  12. for ban_cache in BanCache.objects.filter(user__in=users_dict.keys()):
  13. users_dict[ban_cache.user_id].ban_cache = ban_cache
  14. # Fill user online trackers
  15. for online_tracker in Online.objects.filter(user__in=users_dict.keys()):
  16. users_dict[online_tracker.user_id].online_tracker = online_tracker
  17. # Fill user states
  18. for user in users:
  19. user.status = get_user_status(request, user)
  20. def get_user_status(request, user):
  21. user_status = {
  22. "is_banned": False,
  23. "is_hidden": user.is_hiding_presence,
  24. "is_online_hidden": False,
  25. "is_offline_hidden": False,
  26. "is_online": False,
  27. "is_offline": False,
  28. "banned_until": None,
  29. "last_click": user.last_login or user.joined_on,
  30. }
  31. user_ban = get_user_ban(user, request.cache_versions)
  32. if user_ban:
  33. user_status["is_banned"] = True
  34. user_status["banned_until"] = user_ban.expires_on
  35. try:
  36. online_tracker = user.online_tracker
  37. is_hidden = (
  38. user.is_hiding_presence and not request.user_acl["can_see_hidden_users"]
  39. )
  40. if online_tracker and not is_hidden:
  41. if online_tracker.last_click >= timezone.now() - ACTIVITY_CUTOFF:
  42. user_status["is_online"] = True
  43. user_status["last_click"] = online_tracker.last_click
  44. except Online.DoesNotExist:
  45. pass
  46. if user_status["is_hidden"]:
  47. if request.user_acl["can_see_hidden_users"]:
  48. user_status["is_hidden"] = False
  49. if user_status["is_online"]:
  50. user_status["is_online_hidden"] = True
  51. user_status["is_online"] = False
  52. else:
  53. user_status["is_offline_hidden"] = True
  54. user_status["is_offline"] = False
  55. else:
  56. user_status["is_hidden"] = True
  57. else:
  58. if user_status["is_online"]:
  59. user_status["is_online"] = True
  60. else:
  61. user_status["is_offline"] = True
  62. return user_status