1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- from django.contrib.auth import get_user_model
- from django.core.exceptions import PermissionDenied
- from django.utils.translation import ugettext as _
- from django.utils.translation import ugettext_lazy
- from misago.search import SearchProvider
- from .serializers import UserCardSerializer
- HEAD_RESULTS = 8
- TAIL_RESULTS = 8
- UserModel = get_user_model()
- class SearchUsers(SearchProvider):
- name = ugettext_lazy("Users")
- url = 'users'
- def allow_search(self):
- if not self.request.user.acl_cache['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 = UserModel.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
|