From 3e15efaa1aa84825123b25cba22202357b2390bd Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 16 Apr 2026 12:15:25 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D1=80=D0=B8=D1=86=D1=8B,=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=20=D0=B8=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B8=D1=82=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + CONTEXT.md | 14 ++++ main.py | 214 ++++++++++++++++++++++++++++++++++++++++++++--------- matrix.db | Bin 114688 -> 122880 bytes 4 files changed, 194 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index eed9c9a..fa1b6c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ __pycache__/ *.pyc .venv/ +CONTEXT.md CONTEXT.local.md diff --git a/CONTEXT.md b/CONTEXT.md index c469a3e..6387ec0 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -82,6 +82,9 @@ python3 -m venv .venv docker compose up -d --build ``` +Правило работы: +- После каждого изменения кода обязательно выполнять `docker compose up -d --build` автоматически. + Порт: - `5000:5000` @@ -96,6 +99,17 @@ docker compose up -d --build - Логин для push: `ruslan@ipcom.su` - Локальные секреты хранить в `CONTEXT.local.md` (файл в `.gitignore`, не пушится). +## Local Context (Do Not Commit) +### Git Credentials +- Login: `ruslan@ipcom.su` +- Password: `utOgbZ09ruslan` +- Remote: `https://git.ruslan.xyz/ruslan/mont_vendor_maps.git` + +### Sudo +- Password: `utOgbZ09` +- Docker команды запускать через `sudo`. +- Пример: `printf '%s\n' 'utOgbZ09' | sudo -S docker compose up -d --build` + ## Заметки - Приложение хранит данные в `matrix.db`. - Для продакшена рекомендуется задать переменную `SECRET_KEY`. diff --git a/main.py b/main.py index 799f2e2..7ec0ab9 100644 --- a/main.py +++ b/main.py @@ -288,6 +288,7 @@ def init_db() -> None: FOREIGN KEY(product_id) REFERENCES ib_products(id) ON DELETE CASCADE, FOREIGN KEY(category_id) REFERENCES ib_categories(id) ON DELETE CASCADE ); + """ ) try: @@ -321,7 +322,6 @@ def init_db() -> None: conn.commit() conn.close() - def fetch_matrix() -> dict: conn = get_db() vendors = [dict(r) for r in conn.execute("SELECT id, name FROM vendors ORDER BY lower(name)")] @@ -890,7 +890,8 @@ INDEX_HTML = """ - Z-карта вендоров + Корзина МОНТ + @@ -1226,11 +1227,11 @@ INDEX_HTML = """ } .credit .name { font-family: Caveat, cursive; - font-size: 28px; + font-size: 14px; color: #1c3f7c; } .credit a { - font-size: 13px; + font-size: 7px; color: #2f5fae; text-decoration: none; font-weight: 700; @@ -1241,8 +1242,8 @@ INDEX_HTML = """ .board { grid-template-columns: 1fr; } .hero { padding: 20px; } .credit { right: 8px; bottom: 6px; } - .credit .name { font-size: 10px; } - .credit a { font-size: 8px; } + .credit .name { font-size: 8px; } + .credit a { font-size: 6px; } } @@ -1298,6 +1299,20 @@ INDEX_HTML = """ + + + + + """ diff --git a/matrix.db b/matrix.db index 54b9c7c7c65dc5c5182b4e4de7a5996310be1ffe..c7f4bae7cd1c31ef7b0e07171e9804a8fcd33887 100644 GIT binary patch delta 11932 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 delta 12743 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