lists.py 3.6 KB

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