feat: Enhance Python environment setup with system Python option and improve dependency installation
Some checks failed
Run Tests / e2e tests (push) Failing after 50s
Run Tests / lint tests (push) Failing after 1m53s
Run Tests / unit tests (push) Failing after 2m25s

refactor: Clean up imports in currencies and users routes
fix: Update theme settings saving logic and clean up test imports
This commit is contained in:
2025-10-27 18:39:20 +01:00
parent 7385bdad3e
commit 54137b88d7
8 changed files with 42 additions and 26 deletions

View File

@@ -5,30 +5,48 @@ inputs:
python-version:
description: Python version to install.
required: false
default: "3.10"
default: '3.10'
use-system-python:
description: Skip setup-python and rely on the system Python already available in the environment.
required: false
default: 'false'
install-playwright:
description: Install Playwright browsers when true.
required: false
default: "false"
default: 'false'
install-requirements:
description: Space-delimited list of requirement files to install.
required: false
default: "requirements.txt requirements-test.txt"
default: 'requirements.txt requirements-test.txt'
run-db-setup:
description: Run database wait and setup scripts when true.
required: false
default: "true"
default: 'true'
db-dry-run:
description: Execute setup script dry run before live run when true.
required: false
default: "true"
default: 'true'
runs:
using: composite
steps:
- name: Set up Python
if: ${{ inputs.use-system-python != 'true' }}
uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python-version }}
- name: Verify system Python
if: ${{ inputs.use-system-python == 'true' }}
shell: bash
run: |
set -euo pipefail
if ! command -v python >/dev/null 2>&1; then
echo "Python executable not found on PATH" >&2
exit 1
fi
python --version
python -m pip --version >/dev/null 2>&1 || python -m ensurepip --upgrade
python -m pip --version
- name: Configure apt proxy
shell: bash
run: |
@@ -59,7 +77,7 @@ runs:
if [ -n "${requirements}" ]; then
for requirement in ${requirements}; do
if [ -f "${requirement}" ]; then
pip install -r "${requirement}"
python -m pip install -r "${requirement}"
else
echo "Requirement file ${requirement} not found" >&2
exit 1

View File

@@ -58,6 +58,7 @@ jobs:
uses: ./.gitea/actions/setup-python-env
with:
install-playwright: ${{ matrix.target != 'e2e' }}
use-system-python: 'true'
- name: Run tests
run: |

View File

@@ -1,4 +1,4 @@
from typing import Dict, List, Optional
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query, status
from pydantic import BaseModel, ConfigDict, Field, field_validator

View File

@@ -101,7 +101,7 @@ class ThemeSettings(BaseModel):
@router.post("/theme")
async def update_theme(theme_data: ThemeSettings, db: Session = Depends(get_db)):
data_dict = theme_data.model_dump()
saved = save_theme_settings(db, data_dict)
save_theme_settings(db, data_dict)
return {"message": "Theme updated", "theme": data_dict}

View File

@@ -3,9 +3,15 @@ from sqlalchemy.orm import Session
from config.database import get_db
from models.user import User
from services.security import get_password_hash, verify_password, create_access_token, SECRET_KEY, ALGORITHM, get_current_user, oauth2_scheme
from jose import jwt, JWTError
from schemas.user import UserCreate, UserInDB, UserLogin, UserUpdate, PasswordResetRequest, PasswordReset, Token
from services.security import create_access_token, get_current_user
from schemas.user import (
PasswordReset,
PasswordResetRequest,
UserCreate,
UserInDB,
UserLogin,
UserUpdate,
)
router = APIRouter(prefix="/users", tags=["users"])
@@ -62,7 +68,7 @@ async def update_user_me(user_update: UserUpdate, current_user: User = Depends(g
if existing_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="Username already taken")
current_user.username = user_update.username
setattr(current_user, "username", user_update.username)
if user_update.email and user_update.email != current_user.email:
existing_user = db.query(User).filter(
@@ -70,7 +76,7 @@ async def update_user_me(user_update: UserUpdate, current_user: User = Depends(g
if existing_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered")
current_user.email = user_update.email
setattr(current_user, "email", user_update.email)
if user_update.password:
current_user.set_password(user_update.password)

View File

@@ -43,15 +43,14 @@ def backfill(
engine = create_engine(db_url)
with engine.begin() as conn:
# Ensure currency table exists
res = (
if db_url.startswith("sqlite:"):
conn.execute(
text(
"SELECT name FROM sqlite_master WHERE type='table' AND name='currency';"
)
)
if db_url.startswith("sqlite:")
else conn.execute(text("SELECT to_regclass('public.currency');"))
)
else:
conn.execute(text("SELECT to_regclass('public.currency');"))
# Note: we don't strictly depend on the above - we assume migration was already applied
# Helper: find or create currency by code

View File

@@ -16,8 +16,7 @@ from __future__ import annotations
import argparse
import logging
import os
from typing import Iterable, Optional
from typing import Optional
import psycopg2
from psycopg2 import errors

View File

@@ -1,15 +1,8 @@
import pytest
from sqlalchemy.orm import Session
from fastapi.testclient import TestClient
from main import app
from models.theme_setting import ThemeSetting
from services.settings import save_theme_settings, get_theme_settings
client = TestClient(app)
def test_save_theme_settings(db_session: Session):
theme_data = {
"theme_name": "dark",