Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down
11 changes: 9 additions & 2 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
40 changes: 24 additions & 16 deletions app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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.
Expand All @@ -38,40 +39,47 @@ 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)
specialized_services = Column(Boolean)
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")
31 changes: 22 additions & 9 deletions initialize_data.py
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -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()
Expand All @@ -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()
Expand All @@ -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',
Expand All @@ -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']),
Expand Down Expand Up @@ -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()
initialize_database()