Znymkari · Лабораторія
←

Документация

Архитектура Статус Контекст История Продакшн Ноут Олега VPS COM Oleg COM Pavel Коммиты VPS Коммиты Цеха

CONTEXT.md — шпаргалка

Читать первым перед сессией. Навигация + правила + грабли. Статус — STATE.md. ТЗ — ARCHITECTURE.md. История — CHANGES.md.


0. Два проекта

Проект Где Роль Git
web/ D:\content_shop\web\ → VPS Сайт-витрина: клиент, корзина, оплата, выдача ✅ свой репо (43 коммита)
znymkari-data/ D:\content_shop\znymkari-data\ → ноут Лаборатория: импорт, sanitize, превью, push ✅ свой репо (создан 2026-10-15-б)

Общее между ними: - Модели catalog (Event, Block, Category, Performance, Media, Organizer, TeamMember, ProgramScan, Expense, ExtraIncome). - import_service.py, media_metadata.py, sanitize.py, generate_video_posters. - Одна схема БД на обоих. Транспорт — JSON (django.core.serializers) + ORM-merge, не pg_dump. - Organizer / TeamMember — справочники живут только на VPS. На ноуте не заполняются и не показываются в админке.

Что НЕ берём в znymkari-data: cart, favorites, telegram, issues, orders, клиентские views, templates сайта, static сайта.


1. Что где лежит

Локально (D:\content_shop\)

