lists.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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.shortcuts import redirect, render as django_render
  7. from django.utils import timezone
  8. from django.views.decorators.cache import cache_page
  9. from misago.core.shortcuts import get_object_or_404, paginate
  10. from misago.users.models import Rank
  11. from misago.users.online.utils import get_online_queryset
  12. from misago.users.permissions.profiles import (allow_browse_users_list,
  13. allow_see_users_online_list)
  14. from misago.users.sites import users_list
  15. def render(request, template, context):
  16. context['pages'] = users_list.get_pages(request)
  17. for page in context['pages']:
  18. page['reversed_link'] = reverse(page['link'])
  19. active_rank = context.get('rank')
  20. for rank in Rank.objects.filter(is_tab=True).order_by('order'):
  21. context['pages'].append({
  22. 'name': rank.name,
  23. 'reversed_link': reverse('misago:users_rank',
  24. kwargs={'rank_slug': rank.slug}),
  25. 'is_active': active_rank.pk == rank.pk if active_rank else None
  26. })
  27. for page in context['pages']:
  28. if page['is_active']:
  29. context['active_page'] = page
  30. break
  31. return django_render(request, template, context)
  32. def allow_see_list(permission=None):
  33. def permission_decorator(f):
  34. def decorator(request, *args, **kwargs):
  35. allow_browse_users_list(request.user)
  36. if permission:
  37. permission(request.user)
  38. return f(request, *args, **kwargs)
  39. return decorator
  40. return permission_decorator
  41. @allow_see_list()
  42. def lander(request):
  43. default = users_list.get_default_link()
  44. return redirect(default)
  45. def list_view(request, template, queryset, page, context=None):
  46. context = context or {}
  47. context['users'] = paginate(queryset, page, 6 * 3, 5)
  48. return render(request, template, context)
  49. def ranking_view(request, template, queryset, context=None):
  50. context = context or {}
  51. context.update({
  52. 'users': queryset[:settings.MISAGO_RANKING_SIZE],
  53. 'users_count': queryset.count()
  54. })
  55. return render(request, template, context)
  56. #@cache_page(18 * 3600)
  57. @allow_see_list()
  58. def active_posters(request, page=0):
  59. tracked_period = settings.MISAGO_RANKING_LENGTH
  60. tracked_since = timezone.now() - timedelta(days=tracked_period)
  61. User = get_user_model()
  62. queryset = User.objects.filter(post__posted_on__gte=tracked_since)
  63. queryset = queryset.annotate(num_posts=Count('post'))
  64. queryset = queryset.select_related('user__rank')
  65. queryset = queryset.order_by('-num_posts')
  66. template = "misago/userslists/active_posters.html"
  67. return ranking_view(request, template, queryset, {
  68. 'tracked_period': tracked_period
  69. })
  70. @allow_see_list(allow_see_users_online_list)
  71. def online(request, page=0):
  72. queryset = get_online_queryset(request.user).order_by('user__slug')
  73. queryset = queryset.select_related('user__rank')
  74. template = "misago/userslists/online.html"
  75. return list_view(request, template, queryset, page, {
  76. 'data_from': timezone.now()
  77. })
  78. @allow_see_list()
  79. def rank(request, rank_slug, page=0):
  80. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  81. queryset = rank.user_set.order_by('slug')
  82. template = "misago/userslists/rank.html"
  83. return list_view(request, template, queryset, page, {'rank': rank})