File size: 2,984 Bytes
92bfe31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""
Migrate Grade 12 users to Grade 11.

Run this to convert all existing Grade 12 users to Grade 11:
    python backend/scripts/migrate_grade12_to_grade11.py

This handles:
- Firestore user profiles
- Progress records
- Any references to Grade 12
"""

import logging
import os
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

logger = logging.getLogger(__name__)


def migrate_grade_12_to_grade_11():
    """Migrate all Grade 12 users to Grade 11."""
    try:
        import firebase_admin
        from firebase_admin import firestore

        svc_account = os.getenv("FIREBASE_SERVICE_ACCOUNT_JSON")
        if svc_account:
            import json
            from firebase_admin import credentials
            creds = credentials.Certificate(json.loads(svc_account))
            firebase_admin.initialize_app(creds)
        else:
            firebase_admin.initialize_app()

        db = firestore.client()
        print("Firebase initialized")

    except Exception as e:
        print(f"Failed to initialize Firebase: {e}")
        return

    # Count migrations
    users_migrated = 0
    progress_migrated = 0

    # Migrate users collection
    print("\n--- Migrating users ---")
    users_ref = db.collection("users")
    
    # Batch update for users
    batch = db.batch()
    user_count = 0

    for doc in users_ref.stream():
        data = doc.to_dict()
        if data.get("grade") == "Grade 12":
            batch.update(doc.reference, {"grade": "Grade 11"})
            user_count += 1
            print(f"  Migrating user: {doc.id} ({data.get('name', 'Unknown')})")
            
            if user_count >= 500:
                batch.commit()
                users_migrated += user_count
                user_count = 0
                batch = db.batch()

    if user_count > 0:
        batch.commit()
        users_migrated += user_count

    print(f"  => Migrated {users_migrated} users to Grade 11")

    # Migrate progress collection
    print("\n--- Migrating progress ---")
    progress_ref = db.collection("progress")
    batch = db.batch()
    progress_count = 0

    for doc in progress_ref.stream():
        data = doc.to_dict()
        if data.get("gradeLevel") == "Grade 12":
            batch.update(doc.reference, {"gradeLevel": "Grade 11"})
            progress_count += 1
            
            if progress_count >= 500:
                batch.commit()
                progress_migrated += progress_count
                progress_count = 0
                batch = db.batch()

    if progress_count > 0:
        batch.commit()
        progress_migrated += progress_count

    print(f"  => Migrated {progress_migrated} progress records to Grade 11")

    print(f"\n=== Migration complete ===")
    print(f"Users migrated: {users_migrated}")
    print(f"Progress migrated: {progress_migrated}")


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    migrate_grade_12_to_grade_11()