lists.py 3.1 KB

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