From 2631c549a5dd3169a27ee288578cf0809b87e15d Mon Sep 17 00:00:00 2001 From: KaySar12 Date: Wed, 19 Mar 2025 18:23:21 +0700 Subject: [PATCH] update --- setup/delete_records.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/setup/delete_records.py b/setup/delete_records.py index a46fc7b6f..bc54f728e 100755 --- a/setup/delete_records.py +++ b/setup/delete_records.py @@ -102,6 +102,7 @@ except Exception as e: skipped_models_cache = set() # Cache to store skipped models + def fetch_related_fields_for_model(model, base_model): """Fetch related fields for a single model with caching for skipped models.""" if model in skipped_models_cache: @@ -117,11 +118,16 @@ def fetch_related_fields_for_model(model, base_model): and field_info.get("relation") == base_model ): related_fields.setdefault(model, []).append(field_name) + except odoorpc.error.RPCError as e: + color_log.Show(FAIL, f"Access denied for model {model}: {e}") + skipped_models_cache.add(model) # Add to cache if access is denied + return {} except Exception as e: color_log.Show(NOTICE, f"Skipping model {model}: {e}") - skipped_models_cache.add(model) # Add to cache if an error occurs + skipped_models_cache.add(model) # Add to cache for any other errors return related_fields + # Function to fetch related models def get_related_fields(db_name, base_model): """Fetch related fields for a given model using multiprocessing.""" @@ -166,7 +172,7 @@ def get_related_fields(db_name, base_model): def delete_records_cascade( record_ids, model_name, process_count, related_models, db_name ): - """Iteratively delete related records before deleting the base records""" + """Iteratively delete related records before deleting the base records.""" # Stack for traversal: list of (model_name, record_ids) tuples stack = [(model_name, record_ids)] # Track visited records to avoid cycles: set of (model_name, record_id) tuples @@ -186,6 +192,10 @@ def delete_records_cascade( for related_model, fields in get_related_fields( db_name, current_model ).items(): + if related_model in skipped_models_cache: + color_log.Show(NOTICE, f"Skipping cached model {related_model}") + continue + related_model_obj = odoo.env[related_model] for field in fields: try: @@ -196,15 +206,22 @@ def delete_records_cascade( stack.append((related_model, related_ids)) has_dependents = True color_log.Show( - 3, + NOTICE, f"{process_count}: Found {len(related_ids)} related records in {related_model} ({field})", ) process_count += 1 except odoorpc.error.RPCError as e: color_log.Show( - 1, f"Access denied for model {related_model}: {e}" + FAIL, f"Access denied for model {related_model}: {e}" ) - continue + skipped_models_cache.add(related_model) # Add to cache + break # Skip further processing for this model + except Exception as e: + color_log.Show( + NOTICE, f"Skipping model {related_model} due to error: {e}" + ) + skipped_models_cache.add(related_model) # Add to cache + break # Skip further processing for this model if not has_dependents: deletion_order.append((current_model, current_ids)) @@ -223,7 +240,7 @@ def delete_records_cascade( # Now delete the main records after all dependencies are gone try: if record_ids: - odoo.env.browse(record_ids).unlink() + odoo.env[model_name].browse(record_ids).unlink() color_log.Show(OK, f"Deleted {len(record_ids)} records from {model_name}") except Exception as e: color_log.Show(FAIL, f"Error deleting {model_name} records: {e}")