From 0b92875c00daaae819efb1c7f6b6fac846d5b6a2 Mon Sep 17 00:00:00 2001 From: KaySar12 Date: Wed, 19 Mar 2025 18:15:03 +0700 Subject: [PATCH] update --- setup/delete_records.py | 58 +++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/setup/delete_records.py b/setup/delete_records.py index 6b5f79bd0..a46fc7b6f 100755 --- a/setup/delete_records.py +++ b/setup/delete_records.py @@ -73,10 +73,13 @@ db_name = args.db_name base_model = args.base_model domain_str = args.domain process_size = args.process_size - +OK = 0 +FAIL = 1 +INFO = 2 +NOTICE = 3 # Odoo connection setup odoo = odoorpc.ODOO(HOST, port=PORT) -color_log.Show(2, ("Available databases:", odoo.db.list())) +color_log.Show(INFO, ("Available databases:", odoo.db.list())) # Login to Odoo try: @@ -86,19 +89,25 @@ try: f"Connected to Odoo at {HOST}:{PORT}, Database: {db_name}, Model: {base_model}", ) except Exception as e: - color_log.Show(1, f"Fail to Connect to Odoo Server {e}") + color_log.Show(FAIL, f"Fail to Connect to Odoo Server {e}") exit(1) # Convert DOMAIN from string to list try: domain_filter = ast.literal_eval(domain_str) except Exception as e: - color_log.Show(3, f"Invalid DOMAIN format: {e}") + color_log.Show(FAIL, f"Invalid DOMAIN format: {e}") exit(1) +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.""" + """Fetch related fields for a single model with caching for skipped models.""" + if model in skipped_models_cache: + color_log.Show(NOTICE, f"Skipping cached model {model}") + return {} + related_fields = {} try: fields = odoo.env[model].fields_get() @@ -109,10 +118,10 @@ def fetch_related_fields_for_model(model, base_model): ): related_fields.setdefault(model, []).append(field_name) except Exception as e: - color_log.Show(3, f"Skipping model {model}: {e}") + color_log.Show(NOTICE, f"Skipping model {model}: {e}") + skipped_models_cache.add(model) # Add to cache if an error occurs 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.""" @@ -123,7 +132,7 @@ def get_related_fields(db_name, base_model): related_models = json.load(f) return related_models - color_log.Show(2, f"Fetching related models for {base_model} from Odoo...") + color_log.Show(INFO, f"Fetching related models for {base_model} from Odoo...") related_models = {} try: @@ -150,7 +159,7 @@ def get_related_fields(db_name, base_model): return related_models except Exception as e: - color_log.Show(3, f"Error fetching related models: {e}") + color_log.Show(FAIL, f"Error fetching related models: {e}") return {} @@ -186,12 +195,15 @@ def delete_records_cascade( if related_ids: stack.append((related_model, related_ids)) has_dependents = True - print( - f"{process_count}: Found {len(related_ids)} related records in {related_model} ({field})" + color_log.Show( + 3, + f"{process_count}: Found {len(related_ids)} related records in {related_model} ({field})", ) process_count += 1 except odoorpc.error.RPCError as e: - print(f"Access denied for model {related_model}: {e}") + color_log.Show( + 1, f"Access denied for model {related_model}: {e}" + ) continue if not has_dependents: @@ -204,17 +216,17 @@ def delete_records_cascade( try: if del_ids: odoo.env[del_model].browse(del_ids).unlink() - color_log.Show(0, f"Deleted {len(del_ids)} records from {del_model}") + color_log.Show(OK, f"Deleted {len(del_ids)} records from {del_model}") except Exception as e: - color_log.Show(3, f"Error deleting {del_model} records: {e}") + color_log.Show(FAIL, f"Error deleting {del_model} records: {e}") # Now delete the main records after all dependencies are gone try: if record_ids: odoo.env.browse(record_ids).unlink() - color_log.Show(0, f"Deleted {len(record_ids)} records from {model_name}") + color_log.Show(OK, f"Deleted {len(record_ids)} records from {model_name}") except Exception as e: - color_log.Show(3, f"Error deleting {model_name} records: {e}") + color_log.Show(FAIL, f"Error deleting {model_name} records: {e}") # Function to delete records in parallel @@ -237,22 +249,22 @@ def process_batch(batch, model_name, process_count, related_models): model.browse(record_id).write({"active": False}) archived_count += 1 color_log.Show( - 2, f"{process_count}: Archived {model_name} ID {record_id}" + INFO, f"{process_count}: Archived {model_name} ID {record_id}" ) else: model.unlink([record_id]) deleted_count += 1 color_log.Show( - 2, f"{process_count}: Deleted {model_name} ID {record_id}" + INFO, f"{process_count}: Deleted {model_name} ID {record_id}" ) except Exception as e: skipped_count += 1 color_log.Show( - 3, f"{process_count}: Skipped {model_name} ID {record_id}: {e}" + INFO, f"{process_count}: Skipped {model_name} ID {record_id}: {e}" ) color_log.Show( - 0, + OK, f"{process_count}: {model_name} - Deleted: {deleted_count}, Archived: {archived_count}, Skipped: {skipped_count}.", ) @@ -261,12 +273,12 @@ def process_batch(batch, model_name, process_count, related_models): def main(): """Main function to fetch records and process them in parallel.""" model = odoo.env[base_model] - color_log.Show(2, f"{domain_filter}") + color_log.Show(INFO, f"{domain_filter}") record_ids = model.search(domain_filter) if not record_ids: color_log.Show( - 1, f"No records found for model {base_model} with the given domain." + FAIL, f"No records found for model {base_model} with the given domain." ) return @@ -301,7 +313,7 @@ def main(): for process in processes: process.join() - color_log.Show(0, "Record deletion process completed.") + color_log.Show(OK, "Record deletion process completed.") if __name__ == "__main__":