diff --git a/app/core/config.py b/app/core/config.py index 8895b77..0e907ba 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -1,5 +1,5 @@ import os -from pydantic import BaseSettings +from pydantic_settings import BaseSettings class Settings(BaseSettings): PROJECT_NAME: str = "School Portal API" diff --git a/app/db/init_db.py b/app/db/init_db.py new file mode 100644 index 0000000..fae6df7 --- /dev/null +++ b/app/db/init_db.py @@ -0,0 +1,25 @@ +from sqlalchemy.orm import Session +from app.db.session import engine +from app.db.base import Base +from app.models import user, class_model, subject, grade, attendance, notification +from app.core.config import settings +from app.services.user import user_service +from app.schemas.user import UserCreate +from app.models.user import UserRole + +def init_db(db: Session) -> None: + # Create tables + Base.metadata.create_all(bind=engine) + + # Create initial superuser + user = user_service.get_by_email(db, email=settings.FIRST_SUPERUSER_EMAIL) + if not user: + user_in = UserCreate( + email=settings.FIRST_SUPERUSER_EMAIL, + password=settings.FIRST_SUPERUSER_PASSWORD, + first_name="System", + last_name="Administrator", + role=UserRole.ADMIN, + is_active=True + ) + user = user_service.create(db, obj_in=user_in) \ No newline at end of file diff --git a/main.py b/main.py index 7ea477f..92854de 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,21 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from contextlib import asynccontextmanager from app.api.v1.api import api_router from app.core.config import settings +from app.db.session import SessionLocal +from app.db.init_db import init_db + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + db = SessionLocal() + try: + init_db(db) + finally: + db.close() + yield + # Shutdown app = FastAPI( title=settings.PROJECT_NAME, @@ -9,7 +23,8 @@ app = FastAPI( description="School Portal API - A comprehensive school management system", openapi_url="/openapi.json", docs_url="/docs", - redoc_url="/redoc" + redoc_url="/redoc", + lifespan=lifespan ) app.add_middleware( diff --git a/requirements.txt b/requirements.txt index 126f72a..c5b3192 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ uvicorn[standard]==0.24.0 sqlalchemy==2.0.23 alembic==1.12.1 pydantic[email]==2.5.0 +pydantic-settings==2.1.0 python-jose[cryptography]==3.3.0 passlib[bcrypt]==1.7.4 python-multipart==0.0.6 diff --git a/test_imports.py b/test_imports.py new file mode 100644 index 0000000..1604d2c --- /dev/null +++ b/test_imports.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +"""Test script to verify all imports work correctly.""" + +try: + print("Testing core imports...") + from app.core.config import settings + print("✓ Config imported successfully") + + from app.core.security import create_access_token + print("✓ Security imported successfully") + + print("Testing database imports...") + from app.db.base import Base + from app.db.session import SessionLocal, engine + print("✓ Database imports successful") + + print("Testing model imports...") + from app.models import User, Class, Subject, Grade, Attendance, Notification + print("✓ All models imported successfully") + + print("Testing schema imports...") + from app.schemas import User as UserSchema, Token + print("✓ All schemas imported successfully") + + print("Testing service imports...") + from app.services.user import user_service + print("✓ All services imported successfully") + + print("Testing API imports...") + from app.api.v1.api import api_router + print("✓ API router imported successfully") + + print("Testing main application...") + from main import app + print("✓ Main application imported successfully") + + print("\n🎉 All imports successful! Application should start correctly.") + +except Exception as e: + print(f"❌ Import error: {e}") + import traceback + traceback.print_exc() \ No newline at end of file