lists.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. 'name': rank.name,
  38. 'slug': rank.slug,
  39. 'css_class': rank.css_class,
  40. 'description': description,
  41. 'component': 'rank',
  42. })
  43. for page in context['pages']:
  44. if page['is_active']:
  45. context['active_page'] = page
  46. break
  47. return django_render(request, template, context)
  48. def allow_see_list(f):
  49. def decorator(request, *args, **kwargs):
  50. allow_browse_users_list(request.user)
  51. return f(request, *args, **kwargs)
  52. return decorator
  53. @allow_see_list
  54. def lander(request):
  55. default = users_list.get_default_link()
  56. return redirect(default)
  57. @allow_see_list
  58. def active_posters(request):
  59. ranking = get_active_posters_ranking()
  60. request.frontend_context['USERS'] = {
  61. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  62. 'results': ScoredUserSerializer(ranking['users'], many=True).data,
  63. 'count': ranking['users_count']
  64. }
  65. template = "misago/userslists/active_posters.html"
  66. return render(request, template, {
  67. 'tracked_period': settings.MISAGO_RANKING_LENGTH,
  68. 'users': ranking['users'],
  69. 'users_count': ranking['users_count']
  70. })
  71. @allow_see_list
  72. def rank(request, rank_slug, page=0):
  73. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  74. queryset = rank.user_set.select_related('rank').order_by('slug')
  75. page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
  76. paginator = pagination_dict(page)
  77. request.frontend_context['USERS'] = dict(
  78. results=UserSerializer(page.object_list, many=True).data,
  79. **paginator
  80. )
  81. if rank.description:
  82. description = {
  83. 'plain': rank.description,
  84. 'html': format_plaintext_for_html(rank.description)
  85. }
  86. else:
  87. description = None
  88. template = "misago/userslists/rank.html"
  89. return render(request, template, {
  90. 'rank': rank,
  91. 'users': page.object_list,
  92. 'paginator': paginator
  93. })