@@ -139,3 +139,58 @@ def set_dict_recursive(d: dict | list, key: str, value: str):
139139 for item in d :
140140 if isinstance (item , dict ):
141141 set_dict_recursive (item , key , value )
142+
143+
144+ def set_field_recursive (obj : any , field_name : str , value : any ) -> None :
145+ """
146+ Recursively sets all fields with name 'field_name' to 'value' in the given object.
147+ Works with dictionaries, lists, Pydantic models, and other objects with attributes.
148+
149+ Args:
150+ obj: The object to traverse (dict, list, Pydantic model, or other object)
151+ field_name: The name of the field to set
152+ value: The value to set the field to
153+ """
154+ from pydantic import BaseModel
155+
156+ # Handle dictionary
157+ if isinstance (obj , dict ):
158+ for k , v in list (obj .items ()):
159+ if k == field_name :
160+ obj [k ] = value
161+ else :
162+ set_field_recursive (v , field_name , value )
163+
164+ # Handle list
165+ elif isinstance (obj , list ):
166+ for item in obj :
167+ set_field_recursive (item , field_name , value )
168+
169+ # Handle Pydantic models
170+ elif isinstance (obj , BaseModel ):
171+ # Get the model fields as a dict and process them
172+ data = obj .model_dump ()
173+ for k , v in data .items ():
174+ if k == field_name :
175+ setattr (obj , k , value )
176+ else :
177+ model_value = getattr (obj , k )
178+ set_field_recursive (model_value , field_name , value )
179+
180+ # # Handle other objects with attributes (non-primitive types)
181+ # elif hasattr(obj, "__dict__") and not isinstance(
182+ # obj, (str, int, float, bool, type(None))
183+ # ):
184+ # for k, v in list(obj.__dict__.items()):
185+ # if k == field_name:
186+ # setattr(obj, k, value)
187+ # else:
188+ # set_field_recursive(v, field_name, value)
189+
190+
191+ def set_created_by (obj : any , created_by : str ) -> None :
192+ """
193+ Recursively sets the 'created_by' field to the given value in the given object.
194+ """
195+ assert isinstance (created_by , str )
196+ set_field_recursive (obj , "created_by" , created_by )
0 commit comments