import datetime from django_filters import rest_framework as filters from app.models import Poultry, PoultryHatching, TransportingChickenDetail, Hatching, TransportingDetail, KillHouse, \ TransportCarcassDetail, Driver, Guilds, AllProductsTransport class PoultryFilterSet(filters.FilterSet): class Meta: model = Poultry fields = [ 'UserName', 'FirstName', 'LastName', 'UnitName', 'PartIdCode', 'UnitId', 'LocationIdProvince', 'LocationIdCity' ] class PoultryHatchingFilterSet(filters.FilterSet): class Meta: model = PoultryHatching fields = [ 'DesCertId', 'RequestCode', 'Mobile', 'PartIdCode', 'EpidemiologicCode', 'LocationNameProvince', 'LocationNameCity', 'poultry__UserName', 'poultry__FirstName', 'poultry__LastName', 'poultry__UnitName', 'poultry__PartIdCode', 'poultry__UnitId', 'LocationIdProvince', 'LocationIdCity', 'LocationNameCity', ] class HatchingsFilterSet(filters.FilterSet): class Meta: model = Hatching fields = [ 'UnitName', 'ProvinceName', 'CityName', 'PartIdCode', 'RequestCode', 'poultry__UserName', 'poultry__FirstName', 'poultry__LastName', 'poultry__UnitName', 'poultry__PartIdCode', 'poultry__UnitId', ] class TransportingChickenDetailFilterSet(filters.FilterSet): class Meta: model = TransportingChickenDetail fields = [ 'DesUnitName', 'DesPartIdCode', 'SourceUnitPartIdCode', 'SourceUnitName', 'SourceCertId', 'hatching__DesCertId', 'hatching__LocationNameProvince', 'hatching__LocationNameCity', 'hatching__poultry__UserName', 'hatching__poultry__FirstName', 'hatching__poultry__LastName', 'hatching__poultry__UnitName', 'hatching__poultry__PartIdCode', 'hatching__poultry__UnitId', 'hatching__poultry__LocationIdProvince', 'hatching__poultry__LocationIdCity' ] class HatchingFilterSet(filters.FilterSet): class Meta: model = PoultryHatching fields = [ 'LocationNameCity', 'LocationNameProvince', 'HatchingAge', ] class PoultryInfoFilterSet(filters.FilterSet): class Meta: model = Poultry fields = [ 'LocationNameProvince', 'Province', 'LocationNameCity', 'City', 'FirstName', 'LastName', 'Mobile', 'SystemCode', 'EpidemiologicCode', 'PartIdCode', 'UnitName', ] class HatchingCalculationsFilterSet(filters.FilterSet): class Meta: model = PoultryHatching fields = [ 'LocationNameProvince', 'LocationNameCity', ] class TransportingDetailFilterSet(filters.FilterSet): class Meta: model = TransportingDetail fields = [ 'TrackingCode', 'Province', 'City', 'DesPartIdCode', 'Age', 'hatching__poultry__FirstName', 'hatching__poultry__PartIdCode', 'hatching__RequestCode', 'hatching__CityName', 'hatching__ProvinceName', ] class KillHouseFilterSet(filters.FilterSet): class Meta: model = KillHouse fields = [ 'PartIdCode', 'UnitName', 'Province', 'City', 'ProvinceId' ] class CustomHatchingsFilterSet(filters.FilterSet): city = filters.CharFilter(field_name='CityName', lookup_expr='icontains') province = filters.CharFilter(field_name='ProvinceName', lookup_expr='icontains') system_code = filters.CharFilter(field_name='SystemCode', lookup_expr='exact') age = filters.NumberFilter(field_name='Age', lookup_expr='exact') age__gt = filters.NumberFilter(field_name='Age', lookup_expr='gt') age__gte = filters.NumberFilter(field_name='Age', lookup_expr='gte') age__lt = filters.NumberFilter(field_name='Age', lookup_expr='lt') age__lte = filters.NumberFilter(field_name='Age', lookup_expr='lte') killing_age = filters.NumberFilter(field_name='KillingAve', lookup_expr='exact') killing_age__gt = filters.NumberFilter(field_name='KillingAve', lookup_expr='gt') killing_age__gte = filters.NumberFilter(field_name='KillingAve', lookup_expr='gte') killing_age__lt = filters.NumberFilter(field_name='KillingAve', lookup_expr='lt') killing_age__lte = filters.NumberFilter(field_name='KillingAve', lookup_expr='lte') leftover__gt = filters.NumberFilter(field_name='LeftOver', lookup_expr='gt') leftover__gte = filters.NumberFilter(field_name='LeftOver', lookup_expr='gte') leftover__lt = filters.NumberFilter(field_name='LeftOver', lookup_expr='lt') leftover__lte = filters.NumberFilter(field_name='LeftOver', lookup_expr='lte') leftover__exact = filters.NumberFilter(field_name='LeftOver', lookup_expr='exact') date1__date__gte = filters.DateFilter(method='filter_date_range') date2__date__lte = filters.DateFilter(method='filter_date_range') state = filters.CharFilter(method='filter_state') class Meta: model = Hatching fields = [ 'city', 'province', 'system_code', 'age', 'age__gt', 'age__gte', 'age__lt', 'age__lte', 'killing_age', 'killing_age__gt', 'killing_age__gte', 'killing_age__lt', 'killing_age__lte', 'leftover__gt', 'leftover__gte', 'leftover__lt', 'leftover__lte', 'leftover__exact', 'date1__date__gte', 'date2__date__lte', 'state' ] def filter_date_range(self, queryset, name, value): date1 = self.data.get('date1__date__gte') date2 = self.data.get('date2__date__lte') if date1 and date2: try: date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() return queryset.filter(Date__date__gte=date1, Date__date__lte=date2) except ValueError: return queryset return queryset def filter_state(self, queryset, name, value): state = self.data.get('state') if state: if state == 'pending': queryset = queryset.filter(Age__lte=70) else: queryset = queryset.filter(Age__gt=70) return queryset class TransportingDetailCustomFilterSet(filters.FilterSet): unitname = filters.CharFilter(field_name='DesUnitName', lookup_expr='icontains') province = filters.CharFilter(field_name='Province', lookup_expr='icontains') city = filters.CharFilter(field_name='City', lookup_expr='icontains') code = filters.CharFilter(field_name='DesPartIdCode', lookup_expr='exact') trackingstatus = filters.CharFilter(field_name='TrackingStatusDescription', lookup_expr='exact') quantity__gt = filters.NumberFilter(field_name='GoodAmount', lookup_expr='gt') quantity__gte = filters.NumberFilter(field_name='GoodAmount', lookup_expr='gte') quantity__lt = filters.NumberFilter(field_name='GoodAmount', lookup_expr='lt') quantity__lte = filters.NumberFilter(field_name='GoodAmount', lookup_expr='lte') age = filters.NumberFilter(field_name='Age', lookup_expr='exact') age__gt = filters.NumberFilter(field_name='Age', lookup_expr='gt') age__gte = filters.NumberFilter(field_name='Age', lookup_expr='gte') age__lt = filters.NumberFilter(field_name='Age', lookup_expr='lt') age__lte = filters.NumberFilter(field_name='Age', lookup_expr='lte') date1__date__gte = filters.DateFilter(method='filter_date_range') date2__date__lte = filters.DateFilter(method='filter_date_range') poultry_unitname = filters.DateFilter(method='filter_poultry_unit_name') class Meta: model = TransportingDetail fields = [ 'unitname', 'province', 'city', 'code', 'trackingstatus', 'quantity__gt', 'quantity__gte', 'quantity__lt', 'quantity__lte', 'age', 'age__gt', 'age__gte', 'age__lt', 'age__lte', 'date1__date__gte', 'date2__date__lte', 'poultry_unitname', ] def filter_date_range(self, queryset, name, value): date1 = self.data.get('date1__date__gte') date2 = self.data.get('date2__date__lte') if date1 and date2: try: date1 = datetime.datetime.strptime(str(date1), '%Y-%m-%d').date() date2 = datetime.datetime.strptime(str(date2), '%Y-%m-%d').date() return queryset.filter(Date__date__gte=date1, Date__date__lte=date2) except ValueError: return queryset return queryset def filter_poultry_unit_name(self, queryset, name, value): return queryset.filter(poultry__UnitName__icontains=value) class TransportCarcassDetailFilterSet(filters.FilterSet): class Meta: model = TransportCarcassDetail fields = [ 'tracking', 'origin_province', 'origin_city', 'destination_province', 'destination_city', 'product', 'owner'] class DriverFilterSet(filters.FilterSet): class Meta: model = Driver fields = [ 'owner_name', 'driver_name', 'city', 'province', ] class GuildsFilterSet(filters.FilterSet): class Meta: model = Guilds fields = [ 'name', 'province', 'city', 'jihadi_code' ] class AllProductsTransportFilterSet(filters.FilterSet): class Meta: model = AllProductsTransport fields = [ 'record_id', 'tracking', 'product', 'items', 'origin_province', 'origin_city', 'destination_province', 'destination_city', 'owner', 'driver_name', 'car_tracking_code', 'out', 'quantity', 'jihadi_destination', 'jihadi_origin', ]