80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Migration script to update subscriber categories
|
|
Ensures all subscribers have all available categories if they're missing some
|
|
"""
|
|
from pymongo import MongoClient
|
|
from config import Config
|
|
from database import subscribers_collection, rss_feeds_collection
|
|
|
|
def migrate_subscriber_categories():
|
|
"""Update all subscribers to have all available categories"""
|
|
|
|
print("\n" + "="*70)
|
|
print("📧 Subscriber Categories Migration")
|
|
print("="*70)
|
|
|
|
# Get all available categories from RSS feeds
|
|
available_categories = list(rss_feeds_collection.distinct('category'))
|
|
available_categories.sort()
|
|
|
|
print(f"\n✓ Available categories: {available_categories}")
|
|
|
|
# Get all subscribers
|
|
all_subscribers = list(subscribers_collection.find({}))
|
|
print(f"✓ Found {len(all_subscribers)} total subscribers")
|
|
|
|
updated_count = 0
|
|
no_change_count = 0
|
|
|
|
for subscriber in all_subscribers:
|
|
email = subscriber['email']
|
|
current_categories = subscriber.get('categories', [])
|
|
|
|
# Check if subscriber is missing any categories
|
|
if not current_categories:
|
|
# No categories set - give them all
|
|
print(f"\n {email}: No categories → Adding all {available_categories}")
|
|
subscribers_collection.update_one(
|
|
{'email': email},
|
|
{'$set': {'categories': available_categories}}
|
|
)
|
|
updated_count += 1
|
|
elif set(current_categories) != set(available_categories):
|
|
# Has some categories but not all
|
|
missing = set(available_categories) - set(current_categories)
|
|
print(f"\n {email}: {current_categories} → Adding all {available_categories}")
|
|
print(f" Missing: {list(missing)}")
|
|
subscribers_collection.update_one(
|
|
{'email': email},
|
|
{'$set': {'categories': available_categories}}
|
|
)
|
|
updated_count += 1
|
|
else:
|
|
# Already has all categories
|
|
no_change_count += 1
|
|
|
|
print("\n" + "="*70)
|
|
print("📊 Migration Complete")
|
|
print("="*70)
|
|
print(f"✓ Updated: {updated_count} subscribers")
|
|
print(f"✓ No change needed: {no_change_count} subscribers")
|
|
print(f"✓ Total: {len(all_subscribers)} subscribers")
|
|
print("="*70 + "\n")
|
|
|
|
return {
|
|
'total': len(all_subscribers),
|
|
'updated': updated_count,
|
|
'no_change': no_change_count
|
|
}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
result = migrate_subscriber_categories()
|
|
print(f"✅ Migration successful!")
|
|
except Exception as e:
|
|
print(f"\n❌ Migration failed: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|