lists.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from django.conf import settings
  2. from django.contrib.auth import get_user_model
  3. from django.core.urlresolvers import reverse
  4. from django.shortcuts import redirect, render as django_render
  5. from misago.core.shortcuts import get_object_or_404, paginate, pagination_dict
  6. from misago.core.utils import format_plaintext_for_html
  7. from misago.users.activepostersranking import get_active_posters_ranking
  8. from misago.users.models import Rank
  9. from misago.users.pages import users_list
  10. from misago.users.permissions.profiles import allow_browse_users_list
  11. from misago.users.serializers import UserSerializer, ScoredUserSerializer
  12. def render(request, template, context):
  13. request.frontend_context['USERS_LISTS'] = []
  14. context['pages'] = users_list.get_sections(request)
  15. for page in context['pages']:
  16. page['reversed_link'] = reverse(page['link'])
  17. request.frontend_context['USERS_LISTS'].append({
  18. 'name': unicode(page['name']),
  19. 'component': page['component'],
  20. })
  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. if rank.description:
  30. description = {
  31. 'plain': rank.description,
  32. 'html': format_plaintext_for_html(rank.description)
  33. }
  34. else:
  35. description = None
  36. request.frontend_context['USERS_LISTS'].append({
  37. 'id': rank.pk,
  38. 'name': rank.name,
  39. 'slug': rank.slug,
  40. 'css_class': rank.css_class,
  41. 'description': description,
  42. 'component': 'rank',
  43. })
  44. for page in context['pages']:
  45. if page['is_active']:
  46. context['active_page'] = page
  47. break
  48. return django_render(request, template, context)
  49. def allow_see_list(f):
  50. def decorator(request, *args, **kwargs):
  51. allow_browse_users_list(request.user)
  52. return f(request, *args, **kwargs)
  53. return decorator
  54. @allow_see_list
  55. def lander(request):
  56. default = users_list.get_default_link()
  57. return redirect(default)
  58. @allow_see_list
  59. def active_posters(request):
  60. ranking = get_active_posters_ranking()
  61. request.frontend_context['USERS'] = {
  62. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  63. 'results': ScoredUserSerializer(ranking['users'], many=True).data,
  64. 'count': ranking['users_count']
  65. }
  66. template = "misago/userslists/active_posters.html"
  67. return render(request, template, {
  68. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  69. 'users': ranking['users'],
  70. 'users_count': ranking['users_count']
  71. })
  72. @allow_see_list
  73. def rank(request, rank_slug, page=0):
  74. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  75. queryset = rank.user_set.select_related('rank').order_by('slug')
  76. page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
  77. paginator = pagination_dict(page)
  78. request.frontend_context['USERS'] = dict(
  79. results=UserSerializer(page.object_list, many=True).data,
  80. **paginator
  81. )
  82. if rank.description:
  83. description = {
  84. 'plain': rank.description,
  85. 'html': format_plaintext_for_html(rank.description)
  86. }
  87. else:
  88. description = None
  89. template = "misago/userslists/rank.html"
  90. return render(request, template, {
  91. 'rank': rank,
  92. 'users': page.object_list,
  93. 'paginator': paginator
  94. })