refactor: modernize code quality tooling with Ruff

- Replace black, isort, and flake8 with Ruff (all-in-one linter and formatter)
- Add comprehensive pyproject.toml configuration
- Simplify Makefile code quality targets
- Configure exclusions for venv/.venv in pyproject.toml
- Auto-fix 1,359 linting issues across codebase

Benefits:
- Much faster builds (Ruff is written in Rust)
- Single tool replaces multiple tools
- More comprehensive rule set (UP, B, C4, SIM, PIE, RET, Q)
- All configuration centralized in pyproject.toml
- Better import sorting and formatting consistency

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-28 19:37:38 +01:00
parent 21c13ca39b
commit 238c1ec9b8
169 changed files with 2183 additions and 1784 deletions

View File

@@ -10,17 +10,23 @@ This module provides functions for:
import json
import logging
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional
from datetime import UTC, datetime
from typing import Any
from sqlalchemy import func
from sqlalchemy.orm import Session
from app.exceptions import (AdminOperationException, ResourceNotFoundException,
ValidationException)
from app.exceptions import (
AdminOperationException,
ResourceNotFoundException,
ValidationException,
)
from models.database.admin import AdminSetting
from models.schema.admin import (AdminSettingCreate, AdminSettingResponse,
AdminSettingUpdate)
from models.schema.admin import (
AdminSettingCreate,
AdminSettingResponse,
AdminSettingUpdate,
)
logger = logging.getLogger(__name__)
@@ -28,7 +34,7 @@ logger = logging.getLogger(__name__)
class AdminSettingsService:
"""Service for managing platform-wide settings."""
def get_setting_by_key(self, db: Session, key: str) -> Optional[AdminSetting]:
def get_setting_by_key(self, db: Session, key: str) -> AdminSetting | None:
"""Get setting by key."""
try:
return (
@@ -60,14 +66,13 @@ class AdminSettingsService:
try:
if setting.value_type == "integer":
return int(setting.value)
elif setting.value_type == "float":
if setting.value_type == "float":
return float(setting.value)
elif setting.value_type == "boolean":
if setting.value_type == "boolean":
return setting.value.lower() in ("true", "1", "yes")
elif setting.value_type == "json":
if setting.value_type == "json":
return json.loads(setting.value)
else:
return setting.value
return setting.value
except Exception as e:
logger.error(f"Failed to convert setting {key} value: {str(e)}")
return default
@@ -75,9 +80,9 @@ class AdminSettingsService:
def get_all_settings(
self,
db: Session,
category: Optional[str] = None,
is_public: Optional[bool] = None,
) -> List[AdminSettingResponse]:
category: str | None = None,
is_public: bool | None = None,
) -> list[AdminSettingResponse]:
"""Get all settings with optional filtering."""
try:
query = db.query(AdminSetting)
@@ -100,7 +105,7 @@ class AdminSettingsService:
operation="get_all_settings", reason="Database query failed"
)
def get_settings_by_category(self, db: Session, category: str) -> Dict[str, Any]:
def get_settings_by_category(self, db: Session, category: str) -> dict[str, Any]:
"""
Get all settings in a category as a dictionary.
@@ -198,7 +203,7 @@ class AdminSettingsService:
if update_data.description is not None:
setting.description = update_data.description
setting.last_modified_by_user_id = admin_user_id
setting.updated_at = datetime.now(timezone.utc)
setting.updated_at = datetime.now(UTC)
db.commit()
db.refresh(setting)
@@ -228,8 +233,7 @@ class AdminSettingsService:
value=setting_data.value, description=setting_data.description
)
return self.update_setting(db, setting_data.key, update_data, admin_user_id)
else:
return self.create_setting(db, setting_data, admin_user_id)
return self.create_setting(db, setting_data, admin_user_id)
def delete_setting(self, db: Session, key: str, admin_user_id: int) -> str:
"""Delete setting."""