12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- from django.contrib.auth import get_user_model
- from django.core.exceptions import PermissionDenied
- from django.utils.translation import gettext as _
- from django.utils.translation import gettext_lazy
- from ..search import SearchProvider
- from .serializers import UserCardSerializer
- HEAD_RESULTS = 8
- TAIL_RESULTS = 8
- User = get_user_model()
- class SearchUsers(SearchProvider):
- name = gettext_lazy("Users")
- icon = "people"
- url = "users"
- def allow_search(self):
- if not self.request.user_acl["can_search_users"]:
- raise PermissionDenied(_("You don't have permission to search users."))
- def search(self, query, page=1):
- if query:
- results = search_users(
- search_disabled=self.request.user.is_staff, username=query
- )
- else:
- results = []
- return {
- "results": UserCardSerializer(results, many=True).data,
- "count": len(results),
- }
- def search_users(**filters):
- queryset = User.objects.order_by("slug").select_related(
- "rank", "ban_cache", "online_tracker"
- )
- if not filters.get("search_disabled", False):
- queryset = queryset.filter(is_active=True)
- username = filters.get("username").lower()
- results = []
- # lets grab head and tail results:
- results += list(queryset.filter(slug__startswith=username)[:HEAD_RESULTS])
- results += list(
- queryset.filter(slug__contains=username).exclude(
- pk__in=[r.pk for r in results]
- )[:TAIL_RESULTS]
- )
- return results
|