views.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from django.core.urlresolvers import reverse
  2. from django.http import Http404
  3. from django.shortcuts import redirect
  4. from django.template import RequestContext
  5. from django.utils.translation import ugettext as _
  6. from misago.apps.errors import error403, error404
  7. from misago.conf import settings
  8. from misago import messages
  9. from misago.models import Rank, User
  10. from misago.shortcuts import render_to_response
  11. from misago.utils.strings import slugify
  12. from misago.utils.pagination import make_pagination
  13. from misago.apps.profiles.forms import QuickFindUserForm
  14. def list(request, slug=None, page=0):
  15. ranks = Rank.objects.filter(as_tab=1).order_by('order')
  16. # Find active rank
  17. default_rank = False
  18. active_rank = None
  19. if slug:
  20. for rank in ranks:
  21. if rank.slug == slug:
  22. active_rank = rank
  23. if not active_rank:
  24. return error404(request)
  25. if ranks and active_rank.slug == ranks[0].slug:
  26. return redirect(reverse('users'))
  27. elif ranks:
  28. default_rank = True
  29. active_rank = ranks[0]
  30. # Empty Defaults
  31. message = None
  32. users = []
  33. items_total = 0
  34. pagination = None
  35. in_search = False
  36. # Users search?
  37. if request.method == 'POST':
  38. if not request.acl.users.can_search_users():
  39. return error403(request)
  40. in_search = True
  41. active_rank = None
  42. search_form = QuickFindUserForm(request.POST, request=request)
  43. if search_form.is_valid():
  44. # Direct hit?
  45. username = search_form.cleaned_data['username']
  46. try:
  47. user = User.objects
  48. if settings.PROFILE_EXTENSIONS_PRELOAD:
  49. user = user.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
  50. user = user.get(username__iexact=username)
  51. return redirect(reverse('user', args=(user.username_slug, user.pk)))
  52. except User.DoesNotExist:
  53. pass
  54. # Looks like well have to find near match
  55. if len(username) > 6:
  56. username = username[0:-3]
  57. elif len(username) > 5:
  58. username = username[0:-2]
  59. elif len(username) > 4:
  60. username = username[0:-1]
  61. username = slugify(username.strip()).replace('-', '')
  62. # Go for rought match
  63. if len(username) > 0:
  64. users = User.objects
  65. if settings.PROFILE_EXTENSIONS_PRELOAD:
  66. users = users.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
  67. users = users.filter(username_slug__startswith=username).order_by('username_slug')[:10]
  68. elif 'username' in search_form.errors:
  69. message = messages.Message(_("To search users you have to enter username in search field."), messages.ERROR)
  70. else:
  71. message = messages.Message(search_form.non_field_errors()[0], messages.ERROR)
  72. else:
  73. search_form = QuickFindUserForm(request=request)
  74. if active_rank:
  75. users = User.objects.filter(rank=active_rank)
  76. items_total = users.count()
  77. try:
  78. pagination = make_pagination(page, items_total, settings.profiles_per_list)
  79. except Http404:
  80. if not default_rank and active_rank:
  81. return redirect(reverse('users', kwargs={'slug': active_rank.slug}))
  82. return redirect(reverse('users'))
  83. if settings.PROFILE_EXTENSIONS_PRELOAD:
  84. users = users.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
  85. users = users.order_by('username_slug')[pagination['start']:pagination['stop']]
  86. return render_to_response('profiles/list.html',
  87. {
  88. 'message': message,
  89. 'search_form': search_form,
  90. 'in_search': in_search,
  91. 'active_rank': active_rank,
  92. 'default_rank': default_rank,
  93. 'items_total': items_total,
  94. 'ranks': ranks,
  95. 'users': users,
  96. 'pagination': pagination,
  97. },
  98. context_instance=RequestContext(request));