search.py 1.5 KB

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