lists.py 3.6 KB

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