utils.py 2.3 KB

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