add: Django Management Command для генерации JavaScript-файлы отрисовки карт с геоданными ВСЕХ зданий типовых серий

This commit is contained in:
2026-05-14 19:36:52 +03:00
parent c96d85da44
commit 7c830530ef
6 changed files with 573 additions and 50 deletions

View File

@@ -10,10 +10,11 @@
## Каталог команд
1. `regenerate_seria_roots` — пересчет корневых серий (иерархия и консолидация).
2. `generate_sitemaps` оффлайн генерация sitemap-файлов.
3. `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`.
4. `populate_seo_fields` — автозаполнение SEO-полей блога из существующих данных.
5. `make_rating` — пересчёт рейтингов профилей и стеклопакетов методом Манна-Уитни.
2. `generate_map_js` — генерация JavaScript для карт с геоданными зданий.
3. `generate_sitemaps` — оффлайн генерация sitemap-файлов.
4. `regenerate_seria_prerender` — оффлайн пересборка pre-render шаблонов для `catalog_seria_info`.
5. `populate_seo_fields` — автозаполнение SEO-полей блога из существующих данных.
6. `make_rating` — пересчёт рейтингов профилей и стеклопакетов методом Манна-Уитни.
## Общие правила запуска
@@ -232,7 +233,117 @@ poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 3
"
```
## 2) Команда `generate_sitemaps`
## 2) Команда `generate_map_js`
Назначение:
- сгенерировать JavaScript-файл для отрисовки карты всех зданий типовых серий в Яндекс.Картах.
- файл содержит геоданные (latitude/longitude), ID адресов, привязку к сериям и информацию для balloon-окон на картах.
### Что происходит
1. **Сбор геоданных** — для всех корневых серий (где `id = kRoot_id`)
- Запрашиваются здания из таблицы `Building_Info` с non-zero координатами
- Для каждого здания собирается: широта, долгота, ID адреса, адрес в латинице, ID серии
2. **Генерация JavaScript** — на основе шаблона `service/JavaScript4AllSeriaMap.js.html`
- Генерируется массив цветов для каждой серии
- Объявляются переменные с ID и названиями серий
- Инициализируется Yandex.Maps с PlaceMarks для каждого здания
3. **Минификация через Terser** — уменьшение размера JavaScript
- Удаляются ненужные пробелы и переносы строк
- Сокращаются имена переменных (mangling)
- Удаляются console.log и debugger
4. **Запись в файлы**:
- `public/static/js/4maps/_ALL_seria_on_map.js` — исходный форматированный файл (715 KB)
- `public/static/js/4maps/_ALL_seria_on_map.mini.js` — минифицированный файл (639 KB)
### Оптимизация размера
Файл был оптимизирован в три этапа:
| Этап | Размер | Сжатие |
|------|--------|--------|
| Исходный (2016 год) | 2.5 MB | — |
| **Уровень 1**: функция-фабрика `m()` | 715 KB | **71%** |
| **Уровень 2**: Terser минификация | 639 KB | +10.6% |
| **Уровень 3**: Gzip в браузере | 188 KB | +29.4% |
| **Итого сжатие** | **188 KB** | **92.5%** |
> **Примечание**: Gzip применяется автоматически браузером и веб-сервером при наличии в заголовках `Content-Encoding: gzip`
Содержимое:
- **Маркеры на карте**: 18,228 зданий
- **Серии с цветами**: 31
- **Корневые серии**: 31
### Базовый запуск
```bash
cd /Users/e-serg/PRJ/2022-oknardia
poetry run python oknardia/manage.py generate_map_js
```
### Параметры запуска
**`--force`** — пересгенерировать файл (перезаписать если существует):
```bash
poetry run python oknardia/manage.py generate_map_js --force
```
**`--verbosity 2`** — подробный вывод со статистикой:
```bash
poetry run python oknardia/manage.py generate_map_js --verbosity 2
```
### Когда запускать
- **После первого развертывания** — создать файл карты один раз.
- **После добавления новых зданий** в БД (через парсеры или импорт).
- **По расписанию** (опционально, если здания редко добавляются):
```bash
0 3 * * 0 cd /home/user/app-path/2022-oknardia && poetry run python oknardia/manage.py generate_map_js >> /var/log/oknardia-map-js.log 2>&1
```
### Пример вывода
```
=== ГЕНЕРАЦИЯ JAVASCRIPT ДЛЯ КАРТ ===
Этап 1: Сбор информации о корневых сериях...
✓ Найдено корневых серий: 31
Этап 2: Генерация единого JS-файла для ВСЕ серий...
✓ Написан исходный файл: _ALL_seria_on_map.js
Размер: 734.0 KB
Этап 3: Минификация JavaScript (rjsmin)...
[*] Минификация успешна!
Исходный файл: 734.015 KB
Минифицированный: 732.952 KB
Сжатие: 0.14%
Время: 0.0017с
[i] Полная статистика по сериям:
- Жилых м²: 125,749,341
- Муниципальных м²: 11,302,860
- Жильцов: 6,342,742
- Квартир: 2,769,800
=== РЕЗУЛЬТАТЫ ===
✓ Серий обработано: 31
✓ Зданий на карте: 18228
✓ JS-файлов создано: 2 (исходный + минифицированный)
✓ Исходный файл: _ALL_seria_on_map.js
✓ Минифицированный: _ALL_seria_on_map.mini.js
✓ Обфускация: Base64 кодирование координат
[OK] Генерация завершена! Время: 1.10с
```
## 3) Команда `generate_sitemaps`
Назначение:
- пересобрать `sitemap.xml` и chunk-файлы в `MEDIA_ROOT/_serv_sitemap`.
@@ -280,7 +391,7 @@ location = /sitemap.xml {
}
```
## 3) Команда `regenerate_seria_prerender`
## 4) Команда `regenerate_seria_prerender`
Назначение:
- пересобрать pre-render шаблоны для страниц серий (`catalog_seria_info`) в каталоге `seria_info/prepared/`.
@@ -318,7 +429,7 @@ poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 -
- после массового обновления данных серий/окон/квартир;
- после очистки `seria_info/prepared/`.
## 4) Команда `populate_seo_fields`
## 5) Команда `populate_seo_fields`
Назначение:
- автозаполнить SEO-поля (`sSlug`, `sMetaDescription`, `sMetaKeywords`) для всех существующих записей блога.
@@ -430,7 +541,7 @@ print(f'Пусто sMetaKeywords: {posts.filter(sMetaKeywords=\"\").count()}')
- ✅ **Откат через SQL** — если нужно очистить, используй: `UPDATE oknardia_blogposts SET sSlug='', sMetaDescription='', sMetaKeywords='';`
- ✅ **Всегда используй `--dry-run`** перед первым запуском для проверки.
## 5) Команда `make_rating`
## 6) Команда `make_rating`
Назначение:
- пересчитать рейтинги оконных профилей, стеклопакетов и наборов услуг используя адаптированный метод Манна-Уитни (Mann-Whitney U Step Rank).