def _results(self): on = self.on if isinstance(on, base.Query): on = on() operator = self.operator field_name = self.field_name value = self.value if operator is o_in: if isinstance(value, base.Query): value = value() value = frozenset(value) return results( obj for obj in on if getattr(obj, field_name) in value) else: if operator is o_any: return results(on) elif operator is o_assigned: return results( obj for obj in on if getattr(obj, field_name) is not UNASSIGNED) elif operator is o_unassigned: if isinstance(on, base.Extent): kw = {field_name: UNASSIGNED} return results(on.find(**kw)) else: return results( obj for obj in on if getattr(obj, field_name) is UNASSIGNED) if value is not None: field = self.FieldClass(self, field_name) field.set(value) value = field.get() if isinstance(on, base.Extent) and operator is o_eq: kw = {field_name: value} return results(on.find(**kw)) elif operator.operator: oper = operator.operator def generator(): for obj in on: a = getattr(obj, field_name) b = value try: result = oper(a, b) except TypeError: # Cannot compare e.g. UNASSIGNED with # datetime; assume no match. continue if result: yield obj return results(generator())
def __unicode__(self): FieldClass = self.FieldClass field = FieldClass(self, self.field_name) operator = self.operator on = self.on if isinstance(on, base.Extent): on_label = plural(on) else: on_label = unicode(on) s = u'%s where %s %s' % ( on_label, label(field), label(self.operator), ) if operator is not o_any: value = self.value if isinstance(value, Query): s += u' %s' % value else: field.set(value) s += u' %s' % field return s