Skip to content

Commit 9188d2a

Browse files
bosdqwencoder
andcommitted
Refactor external ID field processing to eliminate side effects\n\n- Make _convert_external_id_field a pure function that returns (base_field_name, converted_value)\n instead of modifying converted_vals as a side effect\n- Update _process_external_id_fields to handle the return value properly\n- Improve separation of concerns between conversion logic and state management\n- Make the code more testable and easier to follow\n- Eliminate misleading variable name 'fields' that actually holds a single string\n\nThis refactoring improves the clarity and maintainability of the external ID field\nprocessing logic by following functional programming principles.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
1 parent 8227cf6 commit 9188d2a

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/odoo_data_flow/import_threaded.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -334,25 +334,23 @@ def _convert_external_id_field(
334334
model: Any,
335335
field_name: str,
336336
field_value: str,
337-
converted_vals: dict[str, Any],
338-
) -> str:
337+
) -> tuple[str, Any]:
339338
"""Convert an external ID field to a database ID.
340339
341340
Args:
342341
model: The Odoo model object
343342
field_name: The field name (e.g., 'parent_id/id')
344343
field_value: The external ID value
345-
converted_vals: Dictionary to store converted values
346344
347345
Returns:
348-
The external ID field name that was processed.
346+
Tuple of (base_field_name, converted_value)
349347
"""
350348
base_field_name = field_name[:-3] # Remove '/id' suffix
351349

352350
# Handle empty external ID references
353351
if not field_value:
354352
# Empty external ID means no value for this field
355-
converted_vals[base_field_name] = False
353+
converted_value = False
356354
log.debug(
357355
f"Converted empty external ID {field_name} -> {base_field_name} (False)"
358356
)
@@ -362,14 +360,14 @@ def _convert_external_id_field(
362360
# Look up the database ID for this external ID
363361
record_ref = model.browse().env.ref(field_value, raise_if_not_found=False)
364362
if record_ref:
365-
converted_vals[base_field_name] = record_ref.id
363+
converted_value = record_ref.id
366364
log.debug(
367365
f"Converted external ID {field_name} ({field_value}) -> "
368366
f"{base_field_name} ({record_ref.id})"
369367
)
370368
else:
371369
# If we can't find the external ID, set to False
372-
converted_vals[base_field_name] = False
370+
converted_value = False
373371
log.warning(
374372
f"Could not find record for external ID '{field_value}', "
375373
f"setting {base_field_name} to False"
@@ -380,9 +378,9 @@ def _convert_external_id_field(
380378
f"'{field_name}': {e}"
381379
)
382380
# On error, set to False
383-
converted_vals[base_field_name] = False
381+
converted_value = False
384382

385-
return field_name
383+
return base_field_name, converted_value
386384

387385

388386
def _process_external_id_fields(
@@ -404,10 +402,14 @@ def _process_external_id_fields(
404402
for field_name, field_value in clean_vals.items():
405403
# Handle external ID references (e.g., 'parent_id/id' -> 'parent_id')
406404
if field_name.endswith("/id"):
407-
fields = _convert_external_id_field(
408-
model, field_name, field_value, converted_vals
405+
# _convert_external_id_field is now a pure function that returns
406+
# (base_field_name, converted_value) instead of modifying
407+
# converted_vals as side effect
408+
base_name, value = _convert_external_id_field(
409+
model, field_name, field_value
409410
)
410-
external_id_fields.append(fields)
411+
converted_vals[base_name] = value
412+
external_id_fields.append(field_name)
411413
else:
412414
# Regular field - pass through as-is
413415
converted_vals[field_name] = field_value

0 commit comments

Comments
 (0)