From a67236d45c940cf195d6099bb4b44d4af61cb00f Mon Sep 17 00:00:00 2001 From: Mohammad Sajad Pourajam Date: Thu, 2 Apr 2026 16:17:48 +0330 Subject: [PATCH] UPDATE --- .gitea/workflows/ai.yml | 2 +- Dockerfile | 5 --- docker-compose.yaml | 2 -- entrypoint.sh | 5 ++- .../commands/repair_location_tables.py | 35 +++++++++++++++++++ logs/app.log.2026-03-27 | 1 + rag/api_provider.py | 24 ++++++++++--- requirements.txt | 1 + 8 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 location_data/management/commands/repair_location_tables.py create mode 100644 logs/app.log.2026-03-27 diff --git a/.gitea/workflows/ai.yml b/.gitea/workflows/ai.yml index 7f9046b..3ab8a3d 100644 --- a/.gitea/workflows/ai.yml +++ b/.gitea/workflows/ai.yml @@ -1,7 +1,7 @@ name: AI Service CI/CD on: - push: +push: branches: [production] paths: - '**' diff --git a/Dockerfile b/Dockerfile index 15c14f9..3fc7fc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,11 +12,6 @@ printf '%s\n' \ 'deb https://mirror-linux.runflare.com/debian/ bookworm-updates main contrib non-free non-free-firmware' \ 'deb https://mirror-linux.runflare.com/debian-security/ bookworm-security main contrib non-free non-free-firmware' \ '' \ -'deb [trusted=yes] https://mirror2.chabokan.net/debian bookworm main contrib non-free non-free-firmware' \ -'deb [trusted=yes] https://mirror2.chabokan.net/debian-security bookworm-security main contrib non-free non-free-firmware' \ -'' \ -'deb http://mirror.iranserver.com/debian/ bookworm main contrib non-free non-free-firmware' \ -'deb-src http://mirror.iranserver.com/debian/ bookworm main contrib non-free non-free-firmware' \ > /etc/apt/sources.list # System deps for MySQL client (pkg-config required by mysqlclient to find libs) diff --git a/docker-compose.yaml b/docker-compose.yaml index b179465..94afb37 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -32,8 +32,6 @@ services: redis: image: redis:7-alpine container_name: ai-redis - ports: - - "6380:6379" qdrant: image: qdrant/qdrant:latest diff --git a/entrypoint.sh b/entrypoint.sh index c0d2027..85ded20 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,9 +2,8 @@ set -e if [ "${SKIP_MIGRATE}" != "1" ]; then echo "Running migrations..." - # python manage.py migrate --noinput --fake-initial - # python manage.py makemigrations --merge - + python manage.py repair_location_tables + python manage.py migrate --noinput echo "Migrations done." fi echo "Starting command: $*" diff --git a/location_data/management/commands/repair_location_tables.py b/location_data/management/commands/repair_location_tables.py new file mode 100644 index 0000000..3ed6c76 --- /dev/null +++ b/location_data/management/commands/repair_location_tables.py @@ -0,0 +1,35 @@ +from django.core.management.base import BaseCommand +from django.db import connection + + +class Command(BaseCommand): + help = "Rename legacy soil_data tables to location_data tables when needed" + + def handle(self, *args, **options): + table_map = { + "soil_data_soillocation": "location_data_soillocation", + "soil_data_soildepthdata": "location_data_soildepthdata", + } + + existing_tables = set(connection.introspection.table_names()) + renamed: list[str] = [] + + with connection.cursor() as cursor: + for old_name, new_name in table_map.items(): + if new_name in existing_tables: + continue + if old_name not in existing_tables: + continue + + cursor.execute(f"RENAME TABLE `{old_name}` TO `{new_name}`") + renamed.append(f"{old_name} -> {new_name}") + existing_tables.discard(old_name) + existing_tables.add(new_name) + + if renamed: + self.stdout.write( + self.style.SUCCESS("Renamed legacy tables: " + ", ".join(renamed)) + ) + return + + self.stdout.write("No legacy location_data tables needed repair.") diff --git a/logs/app.log.2026-03-27 b/logs/app.log.2026-03-27 new file mode 100644 index 0000000..177198f --- /dev/null +++ b/logs/app.log.2026-03-27 @@ -0,0 +1 @@ +2026-03-27 08:38:35,473 [INFO] django.utils.autoreload: Watching for file changes with StatReloader diff --git a/rag/api_provider.py b/rag/api_provider.py index bb288e7..0bd7986 100644 --- a/rag/api_provider.py +++ b/rag/api_provider.py @@ -12,6 +12,14 @@ from .config import RAGConfig, load_rag_config logger = logging.getLogger(__name__) + +def _mask_secret(value: str | None) -> str: + if not value: + return "" + if len(value) <= 8: + return "****" + return f"{value[:4]}...{value[-4:]}" + def get_embedding_client(config: RAGConfig | None = None) -> OpenAI: """ ساخت کلاینت OpenAI برای Embedding بر اساس provider فعال. @@ -19,7 +27,7 @@ def get_embedding_client(config: RAGConfig | None = None) -> OpenAI: """ cfg = config or load_rag_config() emb = cfg.embedding - logger.info(emb.provider) + logger.info("embedding provider=%s", emb.provider) if emb.provider == "avalai": env_var = emb.avalai_api_key_env or emb.api_key_env or "AVALAI_API_KEY" @@ -29,7 +37,11 @@ def get_embedding_client(config: RAGConfig | None = None) -> OpenAI: env_var = emb.api_key_env or "GAPGPT_API_KEY" api_key = os.environ.get(env_var) base_url = emb.base_url or "https://api.gapgpt.app/v1" - logger.info(api_key+" "+base_url) + logger.info( + "embedding base_url=%s api_key=%s", + base_url, + _mask_secret(api_key), + ) return OpenAI(api_key=api_key, base_url=base_url) @@ -44,7 +56,7 @@ def get_chat_client(config: RAGConfig | None = None) -> OpenAI: provider = llm.provider or cfg.embedding.provider - logger.info(provider) + logger.info("chat provider=%s", provider) if provider == "avalai": env_var = llm.avalai_api_key_env or llm.api_key_env or "AVALAI_API_KEY" api_key = os.environ.get(env_var) @@ -53,6 +65,10 @@ def get_chat_client(config: RAGConfig | None = None) -> OpenAI: env_var = llm.api_key_env or "GAPGPT_API_KEY" api_key = os.environ.get(env_var) base_url = llm.base_url or "https://api.gapgpt.app/v1" - logger.info(api_key,base_url) + logger.info( + "chat base_url=%s api_key=%s", + base_url, + _mask_secret(api_key), + ) return OpenAI(api_key=api_key, base_url=base_url) diff --git a/requirements.txt b/requirements.txt index 1e31519..ea4ee2d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,6 +23,7 @@ redis>=5.0,<5.1 # === HTTP & AI === requests>=2.31,<2.32 +httpx>=0.27,<0.28 openai>=1.0,<1.40 # === NumPy (pinned for Python 3.10 compatibility) ===