diff --git a/app/database.py b/app/database.py index 3a489f54..12edc608 100644 --- a/app/database.py +++ b/app/database.py @@ -8,7 +8,7 @@ from sqlalchemy.orm import sessionmaker #Here is where the database is located -SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db" +SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db" #Open up a connection so that we are able to use the database engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}) diff --git a/app/main.py b/app/main.py index a8e8fa7f..afb26b20 100644 --- a/app/main.py +++ b/app/main.py @@ -4,18 +4,25 @@ Handles database initialization and CORS middleware configuration. """ +# Standard library imports (if any) + +# Third-party imports from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# Local application imports from app import models from app.database import engine from app.clients.router import router as clients_router from app.auth.router import router as auth_router -from fastapi.middleware.cors import CORSMiddleware + # Initialize database tables models.Base.metadata.create_all(bind=engine) # Create FastAPI application -app = FastAPI(title="Case Management API", description="API for managing client cases", version="1.0.0") +app = FastAPI(title="Case Management API", + description="API for managing client cases", version="1.0.0") # Include routers app.include_router(auth_router) diff --git a/app/models.py b/app/models.py index df778348..ea16d87a 100644 --- a/app/models.py +++ b/app/models.py @@ -2,18 +2,19 @@ Database models module defining SQLAlchemy ORM models for the Common Assessment Tool. Contains the Client model for storing client information in the database. """ - -from app.database import Base +import enum from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, CheckConstraint, Enum from sqlalchemy.orm import relationship -import enum +from app.database import Base +# pylint: disable=C0103, R0903, C0301, C0303, C0114 class UserRole(str, enum.Enum): + """ Class for UserRole""" admin = "admin" case_worker = "case_worker" - class User(Base): + """ Class for User""" __tablename__ = "users" id = Column(Integer, primary_key=True, autoincrement=True) @@ -23,7 +24,7 @@ class User(Base): role = Column(Enum(UserRole), nullable=False) cases = relationship("ClientCase", back_populates="user") - + class Client(Base): """ Client model representing client data in the database. @@ -38,32 +39,38 @@ class Client(Base): dep_num = Column(Integer, CheckConstraint('dep_num >= 0')) canada_born = Column(Boolean) citizen_status = Column(Boolean) - level_of_schooling = Column(Integer, CheckConstraint('level_of_schooling >= 1 AND level_of_schooling <= 14')) + level_of_schooling = Column(Integer, CheckConstraint( + 'level_of_schooling >= 1 AND level_of_schooling <= 14')) fluent_english = Column(Boolean) - reading_english_scale = Column(Integer, CheckConstraint('reading_english_scale >= 0 AND reading_english_scale <= 10')) - speaking_english_scale = Column(Integer, CheckConstraint('speaking_english_scale >= 0 AND speaking_english_scale <= 10')) - writing_english_scale = Column(Integer, CheckConstraint('writing_english_scale >= 0 AND writing_english_scale <= 10')) - numeracy_scale = Column(Integer, CheckConstraint('numeracy_scale >= 0 AND numeracy_scale <= 10')) - computer_scale = Column(Integer, CheckConstraint('computer_scale >= 0 AND computer_scale <= 10')) + reading_english_scale = Column(Integer, CheckConstraint( + 'reading_english_scale >= 0 AND reading_english_scale <= 10')) + speaking_english_scale = Column(Integer, CheckConstraint( + 'speaking_english_scale >= 0 AND speaking_english_scale <= 10')) + writing_english_scale = Column(Integer, CheckConstraint( + 'writing_english_scale >= 0 AND writing_english_scale <= 10')) + numeracy_scale = Column(Integer, CheckConstraint( + 'numeracy_scale >= 0 AND numeracy_scale <= 10')) + computer_scale = Column(Integer, CheckConstraint( + 'computer_scale >= 0 AND computer_scale <= 10')) transportation_bool = Column(Boolean) caregiver_bool = Column(Boolean) housing = Column(Integer, CheckConstraint('housing >= 1 AND housing <= 10')) - income_source = Column(Integer, CheckConstraint('income_source >= 1 AND income_source <= 11')) + income_source = Column(Integer, CheckConstraint( + 'income_source >= 1 AND income_source <= 11')) felony_bool = Column(Boolean) attending_school = Column(Boolean) currently_employed = Column(Boolean) substance_use = Column(Boolean) time_unemployed = Column(Integer, CheckConstraint('time_unemployed >= 0')) need_mental_health_support_bool = Column(Boolean) - cases = relationship("ClientCase", back_populates="client") - + class ClientCase(Base): + """ Class for ClientBase""" __tablename__ = "client_cases" client_id = Column(Integer, ForeignKey("clients.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) - employment_assistance = Column(Boolean) life_stabilization = Column(Boolean) retention_services = Column(Boolean) @@ -71,7 +78,8 @@ class ClientCase(Base): employment_related_financial_supports = Column(Boolean) employer_financial_supports = Column(Boolean) enhanced_referrals = Column(Boolean) - success_rate = Column(Integer, CheckConstraint('success_rate >= 0 AND success_rate <= 100')) + success_rate = Column(Integer, CheckConstraint( + 'success_rate >= 0 AND success_rate <= 100')) client = relationship("Client", back_populates="cases") user = relationship("User", back_populates="cases") diff --git a/initialize_data.py b/initialize_data.py index 1444bf41..9b44ac52 100644 --- a/initialize_data.py +++ b/initialize_data.py @@ -1,10 +1,19 @@ +""" +Module for initializing the database with default users and client data from a CSV file. +It creates an admin user, a case worker, and populates the database with client information +and associated case data from a CSV file. +""" +# pylint: disable=C0301, C0305, W0718, E1101 import pandas as pd -from sqlalchemy.orm import Session from app.database import SessionLocal from app.models import Client, User, ClientCase, UserRole from app.auth.router import get_password_hash def initialize_database(): + """ + Initializes the database by creating default users (admin and case worker) and loading + client data from a CSV file into the database. + """ print("Starting database initialization...") db = SessionLocal() try: @@ -15,7 +24,7 @@ def initialize_database(): username="admin", email="admin@example.com", hashed_password=get_password_hash("admin123"), - role=UserRole.admin + role=UserRole.ADMIN ) db.add(admin_user) db.commit() @@ -30,7 +39,7 @@ def initialize_database(): username="case_worker1", email="caseworker1@example.com", hashed_password=get_password_hash("worker123"), - role=UserRole.case_worker + role=UserRole.CASE_WORKER ) db.add(case_worker) db.commit() @@ -41,8 +50,8 @@ def initialize_database(): # Load CSV data print("Loading CSV data...") df = pd.read_csv('app/clients/service/data_commontool.csv') - - # Convert data types + + # Convert data types for integer columns integer_columns = [ 'age', 'gender', 'work_experience', 'canada_workex', 'dep_num', 'level_of_schooling', 'reading_english_scale', 'speaking_english_scale', @@ -52,8 +61,8 @@ def initialize_database(): for col in integer_columns: df[col] = pd.to_numeric(df[col], errors='raise') - # Process each row in CSV - for index, row in df.iterrows(): + # Process each row in the CSV and create client and client_case + for _, row in df.iterrows(): # Using _ to discard the unused 'index' variable # Create client client = Client( age=int(row['age']), @@ -102,11 +111,15 @@ def initialize_database(): print("Database initialization completed successfully!") - except Exception as e: + except (FileNotFoundError, ValueError) as e: print(f"Error during initialization: {e}") db.rollback() + except Exception as e: + print(f"Unexpected error: {e}") + db.rollback() finally: db.close() if __name__ == "__main__": - initialize_database() \ No newline at end of file + initialize_database() +