From b2651256567b1a9eb954351e42d7347e0a0a0a43 Mon Sep 17 00:00:00 2001 From: Kevin Bataille Date: Mon, 16 Feb 2026 16:36:51 +0100 Subject: [PATCH] Fix category_apply - Filter by site and show article titles - Filter proposals by current_site (only applies to selected site) - Show article title for each post - Show current and proposed categories - Better error logging Co-authored-by: Qwen-Coder --- src/seo/category_manager.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/seo/category_manager.py b/src/seo/category_manager.py index 3807184..4c318d9 100644 --- a/src/seo/category_manager.py +++ b/src/seo/category_manager.py @@ -340,7 +340,7 @@ class CategoryAssignmentProcessor: Args: proposals: List of proposal dicts from CSV - site_name: Site to apply changes to + site_name: Site to apply changes to (filters proposals) confidence_threshold: Minimum confidence to apply (High, Medium, Low) dry_run: If True, don't actually make changes @@ -354,6 +354,13 @@ class CategoryAssignmentProcessor: if dry_run: logger.info("DRY RUN - No changes will be made") + # Filter by site + original_count = len(proposals) + proposals = [p for p in proposals if p.get('current_site', '') == site_name] + filtered_by_site = original_count - len(proposals) + + logger.info(f"Filtered to {len(proposals)} posts on {site_name} ({filtered_by_site} excluded from other sites)") + # Filter by confidence confidence_order = {'High': 3, 'Medium': 2, 'Low': 1} min_confidence = confidence_order.get(confidence_threshold, 2) @@ -370,20 +377,23 @@ class CategoryAssignmentProcessor: # Process each proposal for i, proposal in enumerate(filtered_proposals, 1): - logger.info(f"\n[{i}/{len(filtered_proposals)}] Processing post {proposal.get('post_id')}...") - - post_id = int(proposal.get('post_id', 0)) + post_title = proposal.get('title', 'Unknown')[:60] + post_id = proposal.get('post_id', '') proposed_category = proposal.get('proposed_category', '') current_categories = proposal.get('current_categories', '') confidence = proposal.get('category_confidence', 'Medium') + logger.info(f"\n[{i}/{len(filtered_proposals)}] Post {post_id}: {post_title}...") + logger.info(f" Current categories: {current_categories}") + logger.info(f" Proposed: {proposed_category} (confidence: {confidence})") + if not post_id or not proposed_category: logger.warning(" Skipping: Missing post_id or proposed_category") self.processing_stats['errors'] += 1 continue if dry_run: - logger.info(f" Would assign to: {proposed_category}") + logger.info(f" [DRY RUN] Would assign to: {proposed_category}") continue # Get or create the category @@ -404,9 +414,10 @@ class CategoryAssignmentProcessor: logger.info(f" ✓ Assigned to '{proposed_category}'") else: self.processing_stats['errors'] += 1 + logger.error(f" ✗ Failed to assign category") else: self.processing_stats['errors'] += 1 - logger.error(f" Failed to get/create category '{proposed_category}'") + logger.error(f" ✗ Failed to get/create category '{proposed_category}'") self.processing_stats['total_posts'] = len(filtered_proposals)