ailab/benchmark/visualize_utils.py (38 lines of code) (raw):

from __future__ import absolute_import, division, print_function, unicode_literals import operator from functools import reduce from django.db.models import Q def construct_single_q(rule): operator = rule["operator"] neg = False if operator.startswith("not_"): neg = True operator = operator[4:] cond = { "equal": "exact", "begins_with": "istartswith", "contains": "icontains", "ends_with": "iendswith", "less": "lt", "less_or_equal": "lte", "greater": "gt", "greater_or_equal": "gte", "between": "range", }[operator] if cond != "range": cond_dict = {"{}__{}".format(rule["id"], cond): rule["value"]} else: cond_dict = {"{}__{}".format(rule["id"], cond): tuple(rule["value"])} q_obj = Q(**cond_dict) if neg: q_obj = ~q_obj return q_obj def construct_q(filters): # Base case if "condition" not in filters: return construct_single_q(filters) q_list = [construct_q(rule) for rule in filters["rules"]] if filters["condition"] == "AND": q_obj = reduce(operator.and_, q_list) else: q_obj = reduce(operator.or_, q_list) return q_obj