@@ -80,12 +80,13 @@ def save_entity(self, key, entity, original_metadata, metadata, document, force_
8080 "original_metadata" : original_metadata , "etag" : metadata .get ("etag" , None ), "key" : key ,
8181 "force_concurrency_check" : force_concurrency_check }
8282
83- def _convert_and_save_entity (self , key , document , object_type ):
83+ def _convert_and_save_entity (self , key , document , object_type , nested_object_types ):
8484 if key not in self ._entities_by_key :
85- entity , metadata , original_metadata = Utils .convert_to_entity (document , object_type , self .conventions )
85+ entity , metadata , original_metadata = Utils .convert_to_entity (document , object_type , self .conventions ,
86+ nested_object_types )
8687 self .save_entity (key , entity , original_metadata , metadata , document )
8788
88- def _multi_load (self , keys , object_type , includes ):
89+ def _multi_load (self , keys , object_type , includes , nested_object_types ):
8990 if len (keys ) == 0 :
9091 return []
9192
@@ -94,7 +95,7 @@ def _multi_load(self, keys, object_type, includes):
9495 ids_in_includes = [key for key in keys if key in self ._includes ]
9596 if len (ids_in_includes ) > 0 :
9697 for include in ids_in_includes :
97- self ._convert_and_save_entity (include , self ._includes [include ], object_type )
98+ self ._convert_and_save_entity (include , self ._includes [include ], object_type , nested_object_types )
9899 self ._includes .pop (include )
99100
100101 ids_of_not_existing_object = [key for key in keys if
@@ -112,19 +113,22 @@ def _multi_load(self, keys, object_type, includes):
112113 if results [i ] is None :
113114 self ._known_missing_ids .add (ids_of_not_existing_object [i ])
114115 continue
115- self ._convert_and_save_entity (keys [i ], results [i ], object_type )
116+ self ._convert_and_save_entity (keys [i ], results [i ], object_type , nested_object_types )
116117 self .save_includes (response_includes )
117118 return [None if key in self ._known_missing_ids else self ._entities_by_key [
118119 key ] if key in self ._entities_by_key else None for key in keys ]
119120
120- def load (self , key_or_keys , object_type = None , includes = None ):
121+ def load (self , key_or_keys , object_type = None , includes = None , nested_object_types = None ):
121122 """
122123 @param key_or_keys: Identifier of a document that will be loaded.
123124 :type str or list
124125 @param includes: The path to a reference inside the loaded documents can be list (property name)
125126 :type list or str
126- @param object_type:the class we want to get
127+ @param object_type: The class we want to get
127128 :type classObj:
129+ @param nested_object_types: A dict of classes for nested object the key will be the name of the class and the
130+ value will be the object we want to get for that attribute
131+ :type str
128132 @return: instance of object_type or None if document with given Id does not exist.
129133 :rtype:object_type or None
130134 """
@@ -134,15 +138,16 @@ def load(self, key_or_keys, object_type=None, includes=None):
134138 includes = [includes ]
135139
136140 if isinstance (key_or_keys , list ):
137- return self ._multi_load (key_or_keys , object_type , includes )
141+ return self ._multi_load (key_or_keys , object_type , includes , nested_object_types )
138142
139143 if key_or_keys in self ._known_missing_ids :
140144 return None
141145 if key_or_keys in self ._entities_by_key and not includes :
142146 return self ._entities_by_key [key_or_keys ]
143147
144148 if key_or_keys in self ._includes :
145- self ._convert_and_save_entity (key_or_keys , self ._includes [key_or_keys ], object_type )
149+ self ._convert_and_save_entity (key_or_keys , self ._includes [key_or_keys ], object_type ,
150+ nested_object_types )
146151 self ._includes .pop (key_or_keys )
147152 if not includes :
148153 return self ._entities_by_key [key_or_keys ]
@@ -155,7 +160,7 @@ def load(self, key_or_keys, object_type=None, includes=None):
155160 if len (result ) == 0 or result [0 ] is None :
156161 self ._known_missing_ids .add (key_or_keys )
157162 return None
158- self ._convert_and_save_entity (key_or_keys , result [0 ], object_type )
163+ self ._convert_and_save_entity (key_or_keys , result [0 ], object_type , nested_object_types )
159164 self .save_includes (response_includes )
160165 return self ._entities_by_key [key_or_keys ] if key_or_keys in self ._entities_by_key else None
161166
@@ -310,13 +315,13 @@ def _prepare_for_puts_commands(self, data):
310315 data .entities .append (entity )
311316 if key is not None :
312317 self ._entities_by_key .pop (key )
313- document = entity .__dict__
318+ document = entity .__dict__ . copy ()
314319 document .pop ('Id' , None )
315320 data .commands .append (commands_data .PutCommandData (key , etag , document , metadata ))
316321
317322 def _has_change (self , entity ):
318- if self ._entities_and_metadata [entity ]["original_metadata" ] != self ._entities_and_metadata [entity ][
319- "metadata" ] or self ._entities_and_metadata [entity ]["original_value" ] != entity .__dict__ :
323+ if self ._entities_and_metadata [entity ]["original_metadata" ] != self ._entities_and_metadata [entity ]["metadata" ] \
324+ or self ._entities_and_metadata [entity ]["original_value" ] != entity .__dict__ :
320325 return True
321326 return False
322327
0 commit comments