D:\content_shop\                      ← локальный корень (БЕЗ git)
├── web\                              ← сайт (git repo #1)
│   ├── .git\                         ← история (43 коммита, после реструктуризации)
│   ├── .gitignore
│   ├── apps\
│   │   ├── accounts\                 ← UserProfile, TelegramLinkToken
│   │   ├── catalog\                  ← Event, Media, Performance, ...
│   │   ├── issues\                   ← трекер замечаний
│   │   ├── orders\                   ← пусто, Этап 3
│   │   └── telegram\                 ← бот, webhook, 5 языков
│   ├── config\                       ← settings, urls, wsgi, asgi
│   │   ├── settings.py               ← общие
│   │   ├── settings_local.py         ← dev (не в git)
│   │   └── settings_local_prod.py    ← шаблон прод
│   ├── docs\                         ← доки (этот файл и др.)
│   ├── media\                        ← Znymkari logo, QR
│   ├── static\
│   │   ├── css\common.css, css\lightbox.css
│   │   ├── js\common.js, favorites.js, cart.js, lightbox.js, merge-prompt.js
│   │   └── favicon.ico
│   ├── manage.py, db.sqlite3, requirements.txt
│   ├── start_all.bat                 ← локальный сервер + бот + туннель
│   ├── start_shell.bat               ← Django shell
│   └── test.bat                      ← тесты
├── deploy.bat                        ← деплой сайта на VPS
├── .gitignore                        ← старый корневой, ни к чему не привязан
├── desktop.ini                       ← мусор Windows
└── znymkari-data\                    ← цех (git repo #2, создан 2026-10-15-б)

Мусор в корне и web/

Документация (D:\content_shop\web\docs\)

DOCS_ROOT = BASE_DIR / "docs" в settings.py. Читалка: /catalog/docs/<slug>/, @staff_member_required.

Management-команды

В web/apps/catalog/management/commands/ (VPS): - ✅ receive_event <slug> — мягкий merge JSON в базу + превью в /srv/previews/. - ✅ assign_media_authors <event_id> — эвристика автора по ролям команды.

В znymkari-data/apps/importer/management/commands/ (ноут): - ✅ import_media <event_id> <festival_name> — импорт фестиваля. - ✅ generate_video_posters <event_id> [--force] — добор постеров. - ✅ pack_event <event_id> — JSON + tar превью + meta.json → dist/. - ✅ push_event <event_id> — paramiko SFTP + запуск receive_event по SSH.

Шаблоны сайта (web/apps/catalog/templates/catalog/)

Статика (web/static/)

CSS: common.css (фон, футер, .page-top, app-shell), lightbox.css.

JS — порядок подключения: common.js → lightbox.js → favorites.js → cart.js → merge-prompt.js. favorites.js перед cart.js — иначе у анонима cart.js не найдёт FavoritesModule.

Модули: - common.js — боке, софиты, back-link, sitemap, BuyModal. - lightbox.js — window.Lightbox. - cart.js — window.CartModule. - favorites.js — window.FavoritesModule. - merge-prompt.js — модалка «До входа вы положили N медиа…».

Бэкенд (web/apps/)

catalog/: - models.py — Event, Block, Category, Performance, Media, Organizer, TeamMember, ProgramScan, Expense, ExtraIncome, Favorite, CartItem, UserEventDiscount. - admin.py, views.py, urls.py, api.py, client_api.py, apps.py, tests.py. - services/media_metadata.py — локальная копия. - migrations/ — 12 штук. - management/commands/ — receive_event, assign_media_authors.

accounts/: - models.py — UserProfile, TelegramLinkToken. - views.py, views_telegram.py, urls.py, forms.py, tokens.py, signals.py, admin.py, tests.py. - migrations/ — 4 штуки. - templates/accounts/profile.html.

issues/: models.py (Issue), admin.py, tests/, migrations/.

telegram/: - api.py (Bot API wrapper), services.py (токены), messages.py (5 языков), keyboards.py, preview_photo.py, bot.py, views.py (webhook). - handlers/ — по файлу на команду. - management/commands/ — run_telegram_bot, set_telegram_webhook. - models.py, admin.py, apps.py.

orders/ — пусто, Этап 3.

Конфиг (web/config/)

Одна схема — две конфигурации: - VPS: Postgres znymkari_db, юзер znymkari_user, DEBUG=False, ALLOWED_HOSTS=['znymkari.com', 'www.znymkari.com']. - Ноут: Postgres znymkari_local, юзер znymkari_local_user, DEBUG=False, ALLOWED_HOSTS=['*'] (LAN).


2. URL'ы, которые легко перепутать

URL Что
/ Главная
/event/<id>/ Клиентская страница ивента (без /catalog/)
/catalog/cart/ Корзина. Только залогиненным. Анонима редиректит на /catalog/favorites/
/catalog/favorites/ Избранное. Для всех
/catalog/prices/ Прайс
/catalog/events/ Список ивентов
/catalog/event/<id>/markup/ Разметка ивента (staff)
/catalog/event/<id>/cameras/ Часы камер (staff)
/catalog/docs/<slug>/ Читалка доков (staff). 8 табов
/accounts/signup/, /accounts/login/, /accounts/logout/ Авторизация
/accounts/profile/ Личный кабинет
/accounts/update-profile/ Обновление (POST JSON)
/telegram/webhook/<secret>/ Webhook Telegram-бота
/admin/ Django-админка
/admin/issues/issue/ Замечания

URL'ы в znymkari-data:

URL Что
/ Домашняя: кнопки Импорт · Отправка · Хранилище · Чистка · Настройки
/import/ Импорт: таблица папок и ивентов
/send/ Отправка архивов на VPS
/cleanup/ Чистка мусора (сироты, пустые ивенты, логи)
/storage/ Инвентарь хранилища
/settings/ Пути, VPS, ключи
/admin/ Django-админка

3. Правила работы

  1. Всегда указывать имя файла и путь в правках.
  2. Если пользователь пишет «стоп» — правки из последнего сообщения НЕ применены, кроме тех, что он отметит.
  3. Если пользователь пишет «весь файл» — давать правки целым файлом.
  4. Правки только «Найти → Заменить» — конкретный кусок. Не описывать прозой.
  5. После каждой правки — подсказать, как проверить результат.
  6. Периодически предлагать покрыть тестами.
  7. Если файла не видел или не помнишь — попросить заново, не гадать.
  8. Не переделывать работающее без обсуждения.
  9. Многофайловые правки — разделять на «Файл 1 / Файл 2 / …».
  10. Внутри <script> и <style> — никаких {% %} и {{ }} в комментариях. Django парсит шаблон целиком.
  11. Многострочный комментарий в Django-шаблоне — только блок подряд идущих однострочных {# ... #}. Ни {# ... \n ... #}, ни {% comment %}.
  12. Деплой — двумя путями.

    • VPS: правки кода — только локально, потом deploy.bat. На VPS руками код не трогаем (единственное исключение — settings_local.py). Перед деплоем — три стоп-крана: 1. Тесты python manage.py test -v 2 → 77 OK. 2. tar -tzf web_upload.tar.gz | findstr settings_local → пусто. 3. Изменённый файл присутствует в архиве.
    • Ноут Олега: отдельный деплой. Через SFTP ключом id_ed25519 (пользователь deploy, 193.176.249.24:22022). settings_local.py — свой, не из git.

    Импорт: полностью локальный на ноуте. VPS-БД не трогается до момента push_event / receive_event.

  13. Формат сессий в CHANGES.md — только даты. 2026-10-14, 2026-10-14-б, 2026-10-14-в. Никаких С21, С22. В остальных доках — без номеров сессий вообще.

  14. Стоп-кран tar — перед каждым деплоем проверять, что settings_local.py не попал в архив. Это единственный файл, который живёт на сервере и НЕ должен перезаписываться.


4. Грабли — по темам

Деплой VPS

Django-шаблоны

База данных / поиск

Модели каталога — реальность (не то, что в старой доке)

Клиентские модули (JS)

Общий лайтбокс

CSS / вёрстка

Главная (home.html)

Telegram

ffmpeg / видео

Soft-delete / реактивация

Django settings

Dev

Ноут Олега

Samba (ноут Олега)

Unicode-кавычки в именах папок

Импорт медиа

Хранилище

VPS / Hetzner


5. Стиль общения


6. Что не сделано

См. STATE.md — не дублируем.