diff --git a/apps/establishment/filters.py b/apps/establishment/filters.py index 3a7d3398..7ae5d13c 100644 --- a/apps/establishment/filters.py +++ b/apps/establishment/filters.py @@ -1,7 +1,8 @@ """Establishment app filters.""" from django.core.validators import EMPTY_VALUES from django.utils.translation import ugettext_lazy as _ -from django_filters import rest_framework as filters +from django_filters import rest_framework as filters, Filter +from django_filters.fields import Lookup from rest_framework.serializers import ValidationError from establishment import models @@ -63,13 +64,19 @@ class EstablishmentTypeTagFilter(filters.FilterSet): ) +class ListFilter(Filter): + def filter(self, qs, value): + value_list = value.split(u',') + return super().filter(qs, Lookup(value_list, 'in')) + + class EmployeeBackFilter(filters.FilterSet): """Employee filter set.""" search = filters.CharFilter(method='search_by_name_or_last_name') - position_id = filters.NumberFilter(method='search_by_actual_position_id') - public_mark = filters.NumberFilter(method='search_by_public_mark') - toque_number = filters.NumberFilter(method='search_by_toque_number') + position_id = filters.CharFilter(method='search_by_actual_position_id') + public_mark = filters.CharFilter(method='search_by_public_mark') + toque_number = filters.CharFilter(method='search_by_toque_number') username = filters.CharFilter(method='search_by_username_or_name') class Meta: @@ -93,19 +100,22 @@ class EmployeeBackFilter(filters.FilterSet): def search_by_actual_position_id(self, queryset, name, value): """Search by actual position_id.""" if value not in EMPTY_VALUES: - return queryset.search_by_position_id(value) + value_list = [int(val) for val in value.split(',')] + return queryset.search_by_position_id(value_list) return queryset def search_by_public_mark(self, queryset, name, value): """Search by establishment public_mark.""" if value not in EMPTY_VALUES: - return queryset.search_by_public_mark(value) + value_list = [int(val) for val in value.split(',')] + return queryset.search_by_public_mark(value_list) return queryset def search_by_toque_number(self, queryset, name, value): """Search by establishment toque_number.""" if value not in EMPTY_VALUES: - return queryset.search_by_toque_number(value) + value_list = [int(val) for val in value.split(',')] + return queryset.search_by_toque_number(value_list) return queryset def search_by_username_or_name(self, queryset, name, value): diff --git a/apps/establishment/models.py b/apps/establishment/models.py index f2c7e2ee..edbafdc7 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -1034,22 +1034,22 @@ class EmployeeQuerySet(models.QuerySet): Q(establishmentemployee__to_date__isnull=True) ) - def search_by_position_id(self, value): + def search_by_position_id(self, value_list): """Search by position_id.""" - return self.filter( - Q(establishmentemployee__position_id=value), + return self.search_by_actual_employee().filter( + Q(establishmentemployee__position_id__in=value_list), ) - def search_by_public_mark(self, value): + def search_by_public_mark(self, value_list): """Search by establishment public_mark.""" - return self.filter( - Q(establishmentemployee__establishment__public_mark=value), + return self.search_by_actual_employee().filter( + Q(establishmentemployee__establishment__public_mark__in=value_list), ) - def search_by_toque_number(self, value): + def search_by_toque_number(self, value_list): """Search by establishment toque_number.""" - return self.filter( - Q(establishmentemployee__establishment__toque_number=value), + return self.search_by_actual_employee().filter( + Q(establishmentemployee__establishment__toque_number__in=value_list), ) def search_by_username_or_name(self, value): diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index 4bbf9533..04ba6581 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -187,7 +187,7 @@ class EmployeeListCreateView(generics.ListCreateAPIView): permission_classes = (permissions.AllowAny,) filter_class = filters.EmployeeBackFilter serializer_class = serializers.EmployeeBackSerializers - queryset = models.Employee.objects.all().with_back_office_related() + queryset = models.Employee.objects.all().distinct().with_back_office_related() class EmployeesListSearchViews(generics.ListAPIView):