views.py 4.0 KB

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