search.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _, ugettext_lazy
  4. from misago.search import SearchProvider
  5. from .serializers import UserSerializer
  6. HEAD_RESULTS = 8
  7. TAIL_RESULTS = 8
  8. class SearchUsers(SearchProvider):
  9. name = ugettext_lazy("Users")
  10. url = 'users'
  11. def allow_search(self):
  12. if not self.request.user.acl['can_search_users']:
  13. raise PermissionDenied(
  14. _("You don't have permission to search users."))
  15. def search(self, query, page=1):
  16. if query:
  17. results = search_users(
  18. search_disabled=self.request.user.is_staff,
  19. username=query
  20. )
  21. else:
  22. results = []
  23. return {
  24. 'results': UserSerializer(results, many=True).data,
  25. 'count': len(results)
  26. }
  27. def search_users(**filters):
  28. User = get_user_model()
  29. queryset = User.objects.order_by('slug').select_related(
  30. 'rank', 'ban_cache', 'online_tracker')
  31. if not filters.get('search_disabled', False):
  32. queryset = queryset.filter(is_active=True)
  33. username = filters.get('username').lower()
  34. results = []
  35. # lets grab head and tail results:
  36. results += list(queryset.filter(slug__startswith=username)[:HEAD_RESULTS])
  37. results += list(queryset.filter(
  38. slug__contains=username
  39. ).exclude(pk__in=[r.pk for r in results])[:TAIL_RESULTS])
  40. return results