def _map_field(self, key, value): if self._current.has_key(key): self._current[value] = self._current[key] del self._current[key] elif SEPARATOR in key and self._current.has_key(key.split(SEPARATOR)[0]): key_list = key.split(SEPARATOR) # Skip if the FK or M2M relation is blank. if not self._current[key_list[0]]: return if SEPARATOR in value: value_list = value.split(SEPARATOR) # Test if the key is valid to generate nice errors. try: traverse_dict(self._current, key_list) except KeyError, e: try: traverse_dict(self._current, value_list) except KeyError, e: raise SerializationError("Invalid key '%s' in map_fields. Did you add '%s' to the inline fields?" % (key, key_list[0])) if key_list[0] == value_list[0]: # If the value is a ForeignKey as well (contains the SEPARATOR) # we don't handle it here. It will be handled during the # serialization of the inline element. return else: # Crossmapping between different ForeignKey objects # is currently not supported. raise SerializationError("Crossmapping between different ForeignKey fields is currently not supported.")
def reverse_map_fields(self, objects=None): if not objects: objects = self.objects if not self.map_fields: return for k,v in self.map_fields.items(): source, target = {}, {} source_keys = v.split(SEPARATOR) target_keys = k.split(SEPARATOR) try: source = traverse_dict(objects[0], source_keys, return_parent=True) except KeyError: continue for obj in objects: create_tree_with_val(obj, target_keys, source[source_keys[-1]]) del source[source_keys[-1]]
def testTraverseListReturnParent(self): self.assertEqual( traverse_dict(self.d_list, ["a", "b", "c"], return_parent=True), [{"c": "value1"}, {"c": "value2"}] )
def testTraverseList2(self): self.assertEqual(traverse_dict(self.d_list, ["a", "b"]), [{"c": "value1"}, {"c": "value2"}])
def testTraverseList(self): self.assertEqual(traverse_dict(self.d_list, ["a", "b", "c"]), ["value1", "value2"])
def testTraverseSimpleReturnParent(self): self.assertEqual(traverse_dict(self.d, ["a", "b", "c"], return_parent=True), {"c": "value"})
def testTraverseSimple2(self): self.assertEqual(traverse_dict(self.d, ["a", "b"]), {"c": "value"})
def testTraverseSimple(self): self.assertEqual(traverse_dict(self.d, ["a", "b", "c"]), "value")