lists.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import warnings
  2. from django.conf import settings
  3. from django.contrib.auth import get_user_model
  4. from django.core.urlresolvers import reverse
  5. from django.shortcuts import redirect, render as django_render
  6. from django.views.decorators.cache import cache_page
  7. from misago.core.shortcuts import get_object_or_404, paginate
  8. from misago.users.models import Rank
  9. from misago.users.online import get_online_queryset
  10. from misago.users.permissions.profiles import (allow_browse_users_list,
  11. allow_see_users_online_list)
  12. from misago.users.sites import users_list
  13. def render(request, template, context):
  14. context['pages'] = users_list.get_pages(request)
  15. for page in context['pages']:
  16. page['reversed_link'] = reverse(page['link'])
  17. active_rank = context.get('rank')
  18. for rank in Rank.objects.filter(is_tab=True).order_by('name'):
  19. context['pages'].append({
  20. 'name': rank.name,
  21. 'reversed_link': reverse('misago:users_rank',
  22. kwargs={'rank_slug': rank.slug}),
  23. 'is_active': active_rank.pk == rank.pk if active_rank else None
  24. })
  25. for page in context['pages']:
  26. if page['is_active']:
  27. context['active_page'] = page
  28. break
  29. return django_render(request, template, context)
  30. def allow_see_list(permission=None):
  31. def permission_decorator(f):
  32. def decorator(request, *args, **kwargs):
  33. allow_browse_users_list(request.user)
  34. if permission:
  35. permission(request.user)
  36. return f(request, *args, **kwargs)
  37. return decorator
  38. return permission_decorator
  39. @allow_see_list()
  40. def lander(request):
  41. default = users_list.get_default_link()
  42. return redirect(default)
  43. def list_view(request, template, queryset, page, context=None):
  44. context = context or {}
  45. context['users'] = paginate(queryset, page, 6 * 3, 5)
  46. return render(request, template, context)
  47. @allow_see_list()
  48. @cache_page(24 * 3600)
  49. def active_posters(request, page=0):
  50. warnings.warn("Not implemented yet! See #404 for details.",
  51. FutureWarning)
  52. tracked_period = settings.MISAGO_RANKING_LENGTH
  53. User = get_user_model()
  54. queryset = User.objects.all()
  55. template = "misago/userslists/active_posters.html"
  56. return list_view(request, template, queryset, page, {
  57. 'tracked_period': tracked_period
  58. })
  59. @allow_see_list(allow_see_users_online_list)
  60. def online(request, page=0):
  61. queryset = get_online_queryset(request.user).order_by('user__slug')
  62. template = "misago/userslists/online.html"
  63. return list_view(request, template, queryset, page)
  64. @allow_see_list()
  65. def rank(request, rank_slug, page=0):
  66. rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
  67. queryset = rank.user_set.order_by('slug')
  68. template = "misago/userslists/rank.html"
  69. return list_view(request, template, queryset, page, {'rank': rank})