#!/usr/bin/env python3
"""
Migration script for SMS + Call connector tables.
Creates the following tables if they don't exist:
- sms_messages
- calls
- lead_touchpoints
- opt_outs
Usage:
python scripts/migrate_sms_tables.py [--db-path /path/to/auth.db]
This uses SQLAlchemy's db.create_all() pattern to add missing tables
without affecting existing data.
"""
import argparse
import os
import sys
def main():
parser = argparse.ArgumentParser(description='Create SMS/Call database tables')
parser.add_argument('--db-path', default=None, help='Path to auth.db (default: auto-detect)')
args = parser.parse_args()
# Add project root to path
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, project_root)
# Set up environment
if args.db_path:
os.environ['DATABASE_URL'] = f'sqlite:///{args.db_path}'
else:
# Default location
db_path = os.path.join(project_root, 'instance', 'auth.db')
if os.path.exists(db_path):
os.environ['DATABASE_URL'] = f'sqlite:///{db_path}'
else:
# Check alternative location
db_path = os.path.join(project_root, 'auth.db')
if os.path.exists(db_path):
os.environ['DATABASE_URL'] = f'sqlite:///{db_path}'
# Create app context
from app import create_app
from app.models import db
app = create_app()
with app.app_context():
# Tables to create (in order of dependencies)
from app.models import SmsMessage, Call, LeadTouchpoint, OptOut
tables = [SmsMessage, Call, LeadTouchpoint, OptOut]
created = []
skipped = []
for model in tables:
table_name = model.__tablename__
# Check if table already exists
inspector = db.inspect(db.engine)
if table_name in inspector.get_table_names():
skipped.append(table_name)
print(f' ✓ {table_name} already exists — skipped')
else:
db.create_all(table=[model])
created.append(table_name)
print(f' + Created table: {table_name}')
print(f'\nMigration complete: {len(created)} created, {len(skipped)} skipped')
if created:
print(f' Created: {", ".join(created)}')
if skipped:
print(f' Skipped: {", ".join(skipped)}')
if __name__ == '__main__':
main()