from psycopg2 import sql from .filter import Filter class MultiSelect(Filter): def get_options(self): res = super().get_options() options = [] am_map = self.am.get_output_map() data_map = {d: am_map[s].idx for d, s in self.conf["output_map"].items()} for r in res: opt = {dest: r[source] for dest, source in data_map.items()} opt["name"] = self.conf["fid"] opt["__typename"] = "MultiSelect" # values are queried separately # if self.values and r in self.values: # opt['selected'] = True options.append(opt) return options def validate(self): res = self._options_task.wait_for_result() am_map = self.am.get_output_map() idx = am_map[self.conf["output_map"]["value"]].idx possible = set(str(r[idx]) for r in res) for val in self.values: if val not in possible: super().validate() self._validated = True return True def sql_condition(self, context): """Call validate first!""" if self._validated: values = ",".join( sql.Literal(val).as_string(context) for val in self.values ) if values: return ( f" (fa.attribute_id = {self.conf['inputs']['attribute_id']} " f"AND COALESCE(fa.value, 'unknown') IN ({values})) " ) else: return f" fa.attribute_id = {self.conf['inputs']['attribute_id']} " else: RuntimeError("Call .validate() first!")