search.py 1.5 KB

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