utils.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 Online, BanCache
  5. ACTIVITY_CUTOFF = timedelta(minutes=1)
  6. def get_user_status(user, acl):
  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. if not user.is_hiding_presence or acl['can_see_hidden_users']:
  23. online_tracker = user.online_tracker
  24. if online_tracker.last_click >= timezone.now() - ACTIVITY_CUTOFF:
  25. user_status['is_online'] = True
  26. user_status['last_click'] = online_tracker.last_click
  27. except Online.DoesNotExist:
  28. pass
  29. if user_status['is_hidden']:
  30. if acl['can_see_hidden_users']:
  31. user_status['is_hidden'] = False
  32. if user_status['is_online']:
  33. user_status['is_online_hidden'] = True
  34. user_status['is_online'] = False
  35. else:
  36. user_status['is_offline_hidden'] = True
  37. user_status['is_offline'] = False
  38. else:
  39. user_status['is_hidden'] = True
  40. else:
  41. if user_status['is_online']:
  42. user_status['is_online'] = True
  43. else:
  44. user_status['is_offline'] = True
  45. return user_status
  46. def make_users_status_aware(users, acl, fetch_state=False):
  47. users_dict = {}
  48. for user in users:
  49. users_dict[user.pk] = user
  50. if fetch_state:
  51. # Fill ban cache on users
  52. for ban_cache in BanCache.objects.filter(user__in=users_dict.keys()):
  53. user.ban_cache = ban_cache
  54. # Fill user online trackers
  55. for online_tracker in Online.objects.filter(user__in=users_dict.keys()):
  56. user.online_tracker = online_tracker
  57. # Fill user states
  58. for user in users:
  59. user.status = get_user_status(user, acl)