class QuestionFilterSet(FilterSet): main_slug = filters.ModelChoiceFilter( queryset=Category.objects.filter(parent__isnull=True).all(), to_field_name='slug', field_name='category__slug', label='Hoofd categorie', ) sub_slug = filters.ModelChoiceFilter( queryset=Category.objects.filter(parent__isnull=False).all(), to_field_name='slug', field_name='category__parent__slug', label='Sub categorie', ) def filter_queryset(self, queryset): main_cat = self.form.cleaned_data.get('main_slug', None) main_slug = main_cat.slug if main_cat else None sub_cat = self.form.cleaned_data.get('sub_slug', None) sub_slug = sub_cat.slug if sub_cat else None # sort on main category first, then question ordering qs = queryset.filter(category__is_active=True).order_by( '-categoryquestion__category__parent', 'categoryquestion__order') if main_slug: if sub_slug: childq = Q(category__parent__slug=main_slug) & Q( category__slug=sub_slug) parentq = Q(category__parent__isnull=True) & Q( category__slug=main_slug) qs = qs.filter(childq | parentq) else: qs = qs.filter(category__parent__isnull=True, category__slug=main_slug) return qs
class FreightsFilterSet(FilterSet): channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='货运渠道') trans_company = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='货运公司') freight_status = filters.ChoiceFilter(choices=settings.FREIGHT_STATUS_CHOICE, help_text='货运状态') pack_time_start = filters.DateTimeFilter(field_name='pack_time', lookup_expr='gte', help_text='查询运单(起始打包时间)') pack_time_end = filters.DateTimeFilter(field_name='pack_time', lookup_expr='lte', help_text='查询运单(结束打包时间)') class Meta: model = FreightsInfo fields = []
class FreightQueryFilterSet(FreightStatementFilterSet): freight_code = filters.CharFilter(field_name='trans_code', lookup_expr='iexact', help_text='运单号', label='运单号') trans_company = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='货运公司', label='货运公司') mid_company = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='中港公司', label='中港公司') freight_status = filters.ChoiceFilter(choices=settings.ORDER_STATUS_CHOICE, help_text='运单状态', label='运单状态') channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='货运渠道', label='货运渠道') class Meta: model = FreightsInfo fields = []
class UserFilterSet(FilterSet): status = filters.ChoiceFilter(choices=settings.STATUS_USE_CHOICE, help_text='状态是否启动') bran = filters.ModelChoiceFilter(queryset=BranchesInfo.objects.all(), help_text='分部id') roles = filters.ModelChoiceFilter(queryset=RolesInfo.objects.all(), label='角色ID') class Meta: model = UsersInfo fields = []
class OrdersFilterSet(FilterSet): customer__salesman = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='业务员') customer__service = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='客服专员') operators = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='操作员') order_status = filters.ChoiceFilter(choices=settings.ORDER_STATUS_CHOICE, help_text='订单状态') channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='服务渠道') order_time_start = filters.DateTimeFilter(field_name='order_time', lookup_expr='order_time__gte', help_text='订单时间') order_time_end = filters.DateTimeFilter(field_name='order_time', lookup_expr='order_time_lte', help_text='订单时间') class Meta: model = OrdersInfo fields = []
class OrderQueryFilterSet(OrderStatementFilterSet): trans_code = filters.CharFilter(field_name='trans_code', lookup_expr='iexact', help_text='转单号', label='转单号') customer = filters.ModelChoiceFilter(queryset=CustomersInfo.objects.all(), help_text='客户', label='客户') order_status = filters.ChoiceFilter(choices=settings.ORDER_STATUS_CHOICE, help_text='订单状态', label='订单状态') channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='服务渠道', label='服务渠道') customer__salesman = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='业务员') customer__service = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='客服专员') operators = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='操作员', label='操作员') class Meta: model = OrdersInfo fields = []
class EmployeesAnimalFilter(rest_framework.FilterSet): careperiods__employee = filters.ModelChoiceFilter( label=('Закреплённый сотрудник'), queryset=Employee.objects.all()) class Meta: model = Animal fields = ['careperiods__employee']
class OrdFundsFilterSet(FilterSet): fund_status = filters.ChoiceFilter(choices=settings.FUND_STATUS_CHOICE, help_text='款项状态') order_status = filters.ChoiceFilter(choices=settings.ORDER_STATUS_CHOICE, help_text='订单状态') channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='服务渠道') pay_type = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='付款类型') order_time_start = filters.DateTimeFilter(field_name='order_time', lookup_expr='gte', help_text='订单(查询起始时间)') order_time_end = filters.DateTimeFilter(field_name='order_time', lookup_expr='lte', help_text='订单(查询结束时间)') class Meta: model = OrdFundsInfo fields = []
class CitiesFilterSet(FilterSet): county = filters.ModelChoiceFilter(queryset=Countries.objects.all(), required=True, help_text='国家') status = filters.ChoiceFilter(choices=settings.STATUS_USE_CHOICE, label='状态是否启动') class Meta: model = Cities fields = []
class DictValuesFilterSet(FilterSet): type = filters.ModelChoiceFilter(queryset=DataDictType.objects.all(), required=True, help_text='字典类型代码') status = filters.ChoiceFilter(choices=settings.STATUS_USE_CHOICE, label='状态是否启动') class Meta: model = DataDictsValue fields = []
class CityFilter(FilterSet): pk = filters.NumberFilter(help_text='业务id') code = filters.CharFilter(help_text='代码') name = filters.CharFilter(help_text='名称') county = filters.ModelChoiceFilter(queryset=Countries.objects.all(), required=True, help_text='国家') class Meta: model = Cities fields = []
class CheckValueFilter(FilterSet): pk = filters.NumberFilter(help_text='业务id') code = filters.CharFilter(help_text='代码') name = filters.CharFilter(help_text='名称') type = filters.ModelChoiceFilter(queryset=DataDictType.objects.all(), required=True, help_text='类型') class Meta: model = DataDictsValue fields = []
class OthersFundsFilterSet(FilterSet): fund_type = filters.ChoiceFilter(choices=settings.OTHER_FUND_TYPE_CHOICE, help_text='款项类型') fund_status = filters.ChoiceFilter(choices=settings.FUND_STATUS_CHOICE, help_text='款项状态') order = filters.ModelChoiceFilter(queryset=OrdFundsInfo.objects.all(), help_text='订单') freight = filters.ModelChoiceFilter(queryset=FreFundsInfo.objects.all(), help_text='运单') service = filters.ModelChoiceFilter(queryset=UsersInfo.objects.all(), help_text='款项专员') recpay_time_start = filters.DateTimeFilter(field_name='recpay_time', lookup_expr='gte', help_text='订单(查询起始时间)') recpay_time_end = filters.DateTimeFilter(field_name='recpay_time', lookup_expr='lte', help_text='订单(查询结束时间)') class Meta: model = OtherFundsInfo fields = []
class CustomsFundsFilterSet(FilterSet): fund_status = filters.ChoiceFilter(choices=settings.FUND_STATUS_CHOICE, help_text='款项状态') channel = filters.ModelChoiceFilter(queryset=DataDictsValue.objects.all(), help_text='货运渠道') pack_time_start = filters.DateTimeFilter(field_name='pack_time', lookup_expr='gte', help_text='订单(查询起始时间)') pack_time_end = filters.DateTimeFilter(field_name='pack_time', lookup_expr='lte', help_text='订单(查询结束时间)') class Meta: model = CustomsFundsInfo fields = []
class OrganizationFilter(filterset.FilterSet): """ ## Filters To filter for exact value matches: ?<fieldname>=<value> For advanced filtering use lookups: ?<fieldname>__<lookup>=<value> Possible lookups: - `name`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `regex`, `iregex` - `short`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `isnull`, `regex`, `iregex` - `address`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `isnull`, `regex`, `iregex` - `email`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `isnull`, `regex`, `iregex` - `phone`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `isnull`, `regex`, `iregex` - `url`: `iexact`, `contains`, `icontains`, `startswith`, `istartswith`, `endswith`, `iendswith`, `isnull`, `regex`, `iregex` """ category = filters.ChoiceFilter( label=_("Category"), choices=models.Organization.CATEGORY_CHOICES) parent = filters.ModelChoiceFilter( label=_("Parent"), queryset=models.Organization.objects.all()) class Meta: model = models.Organization fields = { "name": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "regex", "iregex", ), "short": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "isnull", "regex", "iregex", ), "address": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "isnull", "regex", "iregex", ), "email": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "isnull", "regex", "iregex", ), "phone": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "isnull", "regex", "iregex", ), "url": ( "exact", "iexact", "contains", "icontains", "startswith", "istartswith", "endswith", "iendswith", "isnull", "regex", "iregex", ), }
class AlertFilter(FilterSet): """ Filters Alerts. """ def __init__(self, *args, **kwargs): super(AlertFilter, self).__init__(*args, **kwargs) # add a blank choice to ChoiceFilter options for (dummy_name, field) in self.filters.items(): if isinstance(field, django_filters.ChoiceFilter): field.extra['choices'] = tuple([('', '---------'), ] + \ list(field.extra['choices'])) collection = django_filters.ModelMultipleChoiceFilter( name='distillery', label='Collections', queryset=Distillery.objects.have_alerts()) warehouse = django_filters.ModelMultipleChoiceFilter( name='distillery__collection__warehouse', label='Warehouses', queryset=Warehouse.objects.all()) after = django_filters.DateTimeFilter(name='created_date', lookup_expr='gt') before = django_filters.DateTimeFilter(name='created_date', lookup_expr='lte') level = django_filters.MultipleChoiceFilter(choices=ALERT_LEVEL_CHOICES) status = django_filters.MultipleChoiceFilter(choices=ALERT_STATUS_CHOICES) assigned_user = django_filters.ModelChoiceFilter( name='assigned_user', queryset=AppUser.objects.all()) content = django_filters.CharFilter(name='data', label='Content', method='filter_by_content') categories = django_filters.ModelMultipleChoiceFilter( name='distillery__categories', label='Collection categories', queryset=Category.objects.all()) tags = django_filters.ModelMultipleChoiceFilter(name='tags', queryset=Tag.objects.all()) class Meta: model = Alert # List content field last so it will have fewer Alerts to # filter. The content filter requires a query to the Distillery # associated with the Alert. It's best to filter out as many # records as possible before constructing that query. fields = [ 'collection', 'after', 'before', 'level', 'status', 'assigned_user', 'content' ] @staticmethod def _get_data_query(distillery, value): """ """ text_fields = distillery.get_text_fields() field_names = [field.field_name for field in text_fields] field_keys = [name.replace('.', '__') for name in field_names] queries = [] for key in field_keys: query_exp = 'data__%s' % key kwarg = {query_exp: value} queries.append(Q(**kwarg)) field_query = join_query(queries, 'OR') return Q(distillery=distillery) & field_query @staticmethod def _get_title_query(value): """ """ return Q(title__icontains=value) def _filter_by_value(self, queryset, value): """ """ distilleries = Distillery.objects.filter( alerts__in=queryset).distinct() if distilleries: queries = [self._get_data_query(distillery, value) \ for distillery in distilleries] data_query = join_query(queries, 'OR') title_query = self._get_title_query(value) return queryset.filter(title_query | data_query) else: return queryset.none() # @timeit def filter_by_content(self, queryset, name, value): """ Takes a QuerySet of Alerts and a string value. Returns a filtered QuerySet of Alerts whose data includes the given value. """ if not value: return queryset try: return self._filter_by_value(queryset, value) except ValueError: LOGGER.error('An error occurred while filtering Alerts') return queryset