@@ -139,3 +139,58 @@ def set_dict_recursive(d: dict | list, key: str, value: str):
139
139
for item in d :
140
140
if isinstance (item , dict ):
141
141
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