diff --git a/backfill_is_archived.py b/backfill_is_archived.py new file mode 100644 index 0000000..33cc66a --- /dev/null +++ b/backfill_is_archived.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +""" +One-off script to backfill is_archived field on all projects in Firestore. + +This sets is_archived = True for projects where phase_name == "Archived", +and is_archived = False for all other projects. + +Usage: + python backfill_is_archived.py +""" + +import os +from firebase_admin import credentials, initialize_app, firestore + +# Path to your staging service account JSON +CREDENTIALS_PATH = "./rothbard-staging2-12345-firebase-adminsdk-fbsvc-7f95268383.json" + +def main(): + # Initialize Firebase Admin with staging credentials + cred = credentials.Certificate(CREDENTIALS_PATH) + app = initialize_app(cred, name='backfill-is-archived') + db = firestore.client(app=app) + + projects_ref = db.collection("projects") + docs = list(projects_ref.stream()) + + total = len(docs) + archived_count = 0 + updated_count = 0 + batch_size = 500 + + print(f"Found {total} projects. Processing in batches of {batch_size}...") + + for i in range(0, total, batch_size): + batch = db.batch() + batch_docs = docs[i:i + batch_size] + + for doc in batch_docs: + data = doc.to_dict() + phase_name = data.get("phase_name", "") + is_archived = (phase_name == "Archived") + + if is_archived: + archived_count += 1 + + # Only update if the field is missing or different + if data.get("is_archived") != is_archived: + ref = projects_ref.document(doc.id) + batch.update(ref, {"is_archived": is_archived}) + updated_count += 1 + + batch.commit() + print(f" Committed batch {i//batch_size + 1}/{(total + batch_size - 1)//batch_size}") + + print(f"\nDone!") + print(f" Total projects: {total}") + print(f" Projects with phase_name == 'Archived': {archived_count}") + print(f" Documents updated: {updated_count}") + +if __name__ == "__main__": + main()