views.py 3.7 KB

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