lists.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. from datetime import timedelta
  2. from django.conf import settings
  3. from django.contrib.auth import get_user_model
  4. from django.core.urlresolvers import reverse
  5. from django.db.models import Count
  6. from django.http import Http404
  7. from django.shortcuts import redirect, render as django_render
  8. from django.utils import timezone
  9. from misago.forums.models import Forum
  10. from misago.core.cache import cache
  11. from misago.core.shortcuts import get_object_or_404, paginate
  12. from misago.users.models import Rank
  13. from misago.users.online.utils import get_online_queryset
  14. from misago.users.pages import users_list
  15. from misago.users.permissions.profiles import (allow_browse_users_list,
  16. allow_see_users_online_list)
  17. def render(request, template, context):
  18. context['pages'] = users_list.get_pages(request)
  19. for page in context['pages']:
  20. page['reversed_link'] = reverse(page['link'])
  21. active_rank = context.get('rank')
  22. for rank in Rank.objects.filter(is_tab=True).order_by('order'):
  23. context['pages'].append({
  24. 'name': rank.name,
  25. 'reversed_link': reverse('misago:users_rank',
  26. kwargs={'rank_slug': rank.slug}),
  27. 'is_active': active_rank.pk == rank.pk if active_rank else None
  28. })
  29. for page in context['pages']:
  30. if page['is_active']:
  31. context['active_page'] = page
  32. break
  33. return django_render(request, template, context)
  34. def allow_see_list(permission=None):
  35. def permission_decorator(f):
  36. def decorator(request, *args, **kwargs):
  37. allow_browse_users_list(request.user)
  38. if permission:
  39. permission(request.user)
  40. return f(request, *args, **kwargs)
  41. return decorator
  42. return permission_decorator
  43. @allow_see_list()
  44. def lander(request):
  45. default = users_list.get_default_link()
  46. return redirect(default)
  47. def list_view(request, template, queryset, page, context=None):
  48. context = context or {}
  49. context['users'] = paginate(queryset, page, 6 * 3, 5)
  50. return render(request, template, context)
  51. @allow_see_list()
  52. def active_posters(request, page=0):
  53. ranking = get_active_posters_rankig()
  54. template = "misago/userslists/active_posters.html"
  55. return render(request, template, {
  56. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  57. 'users': ranking['users'],
  58. 'users_count': ranking['users_count']
  59. })
  60. def get_active_posters_rankig():
  61. cache_key = 'misago_active_posters_ranking'
  62. ranking = cache.get(cache_key, 'nada')
  63. if ranking == 'nada':
  64. ranking = get_real_active_posts_ranking()
  65. cache.set(cache_key, ranking, 18*3600)
  66. return ranking
  67. def get_real_active_posts_ranking():
  68. tracked_period = settings.MISAGO_RANKING_LENGTH
  69. tracked_since = timezone.now() - timedelta(days=tracked_period)
  70. ranked_forums = [forum.pk for forum in Forum.objects.all_forums()]
  71. User = get_user_model()
  72. queryset = User.objects.filter(posts__gt=0)
  73. queryset = queryset.filter(post__posted_on__gte=tracked_since,
  74. post__forum__in=ranked_forums)
  75. queryset = queryset.annotate(num_posts=Count('post'))
  76. queryset = queryset.select_related('user__rank')
  77. queryset = queryset.order_by('-num_posts')
  78. queryset = queryset[:settings.MISAGO_RANKING_SIZE]
  79. return {
  80. 'users': [user for user in queryset],
  81. 'users_count': queryset.count()
  82. }
  83. @allow_see_list(allow_see_users_online_list)
  84. def online(request, page=0):
  85. queryset = get_online_queryset(request.user).order_by('user__slug')
  86. queryset = queryset.select_related('user__rank')
  87. template = "misago/userslists/online.html"
  88. try:
  89. return list_view(request, template, queryset, page, {
  90. 'data_from': timezone.now()
  91. })
  92. except Http404:
  93. return redirect('misago:users_online')
  94. @allow_see_list()
  95. def rank(request, rank_slug, page=0):
  96. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  97. queryset = rank.user_set.order_by('slug')
  98. template = "misago/userslists/rank.html"
  99. return list_view(request, template, queryset, page, {'rank': rank})