utils.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from datetime import timedelta
  2. from django.utils import timezone
  3. from misago.users.bans import get_user_ban
  4. from misago.users.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)
  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 = user.is_hiding_presence and not request.user.acl_cache['can_see_hidden_users']
  38. if online_tracker and not is_hidden:
  39. if online_tracker.last_click >= timezone.now() - ACTIVITY_CUTOFF:
  40. user_status['is_online'] = True
  41. user_status['last_click'] = online_tracker.last_click
  42. except Online.DoesNotExist:
  43. pass
  44. if user_status['is_hidden']:
  45. if request.user.acl_cache['can_see_hidden_users']:
  46. user_status['is_hidden'] = False
  47. if user_status['is_online']:
  48. user_status['is_online_hidden'] = True
  49. user_status['is_online'] = False
  50. else:
  51. user_status['is_offline_hidden'] = True
  52. user_status['is_offline'] = False
  53. else:
  54. user_status['is_hidden'] = True
  55. else:
  56. if user_status['is_online']:
  57. user_status['is_online'] = True
  58. else:
  59. user_status['is_offline'] = True
  60. return user_status