def filter_missing_fields(obj, fields, check_cb): missing_fields = [] if fields is None: # Select all fields if isinstance(obj, BaseObject): fields = [item[0] for item in obj.iter_fields()] else: fields = [item[0] for item in iter_fields(obj)] for field in fields: if not hasattr(obj, field): raise FieldNotFound(obj, field) value = getattr(obj, field) missing = False if hasattr(value, '__iter__'): for v in (value.values() if isinstance(value, dict) else value): if check_cb(v): missing = True break elif check_cb(value): missing = True if missing: missing_fields.append(field) return missing_fields
def fillobj(self, obj, fields=None): """ Fill an object with the wanted fields. :param fields: what fields to fill; if None, all fields are filled :type fields: :class:`list` """ if obj is None: return obj def not_loaded(v): return (v is NotLoaded or isinstance(v, BaseObject) and not v.__iscomplete__()) if isinstance(fields, basestring): fields = (fields, ) missing_fields = [] if fields is None: # Select all fields if isinstance(obj, BaseObject): fields = [item[0] for item in obj.iter_fields()] else: fields = [item[0] for item in iter_fields(obj)] for field in fields: if not hasattr(obj, field): raise FieldNotFound(obj, field) value = getattr(obj, field) missing = False if hasattr(value, '__iter__'): for v in (value.itervalues() if isinstance(value, dict) else value): if not_loaded(v): missing = True break elif not_loaded(value): missing = True if missing: missing_fields.append(field) if not missing_fields: return obj for key, value in self.OBJECTS.iteritems(): if isinstance(obj, key): self.logger.debug(u'Fill %r with fields: %s' % (obj, missing_fields)) return value(self, obj, missing_fields) or obj # Object is not supported by backend. Do not notice it to avoid flooding user. # That's not so bad. for field in missing_fields: setattr(obj, field, NotAvailable) return obj
def fillobj(self, obj, fields=None): """ Fill an object with the wanted fields. :param fields: what fields to fill; if None, all fields are filled :type fields: :class:`list` """ if type(obj) not in self.OBJECTS: raise ObjectNotSupported('The object of type %s is not supported by the backend %s' % (type(obj).__name__, self)) def not_loaded(v): return (v is NotLoaded or isinstance(v, CapBaseObject) and not v.__iscomplete__()) if isinstance(fields, basestring): fields = (fields,) missing_fields = [] if fields is None: # Select all fields if isinstance(obj, CapBaseObject): fields = [item[0] for item in obj.iter_fields()] else: fields = [item[0] for item in iter_fields(obj)] for field in fields: if not hasattr(obj, field): raise FieldNotFound(obj, field) value = getattr(obj, field) missing = False if hasattr(value, '__iter__'): for v in (value.itervalues() if isinstance(value, dict) else value): if not_loaded(v): missing = True break elif not_loaded(value): missing = True if missing: missing_fields.append(field) if not missing_fields: return obj for key, value in self.OBJECTS.iteritems(): if isinstance(obj, key): self.logger.debug(u'Fill %r with fields: %s' % (obj, missing_fields)) return value(self, obj, missing_fields) or obj