views.py 4.4 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 misago.apps.errors import error403, error404
  6. from misago.conf import settings
  7. from misago.forms import FormFields
  8. from misago.messages import Message
  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())
  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 search_form.non_field_errors()[0] == 'form_contains_errors':
  69. message = Message(_("To search users you have to enter username in search field."), 'error')
  70. else:
  71. message = Message(search_form.non_field_errors()[0], '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': FormFields(search_form).fields,
  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));