77from ravendb .documents .session .document_info import DocumentInfo
88from ravendb .documents .session .event_args import (
99 BeforeConversionToDocumentEventArgs ,
10- AfterConversionToDocumentEventArgs ,
10+ AfterConversionToDocumentEventArgs , BeforeConversionToEntityEventArgs , AfterConversionToEntityEventArgs ,
1111)
1212from ravendb .exceptions import exceptions
1313from ravendb .exceptions .exceptions import InvalidOperationException
@@ -72,10 +72,10 @@ def _convert_entity_to_json_internal(
7272
7373 # todo: refactor this method, make it more useful/simple and less ugly (like this return...[0])
7474 def convert_to_entity (
75- self , entity_type : Type [_T ], key : str , document : dict , track_entity : bool , nested_object_types = None
75+ self , entity_type : Type [_T ], key : str , document : dict , track_entity : bool
7676 ) -> _T :
7777 conventions = self ._session .conventions
78- return self .convert_to_entity_static (document , entity_type , conventions , nested_object_types )
78+ return self .convert_to_entity_static (document , entity_type , conventions , self . _session )
7979
8080 @staticmethod
8181 def populate_entity_static (entity , document : dict ) -> None :
@@ -148,25 +148,28 @@ def convert_to_entity_by_key_static(
148148
149149 @staticmethod
150150 def convert_to_entity_static (
151- document : dict , object_type : [_T ], conventions : "DocumentConventions" , nested_object_types = None
151+ document : dict , object_type : [_T ], conventions : "DocumentConventions" , session_hook : Optional [ "InMemoryDocumentSessionOperations" ] = None
152152 ) -> _T :
153153 metadata = document .pop ("@metadata" )
154154 document_deepcopy = deepcopy (document )
155155 type_from_metadata = conventions .try_get_type_from_metadata (metadata )
156156 is_inherit = False
157- # todo: events
158- # events.before_conversion_to_entity(document, metadata, type_from_metadata)
157+ key = metadata .get (constants .Documents .Metadata .ID , None )
158+ if session_hook :
159+ session_hook .before_conversion_to_entity_invoke (BeforeConversionToEntityEventArgs (session_hook ,key ,object_type ,document_deepcopy ))
159160
160161 if object_type == dict or type_from_metadata == "builtins.dict" :
161- # events.after_conversion_to_entity(document, document, metadata )
162+ session_hook . after_conversion_to_entity_invoke ( AfterConversionToEntityEventArgs ( session_hook , key , document_deepcopy , document_deepcopy ) )
162163 return document_deepcopy
163164
164165 if type_from_metadata is None :
165166 if object_type is not None :
166167 metadata ["Raven-Python-Type" ] = "{0}.{1}" .format (object_type .__module__ , object_type .__name__ )
167168 else : # no type defined on document or during load, return a dict
168169 dyn = _DynamicStructure (** document_deepcopy )
169- # events.after_conversion_to_entity(dyn, document, metadata)
170+ if session_hook :
171+ session_hook .after_conversion_to_entity_invoke (
172+ AfterConversionToEntityEventArgs (session_hook , key , document_deepcopy ,dyn ))
170173 return dyn
171174 else :
172175 object_from_metadata = Utils .import_class (type_from_metadata )
@@ -187,8 +190,9 @@ def convert_to_entity_static(
187190 if "from_json" in object_type .__dict__ and inspect .ismethod (object_type .from_json ):
188191 entity = object_type .from_json (document_deepcopy )
189192
190- elif nested_object_types is None and is_inherit :
193+ elif is_inherit :
191194 entity = Utils .convert_json_dict_to_object (document_deepcopy , object_type )
195+
192196 else :
193197 entity = _DynamicStructure (** document_deepcopy )
194198 entity .__class__ = object_type
@@ -197,33 +201,11 @@ def convert_to_entity_static(
197201 except TypeError as e :
198202 raise InvalidOperationException ("Probably projection error" , e )
199203
200- if nested_object_types :
201- for key in nested_object_types :
202- attr = getattr (entity , key )
203- if attr :
204- try :
205- if isinstance (attr , list ):
206- nested_list = []
207- for attribute in attr :
208- nested_list .append (Utils .initialize_object (attribute , nested_object_types [key ]))
209- setattr (entity , key , nested_list )
210- elif nested_object_types [key ] is datetime :
211- setattr (entity , key , Utils .string_to_datetime (attr ))
212- elif nested_object_types [key ] is timedelta :
213- setattr (entity , key , Utils .string_to_timedelta (attr ))
214- else :
215- setattr (
216- entity ,
217- key ,
218- Utils .initialize_object (attr , nested_object_types [key ]),
219- )
220- except TypeError as e :
221- print (e )
222- pass
223-
224204 if "Id" in entity .__dict__ :
225205 entity .Id = metadata .get ("@id" , None )
226- # events.after_conversion_to_entity(entity, document, metadata)
206+ if session_hook :
207+ session_hook .after_conversion_to_entity_invoke (
208+ AfterConversionToEntityEventArgs (session_hook , key , document_deepcopy , entity ))
227209 return entity
228210
229211 def remove_from_missing (self , entity ):
0 commit comments