class TripFilterSet(FilterSet): seats_left__gte = filters.NumberFilter(label="Assentos restantes ou mais", method='get_seats_left') origin_radius = filters.NumberFilter( label="Raio de pesquisa na origem em km", method='get_radius') destination_radius = filters.NumberFilter( label="Raio de pesquisa no destino em km", method='get_radius') origin = filters.CharFilter(label="Endereço de origem", method='get_origin') destination = filters.CharFilter(label="Endereço de destino", method='get_destination') def get_seats_left(self, qs, name, value): seats_left = F('max_seats') - Coalesce( Sum('passengers__seats', filter=~Q(passengers__status="denied")), 0) qs = qs.annotate(s_left=seats_left) val = value expr = name.split('__')[1] if len(name.split('__')) > 1 else 'exact' return qs.filter(**{f's_left__{expr}': val}) def get_radius(self, qs, name, value): return qs def get_origin(self, qs, name, value): radius = self.data.get('origin_radius', '10') if not radius: radius = '10' radius = min(max(float(radius), 0.05), 20) pipe = RequestPipeline('origin', self.request) result = pipe.search(value) if result is None: return qs.none() return qs.filter(origin_point__distance_lte=(result.point, D(km=radius))) def get_destination(self, qs, name, value): radius = self.data.get('destination_radius', '10') if not radius: radius = '10' radius = min(max(float(radius), 0.05), 20) pipe = RequestPipeline('destination', self.request) result = pipe.search(value) if result is None: return qs.none() return qs.filter(destination_point__distance_lte=(result.point, D(km=radius))) class Meta: model = Trip fields = { 'price': ['lte'], 'datetime': ['exact', 'gte', 'lte'], 'auto_approve': ['exact'] }
class BlogPostOverrideFilter(FilterSet): declared_publish_date__isnull = filters.NumberFilter(field_name='publish_date', lookup_expr='isnull') all_declared_publish_date = filters.AllLookupsFilter(field_name='publish_date') class Meta: model = BlogPost fields = {'publish_date': '__all__', }
class RoleDetailFilter(FilterSet): active = filters.BooleanFilter() id = filters.NumberFilter() class Meta: Model = Note fields = [ 'active', 'id', ]
class AuditAreaListFilter(FilterSet): active = filters.BooleanFilter() company = filters.NumberFilter() class Meta: Model = AuditArea fields = [ 'active', 'company', ]
class SpecialtyTypeListFilter(FilterSet): active = filters.BooleanFilter() company = filters.NumberFilter() class Meta: Model = SpecialtyType fields = [ 'active', 'company', ]
class CategoryListFilter(FilterSet): active = filters.BooleanFilter() company = filters.NumberFilter() class Meta: Model = Category fields = [ 'active', 'company', ]
class IndicatorListFilter(FilterSet): active = filters.BooleanFilter() company = filters.NumberFilter() class Meta: Model = Indicator fields = [ 'active', 'company', ]
class NoteTypeListFilter(FilterSet): active = filters.BooleanFilter() type = filters.NumberFilter() class Meta: Model = NoteType fields = [ 'active', 'type', ]
class TemplateListFilter(FilterSet): active = filters.BooleanFilter() company = filters.NumberFilter() class Meta: model = Template fields = [ 'id', 'active', 'company', ]
class AuditDetailFilter(FilterSet): categories = filters.RelatedFilter(CategoryListFilter, field_name="categories__parent", queryset=Audit.objects.all()) active = filters.BooleanFilter() template = filters.NumberFilter() class Meta: Model = Audit fields = [ 'active', 'categories', 'template', ]
class AuditListFilter(FilterSet): company = filters.RelatedFilter(TemplateListFilter, field_name="template__company__id", queryset=Template.objects.all()) active = filters.BooleanFilter() template = filters.NumberFilter() class Meta: Model = Audit fields = [ 'active', 'company', 'template', ]
class TemplateCategoryListFilter(FilterSet): template = filters.RelatedFilter(TemplateListFilter, field_name="template__id", queryset=Template.objects.all()) active = filters.BooleanFilter() company = filters.NumberFilter() parent = filters.CharFilter() class Meta: Model = TemplateCategory fields = [ 'active', 'company', 'template', 'parent', ]
class F(PostFilter): pk = filters.NumberFilter(name='id')