From 4d4d5b0118aedf2992ee16d6dbfeb4279e724d08 Mon Sep 17 00:00:00 2001 From: mguschin Date: Tue, 10 Mar 2026 14:11:25 +0300 Subject: [PATCH] Add Jivosite live chat widget support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves #3 — widget is loaded on every page via base.html when JIVOSITE_WIDGET_ID env var is set. Centralized Jinja2Templates instance in web/templates_env.py with jivosite_widget_id as a global. Co-Authored-By: Claude Sonnet 4.6 --- web/config.py | 2 ++ web/routes/auth.py | 3 +-- web/routes/catalog.py | 3 +-- web/routes/connections.py | 3 +-- web/routes/evotor.py | 3 +-- web/routes/profile.py | 3 +-- web/routes/reset.py | 3 +-- web/routes/sync.py | 3 +-- web/routes/vk.py | 3 +-- web/templates/base.html | 3 +++ web/templates_env.py | 6 ++++++ 11 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 web/templates_env.py diff --git a/web/config.py b/web/config.py index 1c5ade9..729d3d7 100644 --- a/web/config.py +++ b/web/config.py @@ -10,6 +10,8 @@ class Settings(BaseSettings): EVOTOR_APP_ID: str = "" EVOTOR_WEBHOOK_SECRET: str = "" + JIVOSITE_WIDGET_ID: str = "" + HEALTH_CHECK_INTERVAL_SECONDS: int = 600 CATALOG_REFRESH_INTERVAL_SECONDS: int = 3600 diff --git a/web/routes/auth.py b/web/routes/auth.py index c3d7a29..ca04473 100644 --- a/web/routes/auth.py +++ b/web/routes/auth.py @@ -2,7 +2,7 @@ import uuid from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import hash_password, verify_password, get_current_user @@ -12,7 +12,6 @@ from web.models import User from web.schemas import validate_registration, validate_login router = APIRouter() -templates = Jinja2Templates(directory="web/templates") @router.get("/register") diff --git a/web/routes/catalog.py b/web/routes/catalog.py index 5465b48..a60911b 100644 --- a/web/routes/catalog.py +++ b/web/routes/catalog.py @@ -3,7 +3,7 @@ import io from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse, StreamingResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import get_current_user @@ -12,7 +12,6 @@ from web.evotor_api import refresh_catalog_cache from web.models import User, EvotorConnection, SyncConfig, SyncFilter, CachedStore, CachedGroup, CachedProduct router = APIRouter(prefix="/catalog") -templates = Jinja2Templates(directory="web/templates") def _get_or_create_sync_config(db: Session, user_id: int) -> SyncConfig: diff --git a/web/routes/connections.py b/web/routes/connections.py index b37cbc6..c26c063 100644 --- a/web/routes/connections.py +++ b/web/routes/connections.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import get_current_user @@ -8,7 +8,6 @@ from web.database import get_db from web.models import User, EvotorConnection, VkConnection router = APIRouter() -templates = Jinja2Templates(directory="web/templates") SERVICE_TYPES = [ { diff --git a/web/routes/evotor.py b/web/routes/evotor.py index 9d23664..eb01a00 100644 --- a/web/routes/evotor.py +++ b/web/routes/evotor.py @@ -4,7 +4,7 @@ import httpx from datetime import datetime from fastapi import APIRouter, Request, Depends, HTTPException from fastapi.responses import RedirectResponse, JSONResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from pydantic import BaseModel from sqlalchemy.orm import Session @@ -16,7 +16,6 @@ from web.models import User, EvotorConnection logger = logging.getLogger(__name__) router = APIRouter(prefix="/evotor") -templates = Jinja2Templates(directory="web/templates") EVOTOR_APP_URL = "https://market.evotor.ru/store/apps/{app_id}" EVOTOR_STORES_URL = "https://api.evotor.ru/stores" diff --git a/web/routes/profile.py b/web/routes/profile.py index 828474e..9e813be 100644 --- a/web/routes/profile.py +++ b/web/routes/profile.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import get_current_user, verify_password, hash_password @@ -9,7 +9,6 @@ from web.models import User from web.schemas import validate_profile, validate_reset_password router = APIRouter() -templates = Jinja2Templates(directory="web/templates") # VIEW PROFILE diff --git a/web/routes/reset.py b/web/routes/reset.py index 018e3b3..7d290db 100644 --- a/web/routes/reset.py +++ b/web/routes/reset.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta, timezone from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import hash_password @@ -13,7 +13,6 @@ from web.models import User from web.schemas import validate_reset_password router = APIRouter() -templates = Jinja2Templates(directory="web/templates") @router.get("/forgot-password") diff --git a/web/routes/sync.py b/web/routes/sync.py index ddff7b6..b2930c8 100644 --- a/web/routes/sync.py +++ b/web/routes/sync.py @@ -2,7 +2,7 @@ from datetime import datetime from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import get_current_user @@ -10,7 +10,6 @@ from web.database import get_db from web.models import User, EvotorConnection, VkConnection, SyncConfig, SyncFilter router = APIRouter(prefix="/sync") -templates = Jinja2Templates(directory="web/templates") def _get_or_create_sync_config(db: Session, user_id: int) -> SyncConfig: diff --git a/web/routes/vk.py b/web/routes/vk.py index 2a473ac..4a7af69 100644 --- a/web/routes/vk.py +++ b/web/routes/vk.py @@ -5,7 +5,7 @@ import httpx from fastapi import APIRouter, Request, Depends from fastapi.responses import RedirectResponse -from fastapi.templating import Jinja2Templates +from web.templates_env import templates from sqlalchemy.orm import Session from web.auth import get_current_user @@ -14,7 +14,6 @@ from web.database import get_db from web.models import User, VkConnection router = APIRouter(prefix="/vk") -templates = Jinja2Templates(directory="web/templates") VK_AUTHORIZE_URL = "https://oauth.vk.com/authorize" VK_TOKEN_URL = "https://oauth.vk.com/access_token" diff --git a/web/templates/base.html b/web/templates/base.html index ab1878d..9f81b48 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -64,6 +64,9 @@ {% block content %}{% endblock %} + {% if jivosite_widget_id %} + + {% endif %}