lists.py 2.9 KB

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