def _set_property_value(self, lom_object, property_name, value): verify_object_property(lom_object, property_name) prop = getattr(lom_object, property_name) if property_name in PROPERTY_TYPES.keys(): if not is_lom_object(value, self.lom_classes): raise LomAttributeError('set: no valid object id') if not isinstance(value, PROPERTY_TYPES[property_name]): raise LomAttributeError('set: type mismatch') elif isinstance(prop, (int, bool)): if unicode(value) in (u'True', u'False'): value = int(unicode(value) == u'True') elif not isinstance(value, int): raise LomAttributeError('set: invalid value') elif isinstance(prop, float): if not isinstance(value, (int, float)): raise LomAttributeError('set: type mismatch') value = float(value) elif isinstance(prop, (str, unicode)): if not isinstance(value, (str, unicode, int, float)): raise LomAttributeError('set: type mismatch') value = unicode(value) else: raise LomAttributeError('set: unsupported property type') setattr(lom_object, property_name, value)
def _generate_property_info(self, prop_name, lom_object): try: real_prop = getattr(lom_object, prop_name) if not isinstance(real_prop, HIDDEN_TYPES) and not is_class(real_prop): prop_type = real_prop.__class__.__name__ if prop_name in TUPLE_TYPES: type_name = TUPLE_TYPES[prop_name].__name__ self._lists_of_children.append((prop_name, type_name)) elif prop_name in PROPERTY_TYPES.keys(): type_name = (real_prop.__class__ if real_prop != None else PROPERTY_TYPES[prop_name]).__name__ self._children.append((prop_name, type_name)) elif prop_name == 'canonical_parent': if real_prop != None: self._children.append((prop_name, prop_type)) elif callable(real_prop): if not prop_name.endswith('_listener'): self._functions.append((prop_name, )) elif prop_type not in ('type', 'Enum'): info_type = 'int' if isinstance(real_prop, ENUM_TYPES) else prop_type self._properties.append((prop_name, info_type)) except (AssertionError, RuntimeError): pass
def _generate_property_info(self, prop_name, lom_object, epii_version): try: real_prop = getattr(lom_object, prop_name) if not is_class(real_prop): prop_info = get_exposed_property_info(type(lom_object), prop_name, epii_version) prop_type = real_prop.__class__.__name__ if prop_info and prop_info.format == MFLPropertyFormats.JSON: self._properties.append((prop_name, 'dict')) elif prop_name in TUPLE_TYPES: self._add_list_of_children(prop_name) elif prop_name in PROPERTY_TYPES.keys(): self._add_child(real_prop, prop_name) elif prop_name == 'canonical_parent': if real_prop != None: self._children.append((prop_name, prop_type)) elif callable(real_prop): if not prop_name.endswith('_listener'): self._functions.append((prop_name, )) elif prop_type not in ('type', 'Enum'): info_type = 'int' if isinstance(real_prop, ENUM_TYPES) else prop_type self._properties.append((prop_name, info_type)) except (AssertionError, RuntimeError): pass return
def _find_property_object_path(self, lom_object, parent): component = None for key in PROPERTY_TYPES.keys(): if isinstance(lom_object, PROPERTY_TYPES[key]): if hasattr(parent, key): component = lom_object == getattr(parent, key) and key break return component
def _generate_property_info(self, prop_name, lom_object): try: real_prop = getattr(lom_object, prop_name) if not is_class(real_prop): prop_type = real_prop.__class__.__name__ if prop_name in TUPLE_TYPES: self._add_list_of_children(prop_name) elif prop_name in PROPERTY_TYPES.keys(): self._add_child(real_prop, prop_name) elif prop_name == 'canonical_parent': if real_prop != None: self._children.append((prop_name, prop_type)) elif callable(real_prop): if not prop_name.endswith('_listener'): self._functions.append((prop_name,)) elif prop_type not in ('type', 'Enum'): info_type = 'int' if isinstance(real_prop, ENUM_TYPES) else prop_type self._properties.append((prop_name, info_type)) except (AssertionError, RuntimeError): pass
def _set_property_value(self, lom_object, property_name, value): verify_object_property(lom_object, property_name, self.epii_version) prop = getattr(lom_object, property_name) prop_info = get_exposed_property_info(type(lom_object), property_name, self.epii_version) if prop_info and prop_info.from_json: value = prop_info.from_json(lom_object, value) if value is None: raise LomAttributeError('set: invalid value') elif property_name in PROPERTY_TYPES.keys(): if not is_lom_object(value, self.lom_classes): raise LomAttributeError('set: no valid object id') if not isinstance(value, PROPERTY_TYPES[property_name]): raise LomAttributeError('set: type mismatch') elif isinstance(prop, (int, bool)): if unicode(value) in (u'True', u'False'): value = int(unicode(value) == u'True') elif not isinstance(value, int): raise LomAttributeError('set: invalid value') elif isinstance(prop, float): if not isinstance(value, (int, float)): raise LomAttributeError('set: type mismatch') value = float(value) elif isinstance(prop, (str, unicode)): if not isinstance(value, (str, unicode, int, float)): raise LomAttributeError('set: type mismatch') value = unicode(value) elif isinstance(prop, tuple): prop_info = get_exposed_property_info(type(lom_object), property_name, self.epii_version) if prop_info and prop_info.format == MFLPropertyFormats.JSON: package = json.loads(value) value = tuple(package[property_name]) else: raise LomAttributeError('set: unsupported property type') else: raise LomAttributeError('set: unsupported property type') setattr(lom_object, property_name, value)