lists.py 3.5 KB

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