From f478a52a2fb40460861e0e79c7ef2a0a2619a610 Mon Sep 17 00:00:00 2001 From: Joshua Salako Date: Mon, 9 Jun 2025 12:45:54 +0100 Subject: [PATCH] Update configuration and ignore files; added openpyxl to requirements --- .dockerignore | 3 +- .gitignore | 1 + demo/Transaction_test_sample.xls | Bin 0 -> 98304 bytes demo/upload_xls.py | 128 +++++++++++++++++++++++++++++++ requirements.txt | 3 +- salary_analytics/config.py | 10 +-- 6 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 demo/Transaction_test_sample.xls create mode 100644 demo/upload_xls.py diff --git a/.dockerignore b/.dockerignore index 85f64d5..5906c98 100644 --- a/.dockerignore +++ b/.dockerignore @@ -42,4 +42,5 @@ output/ # Local development .env -.env.local \ No newline at end of file +.env.local +.vscode/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 889671b..05ab7ce 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ __pycache__/* output/* .idea/* salary_analytics/__pycache__/* +.vscode/* diff --git a/demo/Transaction_test_sample.xls b/demo/Transaction_test_sample.xls new file mode 100644 index 0000000000000000000000000000000000000000..aee502a21dba1116c2f29dc1783f16a6d2b6e9a1 GIT binary patch literal 98304 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 XtU(<@kb!@$KG**X{=@vi^7;P") + sys.exit(1) + + xls_path = sys.argv[1] + upload_xls_to_db(xls_path) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c7e2327..b2d72d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,5 @@ uvicorn>=0.15.0 pydantic>=1.8.0 python-multipart>=0.0.5 python-dotenv>=0.19.0 -joblib>=1.1.0 \ No newline at end of file +joblib>=1.1.0 +openpyxl>=3.0.10 \ No newline at end of file diff --git a/salary_analytics/config.py b/salary_analytics/config.py index 0e3d36c..8277286 100644 --- a/salary_analytics/config.py +++ b/salary_analytics/config.py @@ -23,11 +23,11 @@ os.makedirs(MODEL_DIR, exist_ok=True) # Database Configuration DB_CONFIG = { - "user": os.getenv("DB_USER", "salaryloan"), # Default value as fallback - "password": os.getenv("DB_PASSWORD", "salaryloan"), - "name": os.getenv("DB_NAME", "salaryloan"), - "port": os.getenv("DB_PORT", "10532"), - "host": os.getenv("DB_HOST", "dev-data.simbrellang.net") + "user": os.getenv("DB_USER"), # Default value as fallback + "password": os.getenv("DB_PASSWORD"), + "name": os.getenv("DB_NAME"), + "port": os.getenv("DB_PORT"), + "host": os.getenv("DB_HOST") } # Table Configuration