from .filter import Filter class Range(Filter): def _do_options(self): return None def prepare_options(self): return self def get_options(self): options = [] for _, param in enumerate(["min", "max"]): opt = { "__typename": "Range", "id": param, "name": f'{self.conf["fid"]}_{param}', "placeholder": self.get_param("placeholder"), "min": self.get_param("min"), "max": self.get_param("max"), } # values are queried separately # if self.values and len(self.values) > num: # opt['value'] = self.values[num] options.append(opt) return options def validate(self): if self.values: if len(self.values) != 2: super().validate() min = self.get_param("min") max = self.get_param("max") values = [] for val, param in zip(self.values, ["min", "max"]): try: if val: val = int(val) else: val = self.get_param(param) except ValueError: super().validate() if not (min <= val <= max): super().validate() values.append(val) if not (values[0] <= values[1]): super().validate() self._validated = True return True def sql_condition(self, context): """Call validate first!""" if self._validated: min = int(self.values[0]) if self.values[0] else self.get_param("min") max = int(self.values[1]) if self.values[1] else self.get_param("max") return ( f" (fa.attribute_id = {self.conf['inputs']['attribute_id']} " f"AND fa.value::numeric >= {min} AND fa.value::numeric <= {max}) " ) else: RuntimeError("Call .validate() first!") def has_values(self): if self.values: for val in self.values: if val: return True return False