Compare commits
77 Commits
v0.3.1
..
5bdb97f5e8
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bdb97f5e8 | |||
| e2091b72b1 | |||
| 446cbe8c5c | |||
| bdca8dfc6a | |||
| 111dd7bd33 | |||
| 57a522f4b7 | |||
| 2b37f709a9 | |||
| f480dc3666 | |||
| 2da036e4e0 | |||
| 28620ce2a9 | |||
| 574ae84321 | |||
| 796cb89525 | |||
| 0e8839bf18 | |||
| dbd622e456 | |||
| 741dd2685e | |||
| c01873144e | |||
| 8387d36abf | |||
| 2bc0869104 | |||
| 8c7972178c | |||
| c338a17dd8 | |||
| 3cc4ae39f7 | |||
| d789b2443a | |||
| 25beecdf60 | |||
| 5eb2f304a3 | |||
| 0246c1de8c | |||
| 4196cd64d8 | |||
| 60b6582f1b | |||
| 4a91928bc7 | |||
| b322331366 | |||
| e041110059 | |||
| ae1b851db7 | |||
| 28aa35d617 | |||
| b296ad79e9 | |||
| fbea58b1c4 | |||
| 30084dd6ac | |||
| c961b64036 | |||
| ad74f0a51e | |||
| 78ec6077b6 | |||
| c68fa5be07 | |||
| ee1dd31d54 | |||
| 6066e5df29 | |||
| 8704f4125b | |||
| 2777f3fde2 | |||
| 4b9ca319f9 | |||
| 56d7af5c9d | |||
| 0368c1c34e | |||
| fbdf95b66f | |||
| 8fdaf6935e | |||
| 8272bdb25f | |||
| 6a4c315cdc | |||
| f2c89abe1c | |||
| 37a605ef09 | |||
| 28a680fdf1 | |||
| 9bcbc73602 | |||
| 8ca1f5b36e | |||
| 6c4dcd1cb7 | |||
| 5a38181cd3 | |||
| 5738ee9c9e | |||
| 9535424e6a | |||
| 4e03fead67 | |||
| 5de28c8bfb | |||
| de45931ff4 | |||
| d27d0e7173 | |||
| f3a8a65afe | |||
| 72b71c7810 | |||
| 6bd8143d83 | |||
| a970b7109b | |||
| 99b8ba80d5 | |||
| 7cc438d1c5 | |||
| 034ec20c26 | |||
| 90ddc0d88c | |||
| 6e92eca67a | |||
| 6a9c0e4568 | |||
| 265732bae8 | |||
| cded4e407e | |||
| f996dd891e | |||
| 748a1882e5 |
-128
@@ -1,128 +0,0 @@
|
||||
# Git и версионирование
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
|
||||
# Документация и инструкции
|
||||
*.md
|
||||
README.md
|
||||
SETUP.md
|
||||
AGENTS.md
|
||||
MANAGEMENT_RUNBOOK.md
|
||||
|
||||
# Python и виртуальное окружение
|
||||
__pycache__
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# IDE и редакторы
|
||||
.vscode
|
||||
.idea
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
.project
|
||||
.pydevproject
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
*.sublime-project
|
||||
|
||||
# Тестирование и линтинг
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
.tox/
|
||||
.mypy_cache/
|
||||
.hypothesis/
|
||||
|
||||
# Локальные данные и конфиги
|
||||
.env
|
||||
.env.local
|
||||
local_settings.py
|
||||
database/*.sqlite3
|
||||
database/*.db
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Статика для разработки и bootstrap-стили
|
||||
public/static/bootstrap-3.3.7-dist.zip
|
||||
public/static/css/*.map
|
||||
public/static/js/*.map
|
||||
public/static/**/*.map
|
||||
|
||||
# Временные файлы
|
||||
*.tmp
|
||||
*.temp
|
||||
*.bak
|
||||
|
||||
# Шрифты
|
||||
*.ttf
|
||||
*.otf
|
||||
|
||||
# Системные файлы macOS
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
|
||||
# Системные файлы Linux
|
||||
.Xauthority
|
||||
.Xdefaults
|
||||
|
||||
# Docker и CI/CD
|
||||
docker-compose.override.yml
|
||||
.dockerignore
|
||||
Dockerfile*
|
||||
|
||||
# Node modules (если понадобятся в будущем)
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# Конфиги оставляем как пример!
|
||||
# config/ -> НЕ ИСКЛЮЧАЕМ (нужен как образец)
|
||||
# *.ini, *.conf -> НЕ ИСКЛЮЧАЕМ (нужны как примеры)
|
||||
|
||||
# Django автогенерируемые файлы (создаются при старте контейнера, не нужны в образе)
|
||||
# public/static_collected/ # собранная статика (создаётся при collectstatic)
|
||||
# public/media/ # медиа-файлы (могут быть большие, создаются динамически)
|
||||
# oknardia/templates/seria_info/prepared/ # пре-рендер шаблоны серий (создаются управ.командой)
|
||||
# public/media/_serv_sitemap/ # sitemap'ы (создаются управ.командой)
|
||||
|
||||
# Примечание: Мы не исключаем эти директории потому что:
|
||||
# 1. public/media/ может содержать важные медиа для разработки
|
||||
# 2. пре-рендер шаблоны кэшируются для production оптимизации
|
||||
# При сборке production образа они создаются автоматически в docker-compose через manage.py команды.
|
||||
|
||||
# Базы данных и кеши
|
||||
*.sqlite3
|
||||
*.db
|
||||
database/oknadria_backup*.sqlite3
|
||||
|
||||
# Миграции можем оставить, они нужны для контейнера
|
||||
# oknardia/oknardia/migrations/ -> НЕ ИСКЛЮЧАЕМ
|
||||
|
||||
+13
-59
@@ -1,6 +1,5 @@
|
||||
# Django Configuration Example
|
||||
# Все настройки читаются из переменных окружения (DEV/PROD без распознавания хоста)
|
||||
# Для локальной разработки можно скопировать файл в .env.local и экспортировать его.
|
||||
# Копируйте этот файл в .env.local и заполните реальные значения
|
||||
|
||||
# ============================================================================
|
||||
# DJANGO
|
||||
@@ -16,39 +15,19 @@ DEBUG=False
|
||||
# Допустимые хосты (разделены запятой без пробелов)
|
||||
ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com
|
||||
|
||||
# Базовый публичный URL сайта (используется для абсолютных URL в sitemap.xml)
|
||||
SITE_BASE_URL=https://yourdomain.com
|
||||
|
||||
# Админы для email-оповещений Django (формат: Имя:email,Имя2:email2)
|
||||
ADMINS=Admin:admin@example.com
|
||||
|
||||
# URL для доступа к админке Django (можно сменить для безопасности, чтобы боты не могли её найти)
|
||||
ADMIN_URL=admin/
|
||||
|
||||
# CSRF Trusted Origins (для корректной работы CSRF при доступе к админке и другим формам с разных доменов/портов)
|
||||
DJANGO_CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,http://localhost:8000,https://yourdomain.com
|
||||
|
||||
# ============================================================================
|
||||
# DATABASE
|
||||
# ============================================================================
|
||||
|
||||
# Database backend (по умолчанию SQLite)
|
||||
DATABASE_ENGINE=django.db.backends.sqlite3
|
||||
# Database backend (по умолчанию mysql)
|
||||
DATABASE_ENGINE=django.db.backends.mysql
|
||||
|
||||
# Имя/путь базы данных:
|
||||
# - для SQLite: только имя файла (полный путь соберется в settings.py через PROJECT_ROOT/database)
|
||||
# - для MySQL/MariaDB: имя базы
|
||||
DATABASE_NAME=oknardia.sqlite3
|
||||
|
||||
# Для MySQL/MariaDB (используются, если DATABASE_ENGINE=django.db.backends.mysql)
|
||||
# DATABASE_HOST=localhost
|
||||
# DATABASE_PORT=3306
|
||||
# DATABASE_USER=name-for-db-user
|
||||
# DATABASE_PASSWORD=your-db-password-here
|
||||
|
||||
|
||||
# Подкаталог в MEDIA_ROOT, где хранится кеш sitemap-файлов
|
||||
SITEMAP_SUBDIR=_serv_sitemap
|
||||
# Database connection
|
||||
DATABASE_HOST=localhost
|
||||
DATABASE_PORT=3306
|
||||
DATABASE_NAME=django_oknardia
|
||||
DATABASE_USER=web
|
||||
DATABASE_PASSWORD=your-db-password-here
|
||||
|
||||
# ============================================================================
|
||||
# EMAIL
|
||||
@@ -61,7 +40,6 @@ EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
|
||||
EMAIL_HOST=smtp.example.com
|
||||
EMAIL_PORT=587
|
||||
EMAIL_USE_TLS=True
|
||||
EMAIL_USE_SSL=False
|
||||
EMAIL_HOST_USER=your-email@example.com
|
||||
EMAIL_HOST_PASSWORD=your-email-password
|
||||
|
||||
@@ -117,22 +95,12 @@ LOG_LEVEL=INFO
|
||||
# CELERY_BROKER_URL=redis://localhost:6379/0
|
||||
# CELERY_RESULT_BACKEND=redis://localhost:6379/0
|
||||
|
||||
# ============================================================================
|
||||
# DOCKER: LOCAL PRODUCTION TESTING
|
||||
# ============================================================================
|
||||
|
||||
# Разрешить Django обслуживать медиа-файлы через Python (только для локального тестирования)
|
||||
# ВАЖНО: В настоящем production медиа и статику обслуживает Nginx, а не Django!
|
||||
# Используется ТОЛЬКО в docker-compose.local-prod.yml для локального тестирования production конфигурации.
|
||||
# На production сервере НЕ устанавливайте это значение в True!
|
||||
ALLOW_MEDIA_SERVE=False
|
||||
|
||||
# ============================================================================
|
||||
# ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ
|
||||
# ============================================================================
|
||||
|
||||
# 1. Скопируйте этот файл:
|
||||
# cp .env.sample .env.local
|
||||
# cp .env.example .env.local
|
||||
#
|
||||
# 2. Отредактируйте значения в .env.local:
|
||||
# nano .env.local
|
||||
@@ -140,8 +108,9 @@ ALLOW_MEDIA_SERVE=False
|
||||
# 3. Убедитесь, что .env.local в .gitignore:
|
||||
# grep ".env" .gitignore
|
||||
#
|
||||
# 4. Экспортируйте переменные перед запуском Django:
|
||||
# set -a; source .env.local; set +a
|
||||
# 4. Используйте python-dotenv для загрузки переменных в settings.py:
|
||||
# from dotenv import load_dotenv
|
||||
# load_dotenv()
|
||||
#
|
||||
# ВАЖНО:
|
||||
# - НИКОГДА не коммитьте .env.local или файлы с реальными значениями в git!
|
||||
@@ -152,18 +121,3 @@ ALLOW_MEDIA_SERVE=False
|
||||
# - AWS Systems Manager Parameter Store
|
||||
# - HashiCorp Vault
|
||||
|
||||
|
||||
# ****************************************************************************************************************
|
||||
# Системные пути на хосте (ТОЛЬКО ДЛЯ ПРОДАКШЕНА)
|
||||
# Используется скриптом для генерации корректного Nginx конфига (alias к медиа-файлам).
|
||||
# На локальной машине разработчика (Dev) эта переменная игнорируется.
|
||||
# В ПРОДАКШЕНЕ: Укажите полный путь к папке проекта на сервере
|
||||
HOST_PROJECT_PATH=/home/username/projects
|
||||
|
||||
# ****************************************************************************************************************
|
||||
# Настройки доступа к пакетам в репозитории, чтобы wathtower мог проверять их свежесть и скачивать для обновления.
|
||||
# Получить эти данные можно в настройках вашего репозитория, например:
|
||||
# для GitHub: в разделе "Developer settings" -> "Personal access tokens";
|
||||
# для Gitea: в разделе "Settings / Настройки" -> "Actions / Действия" -> "Secrets / Секреты".
|
||||
REPO_USER=[login]
|
||||
REPO_PASS=[token]
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
name: Build and Push Docker Image
|
||||
run-name: Build and Push Docker Image ${{ github.ref_name }}
|
||||
|
||||
on:
|
||||
push:
|
||||
# Запускать сборку только при создании тега, начинающегося с 'v' (например, v1.0.0, v2.3.1)
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
env:
|
||||
REGISTRY: git.cube2.ru
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest # Или метка вашего раннера, если он специфичный (например, macos или self-hosted)
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Настройка QEMU для мультиплатформенной сборки (если нужно собирать под разные архитектуры)
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
# Настройка Docker Buildx (обязательно для build-push-action)
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
# Логин в реестр Gitea
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
|
||||
# Извлечение метаданных (тегов и лейблов) для Docker
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=tag
|
||||
type=raw,value=latest,enable=${{ github.ref_type == 'tag' }}
|
||||
|
||||
# Сборка и отправка образа
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
file: Dockerfile
|
||||
push: true
|
||||
# Собираем под текущую архитектуру (linux/amd64).
|
||||
# Если сервер и MacMini на разных архитектурах (x86 vs ARM), добавьте нужные, например: linux/amd64,linux/arm64
|
||||
# platforms: linux/amd64,linux/arm64
|
||||
# ---
|
||||
# Собираем только под linux/amd64 (для скорости + все равно сервер на x86).
|
||||
platforms: linux/amd64
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
# ДОБАВЛЕНО для медленного интернета и оптимизации сборки:
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
timeout: 1800 # Увеличено до 30 минут на всю сборку
|
||||
-35
@@ -133,38 +133,3 @@ dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# MacOS specific files
|
||||
.DS_Store
|
||||
|
||||
# Database dumps and backups (CRITICAL - NEVER commit production data!)
|
||||
SQL/
|
||||
*.sql
|
||||
*.dump
|
||||
*.backup
|
||||
*.sql.gz
|
||||
db.json
|
||||
db.json.zip
|
||||
|
||||
# API keys, certificates, and credentials
|
||||
*.key
|
||||
*.pem
|
||||
*.p12
|
||||
*.p8
|
||||
*.crt
|
||||
*.cert
|
||||
|
||||
# IDE and editor specific
|
||||
.vscode/settings.json
|
||||
.idea/vcs.xml
|
||||
.idea/inspectionProfiles/
|
||||
|
||||
# Project specific ignore patterns
|
||||
.github/
|
||||
.log/
|
||||
.logs/
|
||||
sitemap*.xml
|
||||
|
||||
# Django static files (собранная статика, пересоздается при деплое)
|
||||
public/static_collected/
|
||||
|
||||
|
||||
@@ -213,7 +213,6 @@ python manage.py collectstatic # собрать статику для
|
||||
5. **Foreign Key ON_DELETE**: используется в основном `DO_NOTHING` и `SET_NULL`, будь осторожен при удалении
|
||||
6. **Двойной хост**: убедись, что используешь правильные переменные из `my_secret.py` для текущей машины
|
||||
7. **Индексирование БД**: большинство полей для поиска уже имеют `db_index=True`, но проверь при добавлении фильтров
|
||||
8. **SEO-даты и свежесть контента**: при переделке вьюх/шаблонов отдельно проверяй, нужны ли ещё `last_update`, `PUB_DAT`, `Date4Meta` и `Last4Meta`; если дата не участвует в смысловой логике страницы, лучше оставить базовые `{% now %}` из `base.html`, а не тащить лишний контекст во вьюху и не нагружать бекенд.
|
||||
|
||||
## Реферальные ссылки (для более глубокого изучения)
|
||||
|
||||
|
||||
@@ -1,361 +0,0 @@
|
||||
# Система двухуровневого кеширования страниц серий
|
||||
|
||||
## 📖 Описание
|
||||
|
||||
Система страниц серий домов использует **двухуровневое кеширование**:
|
||||
|
||||
1. **Статический кеш** — дорогостоящие данные (карты, графики, схемы), генерируются один раз и сохраняются на диск
|
||||
2. **Динамические данные** — верхняя статья (редактируется через админку) и таблица оконных проёмов (показывает свежие предложения), пересчитываются при каждом запросе
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Архитектура кеша
|
||||
|
||||
Для каждой серии создаются **3 отдельных кешируемых файла**:
|
||||
|
||||
| Файл | Содержимое | Размер | Где появляется |
|
||||
|------|-----------|--------|---|
|
||||
| `{seria_id}_id_static_flaps.html` | Схемы открывания и типовые размеры окон | 4-7KB | В разделе "Дома серии: типовые размеры" |
|
||||
| `{seria_id}_id_static_graph.html` | Google Charts: график ввода в эксплуатацию | 2-3KB | В контейнере height:300px |
|
||||
| `{seria_id}_id_static_map_stats.html` | Yandex Maps + блок статистики | 6-46KB | Карта (col-md-7) + статистика (col-md-4) |
|
||||
|
||||
### Верхняя статья — ДИНАМИЧЕСКИЕ ДАННЫЕ, не кешируется!
|
||||
|
||||
**Верхняя статья про серию** (`THIS_SERIA_DESCRIPTION`) — это динамические данные, которые:
|
||||
- Хранятся в БД (поле `sDescription` модели `Seria_Info`)
|
||||
- **Редактируются через админку** → нужны изменения **без перезагрузки контейнера**
|
||||
- Рендерятся всегда из БД, не сохраняются в кеш-файлы
|
||||
|
||||
Если бы мы кешировали верхнюю статью:
|
||||
- Админ редактирует статью → кеш-файл не обновляется автоматически
|
||||
- Нужно перезагрузить контейнер или вручную удалять файл кеша
|
||||
- При регенерации кеша может произойти перезапись старыми данными
|
||||
|
||||
**Решение**: верхняя статья **всегда рендерится из БД**, как и таблица окон.
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Логика работы
|
||||
|
||||
### При первом запросе seriesId (cache miss):
|
||||
|
||||
1. View `catalog_seria_info()` обнаруживает отсутствие кеш-файлов
|
||||
2. Вычисляются дорогостоящие данные:
|
||||
- Геокоординаты всех зданий серии
|
||||
- Год ввода в эксплуатацию (для графика)
|
||||
- Схемы открывания окон
|
||||
3. Генерируются **3 отдельных файла** в `oknardia/templates/seria_info/prepared/`
|
||||
4. Верхняя статья и таблица окон **рендерятся из БД** при каждом запросе
|
||||
5. Контекст получает пути к 3 кеш-файлам + свежие динамические данные
|
||||
6. Main-шаблон включает 3 кеш-файла + 2 динамических блока
|
||||
7. Ответ отправляется пользователю
|
||||
|
||||
### При последующих запросах (cache hit):
|
||||
|
||||
1. View обнаруживает, что все 3 файла существуют
|
||||
2. **Верхняя статья пересчитывается заново** из БД (от админа)
|
||||
3. **Таблица окон пересчитывается заново** (новые предложения видны сразу)
|
||||
4. Main-шаблон включает 3 статических файла + 2 динамических блока
|
||||
5. Ответ отправляется быстро (схемы, график, геоданные из кеша)
|
||||
|
||||
### Ключевой мюмент: Всё свежее!
|
||||
|
||||
- Кеширование **не трогает** верхнюю статью и таблицу окон → они всегда свежие
|
||||
- Новые цены от поставщиков видны пользователям **сразу**
|
||||
- Админ может редактировать текст про серию → видно **без перезагрузки** контейнера
|
||||
- Таблица пересчитывается в запросе через Q-фильтры к БД (есть индексы на БД)
|
||||
|
||||
---
|
||||
|
||||
## 📁 Структура файлов
|
||||
|
||||
### Templates (шаблоны)
|
||||
|
||||
```
|
||||
oknardia/templates/seria_info/
|
||||
├── all_seria_info_pre_light.html # Main-шаблон (включает 3 static-файла + динамику)
|
||||
├── all_seria_info_pre_light_static_flaps.html # ШАГ 1: Схемы открывания (кешируется)
|
||||
├── all_seria_info_pre_light_static_graph.html # ШАГ 2: График ввода (кешируется)
|
||||
├── all_seria_info_pre_light_static_map_stats.html # ШАГ 3: Карта + статистика (кешируется)
|
||||
└── prepared/ # Директория с кеш-файлами
|
||||
├── 210_id_static_flaps.html
|
||||
├── 210_id_static_graph.html
|
||||
├── 210_id_static_map_stats.html
|
||||
├── 100_id_static_flaps.html
|
||||
└── ... (93 файла: 31 серия × 3 типа)
|
||||
```
|
||||
|
||||
### Генерация кеша (Web-логика)
|
||||
|
||||
```
|
||||
oknardia/web/
|
||||
├── catalog_series.py # catalog_seria_info() — генерирует 3 файла + динамику
|
||||
└── management/commands/
|
||||
└── regenerate_seria_prerender.py # Batch-команда для регенерации всех серий
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Управление кешем
|
||||
|
||||
### Разработка (DEV-режим)
|
||||
|
||||
```bash
|
||||
python manage.py runserver
|
||||
```
|
||||
|
||||
В DEV-режиме (`DEBUG = True`):
|
||||
- Кеш **не используется** (всегда `PRE_RENDERED_STATIC_*_PATH = ""`)
|
||||
- Main-шаблон рендерит данные напрямую
|
||||
- Удобно для разработки (вижу изменения сразу)
|
||||
|
||||
### Production (PROD-режим)
|
||||
|
||||
#### Первоначальная генерация (все 31 серия):
|
||||
|
||||
```bash
|
||||
python manage.py regenerate_seria_prerender
|
||||
```
|
||||
|
||||
Вывод:
|
||||
```
|
||||
OK seria 100: 3 кеш-файла созданы
|
||||
OK seria 12: 3 кеш-файла созданы
|
||||
...
|
||||
Готово. Обработано: 31. Создано/пересоздано: 31 × 3 файла. Пропущено: 0.
|
||||
```
|
||||
|
||||
#### Регенерация конкретной серии:
|
||||
|
||||
```bash
|
||||
python manage.py regenerate_seria_prerender --seria-id 210
|
||||
```
|
||||
|
||||
#### Dry-run (без создания файлов):
|
||||
|
||||
```bash
|
||||
python manage.py regenerate_seria_prerender --dry-run
|
||||
```
|
||||
|
||||
#### Force-переписать даже если есть кеш:
|
||||
|
||||
```bash
|
||||
python manage.py regenerate_seria_prerender --force
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Когда нужна регенерация кеша?
|
||||
|
||||
### ✅ Регенерируйте, если:
|
||||
|
||||
- Изменены координаты зданий (geo-данные)
|
||||
- Добавлены новые здания в серию
|
||||
- Обновлены годы ввода в эксплуатацию (для графика)
|
||||
- Изменены схемы открывания окон
|
||||
- Обновлена верхняя статья про серию
|
||||
|
||||
```bash
|
||||
# Все изменилось → перестроить все
|
||||
python manage.py regenerate_seria_prerender --force
|
||||
|
||||
# Изменилась одна серия → перестроить одну
|
||||
python manage.py regenerate_seria_prerender --seria-id 210
|
||||
```
|
||||
|
||||
### ❌ НЕ нужна регенерация, если:
|
||||
|
||||
- Добавлены новые **предложения** (цены от поставщиков)
|
||||
- Обновлены **наличие/status** существующих предложений
|
||||
- Система просто должна **показать свежие цены**
|
||||
|
||||
Таблица окон пересчитывается при каждом запросе автоматически! 🎉
|
||||
|
||||
---
|
||||
|
||||
## 🔌 Интеграция с Docker
|
||||
|
||||
В контейнере (PROD-режим):
|
||||
|
||||
```dockerfile
|
||||
# Генерируем кеш пр�� запуске
|
||||
RUN python manage.py regenerate_seria_prerender
|
||||
|
||||
# Запускаем сервер
|
||||
CMD ["gunicorn", "oknardia.wsgi:application", "--bind", "0.0.0.0:8000"]
|
||||
```
|
||||
|
||||
Кеш-файлы сохраняются на диск в томе, поэтому переживают перезагрузку контейнера.
|
||||
|
||||
---
|
||||
|
||||
## 📝 Контекстные переменные
|
||||
|
||||
### При первом запросе (происходит генерация):
|
||||
|
||||
View `catalog_seria_info()` отправляет в шаблон:
|
||||
|
||||
```python
|
||||
to_template = {
|
||||
"THIS_SERIA_ID": seria_id, # ID серии (210)
|
||||
"THIS_SERIA_NAME": q_seria.sName, # Название ("1-335")
|
||||
"THIS_SERIA_DESCRIPTION": html_description, # Верхняя статья
|
||||
"FLAP_DIM": flap_dimensions, # Массив схем открывания
|
||||
"DATA4GRAPH": graph_data, # Годы и кол-во домов
|
||||
"DATA4GEO": geo_data, # Координаты зданий
|
||||
"ACCOUNTS": buildings_count, # Кол-во квартир
|
||||
"APARTMENTS": families_count, # Кол-во семей
|
||||
"RESIDENTIAL_M2": total_area, # Площадь жилая
|
||||
# ... и другие
|
||||
}
|
||||
```
|
||||
|
||||
### Для шаблонов генерации кеша:
|
||||
|
||||
Каждый template файл получает **все** эти переменные и рендерится отдельно.
|
||||
|
||||
### Для main-шаблона:
|
||||
|
||||
Main-шаблон получает пути только к 3 кеш-файлам:
|
||||
|
||||
```python
|
||||
to_template.update({
|
||||
"PRE_RENDERED_STATIC_FLAPS_PATH": "seria_info/prepared/210_id_static_flaps.html",
|
||||
"PRE_RENDERED_STATIC_GRAPH_PATH": "seria_info/prepared/210_id_static_graph.html",
|
||||
"PRE_RENDERED_STATIC_MAP_STATS_PATH": "seria_info/prepared/210_id_static_map_stats.html",
|
||||
})
|
||||
|
||||
# Верхняя статья всегда передается как THIS_SERIA_DESCRIPTION и рендерится динамически
|
||||
to_template.update({
|
||||
"THIS_SERIA_DESCRIPTION": html_description, # Из БД, не кешируется
|
||||
})
|
||||
```
|
||||
|
||||
Main-шаблон использует `{% include %}` для 3 кеш-файлов, а верхнюю статью рендерит напрямую: `{{ THIS_SERIA_DESCRIPTION|safe }}`.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Примеры использования
|
||||
|
||||
### Добавили новое здание в серию 210
|
||||
|
||||
```bash
|
||||
# Обновили БД через Django ORM/admin
|
||||
python manage.py shell
|
||||
>>> from oknardia.models import Building_Info
|
||||
>>> Building_Info.objects.create(...)
|
||||
|
||||
# Регенерируем кеш только этой серии
|
||||
python manage.py regenerate_seria_prerender --seria-id 210
|
||||
|
||||
# Пользователи видят новое здание на карте и в таблице
|
||||
```
|
||||
|
||||
### Обновили года ввода в эксплуатацию
|
||||
|
||||
```bash
|
||||
# Изменили данные
|
||||
python manage.py shell
|
||||
>>> from oknardia.models import Building_Info
|
||||
>>> Building_Info.objects.filter(...).update(...)
|
||||
|
||||
# Кеш станет невалидным — нужна регенерация
|
||||
python manage.py regenerate_seria_prerender --force
|
||||
|
||||
# Пользователи видят обновленный график
|
||||
```
|
||||
|
||||
### Добавили новое предложение (цену)
|
||||
|
||||
```bash
|
||||
# PriceOffer.objects.create(...) → система добавляет новое предложение
|
||||
# НЕ нужна регенерация!
|
||||
|
||||
# Таблица окон обновилась сама на следующем запросе
|
||||
# Пользователи видят новое предложение сразу
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
### Проверить, какие кеш-файлы существуют:
|
||||
|
||||
```bash
|
||||
ls -lah oknardia/templates/seria_info/prepared/
|
||||
```
|
||||
|
||||
### Вручную удалить кеш (для тестирования):
|
||||
|
||||
```bash
|
||||
# Удалить кеш одной серии
|
||||
rm oknardia/templates/seria_info/prepared/210*.html
|
||||
|
||||
# Удалить ВСЕ кеш-файлы
|
||||
rm oknardia/templates/seria_info/prepared/*_id_static_*.html
|
||||
```
|
||||
|
||||
### Проверить содержимое кеш-файла:
|
||||
|
||||
```bash
|
||||
cat oknardia/templates/seria_info/prepared/210_id_static_graph.html | head -20
|
||||
cat oknardia/templates/seria_info/prepared/210_id_static_flaps.html | head -30
|
||||
cat oknardia/templates/seria_info/prepared/210_id_static_map_stats.html | head -50
|
||||
```
|
||||
|
||||
### Логирование:
|
||||
|
||||
В `catalog_series.py` логируем создание файлов:
|
||||
|
||||
```python
|
||||
logger.info(f"Cache created: {file_flaps}")
|
||||
logger.info(f"Cache created: {file_graph}")
|
||||
logger.info(f"Cache created: {file_map_stats}")
|
||||
# file_upper НЕ создается — верхняя статья рендерится динамически
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Производительность
|
||||
|
||||
### Без кеша (DEV-режим):
|
||||
|
||||
- ~2-3 сек на запрос (вычисляются geo, graph, flaps)
|
||||
- Каждый запрос трогает БД
|
||||
- Удобно для разработки
|
||||
|
||||
### С кешем (PROD-режим):
|
||||
|
||||
- ~100-300 мс на первый запрос (генерируется кеш)
|
||||
- ~50-100 мс на последующие (включаются файлы + динамическая таблица)
|
||||
- Статические данные из кеша (очень быстро)
|
||||
- Таблица окон кешируется на уровне DB-запроса (индексы работают)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Чек-лист для администратора
|
||||
|
||||
При развертывании в production:
|
||||
|
||||
- [ ] Запустить `python manage.py regenerate_seria_prerender` (сгенерировать все 93 файла)
|
||||
- [ ] Проверить размеры файлов в `prepared/` (~100-200 KB всего)
|
||||
- [ ] Протестировать на локалхосте `DEBUG = False`
|
||||
- [ ] Проверить, что таблица окон обновляется при добавлении новых предложений
|
||||
- [ ] Настроить логирование создания кеша в продакшене
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Близкие компоненты
|
||||
|
||||
- **Main-шаблон**: `oknardia/templates/seria_info/all_seria_info_pre_light.html`
|
||||
- **Динамическая таблица**: `oknardia/templates/seria_info/all_seria_info_pre_light_dynamic_include.html`
|
||||
- **View**: `oknardia/web/catalog_series.py::catalog_seria_info()`
|
||||
- **Management-команда**: `oknardia/web/management/commands/regenerate_seria_prerender.py`
|
||||
- **Тесты**: `oknardia/web/test_prices.py` (проверяет свежесть таблицы)
|
||||
|
||||
---
|
||||
|
||||
**Версия:** 2.0 (Двухуровневое кеширование)
|
||||
**Последнее обновление:** 2026-05-19
|
||||
**Статус:** ✅ Production-ready
|
||||
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
# =================================================
|
||||
# STAGE 1: Builder - Установка зависимостей
|
||||
# =================================================
|
||||
FROM python:3.12-slim AS builder
|
||||
|
||||
# Устанавливаем переменные окружения
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PIP_DEFAULT_TIMEOUT=100
|
||||
|
||||
# Устанавливаем Poetry
|
||||
RUN pip install --no-cache-dir --default-timeout=100 --retries 10 poetry poetry-plugin-export
|
||||
|
||||
# Создаем рабочую директорию
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем только файлы зависимостей для кэширования этого слоя
|
||||
COPY pyproject.toml poetry.lock /app/
|
||||
|
||||
# Экспортируем lock-файл в requirements.txt и ставим зависимости через pip.
|
||||
# Это обычно быстрее и проще для Docker, чем полноценная установка через Poetry.
|
||||
RUN poetry export --format requirements.txt --without-hashes --with dev --output /tmp/requirements.txt \
|
||||
&& pip install --no-cache-dir --default-timeout=100 --retries 10 -r /tmp/requirements.txt
|
||||
|
||||
|
||||
# =================================================
|
||||
# STAGE 2: Final - Создание чистого и безопасного образа
|
||||
# =================================================
|
||||
FROM python:3.12-slim AS stage-final
|
||||
|
||||
# Устанавливаем переменные окружения
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV DJANGO_SETTINGS_MODULE=oknardia.settings
|
||||
|
||||
|
||||
# Удалить: Для DEV окружения отключены создание непривилегированного пользователя
|
||||
# и все связанные с ним операции chown — контейнер запускается от root,
|
||||
# что избегает проблем с доступом к смонтированным томам (база, статика).
|
||||
# RUN addgroup --system app && adduser --system --ingroup app app
|
||||
|
||||
# Создаем рабочую директорию (где находится manage.py)
|
||||
WORKDIR /home/app/oknardia
|
||||
|
||||
# Копируем установленные Python-пакеты из builder-стадии
|
||||
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
|
||||
|
||||
# Удалить для dev: Копируем исходный код проекта. В DEV хозяин files не критичен (root).
|
||||
# COPY --chown=1000:1000 . .
|
||||
# Копируем весь проект в /home/app (корень проекта)
|
||||
COPY . /home/app/
|
||||
|
||||
# Удалить для dev: Создание директорий и установка прав
|
||||
# RUN mkdir -p /nginx_configs_host/nginx && chown -R 1000:1000 /nginx_configs_host
|
||||
# RUN mkdir -p /home/app/web/public/staticfiles && chown -R 1000:1000 /home/app/web/public
|
||||
# RUN mkdir -p /home/app/web/public/media/_error && chown -R 1000:1000 /home/app/web/public/media
|
||||
# RUN mkdir -p /home/app/web/database && chown -R 1000:1000 /home/app/web/database
|
||||
|
||||
# Удалить для dev: USER 1000 — для DEV запускаем от root
|
||||
# USER 1000
|
||||
|
||||
|
||||
# Собираем статику
|
||||
# Используем dummy ключ, так как .env файла нет на этапе сборки
|
||||
# ВАЖНО: В DEV режиме collectstatic запускается в docker-compose command, а не при сборке,
|
||||
# чтобы избежать ошибок с недоступными файлами.
|
||||
# RUN SECRET_KEY=dummy python oknardia/manage.py collectstatic --noinput --clear
|
||||
|
||||
# Открываем порт
|
||||
EXPOSE 8000
|
||||
|
||||
# Проверка здоровья контейнера
|
||||
# Docker будет периодически проверять, жив ли контейнер, отправляя GET запрос к главной странице.
|
||||
# Параметры:
|
||||
# --interval=30s - проверка каждые 30 секунд
|
||||
# --timeout=3s - ожидаем ответ максимум 3 секунды
|
||||
# --start-period=10s - даем контейнеру 10 секунд на запуск перед первой проверкой
|
||||
# --retries=3 - объявляем контейнер unhealthy после 3 неудачных попыток
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
||||
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/').read()" || exit 1
|
||||
|
||||
# Переходим в директорию с manage.py для корректного запуска Django
|
||||
WORKDIR /home/app/oknardia
|
||||
|
||||
# Команда запуска по умолчанию (для продакшена).
|
||||
# В DEV режиме используется runserver через docker-compose.local.yml,
|
||||
# который автоматически отдаёт статику и имеет auto-reload.
|
||||
CMD ["python", "-m", "gunicorn", "--workers", "2", "--bind", "0.0.0.0:8000", "oknardia.wsgi:application"]
|
||||
@@ -1,939 +0,0 @@
|
||||
# MANAGEMENT_RUNBOOK.md
|
||||
|
||||
Единый runbook по management-командам проекта.
|
||||
|
||||
Документ отвечает на 3 вопроса:
|
||||
- что запускать;
|
||||
- когда запускать;
|
||||
- как безопасно откатываться/повторять запуск.
|
||||
|
||||
## Каталог команд
|
||||
|
||||
1. `regenerate_seria_roots` — пересчет корневых серий (иерархия и консолидация).
|
||||
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` — пересчёт рейтингов профилей и стеклопакетов методом Манна-Уитни.
|
||||
|
||||
## Общие правила запуска
|
||||
|
||||
- Запускать команды из корня репозитория.
|
||||
- Для локального/CI запуска использовать `poetry`.
|
||||
- Не запускать тяжелые операции через HTTP-эндпоинты `/service/*`.
|
||||
- Перезапуск веб-сервера (`gunicorn`/`uWSGI`) делать отдельным шагом оркестрации, а не из кода Django.
|
||||
|
||||
Базовый шаблон запуска:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py <command> [args]
|
||||
```
|
||||
|
||||
## 1) Команда `regenerate_seria_roots`
|
||||
|
||||
Назначение:
|
||||
- пересчитать корневые серии (root) для всей иерархии серий домов.
|
||||
- консолидировать различные написания одной и той же серии в одну "корневую" серию.
|
||||
|
||||
### Контекст
|
||||
|
||||
На разных источниках данные о типовых сериях домов были записаны с разными орфографическими вариантами.
|
||||
Например серия **II-57** могла быть обозначена как:
|
||||
- `2-57` (цифра вместо кириллицы)
|
||||
- `И-57` (кириллица И вместо латинской II)
|
||||
- `П-57` (опечатка)
|
||||
- и т.п.
|
||||
|
||||
При парсинге данных эти варианты могли оказаться в БД как отдельные серии, хотя на самом деле это одна и та же серия.
|
||||
Функция `regenerate_seria_roots` связывает все эти варианты (алиасы) с одной **корневой** серией.
|
||||
|
||||
### Когда это нужно
|
||||
|
||||
При добавлении новых адресов и серий типового строительства, при ручном редактировании иерархии серий в админке,
|
||||
при загрузке новых данных с разными орфографическими вариантами серий. Кроме того, если для уже существующих в базе
|
||||
серий будут получены данные о типовых размерах оконных проёмов и типов квартирах (сейчас в базе около 4500 серий, из
|
||||
них всего 31 корневых серий и 1957 серий с найденным корнем... ещё 2502 неописанных серии без корня, т.е. больше
|
||||
половины, могут пополнить каталог Окнардии.
|
||||
|
||||
### Как это работает
|
||||
|
||||
1. **Этап 1**: Находит "корневые" серии (root series) — те, что реально используются в таблице `Apartment_Type`
|
||||
(т.е. у которых есть квартиры). Для каждой такой серии устанавливает `kRoot_id = own_id`.
|
||||
|
||||
2. **Этап 2**: Для всех остальных серий:
|
||||
- Движется вверх по дереву иерархии (`kParent_id`)
|
||||
- Ищет корневую серию (ту, которая либо не имеет родителя, либо она в списке корневых)
|
||||
- Устанавливает найденную корневую серию в поле `kRoot_id`
|
||||
- Если не находит корневую серию → `kRoot_id = None`
|
||||
|
||||
### Пример структуры после обработки
|
||||
|
||||
```
|
||||
Таблица: Seria_Info
|
||||
|
||||
id | sSeriaName | kParent_id | kRoot_id | Комментарий
|
||||
----|------------|------------|-----------|-------------------
|
||||
123 | II-57 | NULL | 123 | Корневая серия
|
||||
124 | 2-57 | 123 | 123 | Алиас (через родителя)
|
||||
125 | И-57 | 123 | 123 | Алиас (через родителя)
|
||||
126 | П-57 | 123 | 123 | Алиас (через родителя)
|
||||
```
|
||||
|
||||
### Базовый запуск
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots
|
||||
```
|
||||
|
||||
### Параметры запуска
|
||||
|
||||
**`--verbosity 0`** — только ошибки (минимум информации):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 0
|
||||
```
|
||||
|
||||
**`--verbosity 1`** — точки/плюсы (стандартный режим):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots
|
||||
# или явно
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 1
|
||||
```
|
||||
|
||||
**`--verbosity 2`** — подробный вывод (названия серий):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 2
|
||||
```
|
||||
|
||||
**`--verbosity 3`** — очень подробный вывод в виде таблицы:
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py regenerate_seria_roots --verbosity 3
|
||||
```
|
||||
|
||||
### Примеры вывода
|
||||
|
||||
**Verbosity 0 (только ошибки - чистый вывод):**
|
||||
```
|
||||
✅ Пересчет завершен! Время: 2.18с
|
||||
```
|
||||
|
||||
**Verbosity 1 (магический режим - точки и символы):**
|
||||
```
|
||||
=== ПЕРЕСЧЕТ КОРНЕВЫХ СЕРИЙ ===
|
||||
Этап 1: Ищем корневые серии в таблице квартир...
|
||||
✓ Найдено корневых серий: 241
|
||||
...............................
|
||||
|
||||
Этап 2: Главная магия - обрабатываем все серии в иерархии...
|
||||
-----++..--.++--...--.+.++++.-+++++++-.-.++.-+--++--++++-+++++++-++.+--.+++-+-..++++++-++++++++++--.-++++++-++++
|
||||
+--+-+++++++++-++++++++++-++++--+++.+++--+++++++++++++++++++---++.+-+-+++++-++++++++++-+++-+----+.-+++-+--++++++
|
||||
+++----+--+-+++++-+--+++--+++-.+++++-++++++++-+---++-+++++---+++------++----++-+--++----+--++--++++--+++++++++++
|
||||
+++++++-------++++---+++-[... очень много символов ...]
|
||||
|
||||
=== РЕЗУЛЬТАТЫ ===
|
||||
✓ Корневых серий (обработаны на этапе 1): 31
|
||||
✓ Серий с найденным корнем: 1957
|
||||
⚠ Серий без корня: 2502
|
||||
|
||||
✅ Пересчет завершен! Время: 2.18с
|
||||
```
|
||||
|
||||
**Легенда магического режима:**
|
||||
- `.` = корневая серия (обработана на этапе 1)
|
||||
- `+` = серия с найденным корнем
|
||||
- `-` = серия без найденного корня
|
||||
- `E` = ошибка при обработке
|
||||
|
||||
**Verbosity 2 (подробный):**
|
||||
```
|
||||
=== ПЕРЕСЧЕТ КОРНЕВЫХ СЕРИЙ ===
|
||||
Этап 1: Ищем корневые серии в таблице квартир...
|
||||
✓ Найдено корневых серий: 241
|
||||
✓ 0008 П-44
|
||||
✓ 0009 П-3
|
||||
✓ 0012 II-49
|
||||
✓ 0017 КОПЭ
|
||||
...
|
||||
|
||||
Этап 2: Главная магия - обрабатываем все серии в иерархии...
|
||||
0001: Нет корня
|
||||
0002: Нет корня
|
||||
0006: корень → 12
|
||||
0007: корень → 9
|
||||
0008: корневая
|
||||
...
|
||||
```
|
||||
|
||||
**Verbosity 3 (очень подробный - таблица):**
|
||||
```
|
||||
=== ПЕРЕСЧЕТ КОРНЕВЫХ СЕРИЙ ===
|
||||
Этап 1: Ищем корневые серии в таблице квартир...
|
||||
✓ Найдено корневых серий: 241
|
||||
✓ 0008 | П-44 | корневая
|
||||
✓ 0009 | П-3 | корневая
|
||||
✓ 0012 | II-49 | корневая
|
||||
...
|
||||
|
||||
Этап 2: Главная магия - обрабатываем все серии в иерархии...
|
||||
--------------------------------------------------------------------------------------------------------------
|
||||
ID | Название | Родитель | Путь | Результат
|
||||
--------------------------------------------------------------------------------------------------------------
|
||||
...
|
||||
...
|
||||
2565 | Г-ЗИ | 9 | 9 | ✓ Корень #9
|
||||
2566 | I-528КП-809/69 | - | (нет) | ✗ Нет корня
|
||||
2567 | 464Д-0154 | 3339 | 3339 → 963 → 375 | ✓ Корень #375
|
||||
2568 | УЛГ-507-4/64 | 2105 | 2105 | ✓ Корень #2105
|
||||
2569 | ЛГ-507-4 | 2105 | 2105 | ✓ Корень #2105
|
||||
2570 | 1ЛГ-600-И-1 | - | (нет) | ✗ Нет корня
|
||||
2571 | 464Д-0154 Новополоцкого ДСК | 3339 | 3339 → 963 → 375 | ✓ Корень #375
|
||||
2572 | 121-0142,13,87 | - | (нет) | ✗ Нет корня
|
||||
...
|
||||
...
|
||||
--------------------------------------------------------------------------------------------------------------
|
||||
|
||||
=== РЕЗУЛЬТАТЫ ===
|
||||
✓ Корневых серий (обработаны на этапе 1): 31
|
||||
✓ Серий с найденным корнем: 1957
|
||||
⚠ Серий без корня: 2502
|
||||
|
||||
✅ Пересчет завершен! Время: 2.18с
|
||||
```
|
||||
|
||||
### Когда запускать
|
||||
|
||||
- **После первого развертывания** — консолидировать иерархию серий.
|
||||
- **После ручного редактирования иерархии** (добавления родитель-потомков в админку).
|
||||
- **После загрузки новых данных** с разными орфографическими вариантами серий.
|
||||
- **По расписанию** (опционально, например раз в месяц):
|
||||
```bash
|
||||
0 2 * * 1 cd /home/user/app-path/2022-oknardia && poetry run python oknardia/manage.py regenerate_seria_roots >> /var/log/oknardia-seria-roots.log 2>&1
|
||||
```
|
||||
|
||||
### Откат и безопасность
|
||||
|
||||
- **Безопасна для повторного запуска** — просто пересчитывает все `kRoot_id`.
|
||||
- **Откат через SQL** — если нужно очистить поле (перед запуском рекомендуется бэкап):
|
||||
```sql
|
||||
UPDATE oknardia_seria_info SET kRoot_id = NULL;
|
||||
```
|
||||
- **Проверка результатов** — после запуска можно проверить:
|
||||
```bash
|
||||
poetry run python oknardia/manage.py shell -c "
|
||||
from oknardia.models import Seria_Info
|
||||
count_null = Seria_Info.objects.filter(kRoot_id__isnull=True).count()
|
||||
count_with_root = Seria_Info.objects.filter(kRoot_id__isnull=False).count()
|
||||
print(f'Серий без корня: {count_null}')
|
||||
print(f'Серий с корнем: {count_with_root}')
|
||||
"
|
||||
```
|
||||
|
||||
## 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`.
|
||||
|
||||
Базовый запуск:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py generate_sitemaps
|
||||
```
|
||||
|
||||
Запуск с параметрами:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py generate_sitemaps \
|
||||
--compare-min-depth 2 \
|
||||
--compare-max-depth 4 \
|
||||
--max-items 40000 \
|
||||
--max-file-size 5242880 \
|
||||
--max-files-qty 998
|
||||
```
|
||||
|
||||
Когда запускать:
|
||||
- после деплоя;
|
||||
- по расписанию (cron/systemd timer);
|
||||
- после крупных изменений данных каталога/блога.
|
||||
|
||||
### Важные замечания
|
||||
|
||||
Чтобы `sitemap.xml` отдавал прокси-nginx напрямую из файловой системы, нужно, чтобы он физически лежал
|
||||
в `MEDIA_ROOT/_serv_sitemap/sitemap.xml`.
|
||||
|
||||
Допустимо, что файл доступен по двум URL (корневой и media), но в `robots.txt` должен быть указан один
|
||||
канонический вариант `sitemap.xml`
|
||||
|
||||
#### NGINX snippet (alias для корневого sitemap)
|
||||
|
||||
```nginx
|
||||
# Корневой sitemap.xml (для привычного для поисковиков URL)
|
||||
location = /sitemap.xml {
|
||||
alias /<путь-к-каталогку-с-докер-приложением>/media/_serv_sitemap/sitemap.xml;
|
||||
default_type application/xml;
|
||||
add_header Cache-Control "public, max-age=300";
|
||||
}
|
||||
```
|
||||
|
||||
## 4) Команда `regenerate_seria_prerender`
|
||||
|
||||
Назначение:
|
||||
- пересобрать pre-render шаблоны для **статических данных** страниц серий (`catalog_seria_info`) в каталоге `seria_info/prepared/`.
|
||||
- генерирует **3 типа файлов** для каждой серии (верхняя статья НЕ кешируется, она рендерится динамически из БД):
|
||||
- `{seria_id}_id_static_flaps.html` — схемы открывания
|
||||
- `{seria_id}_id_static_graph.html` — график ввода в эксплуатацию
|
||||
- `{seria_id}_id_static_map_stats.html` — карта + статистика
|
||||
|
||||
### Контекст: двухуровневое кеширование
|
||||
|
||||
Система использует двухуровневое кеширование:
|
||||
- **Статический кеш** — дорогостоящие операции (геокоординаты, графики, схемы). Генерируются один раз и сохраняются на диск.
|
||||
- **Динамические данные** — верхняя статья про серию (может редактироваться через админку, видно БЕЗ перезагрузки контейнера) и таблица оконных проёмов (показывает актуальные предложения).
|
||||
|
||||
Подробнее: см. [`CACHE_PRERENDER_SYSTEM.md`](CACHE_PRERENDER_SYSTEM.md)
|
||||
|
||||
### Проверка без записи файлов (dry-run):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_prerender --dry-run
|
||||
```
|
||||
|
||||
Пересборка только отсутствующих файлов (стандартный запуск):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_prerender
|
||||
```
|
||||
|
||||
Вывод:
|
||||
```
|
||||
OK seria 210: 3 кеш-файла созданы
|
||||
OK seria 100: 3 кеш-файла созданы
|
||||
...
|
||||
Готово. Обработано: 31. Создано/пересоздано: 31 × 3 файла. Пропущено: 0.
|
||||
```
|
||||
|
||||
Принудительная пересборка всех root-серий (даже если кеш существует):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_prerender --force
|
||||
```
|
||||
|
||||
Выборочная пересборка (конкретные серии):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_prerender --seria-id 843 --seria-id 2100 --force
|
||||
```
|
||||
|
||||
### Когда запускать
|
||||
|
||||
- **После первого развертывания** — сгенерировать кеш всех 31 серии один раз.
|
||||
- **После обновления логики `catalog_seria_info`** — изменились параметры графика или карты.
|
||||
- **После изменения координат зданий** — geo-данные обновлены.
|
||||
- **После добавления новых зданий в серию** — карта и список зда��ий изменились.
|
||||
- **По расписанию** (опционально, если данные по геокоординатам обновляются):
|
||||
```bash
|
||||
0 3 * * 0 cd /Users/e-serg/PRJ/2022-oknardia && poetry run python oknardia/manage.py regenerate_seria_prerender >> /var/log/oknardia-prerender.log 2>&1
|
||||
```
|
||||
|
||||
### Когда НЕ нужна регенерация
|
||||
|
||||
- **При добавлении новых предложений/цен** — таблица окон обновляется при каждом запросе автоматически.
|
||||
- **При редактировании верхней статьи через админку** — она рендерится динамически, кешируется НЕ нужно.
|
||||
- **При изменении наличия/статуса профилей** — рейтинги пересчитываются запросом через `make_rating`.
|
||||
|
||||
## 5) Команда `populate_seo_fields`
|
||||
|
||||
Назначение:
|
||||
- автозаполнить SEO-поля (`sSlug`, `sMetaDescription`, `sMetaKeywords`) для всех существующих записей блога.
|
||||
|
||||
Используется:
|
||||
- при первом развертывании новой версии с автогенерацией SEO-полей;
|
||||
- при восстановлении из бэкапа где SEO-поля пусты;
|
||||
- при изменении логики автогенерации (с флагом `--force`).
|
||||
|
||||
### Базовый запуск
|
||||
|
||||
Заполнить только пустые SEO-поля (стандартный вариант):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py populate_seo_fields
|
||||
```
|
||||
|
||||
### Параметры запуска
|
||||
|
||||
**`--dry-run`** — только показать что будет сделано (без сохранения в БД):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py populate_seo_fields --dry-run
|
||||
```
|
||||
|
||||
**`--force`** — переполнить ВСЕ SEO-поля, даже уже заполненные:
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py populate_seo_fields --force
|
||||
```
|
||||
|
||||
**`--clean`** — очистить все SEO-поля перед заполнением (для переделки):
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py populate_seo_fields --clean
|
||||
```
|
||||
|
||||
**Комбинация флагов** — сухой прогон переполнения всех полей:
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py populate_seo_fields --dry-run --force
|
||||
```
|
||||
|
||||
### Что заполняется
|
||||
|
||||
| Поле | Источник | Результат |
|
||||
|------|----------|-----------|
|
||||
| `sSlug` | `sPostHeader` | URL-безопасный слаг (max 200 символов) |
|
||||
| `sMetaDescription` | `sPostContent` | Первые 160 символов (исключая теги `<cut>`) |
|
||||
| `sMetaKeywords` | `sPostHeader` | Заголовок + префикс "oknardia, окнардия, блог, публикация" (max 256 символов) |
|
||||
|
||||
Пример результата:
|
||||
|
||||
```python
|
||||
sPostHeader = "Профиль Brusbox Super Aero"
|
||||
↓
|
||||
sSlug = "profil-brusbox-super-aero"
|
||||
sMetaDescription = "brusbox-super-aero-pyatikamernaya-profil-sistema..."
|
||||
sMetaKeywords = "oknardia, окнардия, блог, публикация, Профиль Brusbox Super Aero"
|
||||
```
|
||||
|
||||
### Когда запускать
|
||||
|
||||
- **После первого развертывания** — заполнить SEO-поля всех 29 существующих постов одной командой.
|
||||
- **Один раз** — команда идемпотентна (при повторном запуске не будет ничего менять, т.к. пустые поля остатся).
|
||||
- **При изменении логики** — использовать `--clean --force` для полной переделки всех SEO-полей.
|
||||
|
||||
### Пример полного сценария
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
|
||||
# Шаг 1: Проверить что будет заполнено
|
||||
poetry run python oknardia/manage.py populate_seo_fields --dry-run
|
||||
|
||||
# Шаг 2: Если результат устраивает — запустить реально
|
||||
poetry run python oknardia/manage.py populate_seo_fields
|
||||
|
||||
# Шаг 3: Проверить что заполнилось
|
||||
poetry run python oknardia/manage.py shell -c "
|
||||
from oknardia.models import BlogPosts
|
||||
posts = BlogPosts.objects.all()
|
||||
print(f'Пусто sSlug: {posts.filter(sSlug=\"\").count()}')
|
||||
print(f'Пусто sMetaDescription: {posts.filter(sMetaDescription=\"\").count()}')
|
||||
print(f'Пусто sMetaKeywords: {posts.filter(sMetaKeywords=\"\").count()}')
|
||||
"
|
||||
```
|
||||
|
||||
### Возвращаемая информация
|
||||
|
||||
```
|
||||
======================================================================
|
||||
ИТОГОВЫЙ ОТЧЕТ
|
||||
======================================================================
|
||||
|
||||
✓ sSlug заполнено: 28 раз
|
||||
✓ sMetaDescription заполнено: 28 раз
|
||||
✓ sMetaKeywords заполнено: 28 раз
|
||||
✓ Записей обновлено в БД: 28
|
||||
✗ Ошибок при обработке: 0
|
||||
|
||||
Обновлено 28 записей успешно!
|
||||
```
|
||||
|
||||
### Откат и безопасность
|
||||
|
||||
- **Безопасна для повторного запуска** — пустые поля не изменяются при повторной работе.
|
||||
- **Откат через SQL** — если нужно очистить, используй: `UPDATE oknardia_blogposts SET sSlug='', sMetaDescription='', sMetaKeywords='';`
|
||||
- **Всегда используй `--dry-run`** перед первым запуском для проверки.
|
||||
|
||||
## 6) Команда `make_rating`
|
||||
|
||||
Назначение:
|
||||
- пересчитать рейтинги оконных профилей, стеклопакетов и наборов услуг используя адаптированный метод Манна-Уитни (Mann-Whitney U Step Rank).
|
||||
- сохранить результаты в поля `fProfileRating`, `fGlazingRating`, `fSetRating` (0.0 … 5.0 звёзд).
|
||||
- заполнить JSON-состав рейтинга (детальный разбор по каждому параметру) в поля `sProfileDescription`, `sGlazingDescription`, `sSetDescription`.
|
||||
- алгоритм рассчитывает три этапа ранжирования: профили → стеклопакеты → наборы (которые зависят от профилей и стеклопакетов).
|
||||
|
||||
### Базовый запуск
|
||||
|
||||
Пересчитать рейтинги всех профилей и стеклопакетов (стандартный режим):
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py make_rating
|
||||
```
|
||||
|
||||
### Параметры запуска
|
||||
|
||||
**`--verbosity 0`** — минимум информации (только ошибки):
|
||||
**`--verbosity 1`** — стандартная информация (по умолчанию):
|
||||
**`--verbosity 3`** — очень подробный вывод (для отладки, для каждого профиля/стеклопакета таблица):
|
||||
|
||||
Пример использования с параметром `--verbosity`:
|
||||
|
||||
```bash
|
||||
poetry run python oknardia/manage.py make_rating --verbosity 3 | head -500
|
||||
```
|
||||
|
||||
### АЛГОРИТМ: Метод Манна-Уитни (Mann-Whitney U Step Rank)
|
||||
|
||||
Команда использует адаптированный вариант критерия Манна-Уитни для ранжирования параметров качества оконных
|
||||
предложений и комопнентов (профилей, стеклопакетов, наборов услуг) на основе их технических характеристик
|
||||
и популярности у поставщиков.
|
||||
|
||||
#### Как это работает:
|
||||
|
||||
1. **Сортировка объектов** по одному параметру (например, по теплопередаче):
|
||||
- Профиль A: 0.60 Ro → ранг = 0.0
|
||||
- Профиль B: 0.60 Ro → ранг = 0.0 (то же значение, ранг не меняется)
|
||||
- Профиль C: 0.80 Ro → ранг = 1.0 (новое значение, добавляем вес параметра)
|
||||
- Профиль D: 0.95 Ro → ранг = 2.0 (ещё новое значение)
|
||||
|
||||
2. **Направление ранжирования** определяется флагом `revers`:
|
||||
- `revers=False` — **БОЛЬШЕ = ЛУЧШЕ** (например, теплопередача, звукоизоляция)
|
||||
- `revers=True` — **МЕНЬШЕ = ЛУЧШЕ** (например, высота в проёме для прочности)
|
||||
|
||||
3. **Нормализация рангов** к диапазону 0.0 … 1.0:
|
||||
- Профиль A: 0.0 / 2.0 = 0.0
|
||||
- Профиль B: 0.0 / 2.0 = 0.0
|
||||
- Профиль C: 1.0 / 2.0 = 0.5
|
||||
- Профиль D: 2.0 / 2.0 = 1.0
|
||||
|
||||
4. **Суммирование рангов** по всем параметрам:
|
||||
- TmpRating = Σ(ранг_параметра × вес_параметра)
|
||||
|
||||
5. **Преобразование в звёзды** (0.0 … 5.0):
|
||||
- ТmpRating нормализуется к 0..1
|
||||
- Умножается на 5.0 для получения финального рейтинга
|
||||
|
||||
#### Пример итогового рейтинга профиля:
|
||||
|
||||
```
|
||||
Профиль "Brusbox Super Aero"
|
||||
Теплопередача: 0.60 Ro (ранг 0.9, вес 1.0)
|
||||
Звукоизоляция: 33 дБ (ранг 0.8, вес 1.0)
|
||||
Высота в проёме: 112 мм (ранг 0.6, вес 0.3)
|
||||
Количество камер: 6 шт (ранг 0.7, вес 0.1)
|
||||
|
||||
Итого: (0.9×1.0 + 0.8×1.0 + 0.6×0.3 + 0.7×0.1) / 2.3 ≈ 3.8 звёзд ⭐⭐⭐⭐
|
||||
```
|
||||
|
||||
### ПРОФИЛИ: какие параметры учитываются
|
||||
|
||||
| № | Параметр | Поле БД | ЛУЧШЕ | Вес | Описание |
|
||||
|---|----------------------|----------------------------|--------------------|-----|-----------------------------------------------------|
|
||||
| 1 | Звукоизоляция | `fProfileSoundproofing` | БОЛЬШЕ дБ | 1.0 | Сопротивление шуму (дБ) |
|
||||
| 2 | Теплопередача | `fProfileHeatTransf` | БОЛЬШЕ Ro | 1.0 | Сопротивление теплопередаче (м²×°C/Вт) |
|
||||
| 3 | Высота в проёме | `iProfileHeight` | МЕНЬШЕ мм | 0.3 | Видимая высота в световом проёме (экономия) |
|
||||
| 4 | Высота фальца | `iProfileRabbet` | БОЛЬШЕ мм | 0.2 | Глубина фальца для герметизации |
|
||||
| 5 | Толщина стеклопакета | `iProfileGlazingThickness` | БОЛЬШЕ мм | 0.2 | Максимальная толщина стеклопакета |
|
||||
| 6 | Толщина профиля | `iProfileThickness` | БОЛЬШЕ мм | 0.2 | Монтажная (боковая) ширина профиля |
|
||||
| 7 | Контуры уплотнения | `fProfileSeals` | БОЛЬШЕ контуров | 1.2 | Количество контуров уплотнения |
|
||||
| 8 | Количество камер | `iProfileCameras` | БОЛЬШЕ шт | 0.1 | Число камер в профиле (из рамки + створки) |
|
||||
| 9 | Популярность | `NumOffer` | БОЛЬШЕ предложений | 0.1 | Используется ли профиль в коммерческих предложениях |
|
||||
|
||||
**Примеры интерпретации:**
|
||||
- Профиль с рейтингом **5.0 ⭐⭐⭐⭐⭐**: отличная теплопередача + звукоизоляция + много камер + многоконтурные
|
||||
уплотнения.
|
||||
- Профиль с рейтингом **2.0 ⭐⭐**: среднее качество, слабые характеристики.
|
||||
- Профиль с рейтингом **0.5 ⭐**: слабые характеристики или производить не предоставил данных и их нет в отрытых источниках.
|
||||
|
||||
### СТЕКЛОПАКЕТЫ: какие параметры учитываются
|
||||
|
||||
| № | Параметр | Поле БД | ЛУЧШЕ | Вес | Описание |
|
||||
|---|-------------------|-----------------------------|--------------|------|----------------------------------------------------------------------------------------|
|
||||
| 1 | Звукоизоляция | `fGlazingSoundproofing` | БОЛЬШЕ дБ | 1.0 | Звукоизоляционный коэффициент (дБ) |
|
||||
| 2 | Теплопередача | `fGlazingHeatTransfer` | БОЛЬШЕ Ro | 1.0 | Сопротивление теплопередаче (м²×°C/Вт) |
|
||||
| 3 | Светопропускание | `fGlazingLightTransmission` | БОЛЬШЕ % | 0.25 | Коэффициент пропускания видимого света (%), отражение света снаружи |
|
||||
| 4 | Солнцепропускание | `fGlazingPassingSun` | **МЕНЬШЕ %** | 0.15 | Коэффициент солнечного излучения (SHGC) — В России меньше = лучше для охлаждения летом |
|
||||
| 5 | Толщина | `iGlazingThickness` | БОЛЬШЕ мм | 0.1 | Общая толщина стеклопакета |
|
||||
| 6 | Количество камер | `iGlazingCamerasN` | БОЛЬШЕ шт | 0.1 | Число воздушных/аргоновых камер |
|
||||
|
||||
**Особенности стеклопакетов:**
|
||||
- **Светопропускание** = как много естественного света проходит в помещение (больше = лучше)
|
||||
- **Солнцепропускание** = как много солнечного тепла/излучения проходит (в России: меньше = лучше, потому что внутри есть отражающее напыление)
|
||||
- Двухкамерный (с аргоном) почти всегда лучше однокамерного
|
||||
- Трёхкамерные = премиум для холодного климата
|
||||
|
||||
**Примеры интерпретации:**
|
||||
- **5.0 ⭐⭐⭐⭐⭐**: трёхкамерный с хорошей теплопередачей, звукоизоляцией (обычно с аргоном и напылением).
|
||||
- **3.0 ⭐⭐⭐**: двухкамерный, среднее качество
|
||||
- **1.0 ⭐**: однокамерный старого образца или с плохими характеристиками
|
||||
|
||||
### НАБОРЫ: какие параметры учитываются
|
||||
|
||||
| № | Параметр | Поле БД | ЛУЧШЕ | Вес | Описание |
|
||||
|---|-------------------|--------------------------|------------------|-----|---------------------------------------------------|
|
||||
| 1 | Актуальность | `dModify` | МЕНЬШЕ (свежее) | 0.3 | Дата последнего обновления (timestamp) |
|
||||
| 2 | Доставка | `bSetDelivery` | ДА (1) | 0.8 | Включена ли доставка в стоимость |
|
||||
| 3 | Монтаж/демонтаж | `bSetUninstallInstall` | ДА (1) | 1.0 | Включены ли услуги монтажа и демонтажа |
|
||||
| 4 | Подоконник | `sSetSill` | ДА (1) | 0.5 | Включен ли подоконник |
|
||||
| 5 | Водоотлив | `sSetPanes` | ДА (1) | 0.8 | Включен ли водоотлив/козырёк |
|
||||
| 6 | Откос | `sSetSlope` | ДА (1) | 0.5 | Включены ли откосы |
|
||||
| 7 | Климат-контроль | `sSetClimateControl` | ДА (1) | 0.3 | Включено ли управление микроклиматом |
|
||||
| 8 | Число предложений | `NumOffer` | БОЛЬШЕ | 0.2 | Популярность набора (кол-во активных предложений) |
|
||||
| 9 | Гибкость скидок | `iDiscountVariantsCount` | БОЛЬШЕ вариантов | 0.5 | Кол-во вариантов скидок из формулы офиса |
|
||||
| 10| Размер скидок | `fDiscountMax` | БОЛЬШЕ % | 1.0 | Максимальная скидка из всех вариантов |
|
||||
|
||||
**ВАЖНО: Итоговый рейтинг набора состоит из трёх компонентов:**
|
||||
- Рейтинг параметров услуг (Актуальность, Доставка, Монтаж, Подоконник и т.д.)
|
||||
- Рейтинг входящего стеклопакета (ранжируется отдельно)
|
||||
- Рейтинг входящего профиля (ранжируется отдельно)
|
||||
|
||||
Формула итогового рейтинга набора (fSetRating):
|
||||
```
|
||||
k1 = нормализованный TmpRating (услуги) * вес услуг
|
||||
k2 = нормализованный рейтинг стеклопакета * RARING_WEIGHT_GLAZING_IN_SET (обычно 1.5)
|
||||
k3 = нормализованный рейтинг профиля * RARING_WEIGHT_PVC_PROFILE_IN_SET (обычно 1.5)
|
||||
|
||||
fSetRating = k1 + k2 + k3 (итого от 0.0 до 5.0 звёзд)
|
||||
```
|
||||
|
||||
**Примеры интерпретации:**
|
||||
- **5.0 ⭐⭐⭐⭐⭐**: набор с премиум компонентами (хороший профиль и стеклопакет) + полный пакет услуг (доставка, монтаж, подоконник, откос, климат-контроль) + значительные скидки.
|
||||
- **3.5 ⭐⭐⭐⭐**: хороший профиль/стеклопакет + базовые услуги (доставка, монтаж) + скромные скидки.
|
||||
- **2.0 ⭐⭐**: эконом компоненты или слабые услуги (нет доставки, нет откосов).
|
||||
- **1.0 ⭐**: минимальный пакет или устаревшие предложения (давно не обновлялись).
|
||||
|
||||
### Когда запускать
|
||||
|
||||
- **После первого развертывания** — заполнить рейтинги всех профилей, стеклопакетов и наборов.
|
||||
- **После изменения каталога** (добавление нового профиля/стеклопакета/набора).
|
||||
- **После уточнения характеристик** (например, поставщик предоставил новые данные).
|
||||
```bash
|
||||
poetry run python oknardia/manage.py make_rating
|
||||
```
|
||||
|
||||
- **По расписанию** (например, ежемесячно, чтобы пересчитать популярность):
|
||||
```bash
|
||||
30 2 * * 1 cd /home/user/app-path/2022-oknardia && poetry run python oknardia/manage.py make_rating >> /var/log/oknardia-rating.log 2>&1
|
||||
```
|
||||
- **После обновления весов** в `settings.py` (константы `RANK_PVCP_*`, `RANK_GLAZ_*`).
|
||||
|
||||
### Откат и безопасность
|
||||
|
||||
- **Безопасна для повторного запуска** — пересчитывает все рейтинги заново.
|
||||
- **Всегда обновляет только рейтинги** — другие данные в таблицах не меняются.
|
||||
- **Откат через SQL** — если нужно установить нулевые значения (перед запуском рекомендуется бэкап базы):
|
||||
```sql
|
||||
-- Очистить рейтинги профилей
|
||||
UPDATE oknardia_pvcprofiles SET fProfileRating = 0.0, sProfileDescription = '{}';
|
||||
|
||||
-- Очистить рейтинги стеклопакетов
|
||||
UPDATE oknardia_glazing SET fGlazingRating = 0.0, sGlazingDescription = '{}';
|
||||
|
||||
-- Очистить рейтинги наборов
|
||||
UPDATE oknardia_setkit SET fSetRating = 0.0, sSetDescription = '{}';
|
||||
```
|
||||
|
||||
### Примеры из реальных данных
|
||||
|
||||
Пример вывода `--verbosity 1`:
|
||||
|
||||
```
|
||||
=== НАЧАЛИ ПЕРЕСЧЁТ РЕЙТИНГОВ ===
|
||||
|
||||
========================================
|
||||
[ЭТАП 1]: Пересчёт рейтингов ПРОФИЛЕЙ...
|
||||
========================================
|
||||
✓ Обнулены рейтинги у 94 профилей
|
||||
✓ Найдено 94 профилей для ранжирования
|
||||
✓ Сохранено 94 профилей с финальными рейтингами
|
||||
|
||||
=============================================
|
||||
[ЭТАП 2]: Пересчёт рейтингов СТЕКЛОПАКЕТОВ...
|
||||
=============================================
|
||||
✓ Обнулены рейтинги у 97 стеклопакетов
|
||||
✓ Найдено 97 стеклопакетов для ранжирования
|
||||
✓ Сохранено 97 стеклопакетов с финальными рейтингами
|
||||
|
||||
================================================
|
||||
[ЭТАП 3]: Пересчёт рейтингов НАБОРОВ (SetKit)...
|
||||
================================================
|
||||
✓ Обнулены рейтинги у 27 наборов
|
||||
✓ Найдено 27 наборов для ранжирования
|
||||
✓ Сохранено 27 наборов с финальными рейтингами
|
||||
|
||||
[OK!] ПЕРЕСЧЁТ РЕЙТИНГОВ ЗАВЕРШЁН УСПЕШНО!
|
||||
• Обновлено профилей: 94
|
||||
• Обновлено стеклопакетов: 97
|
||||
• Обновлено наборов: 27
|
||||
```
|
||||
|
||||
Пример вывода `--verbosity 3` (наиболее подробный):
|
||||
|
||||
```
|
||||
=== НАЧАЛИ ПЕРЕСЧЁТ РЕЙТИНГОВ ===
|
||||
|
||||
========================================
|
||||
[ЭТАП 1]: Пересчёт рейтингов ПРОФИЛЕЙ...
|
||||
========================================
|
||||
|
||||
✓ Обнулены рейтинги у 94 профилей
|
||||
✓ Найдено 94 профилей для ранжирования
|
||||
...
|
||||
...
|
||||
====================================================================================================
|
||||
ПРОФИЛЬ: politech W80 (ID: 78)
|
||||
====================================================================================================
|
||||
Характеристика Значение Ранг (0..1) Вклад
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Высота в проёме 120 мм 0.368 *
|
||||
Популярность 0 предл. 0.000
|
||||
Теплопередача 0.91 Ro 0.657 ***
|
||||
Толщина профиля 80 мм 0.588 **
|
||||
Толщина стеклопакета 42 мм 0.409 **
|
||||
Уплотнители 3 контуров 1.000 *****
|
||||
Фальц 14 мм 0.150
|
||||
Число камер 12 шт 0.714 ***
|
||||
Шумоизоляция 44.00 дБ 0.909 ****
|
||||
----------------------------------------------------------------------------------------------------
|
||||
ИТОГО: Рейтинг = 4.94/5.0 ****
|
||||
...
|
||||
...
|
||||
✓ Сохранено 94 профилей с финальными рейтингами
|
||||
|
||||
=============================================
|
||||
[ЭТАП 2]: Пересчёт рейтингов СТЕКЛОПАКЕТОВ...
|
||||
=============================================
|
||||
|
||||
✓ Обнулены рейтинги у 97 стеклопакетов
|
||||
✓ Найдено 97 стеклопакетов для ранжирования
|
||||
...
|
||||
...
|
||||
====================================================================================================
|
||||
СТЕКЛОПАКЕТ: Однокамерный 5-4, 25 мм (И+аргон) (ID: 60) | Марка:СПО 5М1-Ar16-И4
|
||||
====================================================================================================
|
||||
Характеристика Значение Ранг (0..1) Вклад
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Камеры — 0.000
|
||||
Светопропускание 74.00% 0.824 ****
|
||||
Солнцепропускание 58.00% 0.450 **
|
||||
Теплопередача 0.91 Ro 0.936 ****
|
||||
Толщина 25 мм 0.400 **
|
||||
Шумоизоляция — 0.429 **
|
||||
----------------------------------------------------------------------------------------------------
|
||||
ИТОГО: Рейтинг = 4.87/5.0 ****
|
||||
...
|
||||
...
|
||||
✓ Сохранено 97 стеклопакетов с финальными рейтингами
|
||||
|
||||
================================================
|
||||
[ЭТАП 3]: Пересчёт рейтингов НАБОРОВ (SetKit)...
|
||||
================================================
|
||||
✓ Обнулены рейтинги у 27 наборов
|
||||
✓ Найдено 27 наборов для ранжирования
|
||||
...
|
||||
...
|
||||
========================================================================================================================
|
||||
НАБОР: Элит (ID: 3)
|
||||
========================================================================================================================
|
||||
Параметр Значение Ранг (0..1) Вклад
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
Актуальность свежий 0.375 *
|
||||
Водоотлив ✓ Да 1.000 *****
|
||||
Гибкость скидок 0 вариантов 0.500 **
|
||||
Доставка ✓ Да 1.000 *****
|
||||
Климат-контроль ✓ Да 1.000 *****
|
||||
Монтаж ✓ Да 1.000 *****
|
||||
Откос ✓ Да 1.000 *****
|
||||
Подоконник ✓ Да 1.000 *****
|
||||
Размер скидок 0.0% 0.500 **
|
||||
Число предложений 46 шт 0.250 *
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
ИТОГО: Рейтинг = 4.16/5.0 ****
|
||||
...
|
||||
...
|
||||
|
||||
[OK!] ПЕРЕСЧЁТ РЕЙТИНГОВ ЗАВЕРШЁН УСПЕШНО!
|
||||
• Обновлено профилей: 94
|
||||
• Обновлено стеклопакетов: 97
|
||||
• Обновлено наборов: 27
|
||||
```
|
||||
|
||||
## Оркестрация и reload веб-сервера
|
||||
|
||||
Важно:
|
||||
- reload веб-сервера не встроен в management-команды;
|
||||
- это отдельная операция окружения.
|
||||
|
||||
Пример для systemd + gunicorn:
|
||||
|
||||
```bash
|
||||
sudo systemctl reload gunicorn
|
||||
```
|
||||
|
||||
Рекомендуемый batch-сценарий:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py regenerate_seria_prerender --force
|
||||
poetry run python oknardia/manage.py generate_sitemaps
|
||||
sudo systemctl reload gunicorn
|
||||
```
|
||||
|
||||
## Cron/systemd timer (пример)
|
||||
|
||||
Пример cron (раз в сутки в 03:20):
|
||||
|
||||
```bash
|
||||
20 3 * * * cd /Users/e-serg/PRJ/2022-oknardia && poetry run python oknardia/manage.py regenerate_seria_prerender --force && poetry run python oknardia/manage.py generate_sitemaps >> /var/log/oknardia-maintenance.log 2>&1
|
||||
```
|
||||
|
||||
Если нужен reload после batch, добавляй отдельной строкой/шагом оркестратора.
|
||||
|
||||
## Диагностика
|
||||
|
||||
Быстрая проверка конфигурации:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
poetry run python oknardia/manage.py check
|
||||
```
|
||||
|
||||
Типовые причины проблем:
|
||||
- нет прав записи в директории `templates/seria_info/prepared` или `MEDIA_ROOT/_serv_sitemap`;
|
||||
- устаревшее виртуальное окружение / неустановленные зависимости;
|
||||
- запуск не из того каталога.
|
||||
|
||||
## План миграции `/service/*` -> management commands
|
||||
|
||||
Текущее направление:
|
||||
- все тяжелые и административные операции переносить из HTTP в management-команды;
|
||||
- `/service/*` оставлять только как thin UI/мониторинг или убрать полностью.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
См. также:
|
||||
- `SETUP.md`
|
||||
- `README.md`
|
||||
|
||||
@@ -1,242 +0,0 @@
|
||||
# Production Deployment Guide для Oknardia
|
||||
|
||||
## Структура на хосте
|
||||
|
||||
Структура директорий на production сервере должна быть:
|
||||
|
||||
```
|
||||
~/docker-app/oknardia-site/
|
||||
├── .env # Переменные окружения Django
|
||||
├── config/ # Конфиги
|
||||
│ └── nginx/
|
||||
│ └── oknardia-app--external-nginx.conf # Конфиг Nginx (шаблон)
|
||||
├── database/ # БД SQLite (создается автоматически)
|
||||
│ └── oknardia.sqlite3
|
||||
├── media/ # Медиа файлы, uploads, кеши
|
||||
│ ├── img_avatar/
|
||||
│ ├── img_seria/
|
||||
│ ├── _serv_sitemap/
|
||||
│ └── _error/ # Error pages (генерируются контейнером)
|
||||
└── docker-compose.prod.yml # Конфиг Docker
|
||||
```
|
||||
|
||||
## Установка на Production сервере
|
||||
|
||||
### 1. Создать директории и скопировать файлы
|
||||
|
||||
```bash
|
||||
# На хосте
|
||||
mkdir -p ~/docker-app/oknardia-site/{config/nginx,database,media}
|
||||
|
||||
# Скопировать docker-compose.prod.yml и .env из проекта
|
||||
cp docker-compose.prod.yml ~/docker-app/oknardia-site/
|
||||
cp .env ~/docker-app/oknardia-site/
|
||||
|
||||
# Скопировать конфиг nginx
|
||||
cp config/nginx/oknardia-app--external-nginx.conf ~/docker-app/oknardia-site/config/nginx/
|
||||
```
|
||||
|
||||
### 2. Настроить .env на сервере
|
||||
|
||||
Отредактировать `~/docker-app/oknardia-site/.env`:
|
||||
|
||||
```bash
|
||||
# ОБЯЗАТЕЛЬНО заполнить эти переменные!
|
||||
|
||||
# Путь к проекту на хосте (используется для sed-замены в конфиге nginx)
|
||||
HOST_PROJECT_PATH=/home/default_user/projects/oknardia-site
|
||||
|
||||
# Credentials для скачивания образа из реестра Gitea
|
||||
REPO_USER=имя_пользователя_gitea
|
||||
REPO_PASS=токен_из_личного_кабинета_gitea
|
||||
|
||||
# Остальное скопировать из локального .env
|
||||
DEBUG=False
|
||||
DJANGO_SECRET_KEY=...
|
||||
```
|
||||
|
||||
**Важно:** `HOST_PROJECT_PATH` должен совпадать с корневой папкой проекта на хосте, куда ты скопировал docker-compose.prod.yml!
|
||||
|
||||
### 3. Запустить контейнеры
|
||||
|
||||
```bash
|
||||
cd ~/docker-app/oknardia-site/
|
||||
|
||||
# Первый запуск (холодный старт)
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# Проверить логи
|
||||
docker compose -f docker-compose.prod.yml logs -f web
|
||||
|
||||
# Проверить статус контейнеров
|
||||
docker compose -f docker-compose.prod.yml ps
|
||||
```
|
||||
|
||||
### 4. Проверить что nginx конфиг был сгенерирован
|
||||
|
||||
После первого запуска контейнер должен:
|
||||
- Создать `/config/nginx/oknardia-app--external-nginx.conf` (боевой конфиг)
|
||||
- Создать `/config/nginx/oknardia-app--external-nginx.conf.example` (exemplo)
|
||||
|
||||
```bash
|
||||
ls -la ~/docker-app/oknardia-site/config/nginx/
|
||||
```
|
||||
|
||||
### 5. Настроить Nginx на хосте
|
||||
|
||||
На хосте установить Nginx и скопировать/ссылаться на конфиг из контейнера:
|
||||
|
||||
```bash
|
||||
# На хосте (например, Ubuntu 20.04)
|
||||
sudo systemctl install nginx
|
||||
|
||||
# Включить сгенерированный конфиг в основной конфиг Nginx
|
||||
# /etc/nginx/sites-available/oknardia или /etc/nginx/conf.d/oknardia.conf
|
||||
|
||||
# Пример:
|
||||
sudo ln -s /home/default_user/projects/oknardia-site/config/nginx/oknardia-app--external-nginx.conf \
|
||||
/etc/nginx/sites-enabled/oknardia
|
||||
|
||||
# Проверить и перезагрузить Nginx
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
## Команды для управления
|
||||
|
||||
```bash
|
||||
cd ~/docker-app/oknardia-site/
|
||||
|
||||
# Запустить контейнеры (если они были остановлены)
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# Остановить контейнеры
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
|
||||
# Перезагрузить контейнеры (удалить и создать заново)
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# Посмотреть логи
|
||||
docker compose -f docker-compose.prod.yml logs -f web
|
||||
docker compose -f docker-compose.prod.yml logs -f watchtower
|
||||
|
||||
# Выполнить команду внутри контейнера Django
|
||||
docker compose -f docker-compose.prod.yml exec web python manage.py shell
|
||||
|
||||
# Пересоздать пре-рендер кеши вручную
|
||||
docker compose -f docker-compose.prod.yml exec web python manage.py regenerate_seria_prerender
|
||||
```
|
||||
|
||||
## Что делает docker-compose.prod.yml
|
||||
|
||||
### Сервис `web` (Django + Gunicorn)
|
||||
|
||||
При старте контейнера:
|
||||
1. ✅ Применяет миграции БД (`migrate --noinput`)
|
||||
2. ✅ Собирает статику (`collectstatic --noinput`)
|
||||
3. ✅ Генерирует sitemap'ы (`generate_sitemaps`)
|
||||
4. ✅ Пересоздает пре-рендер кеши для серий (`regenerate_seria_prerender`)
|
||||
5. ✅ Пересчитывает рейтинги (`make_rating`)
|
||||
6. ✅ Копирует конфиг nginx с авто-заменой путей (через `sed`)
|
||||
7. ✅ Запускает Gunicorn на `127.0.0.1:8000`
|
||||
|
||||
### Сервис `watchtower` (авто-обновление)
|
||||
|
||||
- 👁️ Следит за реестром Gitea (проверка каждые 30 минут)
|
||||
- 🔄 Автоматически скачивает новый образ, если он есть
|
||||
- ♻️ По-graceful перезагружает контейнер web
|
||||
- 🗑️ Удаляет старые образы (WATCHTOWER_CLEANUP=true)
|
||||
|
||||
Watchtower использует метку на контейнере `web`:
|
||||
```yaml
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.scope=oknardia-scope"
|
||||
```
|
||||
|
||||
## Файлы, которые монтируются с хоста
|
||||
|
||||
| На хосте | В контейнере | Назначение |
|
||||
|----------|----------|-----------|
|
||||
| `./database/` | `/home/app/database/` | БД SQLite (КРИТИЧНО!) |
|
||||
| `./media/` | `/home/app/public/media/` | Медиа файлы, uploads |
|
||||
| `./config/` | `/nginx_configs_host/` | Конифиги (читаются и пишущутся контейнером) |
|
||||
|
||||
## Переменные окружения в docker-compose.prod.yml
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- DEBUG=False # Production: без debug
|
||||
- DJANGO_LOG_LEVEL=INFO # Минимум логов
|
||||
- ALLOW_MEDIA_SERVE=False # Nginx обслуживает медиа
|
||||
- HOST_PROJECT_PATH=... # Путь для sed-замены в конфиге nginx
|
||||
- REPO_USER=${REPO_USER} # Из .env (для Watchtower)
|
||||
- REPO_PASS=${REPO_PASS} # Из .env (для Watchtower)
|
||||
```
|
||||
|
||||
## Health Check
|
||||
|
||||
Контейнер имеет healthcheck, который проверяет доступность Django:
|
||||
- Проверка каждые 3 минуты
|
||||
- Таймаут: 12 секунд
|
||||
- Unhealthy после 3 неудачных попыток
|
||||
- Это критично для Watchtower (он ждет что контейнер станет healthy перед finalization)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### ContainerError при запуске
|
||||
|
||||
Проверить логи:
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml logs web
|
||||
```
|
||||
|
||||
### БД не синхронизируется между перезагрузками
|
||||
|
||||
Убедиться что `./database/` правильно монтирует:
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml exec web ls -la /home/app/database/
|
||||
```
|
||||
|
||||
### Watchtower не обновляет контейнер
|
||||
|
||||
Проверить:
|
||||
- Есть ли интернет на сервере
|
||||
- Правильны ли REPO_USER и REPO_PASS в .env
|
||||
- Существует ли образ `oknardia:latest` в реестре
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml logs watchtower
|
||||
```
|
||||
|
||||
### Nginx конфиг не обновился
|
||||
|
||||
Конфиг копируется при старте контейнера. Если нужно пересоздать:
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml down
|
||||
docker compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
Потом проверить:
|
||||
```bash
|
||||
cat ~/docker-app/oknardia-site/config/nginx/oknardia-app--external-nginx.conf
|
||||
```
|
||||
|
||||
## Резервные копии
|
||||
|
||||
Важно регулярно бэкапить:
|
||||
- `./database/oknardia.sqlite3` - БД
|
||||
- `./media/` - Загруженные файлы
|
||||
|
||||
Пример cronjob для ежедневного бэкапа:
|
||||
```bash
|
||||
# /etc/cron.daily/backup-oknardia
|
||||
#!/bin/bash
|
||||
BACKUP_DIR="/backup/oknardia"
|
||||
APP_DIR="/home/default_user/projects/oknardia-site"
|
||||
|
||||
mkdir -p $BACKUP_DIR
|
||||
tar -czf $BACKUP_DIR/oknardia-$(date +%Y%m%d).tar.gz $APP_DIR
|
||||
find $BACKUP_DIR -name "oknardia-*.tar.gz" -mtime +30 -delete # Удалять старше 30 дней
|
||||
```
|
||||
|
||||
@@ -1,55 +1,6 @@
|
||||
# Оконный агрегатор «Окнардия»
|
||||
### Переделка под Python 3.8 и Django 4.1
|
||||
|
||||
**Окнардия** — веб-сервис для сравнения цен на установку оконных конструкций в типовых многоквартирных домах России.
|
||||
|
||||
* **Пользователь, желающий заменить окна**, вводит адрес дома → система распознаёт серию строения → выдаёт типовые размеры оконных проёмов → показывает предложения от поставщиков на установку (замену) окон, с ценами, характеристиками компонентов и условиями.
|
||||
Алгоритмические рейтинги защищают потенциального покупателя от возможных накруток отзывов и позволяют сравнивать предложения по объективным характеристикам.
|
||||
|
||||
* Для **производителей и поставщиков окон** платформа — это канал прямого доступа к целевой аудитории в конкретном районе города.
|
||||
Они размещают свои предложения (компоненты, наборы, цены) и конкурируют на равных условиях. Масштабируемый каталог позволяет охватить
|
||||
множество адресов типовой застройки, а система алгоритмического рейтинга (нет отзывов клиентов, а значит накрутка отзывов невозможна) ранжирует предложения исключительно по характеристикам и условиям предложений.
|
||||
|
||||
**Стек**: Python 3.12+ · Django 5.2+ · SQLite/MariaDB · Bootstrap 3.3 · jQuery · Yandex Maps API
|
||||
|
||||
---
|
||||
|
||||
### Переделка под Python 3.12 и Django 5.2.13 (апрель-май 2026)
|
||||
|
||||
Сделано:
|
||||
* Переход проекта под Python 3.12 и Django 5.2.13, удаление устаревших зависимостей, унификация функций и хелперов.
|
||||
* Перехода на SQLite (возможно, после нагрузочного тестирования переход обратно на mariaDB или PostgreSQL).
|
||||
* Переделаны все raw SQL-запросы на ORM для лучшей поддержки разных СУБД в будущем.
|
||||
* Все сервисные функции из `service/` вынесены в management-команды.
|
||||
* Переработаны все шаблоны с целью SEO- и LLM-оптимизацим: более корректные meta-теги, разметка schema.org
|
||||
через `JSON-LD`, оптимизирована структура "хлебных крошек" и изменение роутинга.
|
||||
* Облегчение шаблона `base.html`: блок логин-логаут подгружается через AJAX только по клику, модуль авторизации
|
||||
вынесен в отдельный JS-файл (`/static/js/auth.js`), счетчики посещений перенесены в подгружаемый JS.
|
||||
* Шаблоны `report/report_last_user_visit.html` больше не требуют серверного рендеринга, а формируются
|
||||
на стороне клиента из кук.
|
||||
* Добавлены SEO-поля блогов.
|
||||
|
||||
### Планы, задачи, маркеры на будущее:
|
||||
|
||||
* Оптимизация кеширования pre-render шаблонов: настроить cronjob для ежедневной/еженедельной очистки `seria_info/prepared/`.
|
||||
* Улучшение администрирования в блогах (Codemirror 6, Типографф).
|
||||
* Упаковать всё в контейнеры: бакенд Django + Gunicorn + WhiteNoise...
|
||||
* CI/CD через gitea + Watchtower для автоматического деплоя при пуше тега `v*.*.*` в репозиторий.
|
||||
* Фронтенд: перейти на новый Bootstrap 5, добавить интерактивные элементы через HTMX + Alpine, сделать адаптивность для мобильных устройств. Убрать jQuery и старые плагины, заменить на современные аналоги.
|
||||
* Оптимизация для мобильных устройств: адаптивный дизайн, оптимизация изображений, улучшение производительности.
|
||||
* Переход проекта под Python 3.14 и Django 6.x.
|
||||
* Нагрузочное тестирование (рпи необходимости переход с SQLite на PostgreSQL в продакшене).
|
||||
|
||||
# См. также:
|
||||
|
||||
* [`MANAGEMENT_RUNBOOK.md`](MANAGEMENT_RUNBOOK.md) – единый runbook по management-командам и кастом-операциям (регенерация кеша, рейтингов, sitemap и т.д.).
|
||||
* [`CACHE_PRERENDER_SYSTEM.md`](CACHE_PRERENDER_SYSTEM.md) – двухуровневая система кеширования страниц серий, структура статик-шаблонов, управление кешем.
|
||||
* [`AGENTS.md`](AGENTS.md) – контекст проекта для AI-ассистентов (архитектура, конвенции, рабочие сценарии).
|
||||
* [`SETUP.md`](SETUP.md) – пошаговая настройка окружения, запуск проекта и базовые команды разработки.
|
||||
|
||||
|
||||
---
|
||||
Легаси-материалы старого README, которые могут быть полезны для понимания устройства проекта и его
|
||||
администрирования, а также для будущей реорганизации документации.
|
||||
|
||||
### Немного о механике кеширования:
|
||||
|
||||
@@ -62,29 +13,63 @@
|
||||
Эти картинки создаются автоматически. Можно не удалять. Даже если какая-то схема открывания или размер проёма станет
|
||||
неактуальным, лишняя картинка просто будет лежать в папке (вдруг такой проём появится снова).
|
||||
|
||||
#### Кеширование pre-render шаблонов серий домов
|
||||
#### Кеширование шаблонов
|
||||
|
||||
В папке `oknardia/templates/seria_info/prepared/` создаются пре-рендер HTML-шаблоны с информацией о сериях домов.
|
||||
В папке `oknardia/oknardia/templates/seria_info/prepared` создаются пре-рендер шаблоны с информацией о сериях домов.
|
||||
|
||||
**Архитектура (май 2026)**: Для каждой серии создаются **3 отдельных кешируемых файла** (верхняя статья НЕ кешируется):
|
||||
* `{seria_id}_id_static_flaps.html` — схемы открывания окон
|
||||
* `{seria_id}_id_static_graph.html` — график ввода в эксплуатацию
|
||||
* `{seria_id}_id_static_map_stats.html` — карта Яндекса и статистика
|
||||
Эти шаблоны надо периодически удалять. Они нужны для скорости. Но если меняются данные по серии, размерам окон, появляются
|
||||
новые коммерческие предложения -- их надо удалять и тогда построятся новые. Вообще на быстрых серверах скорость может
|
||||
не быть проблемой, так что возможно стоит просто настроить через crone ежедневное или еженедельное удаление этих
|
||||
пре-рендер шаблонов. При обращении к соответсвующий страницам эти шаблоны будут пересозданы автоматически.
|
||||
|
||||
**Верхняя статья рендерится динамически** из БД, поэтому изменения через админку видны без перезагрузки контейнера.
|
||||
|
||||
Таблица оконных проёмов **не кешируется** — пересчитывается при каждом запросе, поэтому новые предложения видны пользователям сразу.
|
||||
### Некоторые заметки относительно разработки (DEV) на macOS:
|
||||
|
||||
**Регенерация кеша**:
|
||||
```bash
|
||||
python manage.py regenerate_seria_prerender # все сер��и
|
||||
python manage.py regenerate_seria_prerender --seria-id 210 # конкретная серия
|
||||
Т.к. MariaDB "сидит" в контейнере Dockers могут возникнуть трудности при установке коннектора к базам данных MySQL/MariaDB. Примерно такие:
|
||||
```txt
|
||||
Collecting mysqlclient
|
||||
Using cached mysqlclient-2.1.1.tar.gz (88 kB)
|
||||
Preparing metadata (setup.py) ... error
|
||||
error: subprocess-exited-with-error
|
||||
|
||||
× python setup.py egg_info did not run successfully.
|
||||
│ exit code: 1
|
||||
╰─> [16 lines of output]
|
||||
/bin/sh: mysql_config: command not found
|
||||
/bin/sh: mariadb_config: command not found
|
||||
/bin/sh: mysql_config: command not found
|
||||
Traceback (most recent call last):
|
||||
File "<string>", line 2, in <module>
|
||||
File "<pip-setuptools-caller>", line 34, in <module>
|
||||
File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup.py", line 15, in <module>
|
||||
metadata, options = get_config()
|
||||
File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup_posix.py", line 70, in get_config
|
||||
libs = mysql_config("libs")
|
||||
File "/private/var/folders/jh/gbhf3vk11svg9w4mvhntlb7c0000gn/T/pip-install-nu5ar2g2/mysqlclient_a07e3d9dbe514c7793dc71f1183dda19/setup_posix.py", line 31, in mysql_config
|
||||
raise OSError("{} not found".format(_mysql_config_path))
|
||||
OSError: mysql_config not found
|
||||
mysql_config --version
|
||||
mariadb_config --version
|
||||
mysql_config --libs
|
||||
[end of output]
|
||||
|
||||
note: This error originates from a subprocess, and is likely not a problem with pip.
|
||||
error: metadata-generation-failed
|
||||
|
||||
× Encountered error while generating package metadata.
|
||||
╰─> See above for output.
|
||||
|
||||
note: This is an issue with the package mentioned above, not pip.
|
||||
hint: See above for details.
|
||||
```
|
||||
|
||||
⏱️ **Когда регенерировать**: Изменены координаты зданий, добавлены новые здания, обновлены годы ввода в эксплуатацию.
|
||||
|
||||
❌ **Когда НЕ нужна регенерация**: Добавлены новые предложения/цены (таблица обновляется автоматически), изменены статьи через админку (рендерятся динамически).
|
||||
|
||||
**Подробности**: см. [`CACHE_PRERENDER_SYSTEM.md`](CACHE_PRERENDER_SYSTEM.md)
|
||||
Починить проблему можно воспользовавшись ([рецептом со StackOverflow](https://stackoverflow.com/a/44268445/1504067)):
|
||||
```shell
|
||||
brew install mariadb-connector-c
|
||||
# sudo ln -s /usr/local/opt/mariadb-connector-c/bin/mariadb_config /usr/local/bin/mysql_config
|
||||
|
||||
pip install mysqlclient
|
||||
|
||||
# rm /usr/local/bin/mysql_config
|
||||
brew unlink mariadb-connector-c
|
||||
```
|
||||
@@ -1,187 +1,311 @@
|
||||
# 🚀 SETUP.md — Первичная настройка Окнардии
|
||||
|
||||
**Версия**: 0.2.0 | **Дата**: 18.05.2026 | **Docker**: ✅ Поддерживается
|
||||
**Версия**: 0.2.0 | **Дата**: 16.04.2026
|
||||
|
||||
Этот документ описывает пошаговую настройку проекта для разработки и деплоя.
|
||||
|
||||
---
|
||||
## 📋 Предварительные требования
|
||||
|
||||
## 🐳 Быстрый старт: Docker Dev Environment
|
||||
- **Python**: 3.12+
|
||||
- **Django**: 6.0+
|
||||
- **MariaDB/MySQL**: 5.7+ или 8.0+
|
||||
- **Redis** (опционально, для кеширования): 6.0+
|
||||
- **Poetry** (для управления зависимостями)
|
||||
|
||||
### 1️⃣ Запуск контейнера
|
||||
### На macOS:
|
||||
|
||||
```bash
|
||||
cd /Users/e-serg/PRJ/2022-oknardia
|
||||
docker compose -f docker-compose.local.yml up --build
|
||||
# Установка зависимостей (если не установлены)
|
||||
brew install mariadb-connector-c
|
||||
brew install redis # опционально
|
||||
```
|
||||
|
||||
Сайт будет доступен на **http://localhost:8060**
|
||||
## 🔑 Шаг 1: Конфигурация секретов
|
||||
|
||||
### 2️⃣ Основные команды
|
||||
### 1.1 Создайте файл `my_secret.py`
|
||||
|
||||
```bash
|
||||
# Просмотр логов в реальном времени
|
||||
docker compose -f docker-compose.local.yml logs web -f
|
||||
|
||||
# Зайти в контейнер (bash)
|
||||
docker compose -f docker-compose.local.yml exec web bash
|
||||
|
||||
# Перезагрузить контейнер
|
||||
docker compose -f docker-compose.local.yml restart web
|
||||
|
||||
# Остановить контейнер
|
||||
docker compose -f docker-compose.local.yml down
|
||||
cd oknardia/oknardia
|
||||
cp my_secret.py.template my_secret.py
|
||||
nano my_secret.py # отредактируйте значения
|
||||
```
|
||||
|
||||
**✨ Особенности:**
|
||||
- ✅ **Live reload** — при изменении кода автоматически перезагружается
|
||||
- ✅ **Синхронизция файлов** — база, медиа, статика синхронизированы с хостом
|
||||
- ✅ **Миграции автоматические** — применяются при каждом старте
|
||||
- ✅ **DEBUG режим** — подробные ошибки и админка
|
||||
**Что нужно заполнить:**
|
||||
- IP адреса и хосты (MY_HOST_HOME2, MY_DATABASE_HOST_DEV2)
|
||||
- Пароль БД (MY_DATABASE_PASSWORD_DEV)
|
||||
- Email credentials (MY_EMAIL_HOST_USER_DEV, MY_EMAIL_HOST_PASSWORD_DEV)
|
||||
- Пути к файлам (MY_MEDIA_ROOT_DEV2, MY_STATIC_ROOT_DEV2)
|
||||
- SECRET_KEY (сгенерируйте новый!)
|
||||
|
||||
👁️ **Подробнее про Docker разработку** → см. раздел **"🐳 Docker Development"** ниже.
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Docker Development
|
||||
|
||||
### Структура контейнера
|
||||
|
||||
```
|
||||
/home/app/ # PROJECT_ROOT
|
||||
├── oknardia/ # основная папка Django
|
||||
│ ├── manage.py # точка входа
|
||||
│ ├── oknardia/ # конфиг Django
|
||||
│ ├── web/ # приложение
|
||||
│ └── templates/ # шаблоны
|
||||
├── database/ # SQLite БД (синхронизирована)
|
||||
├── public/
|
||||
│ ├── static/ # исходная статика
|
||||
│ ├── static_collected/ # собранная статика
|
||||
│ └── media/ # загруженные файлы
|
||||
└── ...
|
||||
```
|
||||
|
||||
### Volume mounts (синхронизация)
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- .:/home/app
|
||||
```
|
||||
|
||||
Это монтирует весь проект (`/Users/e-serg/PRJ/2022-oknardia`) в `/home/app` контейнера.
|
||||
|
||||
**Синхронизация:**
|
||||
- Изменения на хосте сразу видны в контейнере
|
||||
- Разные между хостом и контейнером сохраняются на диск
|
||||
- БД и медиа-файлы персистент (не теряются при рестарте контейнера)
|
||||
|
||||
### Миграции в Docker
|
||||
### 1.2 (Опционально) Создайте файл `.env.local`
|
||||
|
||||
```bash
|
||||
# Автоматические при запуске (через docker-compose command):
|
||||
python manage.py migrate --noinput
|
||||
cd /path/to/project
|
||||
cp .env.example .env.local
|
||||
nano .env.local # отредактируйте значения
|
||||
```
|
||||
|
||||
# Или вручную внутри контейнера:
|
||||
docker compose -f docker-compose.local.yml exec web bash
|
||||
python manage.py makemigrations
|
||||
**Примечание**: либо используйте `my_secret.py`, либо `.env.local`, выбирайте удобный способ.
|
||||
|
||||
## 🗄️ Шаг 2: Настройка БД
|
||||
|
||||
### 2.1 Создайте БД и пользователя
|
||||
|
||||
```bash
|
||||
# Подключитесь к MySQL
|
||||
mysql -u root -p
|
||||
|
||||
# В MySQL консоли:
|
||||
CREATE DATABASE django_oknardia_dev;
|
||||
CREATE USER 'web'@'localhost' IDENTIFIED BY 'your-password';
|
||||
GRANT ALL PRIVILEGES ON django_oknardia_dev.* TO 'web'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EXIT;
|
||||
```
|
||||
|
||||
### 2.2 Выполните миграции
|
||||
|
||||
```bash
|
||||
cd /path/to/project/oknardia
|
||||
python manage.py migrate
|
||||
|
||||
# Или непосредственно внутри контейнера:
|
||||
docker compose -f docker-compose.local.yml exec web python manage.py migrate
|
||||
```
|
||||
|
||||
### Установка новых пакетов
|
||||
### 2.3 Создайте суперпользователя
|
||||
|
||||
```bash
|
||||
# 1. На хосте добавьте в pyproject.toml:
|
||||
poetry add some_package
|
||||
|
||||
# 2. Пересоберите контейнер:
|
||||
docker compose -f docker-compose.local.yml up --build
|
||||
|
||||
# 3. Зависимости переустановят при старте контейнера
|
||||
python manage.py createsuperuser
|
||||
```
|
||||
|
||||
### Создание суперюзера (админ)
|
||||
## 📦 Шаг 3: Установка зависимостей
|
||||
|
||||
### Вариант 1: Poetry (рекомендуется)
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.local.yml exec web python manage.py createsuperuser
|
||||
# Установите poetry (если не установлен)
|
||||
curl -sSL https://install.python-poetry.org | python3 -
|
||||
|
||||
# Установите зависимости
|
||||
poetry install
|
||||
|
||||
# Активируйте виртуальное окружение
|
||||
poetry shell
|
||||
```
|
||||
|
||||
### Очистка кеша и статики
|
||||
### Вариант 2: pip (классический способ)
|
||||
|
||||
```bash
|
||||
# Пересоберите статику:
|
||||
docker compose -f docker-compose.local.yml exec web python manage.py collectstatic --clear --noinput
|
||||
|
||||
# Или удалите и пересоздайте:
|
||||
rm -rf ./public/static_collected/*
|
||||
docker compose -f docker-compose.local.yml restart web
|
||||
python -m venv venv
|
||||
source venv/bin/activate # На Windows: venv\Scripts\activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### DEBUG и логирование
|
||||
## 🏃 Шаг 4: Запуск разработки
|
||||
|
||||
### 4.1 Запустите локальный сервер
|
||||
|
||||
```bash
|
||||
# DEBUG=True включен по умолчанию
|
||||
# Смотрите подробные логи:
|
||||
docker compose -f docker-compose.local.yml logs web -f --tail=50
|
||||
|
||||
# Или с фильтром (только ошибки):
|
||||
docker compose -f docker-compose.local.yml logs web --tail=100 | grep -i error
|
||||
cd oknardia
|
||||
python manage.py runserver
|
||||
```
|
||||
|
||||
### Типичные проблемы Docker
|
||||
Откройте браузер: **http://127.0.0.1:8000**
|
||||
|
||||
**"unable to open database file"**
|
||||
```bash
|
||||
# Проверьте что БД существует:
|
||||
ls -la ./database/oknardia.sqlite3
|
||||
|
||||
# Если нет:
|
||||
cp ./database/oknadria_backup-2026-05-12.sqlite3 ./database/oknardia.sqlite3
|
||||
docker compose -f docker-compose.local.yml restart web
|
||||
```
|
||||
|
||||
**"404 Not Found" для статики**
|
||||
```bash
|
||||
# Пересоберите статику:
|
||||
docker compose -f docker-compose.local.yml exec web python manage.py collectstatic --noinput
|
||||
docker compose -f docker-compose.local.yml restart web
|
||||
```
|
||||
|
||||
**Контейнер падает**
|
||||
```bash
|
||||
# Смотрите полные логи:
|
||||
docker compose -f docker-compose.local.yml logs web --tail=200
|
||||
|
||||
# Часто ошибка в settings.py или import'ах
|
||||
```
|
||||
|
||||
**"Connection refused" при обращении в БД**
|
||||
```bash
|
||||
# Проверьте что контейнер запущен:
|
||||
docker compose -f docker-compose.local.yml ps
|
||||
|
||||
# Перезагрузитесь:
|
||||
docker compose -f docker-compose.local.yml down && docker compose -f docker-compose.local.yml up
|
||||
```
|
||||
|
||||
### Очистка Docker
|
||||
### 4.2 Запустите задачи Celery (опционально)
|
||||
|
||||
```bash
|
||||
# Удалить контейнер и образ:
|
||||
docker compose -f docker-compose.local.yml down -v
|
||||
|
||||
# Удалить весь Docker мусор:
|
||||
docker system prune -a --volumes
|
||||
celery -A oknardia worker -l info
|
||||
```
|
||||
|
||||
---
|
||||
## Дополнительные ресурсы
|
||||
## 📁 Шаг 5: Создание необходимых директорий
|
||||
|
||||
```bash
|
||||
# Статика и медиа файлы
|
||||
mkdir -p public/media
|
||||
mkdir -p public/static
|
||||
mkdir -p public/static/img/_flap.cfg
|
||||
mkdir -p public/static/img/_miniflap.cfg
|
||||
|
||||
# Логи
|
||||
mkdir -p logs
|
||||
|
||||
# Сгенерируйте статику
|
||||
python manage.py collectstatic --noinput
|
||||
```
|
||||
|
||||
## 🧪 Шаг 6: Тестирование
|
||||
|
||||
```bash
|
||||
# Запустите тесты
|
||||
python manage.py test
|
||||
|
||||
# С покрытием (если установлен coverage)
|
||||
coverage run --source='.' manage.py test
|
||||
coverage report
|
||||
```
|
||||
|
||||
## 🔐 Шаг 7: Проверка безопасности
|
||||
|
||||
### 7.1 Django встроенная проверка
|
||||
|
||||
```bash
|
||||
python manage.py check --deploy
|
||||
```
|
||||
|
||||
### 7.2 Проверка на утечки секретов
|
||||
|
||||
```bash
|
||||
# Установите инструмент
|
||||
pip install truffleHog
|
||||
|
||||
# Проверьте репозиторий
|
||||
truffleHog filesystem . --json
|
||||
```
|
||||
|
||||
## ✅ Проверка готовности
|
||||
|
||||
Убедитесь, что все работает:
|
||||
|
||||
```bash
|
||||
# 1. Статус БД
|
||||
python manage.py dbshell < /dev/null && echo "✓ Database OK"
|
||||
|
||||
# 2. Статус приложений Django
|
||||
python manage.py check && echo "✓ Django OK"
|
||||
|
||||
# 3. Статус файлов
|
||||
test -d public/media && test -d public/static && echo "✓ Directories OK"
|
||||
|
||||
# 4. Тесты
|
||||
python manage.py test 2>&1 | tail -5
|
||||
```
|
||||
|
||||
## 🚀 Развертывание на продакшене
|
||||
|
||||
### Для разных хостов
|
||||
|
||||
**Masterhost VDS:**
|
||||
```bash
|
||||
# Установка окружения
|
||||
export DJANGO_SECRET_KEY="your-production-key"
|
||||
export DATABASE_PASSWORD="production-db-password"
|
||||
export DATABASE_HOST="localhost"
|
||||
export DEBUG="False"
|
||||
|
||||
# Запуск через uWSGI + Nginx
|
||||
uwsgi --ini config/oknardia.ini
|
||||
```
|
||||
|
||||
**Docker (рекомендуется):**
|
||||
```bash
|
||||
docker build -t oknardia:latest .
|
||||
docker run -d \
|
||||
-e DJANGO_SECRET_KEY="..." \
|
||||
-e DATABASE_PASSWORD="..." \
|
||||
-p 8000:8000 \
|
||||
oknardia:latest
|
||||
```
|
||||
|
||||
## 🛠️ Полезные команды
|
||||
|
||||
```bash
|
||||
# Управление миграциями
|
||||
python manage.py makemigrations # Создать миграцию
|
||||
python manage.py migrate # Применить миграции
|
||||
python manage.py migrate --fake-initial # Подделать первую миграцию
|
||||
|
||||
# Управление данными
|
||||
python manage.py shell # Интерпретатор Python с контекстом Django
|
||||
python manage.py dumpdata > backup.json # Резервная копия данных
|
||||
python manage.py loaddata backup.json # Восстановление данных
|
||||
|
||||
# Статика и медиа
|
||||
python manage.py collectstatic # Собрать статику для продакшена
|
||||
python manage.py findstatic # Найти файлы статики
|
||||
|
||||
# Администрирование
|
||||
python manage.py createsuperuser # Создать администратора
|
||||
python manage.py changepassword username # Изменить пароль
|
||||
|
||||
# Очистка
|
||||
python manage.py clearsessions # Удалить старые сессии
|
||||
python manage.py remove_stale_contenttypes # Удалить устаревшие типы контента
|
||||
|
||||
# Служебные
|
||||
python manage.py check # Проверить конфигурацию
|
||||
python manage.py check --deploy # Проверка для продакшена
|
||||
```
|
||||
|
||||
## 📚 Дополнительные ресурсы
|
||||
|
||||
- [Django документация](https://docs.djangoproject.com/en/stable/)
|
||||
- [AGENTS.md](./AGENTS.md) — архитектура и конвенции проекта
|
||||
- [README.md](./README.md) — основная информация о проекте
|
||||
- [SECURITY_AUDIT_REPORT.md](./SECURITY_AUDIT_REPORT.md) — отчёт безопасности
|
||||
|
||||
## ❓ Решение проблем
|
||||
|
||||
### Проблема: `mysqlclient` не устанавливается на macOS
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
brew install mariadb-connector-c
|
||||
pip install mysqlclient
|
||||
# или
|
||||
brew unlink mariadb-connector-c # после установки
|
||||
```
|
||||
|
||||
### Проблема: `ModuleNotFoundError: No module named 'oknardia'`
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Убедитесь, что находитесь в правильной директории
|
||||
cd /path/to/project/oknardia
|
||||
python manage.py runserver
|
||||
```
|
||||
|
||||
### Проблема: `OperationalError: (2002, "Can't connect to local MySQL server")`
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте, что MySQL запущен
|
||||
# macOS:
|
||||
brew services start mariadb
|
||||
|
||||
# Linux:
|
||||
sudo systemctl start mysql
|
||||
|
||||
# Проверьте credentials в my_secret.py или .env
|
||||
```
|
||||
|
||||
### Проблема: миграции не применяются
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте статус миграций
|
||||
python manage.py showmigrations
|
||||
|
||||
# Примените все миграции
|
||||
python manage.py migrate --run-syncdb
|
||||
|
||||
# Если проблема в конкретной миграции
|
||||
python manage.py migrate app_name 0001 --fake
|
||||
python manage.py migrate app_name
|
||||
```
|
||||
|
||||
## 🤝 Общие вопросы
|
||||
|
||||
**Q: Где хранятся секреты?**
|
||||
A: В `my_secret.py` (в .gitignore) или переменных окружения (.env)
|
||||
|
||||
**Q: Как запустить проект без интернета?**
|
||||
A: Установите все зависимости заранее, используйте локальное хранилище медиа
|
||||
|
||||
**Q: Как работает система рейтинга?**
|
||||
A: Смотрите [AGENTS.md](./AGENTS.md), раздел "Система рейтинга и ранжирования"
|
||||
|
||||
---
|
||||
|
||||
**Версия документа**: 1.0
|
||||
**Последнее обновление**: 16.04.2026
|
||||
**Автор**: GitHub Copilot
|
||||
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
# config/nginx/oknardia-app--external-nginx.conf
|
||||
# ==============================================================================
|
||||
# КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker + Production)
|
||||
# ==============================================================================
|
||||
#
|
||||
# ИНФОРМАЦИЯ:
|
||||
# 1. Этот файл используется как шаблон при деплое
|
||||
# 2. При первом деплое пути `/home/user/path-to-oknardia-app` заменяются на реальный путь через sed
|
||||
# 3. Сгенерированный конфиг скопируется в `/etc/nginx/sites-available/oknardia`
|
||||
# 4. Последующие деплои ОБНОВЛЯЮТ этот файл автоматически (sed + копирование)
|
||||
#
|
||||
# АРХИТЕКТУРА:
|
||||
# - Nginx (порты 80/443) <-> Gunicorn контейнер (localhost:8000)
|
||||
# - Медиа файлы отдаются из `/home/user/path-to-oknardia-app/media/` напрямую
|
||||
# - Ошибки 5xx берутся из `media/_error` (копируются контейнером при старте)
|
||||
# - Sitemap.xml отдается через Django/WhiteNoise (в media/_serv_sitemap/)
|
||||
# - Static файлы (/static/) тоже отдаются через Django/WhiteNoise
|
||||
|
||||
# 1. Описываем, где живет наш Django в Docker
|
||||
upstream oknardia-django {
|
||||
# Мы пробрасываем порт 8050 из контейнера наружу (в docker-compose.yml имя сервиса 'web', контейнер 'oknardia-backend')
|
||||
server 127.0.0.1:8060;
|
||||
keepalive_requests 200;
|
||||
}
|
||||
|
||||
# 2. Конфигурируем сервер
|
||||
server {
|
||||
server_name tmp.oknardia.ru; # Основное доменное имя
|
||||
|
||||
# Слушаем 80 порт (Certbot потом добавит сюда редирект на 443 и настройки SSL)
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
charset utf-8;
|
||||
client_max_body_size 10M; # Разрешаем загрузку не слишком больших картинок
|
||||
|
||||
# Логи (пути могут отличаться в зависимости от настроек сервера, здесь стандартные для Ubuntu)
|
||||
access_log /var/log/nginx/oknardia.access.log;
|
||||
error_log /var/log/nginx/oknardia.error.log;
|
||||
|
||||
# --- GZIP (Сжатие) ---
|
||||
# Очень важно для динамического HTML от Django, который Gunicorn отдает несжатым.
|
||||
gzip on;
|
||||
gzip_vary on; # Добавляет заголовок Vary: Accept-Encoding
|
||||
gzip_proxied any; # Сжимать ответы, даже если мы за прокси
|
||||
gzip_comp_level 6; # Оптимальный баланс скорость/сжатие
|
||||
gzip_min_length 1000; # Не сжимать совсем мелочь
|
||||
# Типы файлов для сжатия (HTML сжимается автоматически, его писать не нужно)
|
||||
gzip_types
|
||||
text/plain
|
||||
text/css
|
||||
text/xml
|
||||
text/javascript
|
||||
application/javascript
|
||||
application/json
|
||||
application/xml
|
||||
application/xml+rss
|
||||
image/svg+xml
|
||||
image/x-icon
|
||||
application/vnd.ms-fontobject
|
||||
font/woff
|
||||
font/woff2;
|
||||
|
||||
# --- МЕДИА ФАЙЛЫ (Загруженный контент) ---
|
||||
# Nginx отдает их напрямую с диска хоста, не дергая Docker.
|
||||
# Сюда входит: загруженные картинки, документы, свитмапы, ошибки 5xx
|
||||
# Путь должен совпадать с тем, где лежит volume на хост-машине.
|
||||
location /media/ {
|
||||
alias /home/user/path-to-oknardia-app/media/;
|
||||
expires 30d; # Кешируем картинки на месяц
|
||||
add_header Cache-Control "public, no-transform";
|
||||
}
|
||||
|
||||
# --- SITEMAP.XML ---
|
||||
# Sitemap хранится в media/_serv_sitemap/ но должен быть доступен из корня
|
||||
# для поисковиков (они ищут http://example.com/sitemap.xml)
|
||||
location = /sitemap.xml {
|
||||
alias /home/user/path-to-oknardia-app/media/_serv_sitemap/sitemap.xml;
|
||||
expires 7d; # Кешируем на неделю (редко меняется)
|
||||
add_header Cache-Control "public";
|
||||
}
|
||||
|
||||
# --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) ---
|
||||
# Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML.
|
||||
# Эти файлы копируются в `media/_error` при старте контейнера Docker.
|
||||
#
|
||||
# ВАЖНО: error_page директива перехватывает ошибки от апстрима (Gunicorn).
|
||||
error_page 500 /500.html;
|
||||
error_page 502 /502.html;
|
||||
error_page 503 /503.html;
|
||||
error_page 504 /504.html;
|
||||
|
||||
location = /500.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /502.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /503.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /504.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
|
||||
error_page 400 /400.html;
|
||||
error_page 401 /401.html;
|
||||
error_page 403 /403.html;
|
||||
error_page 404 /404.html;
|
||||
error_page 413 /413.html;
|
||||
error_page 429 /429.html;
|
||||
|
||||
location = /400.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /401.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /403.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /404.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /413.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
location = /429.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
|
||||
error_page 405 406 407 408 409 410 411 412 414 415 416 417 418 421 422 423 424 425 426 428 431 451 /under_reconstruction.html;
|
||||
location = /under_reconstruction.html { root /home/user/path-to-oknardia-app/media/_error; internal; }
|
||||
|
||||
# --- ВСЁ ОСТАЛЬНОЕ (Django + WhiteNoise) ---
|
||||
# Статика (/static/), robots.txt, favicon.ico и сам сайт обрабатываются внутри контейнера.
|
||||
# Nginx просто прокидывает запрос внутрь.
|
||||
location / {
|
||||
proxy_pass http://oknardia-django;
|
||||
|
||||
# Передаем правильные заголовки, чтобы Django знал реальный IP и протокол
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
# Если нужно чтобы Django обрабатывал и HTTP, и HTTPS, то можно раскомментировать эту строку
|
||||
# и передавать реальный протокол от клиента
|
||||
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Явно указываем https, потому что клиент всегда приходит по HTTPS к Nginx
|
||||
# Даже если внутри контейнера это HTTP на 127.0.0.1:8050, для Django это должно быть HTTPS
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# Тайм-ауты (важно для долгих операций, если они есть)
|
||||
proxy_read_timeout 180s;
|
||||
proxy_connect_timeout 180s;
|
||||
}
|
||||
}
|
||||
|
||||
# 3. Редирект с www на основной домен (SEO best practice)
|
||||
server {
|
||||
server_name www.tmp.oknardia.ru;
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
return 301 $scheme://tmp.oknardia.ru$request_uri;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
# Разработка сайта OKNARDIA.RU
|
||||
# == Конфикурационный файл nginx oknardia.conf
|
||||
|
||||
# Описываем апстрим-потоки которые должен подключить Nginx
|
||||
# Для каждого сайта надо настроить свйо поток, со своим уникальным именем.
|
||||
# Если будете настраивать несколько python (django) сайтов - измените название upstream
|
||||
|
||||
upstream oknardia-django {
|
||||
# расположение файла Unix-сокет для взаимодействие с uwsgi
|
||||
server unix:/home/web/oknardia-ru/socket/oknardia.sock;
|
||||
# server ///home/web/oknardia-ru/socket/oknardia.sock;
|
||||
# также можно использовать веб-сокет (порт) для взаимодействие с uwsgi. Но это медленнее
|
||||
# server 127.0.0.1:8001; # для взаимодействия с uwsgi через веб-порт
|
||||
keepalive_requests 200;
|
||||
}
|
||||
|
||||
# конфигурируем сервер
|
||||
server {
|
||||
server_name tmp.cube2.ru; # доменное имя сайта
|
||||
listen 80; # managed by Certbot
|
||||
## listen 443 ssl http2; # managed by Certbot
|
||||
## ssl_certificate /etc/letsencrypt/live/cadpoint.ru/fullchain.pem; # managed by Certbot
|
||||
## ssl_certificate_key /etc/letsencrypt/live/cadpoint.ru/privkey.pem; # managed by Certbot
|
||||
## include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||
## ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||
|
||||
# server_name 90.156.203.25; # доменное имя сайта
|
||||
charset utf-8; # кодировка по умолчанию
|
||||
access_log /home/web/oknardia-ru/logs/oknardia-access.log; # логи с доступом
|
||||
error_log /home/web/oknardia-ru/logs/oknardia-error.log; # логи с ошибками
|
||||
client_max_body_size 100M; # максимальный объем файла для загрузки на сайт (max upload size)
|
||||
error_page 404 /404.html;
|
||||
error_page 500 /500.html;
|
||||
|
||||
location /media { alias /home/web/oknardia-ru/public/media; } # Расположение media-файлов Django
|
||||
location /static { alias /home/web/oknardia-ru/public/static; } # Расположение static-файлов Django
|
||||
|
||||
location /robots.txt { root /home/web/oknardia-ru/public; } # Расположение robots.txt
|
||||
location /favicon.ico { root /home/web/oknardia-ru/public; } # Расположение favicon.ico
|
||||
location /favicon.gif { root /home/web/oknardia-ru/public; } # Расположение favicon
|
||||
location /favicon.png { root /home/web/oknardia-ru/public; } # Расположение favicon
|
||||
location /favicon.svg { root /home/web/oknardia-ru/public; } # Расположение favicon
|
||||
location /author.txt { root /home/web/oknardia-ru/public; } # Расположение author.txt
|
||||
location = /404.html {
|
||||
root /home/web/oknardia-ru/oknardia/templates/404.html;
|
||||
internal;
|
||||
}
|
||||
location = /500.html {
|
||||
root /home/web/oknardia-ru/oknardia/templates/500.html;
|
||||
internal;
|
||||
}
|
||||
# location ~ \.(html|htm|ico|svg|png|gif|jpg|jpeg)$ {
|
||||
location ~ \.(xml|html|htm|ico|svg|png|gif|jpg|jpeg)$ {
|
||||
root /home/web/oknardia-ru/public; # Расположение статичных *.xml, *.html и *.txt
|
||||
}
|
||||
|
||||
location / {
|
||||
uwsgi_pass oknardia-django; # upstream обрабатывающий обращений
|
||||
include uwsgi_params; # конфигурационный файл uwsgi;
|
||||
proxy_set_header Host $host;
|
||||
|
||||
# ограничение количества запросов c одного IP-адреса с помощью модуля Limit_Req_Module
|
||||
# limit_req zone=one burst=20 nodelay;
|
||||
# one — имя зоны настроеной в /etc/nginx/nginx.conf (для всех сайтов сервера) в блоке http {…}
|
||||
# burst — максимальный всплеск активности, можно регулировать до какого значения запросов
|
||||
# в секунду может быть всплеск запросов;
|
||||
# nodelay — незамедлительно, при достижении лимита подключений, выдавать код 503
|
||||
# (Service Unavailable) для этого IP
|
||||
|
||||
fastcgi_keep_conn on;
|
||||
uwsgi_read_timeout 1800; # некоторые запросы на Raspbery pi очень долго обрабатываются. Например, переиндексация.
|
||||
uwsgi_send_timeout 200; # на всякий случай время записи в сокет
|
||||
}
|
||||
}
|
||||
|
||||
# переадресация с www на "без" www
|
||||
server {
|
||||
server_name www.tmp.cube2.ru;
|
||||
listen 80;
|
||||
return 301 http://tmp.cube2.ru$request_uri;
|
||||
|
||||
## listen 443 ssl; # managed by Certbot
|
||||
## ssl_certificate /etc/letsencrypt/live/cadpoint.ru/fullchain.pem; # managed by Certbot
|
||||
## ssl_certificate_key /etc/letsencrypt/live/cadpoint.ru/privkey.pem; # managed by Certbot
|
||||
## include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
|
||||
## ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
|
||||
}
|
||||
|
||||
# переадресация с http на https
|
||||
##server {
|
||||
## if ($host = oknardia.ru) {
|
||||
## return 301 https://$host$request_uri;
|
||||
## } # managed by Certbot
|
||||
##
|
||||
## listen 80;
|
||||
## server_name cadpoint.ru;
|
||||
## return 404; # managed by Certbot
|
||||
##}
|
||||
|
||||
# переадресация с http на https для www
|
||||
##server {
|
||||
## if ($host = www.cadpoint.ru) {
|
||||
## return 301 https://cadpoint.ru$request_uri;
|
||||
## } # managed by Certbot
|
||||
##
|
||||
## listen 80;
|
||||
## server_name www.cadpoint.ru;
|
||||
## return 404; # managed by Certbot
|
||||
##}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# === Конфигурационный файл uwsgi cadpoint.ini
|
||||
[uwsgi]
|
||||
|
||||
# НАСТРОЙКИ ДЛЯ DJANGO
|
||||
# Корневая папка проекта (полный путь)
|
||||
chdir = /home/web/oknardia-ru/oknardia
|
||||
# Django wsgi файл rsvo_new/wsgi.py записываем так:
|
||||
module = oknardia.wsgi
|
||||
# полный путь к виртуальному окружению
|
||||
home = /home/web/oknardia-ru/env
|
||||
# полный путь к файлу сокета
|
||||
socket = /home/web/oknardia-ru/socket/oknardia.sock
|
||||
# Исходящие сообщения в лог
|
||||
daemonize = /home/web/oknardia-ru/logs/oknardia_uwsgi.log
|
||||
|
||||
# ЗАГАДОЧНЫЕ НАСТРОЙКИ, ПО ИДЕЕ ОНИ НУЖНЫ, НО И БЕЗ НИХ ВСЁ РАБОТАЕТ
|
||||
# расположение wsgi.py
|
||||
wsgi-file = /home/web/oknardia-ru/oknardia/oknardia/wsgi.py
|
||||
# расположение виртуального окружения (как оно работает если этот параметр не указан, не ясно)
|
||||
virtualenv = /home/web/oknardia-ru/env
|
||||
# имя файла при изменении которого происходит авторестарт приложения
|
||||
# (когда этого параметра нет, то ничего не авторестартится, но с ним все рестартится.
|
||||
# Cтоит изменить любой Python-исходник проекта, как изменения сразу вступают в силу.
|
||||
touch-reload = /home/web/oknardia-ru/logs/touch-reload.txt
|
||||
py-autoreload = 5
|
||||
|
||||
# НАСТРОЙКИ ОБЩИЕ
|
||||
# быть master-процессом
|
||||
master = true
|
||||
# максимальное количество процессов
|
||||
processes = 1
|
||||
# если uWSGI установлен как сервис через apt-get то нужно установить еще плагин:
|
||||
# sudo apt-get install uwsgi-plugin-python
|
||||
# и добавить в этот конфиг: plugin = python
|
||||
plugin = python3
|
||||
# права доступа к файлу сокета. По умолчанию должно хватать 664. Но каких-то прав не хватает, поэтому 666.
|
||||
chmod-socket = 666
|
||||
# очищать окружение от служебных файлов uwsgi по завершению
|
||||
vacuum = true
|
||||
# количество секунд после которых подкисший процесс будет перезапущен
|
||||
# Так как некоторе скрипты требуют изрядно времени (особенно полная переиндексация) то ставим значение побольше
|
||||
harakiri = 2600
|
||||
# В общем случае, при некотых значениях harakiri логах uWSGI может вываливаться предупреждение:
|
||||
# WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers
|
||||
# можно оставить harakiri закомментированным, но нам нужно 900 и на него не ругается. Ругается на 30.
|
||||
|
||||
# разрешаем многопоточность
|
||||
enable-threads = true
|
||||
vacuum = true
|
||||
thunder-lock = true
|
||||
max-requests = 500
|
||||
|
||||
# пользователь и группа пользователей от имени которых запускать uWSGI
|
||||
# указываем www-data: к этой группе относится nginx, и ранее мы включили в эту группу нашего [user]
|
||||
# uid = nginx
|
||||
# gid = nginx
|
||||
# uid = root
|
||||
# gid = root
|
||||
uid = web
|
||||
gid = web
|
||||
|
||||
|
||||
print = ---------------- Запущен uWSGI для oknardia.ru ----------------
|
||||
@@ -1,3 +0,0 @@
|
||||
# Это папака для хранения базы данных SQLite, не должна быть в репозитории.
|
||||
*.*
|
||||
*
|
||||
@@ -1,90 +0,0 @@
|
||||
# ==============================================================================
|
||||
# Docker Compose для PRODUCTION тестирования (Local Production Simulation)
|
||||
# Этот файл содержит настройки для локального тестирования production конфигурации.
|
||||
#
|
||||
# ВАЖНО: Используется для отладки production сборки ЛОКАЛЬНО перед деплоем!
|
||||
#
|
||||
# Запуск: docker compose -f docker-compose.local-prod.yml up --build
|
||||
# Остановка: docker compose -f docker-compose.local-prod.yml down
|
||||
# ==============================================================================
|
||||
|
||||
services:
|
||||
web:
|
||||
# Имя контейнера для удобства
|
||||
container_name: oknardia-backend-prod-test
|
||||
|
||||
# Сборка из текущей директории
|
||||
build: .
|
||||
|
||||
# Пробрасывание портов (тестируем на другом порту, чтобы не конфликтовать с dev)
|
||||
# Dev на 8060, Prod на 8061
|
||||
ports:
|
||||
- "8061:8000"
|
||||
|
||||
# 1. КОМАНДА ЗАПУСКА (Prod режим)
|
||||
# Используем Gunicorn как в production.
|
||||
# При старте контейнера:
|
||||
# 1. Создаём медиа директорию
|
||||
# 2. Применяем миграции
|
||||
# 3. Собираем статику
|
||||
# 4. Генерируем sitemap'ы
|
||||
# 5. Пересоздаём пре-рендер шаблоны серий
|
||||
# 6. Пересчитываем рейтинги профилей, стеклопакетов и наборов
|
||||
# (метод Манна-Уитни: может занять 30-60 сек на БД с 94+ профилями)
|
||||
# 7. Запускаем Gunicorn (нет live reload — это production режим!)
|
||||
# (timeout=120 сек для запуска, достаточно для всех процедур инициализации)
|
||||
command: >
|
||||
sh -c "mkdir -p /home/app/public/media &&
|
||||
python manage.py migrate --noinput &&
|
||||
python manage.py collectstatic --noinput &&
|
||||
python manage.py generate_sitemaps &&
|
||||
python manage.py regenerate_seria_prerender &&
|
||||
python manage.py make_rating &&
|
||||
python -m gunicorn --workers 2 --bind 0.0.0.0:8000 --timeout 120 oknardia.wsgi:application"
|
||||
|
||||
# 2. МОНТИРОВАНИЕ КОДА И ДАННЫХ
|
||||
# Подключаем весь проект целиком, чтобы Django правильно вычислил пути.
|
||||
# В production файлы будут в контейнере, но для локального тестирования
|
||||
# монтируем для удобства остановки/пересоздания.
|
||||
volumes:
|
||||
# Весь проект в /home/app
|
||||
- .:/home/app
|
||||
|
||||
# 3. ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ (Production)
|
||||
env_file:
|
||||
# Основной конфиг из .env (DATABASE, EMAIL, API ключи)
|
||||
- .env
|
||||
environment:
|
||||
# ПЕРЕОПРЕДЕЛЯЕМ для production режима:
|
||||
- DEBUG=False # ВАЖНО: выключен debug для production
|
||||
- DJANGO_LOG_LEVEL=INFO # Вместо DEBUG (меньше логов)
|
||||
# Для локального тестирования: разрешить отдачу медиа через Django (только test!)
|
||||
# В production это обслуживает Nginx!
|
||||
- ALLOW_MEDIA_SERVE=True
|
||||
|
||||
# 4. РЕСУРСЫ (Для локального тестирования можно без лимитов, но в реальном production нужны)
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# cpus: '1'
|
||||
# memory: 512M
|
||||
# reservations:
|
||||
# cpus: '0.5'
|
||||
# memory: 256M
|
||||
|
||||
# 5. ЛОГИРОВАНИЕ
|
||||
# Для отладки production проблем полезно видеть логи
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
|
||||
# 6. ЗДОРОВЬЕ КОНТЕЙНЕРА
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
# ==============================================================================
|
||||
# Docker Compose для РАЗРАБОТКИ (Local Development)
|
||||
# Этот файл содержит настройки для локальной работы (live reload, debug).
|
||||
# Запуск: docker compose -f docker-compose.local up --build
|
||||
# ==============================================================================
|
||||
|
||||
services:
|
||||
web:
|
||||
# Имя контейнера для удобства
|
||||
container_name: oknardia-backend-dev
|
||||
|
||||
# Сборка из текущей директории
|
||||
build: .
|
||||
|
||||
# Пробрасывание портов (чтобы сайт был доступен на localhost:8060)
|
||||
# Занятые порты можно посмотреть через `sudo ss -tulpn`
|
||||
ports:
|
||||
- "8060:8000"
|
||||
|
||||
# 1. КОМАНДА ЗАПУСКА (Dev режим)
|
||||
# Используем Django runserver для разработки:
|
||||
# - Автоматически отдаёт статику без WhiteNoise
|
||||
# - Имеет встроенный auto-reload при изменении кода
|
||||
# - Безопаснее и проще для dev, чем Gunicorn
|
||||
# - Миграции применяются автоматически при каждом старте
|
||||
# - Пересоздаём пре-рендер шаблоны и sitemap'ы для актуальности
|
||||
command: >
|
||||
sh -c "python manage.py migrate --noinput &&
|
||||
python manage.py collectstatic --noinput &&
|
||||
python manage.py generate_sitemaps &&
|
||||
python manage.py regenerate_seria_prerender &&
|
||||
python manage.py runserver 0.0.0.0:8000"
|
||||
|
||||
# 2. МОНТИРОВАНИЕ КОДА (Live Reload)
|
||||
# Подключаем весь проект целиком в /home/app для правильного вычисления путей PROJECT_ROOT.
|
||||
# При изменении кода runserver автоматически перезагружается (auto-reload).
|
||||
#
|
||||
# Структура монтирования:
|
||||
# Host: /Users/e-serg/PRJ/2022-oknardia (.)
|
||||
# Container: /home/app
|
||||
# ├── oknardia/ <- исходный код (manage.py находится здесь)
|
||||
# ├── database/ <- SQLite БД для синхронизации между хостом и контейнером
|
||||
# ├── public/ <- статика и медиа-файлы
|
||||
# └── templates/ <- Django шаблоны
|
||||
volumes:
|
||||
- .:/home/app
|
||||
|
||||
# 3. ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
|
||||
env_file:
|
||||
# файл с переменными окружения для разработки
|
||||
- .env
|
||||
environment:
|
||||
# На всякий случай принудительно включаем DEBUG и DEBUG-уровень логов (вдруг в .env что-то не так)
|
||||
# Эти настройки более приоритетные, чем в .env (если дублируются).
|
||||
- DEBUG=True
|
||||
- DJANGO_LOG_LEVEL=DEBUG
|
||||
# В dev нам не нужно ограничивать буферизацию так строго, но не помешает.
|
||||
|
||||
# 4. РЕСУРСЫ (Без лимитов для разработки)
|
||||
# Удаляем секцию ограничений, чтобы локально использовать все доступные ресурсы хоста.
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# cpus: ...
|
||||
# memory: ...
|
||||
# mem_limit: ...
|
||||
|
||||
@@ -1,130 +0,0 @@
|
||||
# ==============================================================================
|
||||
# Docker Compose для PRODUCTION
|
||||
# Этот файл запускается на боевом сервере.
|
||||
# Вариант 1 (если переименовали в docker-compose.yml): docker compose up -d
|
||||
# Вариант 2 (если оставили имя): docker compose -f docker-compose.prod.yml up -d
|
||||
# ==============================================================================
|
||||
|
||||
services:
|
||||
# --- ОСНОВНОЙ СЕРВИС: DJANGO + GUNICORN + WHITENOISE ---
|
||||
web:
|
||||
# Имя контейнера для удобства
|
||||
container_name: oknardia-backend
|
||||
|
||||
# В production используем готовый, собранный образ из реестра (Gitea)
|
||||
image: git.cube2.ru/erjemin/oknardia:latest
|
||||
|
||||
# ПЕРЕЗАПУСК при сбое
|
||||
restart: always
|
||||
|
||||
# Метки для Watchtower (авто-обновление)
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.scope=oknardia-scope"
|
||||
|
||||
# КОМАНДА ЗАПУСКА (Production режим)
|
||||
# При старте контейнера:
|
||||
# 1. Применяем миграции
|
||||
# 2. Собираем статику
|
||||
# 3. Генерируем sitemap'ы
|
||||
# 4. Пересоздаём пре-рендер шаблоны серий
|
||||
# 5. Пересчитываем рейтинги
|
||||
# 6. Создаём папку конфигов nginx (если нет)
|
||||
# 7. Копируем конфиг nginx с авто-заменой путей через sed
|
||||
# (переменная HOST_PROJECT_PATH берется из .env и подставляется в контейнер)
|
||||
# 8. Инициализируем боевой конфиг (если нет, копируем из примера)
|
||||
# 9. Запускаем Gunicorn
|
||||
command: >
|
||||
sh -c "python manage.py migrate --noinput &&
|
||||
python manage.py collectstatic --noinput &&
|
||||
python manage.py generate_sitemaps &&
|
||||
python manage.py regenerate_seria_prerender &&
|
||||
python manage.py make_rating &&
|
||||
mkdir -p /nginx_configs_host/nginx &&
|
||||
sed \"s|/home/user/path-to-oknardia-app|$${HOST_PROJECT_PATH}|g\" /home/app/config/nginx/oknardia-app--external-nginx.conf > /nginx_configs_host/nginx/oknardia-app--external-nginx.conf.example &&
|
||||
if [ ! -f /nginx_configs_host/nginx/oknardia-app--external-nginx.conf ]; then
|
||||
cp /nginx_configs_host/nginx/oknardia-app--external-nginx.conf.example /nginx_configs_host/nginx/oknardia-app--external-nginx.conf;
|
||||
echo 'INIT: Created new nginx config with correct paths';
|
||||
fi &&
|
||||
ERROR_DIR=/home/app/web/public/media/_error &&
|
||||
mkdir -p "$$ERROR_DIR" &&
|
||||
for code in 400 401 403 404 413 429 500 502 503 504; do
|
||||
cp /home/user/path-to-oknardia-app/oknardia/templates/error/$${code}.html "$$ERROR_DIR/$${code}.html";
|
||||
done &&
|
||||
cp /home/user/path-to-oknardia-app/oknardia/templates/error/under_reconstruction.html "$$ERROR_DIR/under_reconstruction.html"
|
||||
python -m gunicorn --workers 2 --bind 0.0.0.0:8000 --timeout 120 oknardia.wsgi:application"
|
||||
|
||||
# Пробрасывание портов
|
||||
# Слушаем только на localhost хоста для безопасности
|
||||
ports:
|
||||
- "127.0.0.1:8060:8000"
|
||||
|
||||
# МОНТИРОВАНИЕ ТОМОВ (Volumes)
|
||||
volumes:
|
||||
# БД SQLite
|
||||
- ./database:/home/app/database
|
||||
|
||||
# Медиа файлы
|
||||
- ./media:/home/app/public/media
|
||||
|
||||
# Конфиги nginx
|
||||
- ./config:/nginx_configs_host
|
||||
|
||||
# Пользователь и права
|
||||
user: "0:0"
|
||||
|
||||
# ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ (Production)
|
||||
# .env файл содержит все sensitive данные (DB, Email, API keys, REPO_USER/PASS)
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
- DJANGO_SETTINGS_MODULE=oknardia.settings
|
||||
- PYTHONUNBUFFERED=1
|
||||
- DEBUG=False
|
||||
- DJANGO_LOG_LEVEL=INFO
|
||||
- ALLOW_MEDIA_SERVE=False
|
||||
|
||||
# ЗДОРОВЬЕ КОНТЕЙНЕРА (Healthcheck)
|
||||
healthcheck:
|
||||
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/').read()"]
|
||||
interval: 3m
|
||||
timeout: 12s
|
||||
start_period: 60s
|
||||
retries: 3
|
||||
|
||||
# ЛОГИРОВАНИЕ (Ротация)
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "5"
|
||||
|
||||
# РЕСУРСЫ
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '0.75'
|
||||
memory: 768M
|
||||
mem_limit: 768M
|
||||
|
||||
# --- WATCHTOWER: АВТО-ОБНОВЛЕНИЕ ОБРАЗОВ ---
|
||||
watchtower:
|
||||
image: containrrr/watchtower
|
||||
container_name: oknardia_watchtower
|
||||
restart: always
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- REPO_USER=${REPO_USER}
|
||||
- REPO_PASS=${REPO_PASS}
|
||||
- WATCHTOWER_SCOPE=oknardia-scope
|
||||
- WATCHTOWER_CLEANUP=true
|
||||
- DOCKER_API_VERSION=1.44
|
||||
- WATCHTOWER_WAIT_ON_TIMEOUT=60
|
||||
- WATCHTOWER_LIFECYCLE_HOOKS=true
|
||||
command: --interval 1800 --cleanup
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -1,34 +0,0 @@
|
||||
# Generated by Django 5.2.13 on 2026-05-10 14:39
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('oknardia', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='blogposts',
|
||||
name='sMetaDescription',
|
||||
field=models.CharField(blank=True, default='', help_text='SEO: описание для мета-тега (до 160 символов). Если пусто, будет использоваться текст тизера из контента.', max_length=160, verbose_name='Meta описание'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='blogposts',
|
||||
name='sMetaKeywords',
|
||||
field=models.CharField(blank=True, default='', help_text='SEO: ключевые слова для мета-тега (до 256 символов). Если пусто, будет использоваться заголовок.', max_length=256, verbose_name='Meta ключевые слова'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='blogposts',
|
||||
name='sSlug',
|
||||
field=models.SlugField(blank=True, help_text='SEO: URL-friendly версия заголовка (автоматически генерируется, если оставить пусто)', max_length=200, verbose_name='Slug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='blogposts',
|
||||
name='dPostDataBegin',
|
||||
field=models.DateTimeField(db_index=True, default=datetime.datetime(2026, 5, 10, 17, 39, 4, 114851), help_text='Если установить будущую дату, то в назначеное время пост появится автоматически.', verbose_name='Опубликован от'),
|
||||
),
|
||||
]
|
||||
@@ -8,8 +8,7 @@ from datetime import date, datetime
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth.models import User
|
||||
from oknardia.settings import *
|
||||
from web.add_func import sanitize_slug, safe_html_spec_symbols
|
||||
import re
|
||||
|
||||
|
||||
# Таблица: Каталог профилей, стеклопакетов (добавлено 09.авг.2017)
|
||||
# create table oknardia_catalog2profile
|
||||
@@ -1034,28 +1033,6 @@ class BlogPosts(models.Model):
|
||||
db_index=False,
|
||||
verbose_name=u"Создано"
|
||||
)
|
||||
sMetaDescription = models.CharField(
|
||||
max_length=160,
|
||||
blank=True,
|
||||
default=u"",
|
||||
verbose_name=u"Meta описание",
|
||||
help_text=u"SEO: описание для мета-тега (до 160 символов). Если пусто, будет использоваться текст тизера из контента."
|
||||
)
|
||||
sMetaKeywords = models.CharField(
|
||||
max_length=256,
|
||||
blank=True,
|
||||
default=u"",
|
||||
verbose_name=u"Meta ключевые слова",
|
||||
help_text=u"SEO: ключевые слова для мета-тега (до 256 символов). Если пусто, будет использоваться заголовок."
|
||||
)
|
||||
sSlug = models.SlugField(
|
||||
max_length=200,
|
||||
db_index=True,
|
||||
blank=True,
|
||||
verbose_name=u"Slug",
|
||||
help_text=u"SEO: URL-friendly версия заголовка (автоматически генерируется, если оставить пусто)"
|
||||
)
|
||||
|
||||
|
||||
def __unicode__(self):
|
||||
# return u'%s (%s)' % (self.sPostHeader, datetime.strftime(
|
||||
@@ -1065,46 +1042,6 @@ class BlogPosts(models.Model):
|
||||
def __str__(self):
|
||||
return self.__unicode__()
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
"""Переопределённый метод save() для автоматической генерации слага и SEO-полей.
|
||||
|
||||
При сохранении записи блога:
|
||||
- Генерируется sSlug из sPostHeader если тот пуст
|
||||
- Генерируется sMetaDescription из текста контента (тизер)
|
||||
- Генерируется sMetaKeywords из заголовка
|
||||
"""
|
||||
# Шаг 1: Автоматически генерируем слаг из заголовка, если он не указан
|
||||
if not self.sSlug and self.sPostHeader:
|
||||
self.sSlug = sanitize_slug(self.sPostHeader, max_length=200)
|
||||
|
||||
# Шаг 2: Автоматически генерируем sMetaDescription из контента (тизер)
|
||||
if not self.sMetaDescription and self.sPostContent:
|
||||
# Удаляем теги <cut> из контента
|
||||
content_clean = re.sub(r'<cut[\s\S]*?>', '', self.sPostContent, flags=re.IGNORECASE)
|
||||
|
||||
# Генерируем тизер (очищенный текст без HTML)
|
||||
tizer = safe_html_spec_symbols(content_clean)
|
||||
|
||||
# Обрезаем до 160 символов для мета-description
|
||||
if len(tizer) > 160:
|
||||
# Обрезаем слово целиком (не посередине)
|
||||
tizer = tizer[:160].rsplit(' ', 1)[0] + '...' if ' ' in tizer[:160] else tizer[:160]
|
||||
|
||||
self.sMetaDescription = tizer
|
||||
|
||||
# Шаг 3: Автоматически генерируем sMetaKeywords из заголовка
|
||||
if not self.sMetaKeywords and self.sPostHeader:
|
||||
|
||||
# Берём заголовок и удаляем HTML-теги
|
||||
header_clean = safe_html_spec_symbols(self.sPostHeader)
|
||||
header_clean = header_clean.strip()
|
||||
|
||||
# Генерируем ключевые слова: фиксированные + заголовок
|
||||
fixed_keywords = u"oknardia, окнардия, блог, публикация"
|
||||
self.sMetaKeywords = f"{fixed_keywords}, {header_clean}"[:256]
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
# db_table = "jtb_BlogPost"
|
||||
verbose_name = u"Запись в блоге каталоге"
|
||||
@@ -1386,8 +1323,6 @@ class Win_MountDim(models.Model):
|
||||
)
|
||||
sFlapConfig = models.CharField(
|
||||
max_length=32,
|
||||
blank=True,
|
||||
default=u"",
|
||||
verbose_name=u"Открывание",
|
||||
help_text=u"Рекомендуемая гор.архитектурой конфигурации открывания (МЕТАЯЗЫК)")
|
||||
sDescripion = models.CharField(
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
ШАБЛОН для my_secret.py
|
||||
|
||||
ИНСТРУКЦИЯ: скопируйте этот файл в my_secret.py и заполните реальные значения.
|
||||
|
||||
Пример:
|
||||
cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py
|
||||
# затем отредактируйте значения в my_secret.py
|
||||
|
||||
ВАЖНО: my_secret.py НИКОГДА не должен быть в git!
|
||||
Используйте .gitignore для исключения файла.
|
||||
"""
|
||||
|
||||
# ============================================================================
|
||||
# РАЗРАБОТКА (DEV) - Хосты и сетевые настройки
|
||||
# ============================================================================
|
||||
|
||||
# Хосты на которых может работать приложение (разработка)
|
||||
MY_ALLOWED_HOSTS = [
|
||||
'127.0.0.1',
|
||||
'localhost',
|
||||
'your-dev-hostname.local', # ИЗМЕНИТЕ на ваше имя хоста
|
||||
]
|
||||
|
||||
# Допустимые хосты для разработки
|
||||
MY_HOST_HOME1 = 'your-dev-hostname-windows' # ИЗМЕНИТЕ
|
||||
MY_HOST_HOME2 = 'your-dev-hostname-mac' # ИЗМЕНИТЕ
|
||||
MY_HOST_DEV = [MY_HOST_HOME1, MY_HOST_HOME2]
|
||||
|
||||
# Хосты для продакшена (заполнять с осторожностью)
|
||||
MY_HOST_PROD = [] # На продакшене используйте переменные окружения!
|
||||
|
||||
# ============================================================================
|
||||
# БЕЗОПАСНОСТЬ - Django SECRET_KEY
|
||||
# ============================================================================
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
# Сгенерируйте новый ключ с помощью:
|
||||
# python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
||||
MY_SECRET_KEY = 'ЗАПОЛНИТЕ_СЛУЧАЙНОЙ_СТРОКОЙ_БОЛЬШОЙ_ДЛИНЫ'
|
||||
|
||||
# ============================================================================
|
||||
# АДМИНИСТРАТОРЫ - для оповещений об ошибках
|
||||
# ============================================================================
|
||||
|
||||
MY_ADMINS = (
|
||||
('Your Name', 'your-email@example.com'),
|
||||
('Admin Name', 'admin@example.com'),
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# ПУТИ К ФАЙЛАМ - разработка
|
||||
# ============================================================================
|
||||
|
||||
# путь к каталогу media (статика, для web-сервера nginx или apache)
|
||||
MY_MEDIA_ROOT_DEV1 = 'M:\\path\\to\\your\\media\\' # Windows (если применимо)
|
||||
MY_MEDIA_ROOT_DEV2 = '/path/to/your/media/' # Mac/Linux - ИЗМЕНИТЕ!
|
||||
|
||||
# путь к каталогу static (статика, для web-сервера nginx или apache)
|
||||
MY_STATIC_ROOT_DEV1 = 'M:\\path\\to\\your\\static' # Windows (если применимо)
|
||||
MY_STATIC_ROOT_DEV2 = '/path/to/your/static' # Mac/Linux - ИЗМЕНИТЕ!
|
||||
|
||||
# путь для кэш-блоков шаблонов
|
||||
MY_STATIC_BASE_PATH_DEV1 = MY_STATIC_ROOT_DEV1
|
||||
MY_STATIC_BASE_PATH_DEV2 = MY_STATIC_ROOT_DEV2
|
||||
|
||||
# путь для sitemap файлов
|
||||
MY_SITEMAP_ROOT_DEV1 = 'M:\\path\\to\\your\\public\\' # Windows (если применимо)
|
||||
MY_SITEMAP_ROOT_DEV2 = '/path/to/your/public/' # Mac/Linux - ИЗМЕНИТЕ!
|
||||
|
||||
# ============================================================================
|
||||
# ПУТИ К ФАЙЛАМ - продакшен
|
||||
# ============================================================================
|
||||
|
||||
MY_MEDIA_ROOT_PROD = '/home/web/oknardia-ru/public/media/' # ЗАПОЛНИТЕ!
|
||||
MY_STATIC_ROOT_PROD = '/home/web/oknardia-ru/public/static' # ЗАПОЛНИТЕ!
|
||||
MY_STATIC_BASE_PATH_PROD = MY_STATIC_ROOT_PROD
|
||||
MY_SITEMAP_ROOT_PROD = '/home/web/oknardia-ru/public/' # ЗАПОЛНИТЕ!
|
||||
|
||||
# ============================================================================
|
||||
# EMAIL - Почтовый сервер (разработка)
|
||||
# ============================================================================
|
||||
|
||||
# Email адреса для разработки
|
||||
MY_EMAIL_DEV = 'dev-email@example.com'
|
||||
MY_EMAIL_FROM_DEV = 'dev-email@example.com'
|
||||
MY_EMAIL_HOST_USER_DEV = 'your-email@smtp.example.com' # ЗАПОЛНИТЕ!
|
||||
MY_EMAIL_HOST_PASSWORD_DEV = 'YOUR_EMAIL_PASSWORD' # ЗАПОЛНИТЕ!
|
||||
MY_EMAIL_HOST_DEV = 'smtp.example.com' # ЗАПОЛНИТЕ! (например: smtp.mail.ru)
|
||||
MY_EMAIL_PORT_DEV = 587 # ЗАПОЛНИТЕ! (обычно 587 или 2525)
|
||||
|
||||
# ============================================================================
|
||||
# EMAIL - Почтовый сервер (продакшен)
|
||||
# ============================================================================
|
||||
|
||||
MY_EMAIL_PROD = MY_EMAIL_DEV
|
||||
MY_EMAIL_FROM_PROD = MY_EMAIL_FROM_DEV
|
||||
MY_EMAIL_HOST_USER_PROD = MY_EMAIL_HOST_USER_DEV # На продакшене используйте env переменные!
|
||||
MY_EMAIL_HOST_PASSWORD_PROD = MY_EMAIL_HOST_PASSWORD_DEV # На продакшене используйте env переменные!
|
||||
MY_EMAIL_HOST_PROD = MY_EMAIL_HOST_DEV
|
||||
MY_EMAIL_PORT_PROD = MY_EMAIL_PORT_DEV
|
||||
|
||||
# ============================================================================
|
||||
# БД MySQL/MariaDB - разработка
|
||||
# ============================================================================
|
||||
|
||||
MY_DATABASE_HOST_DEV1 = 'localhost' # Офисный сервер разработки - ИЗМЕНИТЕ!
|
||||
MY_DATABASE_HOST_DEV2 = 'localhost' # Домашний сервер разработки - ИЗМЕНИТЕ!
|
||||
|
||||
MY_DATABASE_NAME_DEV = 'django_oknardia_dev' # ИЗМЕНИТЕ если нужно
|
||||
MY_DATABASE_PORT_DEV = '3306' # Стандартный порт MySQL
|
||||
|
||||
MY_DATABASE_USER_DEV = 'web' # ИЗМЕНИТЕ если нужно
|
||||
MY_DATABASE_PASSWORD_DEV = 'YOUR_DB_PASSWORD' # ЗАПОЛНИТЕ!
|
||||
|
||||
# ============================================================================
|
||||
# БД MySQL/MariaDB - продакшен
|
||||
# ============================================================================
|
||||
|
||||
MY_DATABASE_HOST_PROD = 'localhost' # ЗАПОЛНИТЕ! (на продакшене)
|
||||
MY_DATABASE_NAME_PROD = 'django_oknardia_prod' # ЗАПОЛНИТЕ!
|
||||
|
||||
MY_DATABASE_PORT_PROD = '3306'
|
||||
MY_DATABASE_USER_PROD = 'web'
|
||||
|
||||
# ВНИМАНИЕ: На продакшене используйте переменные окружения или менеджер секретов!
|
||||
MY_DATABASE_PASSWORD_PROD = '' # ОСТАВЬТЕ ПУСТО! Используйте переменные окружения!
|
||||
|
||||
# ============================================================================
|
||||
# API ключи - Google Captcha
|
||||
# ============================================================================
|
||||
|
||||
# Получите ключи на https://www.google.com/recaptcha/admin
|
||||
# ВАЖНО: Никогда не коммитьте реальные ключи в git!
|
||||
# PRIVATE ключ - это СЕКРЕТ, держите его в безопасности!
|
||||
MY_CAPTCHA_PUBLIC_KEY = 'YOUR_CAPTCHA_PUBLIC_KEY_HERE' # ЗАПОЛНИТЕ!
|
||||
MY_CAPTCHA_PRIVATE_KEY = 'YOUR_CAPTCHA_PRIVATE_KEY_HERE' # ЗАПОЛНИТЕ! (СЕКРЕТ!)
|
||||
|
||||
# ============================================================================
|
||||
# API ключи - Yandex Maps
|
||||
# ============================================================================
|
||||
|
||||
# Получите ключ на https://developer.tech.yandex.ru/
|
||||
MY_YANDEX_MAPS_API_KEY = 'YOUR_YANDEX_MAPS_API_KEY'
|
||||
|
||||
# ============================================================================
|
||||
# uWSGI - Touch-reload файл (для перезагрузки при изменении кода)
|
||||
# ============================================================================
|
||||
|
||||
MY_TOUCH_RELOAD_DEV1 = 'M:\\path\\to\\touch-reload.txt' # Windows (если применимо)
|
||||
MY_TOUCH_RELOAD_DEV2 = '/path/to/logs/touch-reload.txt' # Mac/Linux - ИЗМЕНИТЕ!
|
||||
MY_TOUCH_RELOAD_PROD = '/home/web/oknardia-ru/logs/touch-reload.txt' # ЗАПОЛНИТЕ!
|
||||
|
||||
# ============================================================================
|
||||
# ИНСТРУКЦИЯ ПО ЗАПОЛНЕНИЮ
|
||||
# ============================================================================
|
||||
|
||||
"""
|
||||
1. СКОПИРУЙТЕ этот файл:
|
||||
cp oknardia/oknardia/my_secret.py.template oknardia/oknardia/my_secret.py
|
||||
|
||||
2. ОТРЕДАКТИРУЙТЕ значения, помеченные ИЗМЕНИТЕ! или ЗАПОЛНИТЕ!
|
||||
|
||||
3. УБЕДИТЕСЬ, что мой_secret.py в .gitignore:
|
||||
grep my_secret .gitignore
|
||||
|
||||
4. НИКОГДА не коммитьте my_secret.py в git!
|
||||
|
||||
5. На ПРОДАКШЕНЕ используйте переменные окружения:
|
||||
export DJANGO_SECRET_KEY="..."
|
||||
export DATABASE_PASSWORD="..."
|
||||
и т.д.
|
||||
|
||||
СОВЕТЫ:
|
||||
- Сгенерируйте новый SECRET_KEY с помощью Python:
|
||||
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
||||
|
||||
- Используйте менеджер паролей (LastPass, 1Password, Vault) для хранения учетных данных
|
||||
|
||||
- Регулярно меняйте пароли БД и API ключи
|
||||
|
||||
- На продакшене используйте отдельные более сильные пароли
|
||||
"""
|
||||
|
||||
+69
-192
@@ -1,60 +1,43 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Django settings for oknardia project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 4.1.1.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/4.1/ref/settings/
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
import environ
|
||||
|
||||
|
||||
def _env_admins(raw_items: list[str]) -> tuple[tuple[str, str], ...]:
|
||||
# Формат: "Имя1:email1,Имя2:email2"
|
||||
admins: list[tuple[str, str]] = []
|
||||
for item in raw_items:
|
||||
if ":" not in item:
|
||||
continue
|
||||
admin_name, admin_email = item.split(":", maxsplit=1)
|
||||
admin_name = admin_name.strip()
|
||||
admin_email = admin_email.strip()
|
||||
if admin_name and admin_email:
|
||||
admins.append((admin_name, admin_email))
|
||||
return tuple(admins)
|
||||
|
||||
def _normalize_admin_url(value: str) -> str:
|
||||
"""Приводит URL админки к виду `segment/` без ведущего слэша."""
|
||||
normalized = value.strip().lstrip('/')
|
||||
if not normalized:
|
||||
return 'admin/'
|
||||
if not normalized.endswith('/'):
|
||||
normalized += '/'
|
||||
return normalized
|
||||
from oknardia.my_secret import *
|
||||
import socket
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
PROJECT_ROOT = BASE_DIR.parent
|
||||
PUBLIC_ROOT = PROJECT_ROOT / 'public'
|
||||
STATIC_SOURCE_ROOT = PUBLIC_ROOT / 'static'
|
||||
|
||||
env = environ.Env()
|
||||
environ.Env.read_env(str(PROJECT_ROOT / '.env'))
|
||||
|
||||
CSRF_TRUSTED_ORIGINS = env.list('DJANGO_CSRF_TRUSTED_ORIGINS', default=[])
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = env(
|
||||
var='DJANGO_SECRET_KEY',
|
||||
default='django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch',
|
||||
)
|
||||
ADMIN_URL = _normalize_admin_url(env(var='ADMIN_URL', default='admin/'))
|
||||
SECRET_KEY = 'django-insecure-pd&1$j6z*1w#(j*16b+(@@#&2)+@x^^ot4)zqt-e67*1+$^qch'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
# PREDУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене!
|
||||
DEBUG = TEMPLATE_DEBUG = env.bool('DEBUG', default=False)
|
||||
# ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: не работайте в режиме DEBUG в продашене!
|
||||
if socket.gethostname() in MY_HOST_DEV:
|
||||
DEBUG = TEMPLATE_DEBUG = True
|
||||
else:
|
||||
# Все остальные хосты (подразумевается продакшн)
|
||||
DEBUG = TEMPLATE_DEBUG = True
|
||||
# DEBUG = TEMPLATE_DEBUG = False
|
||||
|
||||
# Допустимые хосты (+ 'testserver' для management команд типа regenerate_seria_prerender)
|
||||
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['127.0.0.1', 'localhost', 'testserver'])
|
||||
ALLOWED_HOSTS = MY_ALLOWED_HOSTS
|
||||
|
||||
# Настройки сообщений об ошибках когда все упало и т.п.
|
||||
ADMINS = _env_admins(env.list('ADMINS', default=[]))
|
||||
ADMINS = MY_ADMINS
|
||||
|
||||
|
||||
# Application definition
|
||||
@@ -68,7 +51,7 @@ INSTALLED_APPS = [
|
||||
'django.contrib.staticfiles',
|
||||
|
||||
'django.contrib.humanize',
|
||||
'django.contrib.sitemaps',
|
||||
# 'django.contrib.sitemaps',
|
||||
|
||||
'oknardia.apps.OknardiaConfig',
|
||||
'web.apps.WebConfig',
|
||||
@@ -84,13 +67,6 @@ MIDDLEWARE = [
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
# Разрешенные IP для отладки (нужно для django-debug-toolbar).
|
||||
INTERNAL_IPS = env.list('INTERNAL_IPS', default=['127.0.0.1', 'localhost'])
|
||||
|
||||
if DEBUG:
|
||||
INSTALLED_APPS += ['debug_toolbar']
|
||||
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware', *MIDDLEWARE]
|
||||
|
||||
ROOT_URLCONF = 'oknardia.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
@@ -139,94 +115,61 @@ DATETIME_FORMAT = 'Y-m-d H:i:s'
|
||||
# Статические файлы (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
MEDIA_URL = '/media/'
|
||||
STATIC_URL = 'static/'
|
||||
MEDIA_URL = 'media/'
|
||||
|
||||
MEDIA_ROOT = str(PUBLIC_ROOT / 'media')
|
||||
# STATIC_ROOT отделен от исходной статики, чтобы избежать staticfiles.E002.
|
||||
STATIC_ROOT = str(PUBLIC_ROOT / 'static_collected')
|
||||
|
||||
# Базовый URL сайта нужен для абсолютных URL в sitemap.xml.
|
||||
SITE_BASE_URL = env('SITE_BASE_URL', default='https://oknardia.ru').rstrip('/')
|
||||
# Файлы sitemap храним в media-volume, чтобы переживали пересоздание контейнера.
|
||||
SITEMAP_SUBDIR = env('SITEMAP_SUBDIR', default='_serv_sitemap').strip('/ ')
|
||||
SITEMAP_ROOT = str(Path(MEDIA_ROOT) / SITEMAP_SUBDIR)
|
||||
SITEMAP_URL_PREFIX = f"{MEDIA_URL.rstrip('/')}/{SITEMAP_SUBDIR}"
|
||||
SITEMAP_INDEX_URL = f"{SITE_BASE_URL}{SITEMAP_URL_PREFIX}/sitemap.xml"
|
||||
|
||||
# Каталоги, откуда Django читает исходную статику в DEBUG-режиме.
|
||||
STATICFILES_DIRS = [
|
||||
str(STATIC_SOURCE_ROOT)
|
||||
] if STATIC_SOURCE_ROOT.is_dir() else []
|
||||
|
||||
# Django 5 требует явное описание хранилищ.
|
||||
# `default` нужен для загружаемых файлов (FileField, ImageField, filer и подобное) и смотрит в `MEDIA_ROOT`.
|
||||
# `staticfiles` остаётся отдельно: в dev используется обычная статика Django, в prod — WhiteNoise.
|
||||
STORAGES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.files.storage.FileSystemStorage',
|
||||
'OPTIONS': {
|
||||
'location': MEDIA_ROOT,
|
||||
},
|
||||
},
|
||||
'staticfiles': {
|
||||
'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage',
|
||||
},
|
||||
}
|
||||
|
||||
# Путь к каталогу static для генерации кэш-файлов и служебных JS.
|
||||
STATIC_BASE_PATH = str(STATIC_SOURCE_ROOT)
|
||||
|
||||
# Определяем движок БД из переменной окружения (по умолчанию SQLite)
|
||||
database_engine = env('DATABASE_ENGINE', default='django.db.backends.sqlite3')
|
||||
|
||||
if database_engine == 'django.db.backends.sqlite3':
|
||||
# Для SQLite принимаем только имя файла из env и кладем БД в PROJECT_ROOT/database.
|
||||
sqlite_db_filename = Path(env('DATABASE_NAME', default='oknardia.sqlite3')).name
|
||||
sqlite_db_path = PROJECT_ROOT / 'database' / sqlite_db_filename
|
||||
if socket.gethostname() in MY_HOST_DEV: # DEBUG: заменяем настройки прода, на настройки девопа
|
||||
MEDIA_ROOT = MY_MEDIA_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_MEDIA_ROOT_DEV2
|
||||
SITEMAP_ROOT = MY_SITEMAP_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_SITEMAP_ROOT_DEV2
|
||||
# STATIC_ROOT = MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2
|
||||
STATICFILES_DIRS = [
|
||||
MY_STATIC_ROOT_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_ROOT_DEV2,
|
||||
]
|
||||
# путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов)
|
||||
STATIC_BASE_PATH = MY_STATIC_BASE_PATH_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_STATIC_BASE_PATH_DEV2
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': str(sqlite_db_path),
|
||||
'OPTIONS': {
|
||||
'timeout': 20,
|
||||
},
|
||||
},
|
||||
'ENGINE': "django.db.backends.mysql",
|
||||
'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2,
|
||||
'PORT': MY_DATABASE_PORT_DEV, # Set to "" for default. Not used with sqlite3.
|
||||
'NAME': MY_DATABASE_NAME_DEV, # Not used with sqlite3.
|
||||
'USER': MY_DATABASE_USER_DEV, # Not used with sqlite3.
|
||||
'PASSWORD': MY_DATABASE_PASSWORD_DEV, # Not used with sqlite3.
|
||||
# 'OPTIONS': { 'autocommit': True, }
|
||||
}
|
||||
}
|
||||
TOUCH_RELOAD = MY_TOUCH_RELOAD_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_TOUCH_RELOAD_DEV2
|
||||
else:
|
||||
# База не SQLite (mariaDB, например): читаем все параметры подключения из env.
|
||||
MEDIA_ROOT = MY_MEDIA_ROOT_PROD
|
||||
# STATICFILES_DIRS = [MY_STATIC_ROOT_PROD1, ]
|
||||
STATIC_ROOT = MY_STATIC_ROOT_PROD
|
||||
SITEMAP_ROOT = MY_SITEMAP_ROOT_PROD
|
||||
# путь к каталогу static (в эту переменную использовать для указания пути где будут делаться кэш-блоки для шаблонов)
|
||||
STATIC_BASE_PATH = MY_STATIC_BASE_PATH_PROD
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': database_engine,
|
||||
'HOST': env('DATABASE_HOST', default='localhost'),
|
||||
'PORT': env('DATABASE_PORT', default='3306'),
|
||||
'NAME': env('DATABASE_NAME', default=''),
|
||||
'USER': env('DATABASE_USER', default=''),
|
||||
'PASSWORD': env('DATABASE_PASSWORD', default=''),
|
||||
'ENGINE': "django.db.backends.mysql",
|
||||
'HOST': MY_DATABASE_HOST_PROD, # Set to "" for localhost. Not used with sqlite3.
|
||||
'PORT': MY_DATABASE_PORT_PROD, # Set to "" for default. Not used with sqlite3.
|
||||
'NAME': MY_DATABASE_NAME_PROD, # Not used with sqlite3.
|
||||
'USER': MY_DATABASE_USER_PROD, # Not used with sqlite3.
|
||||
'PASSWORD': MY_DATABASE_PASSWORD_PROD, # Not used with sqlite3.
|
||||
# 'OPTIONS': { 'autocommit': True, }
|
||||
}
|
||||
}
|
||||
|
||||
TOUCH_RELOAD = MY_TOUCH_RELOAD_PROD
|
||||
|
||||
#########################################
|
||||
# настройки для почтового сервера (они одинаковые для DEV и PROD)
|
||||
EMAIL_BACKEND = env(
|
||||
'EMAIL_BACKEND',
|
||||
default='django.core.mail.backends.smtp.EmailBackend',
|
||||
)
|
||||
EMAIL_HOST = env('EMAIL_HOST', default='localhost')
|
||||
EMAIL_PORT = env.int('EMAIL_PORT', default=25)
|
||||
EMAIL_HOST_USER = env('EMAIL_HOST_USER', default='')
|
||||
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD', default='')
|
||||
EMAIL_USE_TLS = env.bool('EMAIL_USE_TLS', default=True)
|
||||
EMAIL_USE_SSL = env.bool('EMAIL_USE_SSL', default=False)
|
||||
DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default=EMAIL_HOST_USER)
|
||||
SERVER_EMAIL = env('SERVER_EMAIL', default=DEFAULT_FROM_EMAIL)
|
||||
EMAIL_HOST = MY_EMAIL_HOST_DEV
|
||||
EMAIL_PORT = MY_EMAIL_PORT_DEV
|
||||
EMAIL_HOST_USER = MY_EMAIL_HOST_USER_DEV
|
||||
EMAIL_HOST_PASSWORD = MY_EMAIL_HOST_PASSWORD_DEV
|
||||
SERVER_EMAIL = DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
|
||||
EMAIL_USE_TLS = True
|
||||
EMAIL_SUBJECT_PREFIX = 'OKNARDIA ERR: ' # префикс для оповещений об ошибках и необработанных исключениях
|
||||
|
||||
SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False)
|
||||
SESSION_COOKIE_SECURE = env.bool('SESSION_COOKIE_SECURE', default=False)
|
||||
CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', default=False)
|
||||
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||
@@ -234,17 +177,10 @@ CSRF_COOKIE_SECURE = env.bool('CSRF_COOKIE_SECURE', default=False)
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
|
||||
# ключи для Google Captha
|
||||
CAPTCHA_PUBLIC_KEY = env('CAPTCHA_PUBLIC_KEY', default='')
|
||||
CAPTCHA_PRIVATE_KEY = env('CAPTCHA_PRIVATE_KEY', default='')
|
||||
CAPTCHA_PUBLIC_KEY = MY_CAPTCHA_PUBLIC_KEY
|
||||
CAPTCHA_PRIVATE_KEY = MY_CAPTCHA_PRIVATE_KEY
|
||||
|
||||
# МАГИЧЕСКИЕ ЧИСЛА
|
||||
# если непонятно какая серия выбрана через каталог (finger fix) выбираем серию типового строения:
|
||||
DEFAULT_SERIA_ID_FOR_CATALOG = 843 # СЕРИЯ 1-515/9 -- дом в котором я живу
|
||||
DEFAULT_WIN_WIDTH_MM = 670 # Ширина типового окна для ID=16 (если не выбрано)
|
||||
DEFAULT_WIN_HEIGHT_MM = 2160 # Высота типового окна для ID=16 (если не выбрано)
|
||||
DEFAULT_WIN_ID = 16 # ID типового окна (если не выбрано)
|
||||
|
||||
# количество коммерческих предложений во фрейме отчета
|
||||
# количество коммерческих предложений во фреме отчета
|
||||
OFFER_PER_FRAME = 5
|
||||
OFFER_PER_FRAME_FOR_ONE_FLAP = 10
|
||||
# папка для хранения изображений
|
||||
@@ -336,63 +272,4 @@ CATALOG_SORTER_MAGIC_NUMBER_TIZER = 1
|
||||
|
||||
MAX_LEN_RING_LOG_BUFFER = 250 # МАКСИМАЛЬНЫЙ РАЗМЕР КОЛЬЦЕВОГО БУФЕРА
|
||||
|
||||
YANDEX_MAPS_API_KEY = env('YANDEX_MAPS_API_KEY', default='')
|
||||
|
||||
# ============================================================================
|
||||
# Конфигурация в зависимости от режима разработки (DEBUG) vs. production
|
||||
# ============================================================================
|
||||
|
||||
if DEBUG:
|
||||
# В dev: стандартная отдача статики Django (без WhiteNoise/кэширования).
|
||||
# Медиа-файлы отдаются через Django.
|
||||
pass
|
||||
|
||||
else:
|
||||
# В prod: WhiteNoise + CompressedStaticFilesStorage для оптимизации.
|
||||
# Статика собирается с хешем в имени и кэшируется.
|
||||
#
|
||||
# ВАЖНО: Для production нужна полная настройка Nginx:
|
||||
# - Nginx обслуживает статику (/static/) прямо из /home/app/public/static_collected/
|
||||
# - Nginx обслуживает медиа (/media/) прямо из /home/app/public/media/
|
||||
# - Nginx проксирует остальное на Gunicorn (:8000)
|
||||
#
|
||||
# Для локального тестирования production конфига этот файл симулирует Nginx.
|
||||
|
||||
# 1. Добавляем WhiteNoise в начало MIDDLEWARE (после SecurityMiddleware) для отдачи статики
|
||||
MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')
|
||||
|
||||
# 2. Переводим staticfiles на WhiteNoise со сжатием
|
||||
# ВАЖНО: используем CompressedStaticFilesStorage вместо CompressedManifestStaticFilesStorage,
|
||||
# потому что Manifest не справляется с relative paths в CSS (например, jQuery UI).
|
||||
# CompressedStaticFilesStorage сжимает файлы без manifest, что работает надежнее.
|
||||
STORAGES['staticfiles'] = {
|
||||
'BACKEND': 'whitenoise.storage.CompressedStaticFilesStorage', # noqa: F821
|
||||
}
|
||||
|
||||
# 3. WhiteNoise конфиг: обслуживание корневых файлов из public/ (robots.txt, favicon.*, sitemap.xml и т.д.)
|
||||
# Параметр WHITENOISE_LOCATION указывает WhiteNoise, где искать файлы помимо STATIC_ROOT
|
||||
WHITENOISE_LOCATION = str(PUBLIC_ROOT)
|
||||
|
||||
# 4. MIME-типы для шрифтов (иначе браузер может не загрузить)
|
||||
WHITENOISE_MIMETYPES = {
|
||||
'.woff': 'font/woff',
|
||||
'.woff2': 'font/woff2',
|
||||
}
|
||||
# 5. Конфигурация WhiteNoise для обслуживания статических файлов и файлов из /public (например,
|
||||
# robots.txt, favicon.ico и т.п.)
|
||||
# WHITENOISE_ROOT = PUBLIC_ROOT
|
||||
|
||||
# 6. Кэширование неизменяемых файлов (с хешем в имени) на 1 год в браузере
|
||||
# ВАЖНО: лямбда должна принимает ДВА аргумента: path и url (как требует WhiteNoise)
|
||||
WHITENOISE_IMMUTABLE_FILE_TEST = lambda path, url: 'CACHE' in path
|
||||
|
||||
# 7. ЛОКАЛЬНЫЙ ТЕСТ: для отдачи медиа в docker-compose.local-prod.yml
|
||||
# В реальном production это обслуживает Nginx! Никогда не используй в production!
|
||||
# Добавляем StaticFilesHandler который обслуживает и медиа и статику
|
||||
if env.bool('ALLOW_MEDIA_SERVE', default=False):
|
||||
# Для локального тестирования добавляем обслуживание медиа через Django
|
||||
# ВАЖНО: это очень медленно и небезопасно для production!
|
||||
from django.conf.urls.static import static
|
||||
# Будет добавлено в urls.py при импорте: urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
|
||||
|
||||
|
||||
YANDEX_MAPS_API_KEY = MY_YANDEX_MAPS_API_KEY
|
||||
|
||||
+54
-158
@@ -1,84 +1,28 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""oknardia Конфигурация URL"""
|
||||
"""oknardia Конфигурация URL
|
||||
|
||||
Список `urlpatterns` направляет URL-адреса в представления. Дополнительную информацию см.:
|
||||
https://docs.djangoproject.com/en/4.1/topics/http/urls/
|
||||
Примеры:
|
||||
Представления функций
|
||||
1. Добавьте import: из представлений импорта my_app
|
||||
2. Добавьте URL-адрес в urlpatterns: path('', views.home, name='home')
|
||||
Представления на основе классов
|
||||
1. Добавьте импорт: from other_app.views import Home
|
||||
2. Добавьте URL-адрес в шаблоны URL-адресов: path('', Home.as_view(), name='home')
|
||||
Включение другой конфигурации URL
|
||||
1. Импортируйте функцию include(): из django.urls import include, path
|
||||
2. Добавьте URL-адрес в urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import include, re_path, path
|
||||
from django.http import FileResponse
|
||||
from pathlib import Path
|
||||
import environ
|
||||
import mimetypes
|
||||
import os
|
||||
|
||||
# Инициализируем env
|
||||
env = environ.Env()
|
||||
PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
|
||||
environ.Env.read_env(str(PROJECT_ROOT / '.env'))
|
||||
from django.urls import path, re_path
|
||||
from django.conf.urls.static import static
|
||||
from oknardia.settings import *
|
||||
from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service, \
|
||||
catalog_profiles, catalog_series, catalog_openings, catalog_companies
|
||||
from web import views, autocomplete_addr, user_manager, blog, diagrams, report1, report2, catalog, prices, service
|
||||
|
||||
|
||||
def _serve_public_root_file(request, path):
|
||||
"""Отдает статик-файл из public/ с правильным Content-Type и UTF-8 для текстовых файлов."""
|
||||
file_path = PUBLIC_ROOT / path
|
||||
|
||||
# Безопасность: проверяем, что файл гарантированно внутри PUBLIC_ROOT
|
||||
try:
|
||||
file_path = file_path.resolve()
|
||||
file_path.relative_to(PUBLIC_ROOT.resolve())
|
||||
except ValueError:
|
||||
from django.http import Http404
|
||||
raise Http404("Файл не найден")
|
||||
|
||||
if not file_path.is_file():
|
||||
from django.http import Http404
|
||||
raise Http404("Файл не найден")
|
||||
|
||||
# Определяем MIME type
|
||||
mime_type, _ = mimetypes.guess_type(str(file_path))
|
||||
|
||||
# Для текстовых файлов добавляем charset=utf-8
|
||||
if mime_type and mime_type.startswith('text'):
|
||||
mime_type = f"{mime_type}; charset=utf-8"
|
||||
|
||||
response = FileResponse(open(file_path, 'rb'), content_type=mime_type)
|
||||
|
||||
# Определяем Content-Disposition в зависимости от типа файла:
|
||||
# inline — браузер отображает/обрабатывает (иконки, картинки, CSS, JS, robots.txt, manifest)
|
||||
# attachment — браузер скачивает (архивы, документы и т.д.)
|
||||
inline_types = {
|
||||
'image/', # все картинки (PNG, SVG, JPG и т.д.)
|
||||
'text/', # все текстовые файлы
|
||||
'application/javascript',
|
||||
'application/json',
|
||||
'application/xml',
|
||||
'application/rss+xml',
|
||||
'application/x-web-app-manifest+json', # manifest
|
||||
}
|
||||
|
||||
if mime_type and any(mime_type.lower().startswith(t) for t in inline_types):
|
||||
response['Content-Disposition'] = 'inline'
|
||||
else:
|
||||
# Для остального (неизвестные типы, архивы и т.д.) — скачивание
|
||||
response['Content-Disposition'] = f'attachment; filename="{file_path.name}"'
|
||||
|
||||
return response
|
||||
|
||||
|
||||
def _iter_public_root_files():
|
||||
"""Находит все обычные файлы в корне public/, кроме служебных артефактов (начинающихся с точки)."""
|
||||
if not PUBLIC_ROOT.exists():
|
||||
return
|
||||
|
||||
for file_path in sorted(PUBLIC_ROOT.iterdir()):
|
||||
if not file_path.is_file():
|
||||
continue
|
||||
# Пропускаем служебные файлы (начинающиеся с точки)
|
||||
if file_path.name.startswith('.'):
|
||||
continue
|
||||
yield file_path.name
|
||||
|
||||
urlpatterns = [
|
||||
path(ADMIN_URL, admin.site.urls),
|
||||
path('admin/', admin.site.urls),
|
||||
|
||||
# главная страница
|
||||
re_path(r'^$', views.main_init),
|
||||
@@ -112,104 +56,56 @@ urlpatterns = [
|
||||
re_path(r'^stat/series/geo[/*]$', diagrams.statistic_menu), # дубль для старых ссылок
|
||||
re_path(r'^stat/rating[/*]$', report2.ratings),
|
||||
re_path(r'^stat/rating/profiles_rank[/*]$', report2.profiles_rating),
|
||||
# --- КАТАЛОГ
|
||||
re_path(r'^catalog[/*]$', catalog.catalog_root), # ГЛАВНАЯ СТРАНИЦА КАТАЛОГА
|
||||
# --- --- КАТАЛОГ ПРОФИЛЕЙ
|
||||
re_path(r'^catalog/profile[/*]$', catalog_profiles.catalog_profile), # СПИСОК ВСЕХ ПРОФИЛЕЙ И ПРОИЗВОДИТЕЛЕЙ
|
||||
# --- Каталог
|
||||
# --- --- Каталог профилей
|
||||
re_path(r'^catalog[/*]$', catalog.catalog_root),
|
||||
re_path(r'^catalog/profile[/*]$', catalog.catalog_profile),
|
||||
re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)'
|
||||
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$',
|
||||
catalog_profiles.catalog_profile_model), # СТРАНИЦА ОПИСАНИЯ МОДЕЛИ ПРОФИЛЯ
|
||||
r'/(?P<model_id>\d+)-(?P<model_name>\S*)[/*]$', catalog.catalog_profile_model),
|
||||
re_path(r'^catalog/profile/(?P<manufacture_id>\d+)-(?P<manufacture_name>\S*)[/*]$',
|
||||
catalog_profiles.catalog_profile_manufacture), # КАРТОЧКА ОПИСАНИЯ ПРОИЗВОДИТЕЛЯ ПРОФИЛЯ
|
||||
# --- --- КАТАЛОГ СЕРИЙ ТИПОВОГО СТРОИТЕЛЬСТВА
|
||||
re_path(r'^catalog/seria[/*]$', catalog_series.catalog_seria), # СПИСОК ВСЕХ СЕРИЙ ЗДАНИЙ
|
||||
re_path(r'^catalog/seria/(?P<seria_name_translit>[^/]*)/all(?P<seria_id>\d+)[/*]$',
|
||||
catalog_series.catalog_seria_info), # КАРТОЧКА СЕРИИ ДОМА И ЕЕ СТАТИСТИКА
|
||||
catalog.catalog_profile_manufacture),
|
||||
# --- --- Каталог серий типового строительства
|
||||
re_path(r'^catalog/seria[/*]$', catalog.catalog_seria),
|
||||
re_path(r'^catalog/seria/(?P<seria_name_translit>[^/]*)/all(?P<seria_id>\d+)[/*]$', catalog.catalog_seria_info),
|
||||
re_path(r'^seria_[^/]*/all(?P<seria_id>\d+)/\S*$', catalog.report_all_info_seria_redirect), # для старых ссылок
|
||||
# --- --- КАТАЛОГ СТАНДАРТНЫХ ПРОЁМОВ И СХЕМ ОТКРЫВАНИЯ ДЛЧ ТИПОВЫХ СЕРИЙ СТРОИТЕЛЬСТВА
|
||||
re_path(r'^catalog/standard_opening[/*]$', catalog_openings.standard_opening), # СТРАНИЦА С ТАБЛИЦЕЙ ПРОЁМОМ
|
||||
# --- --- КАТАЛОГ ПРОИЗВОДИТЕЛЕЙ ОКОН
|
||||
re_path(r'^catalog/company[/*]$', catalog_companies.catalog_company), # СПИСОК ВСЕХ ПРОИЗВОДИТЕЛЕЙ ОКОН
|
||||
re_path(r'^catalog/company/(?P<company_id>\d+)-(?P<company_name_slug>\S*)[/*]$',
|
||||
catalog_companies.catalog_company_detail), # КАРТОЧКА ПРОИЗВОДИТЕЛЯ-УСТАНОВЩИКА ОКОН
|
||||
# --- --- КАТАЛОГ ОКОННЫХ НАБОРОВ (SetKit) — список комплектаций с переходом к сравнению
|
||||
re_path(r'^catalog/sets[/*]$', catalog.catalog_sets),
|
||||
# --- --- Каталог стандартных проёмов и схем открывания длч типовых серий строительства
|
||||
re_path(r'^catalog/standard_opening[/*]$', catalog.standard_opening),
|
||||
# --- --- Каталог производителей окон
|
||||
re_path(r'^catalog/company[/*]$', catalog.catalog_company),
|
||||
re_path(r'^catalog/company/(?P<company_id>\d+)-(?P<company_name_slug>\S*)[/*]$', catalog.catalog_company_detail),
|
||||
# ЦЕНОВЫЕ ПРЕДЛОЖЕНИЯ
|
||||
# --- ОДИНОЧНОЕ ОКНО
|
||||
re_path(r'^catalog/standard_opening/price-(?P<win_width_mm>\d+)x(?P<win_height_mm>\d+)mm-tip(?P<win_id>\d+)[/*]$',
|
||||
prices.report_one_win_price), # КАНОНИЧЕСКИЙ SEO-URL СТРАНИЦЫ ЦЕН ДЛЯ ОДНОГО ПРОЕМА
|
||||
# --- Одиночное окно
|
||||
re_path(r'^tsena-odnogo-okna/(?P<win_width_mm>\d+)x(?P<win_height_mm>\d+)mm/tip(?P<win_id>\d+)[/*]$',
|
||||
prices.redirect_one_win_price_legacy), # LEGACY-URL: 301 -> КАНОНИЧЕСКИЙ ПУТЬ
|
||||
re_path(r'^next_price_one_flap_frame/idW(?P<win_id>\d+)N(?P<frame_begin_n>\d+)\S*$',
|
||||
prices.next_one_win_price), # ПОДГРУЖАЕМЫЙ ФРЕЙМ С ЦЕНОВЫМИ ПРЕДЛОЖЕНИЯМИ ДЛЯ ОДНОГО ПРОЕМА
|
||||
# --- ЦЕНОВАЯ ВЫДАЧА (НОВЫЙ РОУТИНГ)
|
||||
# НОВЫЙ КРАСИВЫЙ URL С ПРЕФИКСАМИ SERIAID, APPARTAD, ADDRESSID
|
||||
re_path(r'^price/seriaID(?P<seria_id>\d+)--(?P<seria_slug>[^/]+)/appartID(?P<apart_id>\d+)/addressID(?P<address_id>\d+)--(?P<address_slug>[^/]+)/?$', prices.report_price_new),
|
||||
# --- ПОДГРУЖАЕМЫЙ ФРЕЙМ ЦЕНОВОЙ ВЫДАЧИ (ОСТАВЛЯЕМ СТАРЫЙ)
|
||||
prices.report_one_win_price),
|
||||
re_path(r'^next_price_one_flap_frame/idW(?P<win_id>\d+)N(?P<frame_begin_n>\d+)\S*$', prices.next_one_win_price),
|
||||
# --- Ценовая выдача
|
||||
re_path(r'^(?P<build_id>\d+)/(?P<apart_id>\d+)/(?P<slug>[\s\S]*)$', prices.report_price),
|
||||
# --- Подгружаемый фрейм ценовая выдачи
|
||||
re_path(r'^next_price_frame/idA(?P<apart_id>\d+)MDPO(?P<mount_dim_per_offer>\d+)LON(?P<address_longitude>\d+)'
|
||||
r'LAT(?P<address_latitude>\d+\.*\d*)N(?P<frame_begin_n>\d+\.*\d*)\S*[/*]$', prices.next_price_frame),
|
||||
# --- СТАРЫЙ URL ЦЕНОВОЙ ВЫДАЧИ (ДОБАВИМ РЕДИРЕКТ) ДЛЯ ПОИСКОВИКОВ
|
||||
# --- НЕ УДАЛЯТЬ! КАРТА С СЕРИЯМИ ДОМОВ ИСПОЛЬЗУЕТ ЭТОТ РОУТИНГ, Т.К. ТАКИЕ URL КОРОЧЕ И ДЕЛАЮТ JS КОПАКТНЕЕ
|
||||
re_path(r'^(?P<build_id>\d+)/(?P<apart_id>\d+)/(?P<slug>[\s\S]*)$', prices.report_price_legacy_redirect),
|
||||
# СРАВНЕНИЕ ОКОННЫХ НАБОРОВ
|
||||
re_path(r'^compare_sets/(?P<to_compare>[\s\S]+|.*)$', report1.compare_offers), # дубль для старых ссылок
|
||||
re_path(r'^compare_offers/(?P<to_compare>[\s\S]+|.*)$', report1.compare_offers),
|
||||
re_path(r'^specification_set/\d$', views.main_init), # заглушка (позже будет спецификация оконного набора)
|
||||
# отображение всех составлющих рейтинга
|
||||
re_path( r'^show_rating_components/(?P<win_set>\d+)$', report1.show_rating_components),
|
||||
# СЛУЖЕБНЫЕ СТРАНИЦЫ (для администратора)
|
||||
# --- страничка "главная сервис-утилит"
|
||||
re_path(r'^service[/*]$', service.service),
|
||||
# --- страничка для тестирования верстки текста в блоге
|
||||
re_path(r'^service/tmp[/*]$', service.tmp),
|
||||
# --- страничка "нет доступа"
|
||||
re_path(r'^service/not-denice[/*]$', service.not_denice),
|
||||
# --- создание файлов sitemap.xml
|
||||
re_path(r'^service/make_sitemaps[/*]$', service.make_site_maps),
|
||||
|
||||
]
|
||||
|
||||
|
||||
# Динамическая генерация URL patterns для всех файлов в корне public/
|
||||
# (кроме служебных файлов, начинающихся с точки)
|
||||
# В DEV режиме и при ALLOW_MEDIA_SERVE=True отдаются через Django,
|
||||
# в PRODUCTION это должно обслуживать Nginx/WhiteNoise
|
||||
PUBLIC_ROOT_URLPATTERNS = [
|
||||
path(filename, _serve_public_root_file, {'path': filename})
|
||||
for filename in _iter_public_root_files()
|
||||
]
|
||||
|
||||
# Добавляем static файлы для корня ДО основных URL patterns
|
||||
# (чтобы отдавать файлы быстро и не проверять остальные рулы)
|
||||
urlpatterns = [*PUBLIC_ROOT_URLPATTERNS, *urlpatterns]
|
||||
|
||||
handler404 = 'web.views.handler404'
|
||||
handler400 = 'web.views.handler400'
|
||||
handler403 = 'web.views.handler403'
|
||||
handler500 = 'web.views.handler500'
|
||||
|
||||
# Для локального тестирования production конфига: отдача медиа через Django
|
||||
# В реальном production медиа обслуживает Nginx!
|
||||
if DEBUG or env.bool('ALLOW_MEDIA_SERVE', default=False):
|
||||
from django.views.static import serve as serve_static
|
||||
# Проверяем что директория медиа существует
|
||||
if os.path.isdir(MEDIA_ROOT):
|
||||
# Добавляем URL pattern для отдачи медиа файлов
|
||||
urlpatterns += [
|
||||
re_path(
|
||||
r'^media/(?P<path>.*)$',
|
||||
serve_static,
|
||||
{'document_root': MEDIA_ROOT},
|
||||
name='media'
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
if DEBUG:
|
||||
# --- страничка для тестирования верстки текста в блоге
|
||||
urlpatterns += [re_path(r'^blog/tmp[/*]$', service.tmp),]
|
||||
# --- странички для тестирования страниц с кодами ошибок
|
||||
urlpatterns += [
|
||||
re_path(r'^400$', views.handler400),
|
||||
re_path(r'^403$', views.handler403),
|
||||
re_path(r'^404$', views.handler404),
|
||||
re_path(r'^500$', views.handler500),
|
||||
]
|
||||
# ___ ____ _ _____ _ _ _____ _
|
||||
# | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| |
|
||||
# |_ | | | | -_| . | | | . | | | | . | . | | . | .'| _| | __| .'| | -_| |
|
||||
# |_| |____/|___|___|___|_ | |_| |___|___|_|___|__,|_| |__| |__,|_|_|___|_|
|
||||
# |___|
|
||||
urlpatterns = [path('__debug__/', include('debug_toolbar.urls')), *urlpatterns]
|
||||
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
|
||||
|
||||
# ___ ____ _ _____ _ _ _____ _
|
||||
# | | | | \ ___| |_ _ _ ___ |_ _|___ ___| | |_ ___ ___ | _ |___ ___ ___| |
|
||||
# |_ | | | | -_| . | | | . | | | | . | . | | . | .'| _| | __| .'| | -_| |
|
||||
# |_| |____/|___|___|___|_ | |_| |___|___|_|___|__,|_| |__| |__,|_|_|___|_|
|
||||
# |___|
|
||||
|
||||
@@ -4,31 +4,25 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="{% block Date4Meta %}{% now "Y-m-d" %}{% endblock %}" />
|
||||
<meta http-equiv="Last-Modified" content="{% block Last4Meta %}{% now "Y-m-d" %}{% endblock %}" />
|
||||
<meta http-equiv="Expires" content="{% block Expires4Meta %}{% now "Y-m-d" %}{% endblock %}" />
|
||||
<meta http-equiv="Date" content="{% block Date4Meta %}{% now "c" %}{% endblock %}" />
|
||||
<meta http-equiv="Last-Modified" content="{% block Last4Meta %}{% now "c" %}{% endblock %}" />
|
||||
<meta http-equiv="Expires" content="{% block Expires4Meta %}{% now "c" %}{% endblock %}" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="{% block Description %}{{ META_DESCRIPTION|default:"" }}Здесь вы можете узнать цены и скидки на пластиковые окна. Просто введите адрес, укажите планировку квартиры и узнайте размеры проёмов, актуальные предложения и стоимость установки окон. Сравнивайте характеристики стеклопакетов, оконных профилей, схем открывания, расценки, условия установки, обслуживания и гарантии.{% endblock %}" />
|
||||
<meta name="keywords" content="{% block Keywords %}цены на пластиковые окна, скидки на пластиковые окна, окна в квартиру, размеры окон в доме серии, скидки на пластиковые окна, характеристики пластиковых окон{{ META_KEYWORDS|default:"" }}{% endblock %}" />
|
||||
<meta name="author" content="{% block Author4Meta %}{% endblock %} OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="{% block CopyrightAuthor4Meta %}{% endblock %} OKNARDIA.RU" />
|
||||
<meta name="author" content="{% block Author4Meta %}{% endblock %}OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="{% block CopyrightAuthor4Meta %}{% endblock %}OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="{{ META_DOCUMENT_STATE|default:"Dynamic" }}" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>{% block Title %}{% endblock %} : ОКНАРДИЯ</title>
|
||||
<link rel="icon" type="image/png" href="{{ request.scheme }}://{{ request.get_host }}/favicon.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="{{ request.scheme }}://{{ request.get_host }}/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="{{ request.scheme }}://{{ request.get_host }}/apple-touch-icon.png" />
|
||||
<meta name="apple-mobile-web-app-title" content="oknardia.ru" />
|
||||
<link rel="manifest" href="{{ request.scheme }}://{{ request.get_host }}/site.webmanifest" />
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet" type="text/css" />{# <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />#}
|
||||
<link href="{% static 'css/bootstrap-theme.min.css' %}" rel="stylesheet" type="text/css" />{# <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />#}
|
||||
<link href="{% static 'css/oknardia1.css' %}" rel="stylesheet" type="text/css" />{% block Top_CSS1 %}{% endblock %}{% block Top_CSS2 %}{% endblock %}{% block Top_CSS3 %}{% endblock %}
|
||||
<script src="{% static 'js/jquery-2.1.1.min.js' %}" type="text/javascript"></script>{# <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>#}
|
||||
<script src="{% static 'js/bootstrap.min.js' %}" type="text/javascript"></script>{# <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" type="text/javascript"></script>#}{% block Top_JS1 %}{% endblock %}{% block Top_JS2 %}{% endblock %}{% block Top_JS3 %}{% endblock %}{% block Top_JS4 %}{% endblock %}{% block Top_JS5 %}{% endblock %}{% block Top_Meta1 %}{% endblock %}
|
||||
{# Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru #}<script src="{% static 'js/analytics.js' %}" type="text/javascript"></script>
|
||||
{# Модуль авторизации: управление dropdown меню логина/логаута #}<script src="{% static 'js/auth.js' %}" type="text/javascript"></script>{% block ADD_TO_HEAD %}{% endblock %}
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body{% block Add_Body_Attribute %}{% endblock %}>
|
||||
@@ -54,13 +48,13 @@
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/myi-zhdyom-vashi-prajs-listyi">Сотрудничество</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><a href="#" onclick="return openLoginLogout(event);" rel="nofollow"><span class="glyphicon glyphicon-user"></span> {% if LOGGED_USER != "" %}{{ user.username|truncatechars:12 }}{% else %}Вход{% endif %}</a><small>{# Авторизации. #}<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>{% endblock %}
|
||||
@@ -71,10 +65,25 @@
|
||||
{% block Bottom_Nav_Bar %}
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<small>© oknardia.ru, 2015-{% now "Y" %}. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: {{ ticks }}{{ TAU }} сек---> {{ ticks }}{{ TAU }} сек </small>
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
{# <!-- Google Analylics --> #}(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
{# <!-- Rating@Mail.ru counter --> #}var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
{# <!-- Rating@Mail.ru nosript --> #}<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
{# <!-- Yandex.Metrika counter --> #}<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />{# <!-- /Yandex.Metrika counter --> #}
|
||||
</div></noscript>
|
||||
{#<!-- Rating@Mail.ru logo -->#}<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>{#<!-- //Rating@Mail.ru logo -->#}
|
||||
{# <!-- Yandex.Metrika informer --> #}<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>{# <!-- /Yandex.Metrika informer --> #}
|
||||
{# <!-- begin of Top100 code --> #}<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>{# <!-- end of Top100 code --> #}
|
||||
<script type="text/javascript"><!--
|
||||
{#<!--LiveInternet counter-->#}document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
{# <!-- Yandex.Metrika counter --> #}(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>{# <!--/LiveInternet--> #}
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-{% now "Y" %}. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: {{ ticks }}{{ TAU }} сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
</div>{% endblock %}
|
||||
{# ######################################## Нижнее меню-футер КОНЕЦ ######################################## #}
|
||||
|
||||
{# Модальное окно SOCIAL LOGIN НАЧАЛО #}
|
||||
|
||||
@@ -1,121 +1,20 @@
|
||||
{% extends "base.html" %}{% load static %}
|
||||
|
||||
{% block Title %}Блог Окнардии для компаний-поставщиков окон и их клиентов — Страница {{ PAGE_BACK|add:"1" }}{% endblock %}
|
||||
{% block Title %}Блоги: Стр.{{ PAGE_BACK|add:"1" }}{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Блог Окнардии для компаний-поставщиков окон и их клиентов: публикации о пластиковых окнах, продвижении услуг замены окон, ценах и трендах — Страница {{ PAGE_BACK|add:"1" }}{% endblock %}
|
||||
{% block Description %}Блоги «Окнардия» :: {% for i1 in DIM_BLOGPOST %}{{ i1.HEADER_D }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endblock %}
|
||||
|
||||
{% block Keywords %}{{ META_KEYWORDS }}{% endblock %}
|
||||
{% block Keywords %}oknardia, окнардия, blogs, блоги, публикации, цены пластиковых окон, стоимость пластиковых окон, скидки на пластиковые окна, предложения пластиковых окон, {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if META_DATA_PUB %}{{ META_DATA_PUB|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{% if META_DATA_MODIFY %}{{ META_DATA_MODIFY|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}Окнардия{% endblock %}
|
||||
{% block Author4Meta %}: Блоги{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Окнардия{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- Canonical (текущая страница) и pagination разметка --> #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}" />
|
||||
{% if PAGE_BACK > 0 %}<link rel="prev" href="{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK|add:'-1' }}" />{% endif %}
|
||||
{% if FORW_BUTTON %}<link rel="next" href="{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK|add:'1' }}" />{% endif %}
|
||||
{# <!-- Meta-теги для улучшения индексирования в социальных сетях (B2B) --> #}
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Блог Окнардии для компаний-поставщиков окон и их клиентов" />
|
||||
<meta property="og:description" content="Публикации о пластиковых окнах, продвижении услуг замены окон, ценах и трендах — Страница {{ PAGE_BACK|add:"1" }}" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
{% if META_IMAGE %}<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{{ META_IMAGE }}" />{% else %}<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg" />{% endif %}
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Блог Окнардии — для компаний и их клиентов" />
|
||||
<meta name="twitter:description" content="Статьи о продвижении услуг замены окон, ценах и трендах в оконной индустрии — Страница {{ PAGE_BACK|add:"1" }}" />
|
||||
{% if META_IMAGE %}<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}{{ META_IMAGE }}" />{% else %}<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg" />{% endif %}
|
||||
{# <!-- /Meta-теги --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{# <!-- Schema.org JSON-LD разметка для списка блога (B2B для компаний и их клиентов) --> #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Блог Окнардии — для компаний-поставщиков окон и их клиентов",
|
||||
"description": "Блог Окнардии для компаний-поставщиков окон и их клиентов: публикации о пластиковых окнах, продвижении услуг замены окон, ценах и трендах. Ресурс для расширения продаж и улучшения видимости в выдаче поисковиков.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}",
|
||||
"image": "{% if META_IMAGE %}{{ request.scheme }}://{{ request.get_host }}{{ META_IMAGE }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg{% endif %}",
|
||||
"audience": [
|
||||
{
|
||||
"@type": "AudienceType",
|
||||
"name": "B2B: Компании-поставщики и производители оконных конструкций"
|
||||
},
|
||||
{
|
||||
"@type": "AudienceType",
|
||||
"name": "B2C: Клиенты компаний, ищущие информацию о заменке окон"
|
||||
}
|
||||
],
|
||||
"breadcrumb": {
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Блог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Страница {{ PAGE_BACK|add:'1' }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "Blog",
|
||||
"name": "Блог Окнардии",
|
||||
"alternateName": "Блог для компаний-поставщиков окон и их клиентов",
|
||||
"description": "Профессиональный блог для компаний, занимающихся производством, поставкой и установкой пластиковых окон, а также их клиентов. Публикации об оконных конструкциях, продвижении услуг замены окон, ценах, трендах и инновациях в оконной индустрии.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/blog/",
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg",
|
||||
"audience": [
|
||||
{
|
||||
"@type": "AudienceType",
|
||||
"name": "Компании-поставщики, производители, установщики окон"
|
||||
},
|
||||
{
|
||||
"@type": "AudienceType",
|
||||
"name": "Конечные клиенты, ищущие информацию об окнах и услугах"
|
||||
}
|
||||
],
|
||||
"blogPosts": [
|
||||
{% for POST in DIM_BLOGPOST %}
|
||||
{
|
||||
"@type": "BlogPosting",
|
||||
"headline": "{{ POST.HEADER|escapejs }}",
|
||||
"description": "{% if POST.META_DESC %}{{ POST.META_DESC|escapejs }}{% else %}Публикация в блоге Окнардии{% endif %}",
|
||||
"image": "{% if POST.IMG_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ POST.IMG_BLOG|escapejs }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg{% endif %}",
|
||||
"datePublished": "{{ POST.PUB_DAT|date:'Y-m-d' }}T{{ POST.PUB_DAT|date:'H:i:s' }}Z",
|
||||
"dateModified": "{{ POST.MOD_DAT|date:'Y-m-d' }}T{{ POST.MOD_DAT|date:'H:i:s' }}Z",
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"name": "{{ POST.NAME1 }}{% if POST.NAME2 %} {{ POST.NAME2 }}{% endif %}"
|
||||
},
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ POST.POST_ID }}/{{ POST.HEADER_T }}",
|
||||
"keywords": "{% if POST.META_KW %}{{ POST.META_KW|escapejs }}{% else %}блог, публикация, окна, поставщики{% endif %}"
|
||||
}{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{# <!-- /Schema.org JSON-LD --> #}{% endblock %}
|
||||
{% block CopyrightAuthor4Meta %}: Блоги{% endblock %}
|
||||
|
||||
{% block Top_JS3%}
|
||||
<script>
|
||||
@@ -125,35 +24,29 @@ $(window).load(function(){var images = $('.half');images.each(function(i){$(this
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
{# Хлебные крошки #}
|
||||
<div class="row">
|
||||
{# <!--- Хлебные крошки --> #}<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/blog/">Блог</a></li>
|
||||
<li>Страница {{ PAGE_BACK|add:"1" }}</li>
|
||||
<li>Стр.{{ PAGE_BACK|add:"1" }}</li>
|
||||
</ol>
|
||||
<h1>Блог</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Список постов #}
|
||||
</div>{# <!--- /Хлебные крошки ---> #}
|
||||
{% for POST in DIM_BLOGPOST %}<div class="row">
|
||||
<div class="col-md-11 col-xs-12 blog-list-header">
|
||||
<hr class="dotted-black" />
|
||||
<p><time datetime="{{ POST.PUB_DAT|date:'Y-m-d\TH:i:s\Z' }}">{{ POST.PUB_DAT|date:"d.F.Y (l) H:i" }}</time></p>
|
||||
<p><img src="/media/{{ POST.USER_AVATAR }}" alt="{{ POST.NAME1 }}{% if POST.NAME2 %} {{ POST.NAME2 }}{% endif %}" />
|
||||
{% if POST.NAME1 != "" or POST.NAME2 != "" %}<i>{{ POST.NAME1 }}{% if POST.NAME2 != "" %} {{ POST.NAME2 }}{% endif %}</i>{% endif %}
|
||||
</p>
|
||||
<p>{{ POST.PUB_DAT|date:"d.F.Y (l) H:i" }}</p>
|
||||
<p><img src="/media/{{ POST.USER_AVATAR }}" /> {% if POST.NAME1 != "" or POST.NAME2 != "" %} <i>{{ POST.NAME1 }}{% if POST.NAME2 != "" %} {{ POST.NAME2 }}{% endif %}</i>{% endif %}</p>
|
||||
<h2>{{ POST.HEADER|safe }}</h2>
|
||||
</div>
|
||||
<div class="col-md-11 blog-list-tizer">
|
||||
{# Тизер поста в блоге #}{{ POST.CONTENT_CUT|safe|truncatechars:4096 }}{# /Тизер поста в блоге #}
|
||||
{# <!--- Тизер поста в блоге ---> #}{{ POST.CONTENT_CUT|safe|truncatechars:4096 }}{# <!--- /Тизер поста в блоге ---> #}
|
||||
{% if POST.CUT_TEXT != "NONE" %}<p><a href="/blogpost/{{ POST.POST_ID }}/{{ POST.HEADER_T }}?page-back={{ PAGE_BACK }}" class="btn btn-default">{{ POST.CUT_TEXT|safe }}</a></p>{% endif %}
|
||||
</div>
|
||||
</div>{% endfor %}
|
||||
|
||||
{# Листалка пагинации #}<nav class="row">
|
||||
{# <!--- Листалка ---> #}<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<hr class="dotted-black" />
|
||||
<nav aria-label="переходы на страницы">
|
||||
@@ -173,10 +66,13 @@ $(window).load(function(){var images = $('.half');images.each(function(i){$(this
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
{# Баннер #}
|
||||
<div class="row"><div class="col-md-12 col-xs-12">{% include "ad/bannet-wide.html" %}</div></div>
|
||||
</div>{# <!--- /Листалка: ---> #}
|
||||
{# <!--- Баннер ---> #}<div class="row"><div class="col-md-12 col-xs-12">{% include "ad/bannet-wide.html" %}</div></div>{# <!--- Баннер: конец --- #}
|
||||
</div>{% endblock %}
|
||||
|
||||
{% comment %}
|
||||
{% block Top_Nav_Bar %}
|
||||
{# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #}
|
||||
{% endblock %}
|
||||
{% endcomment %}
|
||||
|
||||
|
||||
@@ -1,103 +1,57 @@
|
||||
{% extends "base.html" %}{% load static %}
|
||||
|
||||
{% block Title %}{{ HEADER|striptags }}{% endblock %}
|
||||
{% block Title %}Блог :: {{ HEADER|striptags }}{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}{% if META_DESC %}{{ META_DESC }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}{% endblock %}
|
||||
{% block Description %}{{ TIZER|striptags|truncatewords:25 }}{% endblock %}
|
||||
|
||||
{% block Keywords %}{% if META_KW %}{{ META_KW }}{% else %}oknardia, окнардия, блог, публикация, {{ HEADER|striptags }}{% endif %}{% endblock %}
|
||||
{% block Keywords %}oknardia, окнардия, blog, блог, публикация, {{ HEADER|striptags }}{% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}{{ NAME1 }}{% if NAME2 %} {{ NAME2 }}{% endif %} ({{ USERNAME }}) в Блоге Окнардия{% endblock %}
|
||||
{% block Author4Meta %}: {{ USERNAME }}{% if NAME1 != "" or NAME2 != "" %} ({{ NAME1 }}{% if NAME2 != "" %} {{ NAME2 }}{% endif %}){% endif %}{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Окнардия — Блог{% endblock %}
|
||||
{% block CopyrightAuthor4Meta %}: Блоги{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- Canonical разметка --> #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />{% if not BACK_DISABLE %}
|
||||
<link rel="prev" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ BACK_ID }}/{{ BACK_HEADER_T }}?page-back={{ PAGE_BACK|add:'-1' }}" />{% endif %}{% if not FORW_DISABLE %}
|
||||
<link rel="next" href="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ FORW_ID }}/{{ FORW_HEADER_T }}?page-back={{ PAGE_BACK }}" />{% endif %}
|
||||
{# <!-- Meta-теги для социальных сетей (B2B/B2C для компаний и клиентов) --> #}
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="{{ HEADER|striptags }}" />
|
||||
<meta property="og:description" content="{% if META_DESC %}{{ META_DESC|escapejs|truncatewords:30 }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}" />
|
||||
{% block Top_Meta1 %}
|
||||
{# <!-- Дополнительные Metatags --> #}{% if NAME1 != '' or NAME2 != '' %}
|
||||
<meta itemprop="author" content="{{ NAME1 }} {{ NAME2 }}" />{% endif %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ USER_AVATAR }}" />
|
||||
<meta itemprop="datePublished" content="{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="ОКНАРДИЯ: сборник цен на пластиковые окна" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="{% if NAME1 != '' or NAME2 != '' %}{{ NAME1 }}{% if NAME2 != '' %} {{ NAME2 }}{% endif %}{% endif %}" /></span>
|
||||
<meta itemprop="articleSection" content="ОКНАРДИЯ: Блог «{{ USERNAME }}»" />
|
||||
<meta itemprop="headline" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||
<link rel="canonical" href="https://oknardia.ru/blogpost/{{ ID }}/{{ HEADER_T }}" />
|
||||
<link rel="standout" href="https://oknardia.ru/blogpost/{{ ID }}/{{ HEADER_T }}" />
|
||||
{# <!-- Разметка для соц-сетей Facebook Open Graph --> #}<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
{# <!-- Разметка OG-теги для соц-сетей и мессенджеров --> #}<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="og:url" content="https://oknardia.ru/blogpost/{{ ID }}/{{ HEADER_T }}" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="{{ HEADER|striptags }} | oknardia.ru" />
|
||||
<meta property="og:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="{{ HEADER|striptags }} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="{{ HEADER|striptags }}" />
|
||||
<meta name="twitter:description" content="{% if META_DESC %}{{ META_DESC|escapejs|truncatewords:30 }}{% else %}{{ TIZER|striptags|truncatewords:25 }}{% endif %}" />
|
||||
<meta name="twitter:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
{# <!-- /Meta-теги --> #}{% endblock %}
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}">{% endblock %}
|
||||
|
||||
{% block Top_JS3%}
|
||||
<script type="text/javascript">$(window).load(function(){var images = $('.half');images.each(function(i){$(this).width($(this).width()/2);});});</script>{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{# <!-- Schema.org JSON-LD разметка для отдельного блог-поста --> #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BlogPosting",
|
||||
"headline": "{{ HEADER|escapejs }}",
|
||||
"description": "{% if META_DESC %}{{ META_DESC|escapejs }}{% else %}{{ TIZER|striptags|escapejs|truncatewords:25 }}{% endif %}",
|
||||
"image": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG|escapejs }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}",
|
||||
"datePublished": "{{ PUB_DAT|date:'Y-m-d' }}T{{ PUB_DAT|date:'H:i:s' }}Z",
|
||||
"dateModified": "{% if PUB_MODIFY %}{{ PUB_MODIFY|date:'Y-m-d' }}T{{ PUB_MODIFY|date:'H:i:s' }}Z{% else %}{{ PUB_DAT|date:'Y-m-d' }}T{{ PUB_DAT|date:'H:i:s' }}Z{% endif %}",
|
||||
"mainEntityOfPage": {
|
||||
"@type": "WebPage",
|
||||
"@id": "{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}"
|
||||
},
|
||||
"breadcrumb": {
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Блог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Страница {{ PAGE_BACK|add:'1' }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/blog/P{{ PAGE_BACK }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "{{ HEADER|escapejs }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/blogpost/{{ ID }}/{{ HEADER_T }}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"name": "{{ NAME1 }}{% if NAME2 %} {{ NAME2 }}{% endif %}"
|
||||
},
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "ОКНАРДИЯ",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg"
|
||||
}
|
||||
},
|
||||
"keywords": "{% if META_KW %}{{ META_KW|escapejs }}{% else %}блог, публикация, окна, поставщики{% endif %}"
|
||||
}
|
||||
</script>
|
||||
{# <!-- /Schema.org JSON-LD --> #}{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<dIv class="container-fluid" itemscope itemtype="http://schema.org/Article">
|
||||
<div class="row">{% if not IS_ARCHIVE %}
|
||||
@@ -124,7 +78,7 @@
|
||||
</DIv>
|
||||
</DiV>
|
||||
{# Листалка: НАЧАЛО #}<div class="row">
|
||||
<nav class="col-md-11 col-xs-12">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<hr class="dotted-black" />
|
||||
{% if not IS_ARCHIVE %}<nav aria-label="перелистывание записей блога">
|
||||
<ul class="pager">
|
||||
@@ -136,7 +90,7 @@
|
||||
{% else %}<li class="next"><a href="/blogpost/{{ FORW_ID }}/{{ FORW_HEADER_T }}?page-back={{ PAGE_BACK }}">Следующая запись <span aria-hidden="true">→</span></a></li>{% endif %}
|
||||
</ul>
|
||||
</nav>{% endif %}
|
||||
</nav>
|
||||
</div>
|
||||
</div>{# Листалка: КОНЕЦ #}
|
||||
{# --- Баннер: НАЧАЛО --- #}
|
||||
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
|
||||
@@ -149,3 +103,4 @@
|
||||
{# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #}
|
||||
{% endblock %}
|
||||
{% endcomment %}
|
||||
|
||||
|
||||
@@ -1,81 +1,58 @@
|
||||
{% extends "base.html" %}
|
||||
{% load static %}{% load filters %}
|
||||
|
||||
{% block Title %}Каталог оконных компаний: производители и поставщики окон, рейтинг и цены{% endblock %}
|
||||
{% block Title %}Каталог изготовителей и поставщиков окон{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Актуальный каталог оконных компаний России. Сравните производителей и поставщиков пластиковых окон по рейтингу, ассортименту, средней цене и дате последнего обновления.{% endblock %}
|
||||
{% block Description %}Каталог изготовителей окон, партнёры «Окнардия», рейтинг, {% for i in COMPANIES %}{{ i.sMerchantName }}, {% endfor %} средняя цена окна{% endblock %}
|
||||
|
||||
{% block Keywords %}оконные компании, каталог компаний, производители окон, поставщики окон, рейтинг оконных компаний, сравнить цены на окна, oknardia, окнардия{% endblock %}
|
||||
{% block Keywords %}Оконные компании, {% for i in COMPANIES %}{{ i.sMerchantName }}, {% endfor %} изготовители окон, производители окон, постащики окон, партнёры, каталог компаний, каталог оконных компаний, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог изготовителей окон{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог изготовителей окон{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/company/" />
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог производителей окон" />
|
||||
<meta itemprop="headline" content="Компании-партнёры «Окнардии», их рейтинг, число оконных наборов и вариантов расчёта цен для типовых проёмов, средняя цена окна..." />
|
||||
<meta name="news_keywords" content="{{ HEADER }}" />
|
||||
<link rel="canonical" href="https://oknardia.ru/catalog/company/" />
|
||||
<link rel="standout" href="https://oknardia.ru/catalog/company/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/company/" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/company/" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Каталог оконных компаний: производители и поставщики окон, рейтинг и цены | oknardia.ru" />
|
||||
<meta property="og:description" content="Актуальный каталог оконных компаний России. Сравните производителей и поставщиков пластиковых окон по рейтингу, ассортименту, средней цене и дате последнего обновления." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta property="og:title" content="Каталог производителей окон | oknardia.ru" />
|
||||
<meta property="og:description" content="Компании-партнеры «Окнардии», их средний рейтинг, число оконных наборов и вариантов расчета цен для типовых проёмов, средняя цена окна..." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Каталог оконных компаний: производители и поставщики окон, рейтинг и цены | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Актуальный каталог оконных компаний России. Сравните производителей и поставщиков пластиковых окон по рейтингу, ассортименту, средней цене и дате последнего обновления." />
|
||||
<meta name="twitter:title" content="Каталог производителей окон | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Компании-партнеры «Окнардии», их средний рейтинг, число оконных наборов и вариантов расчета цен для типовых проёмов, средняя цена окна..." />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
{# Удалить: <meta name="twitter:domain"> — устаревший тег #}
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="relap-image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg">
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}">
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD для страницы-списка компаний: CollectionPage + ItemList с элементами Organization.
|
||||
Это понятнее для поисковиков, чем legacy microdata на метатегах.
|
||||
{% endcomment %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Каталог оконных компаний: производители и поставщики окон",
|
||||
"description": "Актуальный каталог оконных компаний России с рейтингами, средней ценой и составом наборов.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/",
|
||||
"inLanguage": "ru-RU",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "ItemList",
|
||||
"name": "Производители и поставщики окон",
|
||||
"numberOfItems": {{ COMPANIES|length }},
|
||||
"itemListElement": [
|
||||
{% for i in COMPANIES %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Organization",
|
||||
"name": "{{ i.sMerchantName|escapejs }}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ i.id }}-{{ i.sMerchantMainURL }}",
|
||||
"logo": "{{ request.scheme }}://{{ request.get_host }}/media/{{ i.pMerchantLogo }}"
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
{# <!--- Хлебные крошки: НАЧАЛО --> #}<div class="row">
|
||||
@@ -113,3 +90,7 @@ JSON-LD для страницы-списка компаний: CollectionPage +
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>{% endblock %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,20 +5,30 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Производитель окон «{{ COMPANY }}» в каталоге Окнардии: оконные наборы, их состав и характеристики, независимый рейтинг качества, средние цены на замену оконных конструкций в типовых домах.{% endblock %}
|
||||
{% block Description %}«{{ COMPANY }}», описание компании «{{ COMPANY }}», оконные наборы от «{{ COMPANY }}» и их состав, характеристики «{{ COMPANY }}», рейтинг «{{ COMPANY }}», средние цены и отклонение цен «{{ COMPANY }}».{% endblock %}
|
||||
|
||||
{% block Keywords %}{{ COMPANY }}, компания {{ COMPANY }}, окна {{ COMPANY }}, изготовитель окон {{ COMPANY }}, производитель окон {{ COMPANY }}, поставщик окон {{ COMPANY }}, партнёр, каталог компаний, каталог оконных компаний, oknardia, окнардия{% endblock %}
|
||||
{% block Keywords %}{{ COMPANY }}, компания {{ COMPANY }}, окна {{ COMPANY }}, изготовитель окон {{ COMPANY }}, производитель окон {{ COMPANY }}, поставщик окон {{ COMPANY }}, партнёр, каталог компаний, каталог оконных компаний, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}Каталог изготовителей окон{% endblock %}
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Каталог изготовителей окон{% endblock %}
|
||||
{% block Author4Meta %}: Каталог изготовителей окон{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог изготовителей окон{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
{# Microdata (itemprop) убрана — заменена на JSON-LD в блоке ADD_TO_HEAD ниже (чище, надёжнее) #}
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог производителей окон" />
|
||||
<meta itemprop="headline" content="Изготовитель окон «{{ COMPANY }}», описание, производимые им оконные наборы и их состав, характеристики, рейтинг, средние цены и отклонение цен." />
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}" />
|
||||
{# Удалить: <link rel="standout"> — тег Google News 2011 г., отменён в 2014, поисковики игнорируют #}
|
||||
<link rel="canonical" href="https://oknardia.ru/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}" />
|
||||
<link rel="standout" href="https://oknardia.ru/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
@@ -26,60 +36,24 @@
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Окна «{{ COMPANY }}» | oknardia.ru" />
|
||||
<meta property="og:description" content="«{{ COMPANY }}» — оконные наборы, состав и характеристики, независимый рейтинг качества, средние цены на установку. Агрегатор Окнардия." />
|
||||
{# Нельзя вкладывать {{ }} внутрь аргумента фильтра |default — используем {% if %}{% else %} #}
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta property="og:description" content="Окна «{{ COMPANY }}», описание окон «{{ COMPANY }}», производимые им оконные наборы и их состав, характеристики, рейтинг, средние цены и отклонение цен." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Производитель окон «{{ COMPANY }}» | oknardia.ru" />
|
||||
<meta name="twitter:description" content="«{{ COMPANY }}» в каталоге Окнардии: наборы, характеристики, рейтинг и цены на установку окон в типовых домах." />
|
||||
<meta name="twitter:title" content="Производителей окон «{{ COMPANY }}» | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Изготовитель окон «{{ COMPANY }}», описание, производимые им оконные наборы и их состав, характеристики, рейтинг, средние цены и отклонение цен." />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
{# Удалить: <meta name="twitter:domain"> — устарело с 2015, Twitter его не использует #}
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}">
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}">
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
|
||||
{% block Top_JS5 %}
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD разметка Schema.org для страницы производителя окон.
|
||||
Тип LocalBusiness описывает компанию-поставщика окон: название, контакты, адрес, геокоординаты,
|
||||
логотип и ссылку на официальный сайт производителя.
|
||||
Данные берутся из первого набора в SETS (все наборы принадлежат одному офису/бренду),
|
||||
поэтому достаточно SETS.0 для контактной информации.
|
||||
Документация: https://schema.org/LocalBusiness #}{% endcomment %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "LocalBusiness",
|
||||
"name": "{{ COMPANY|escapejs }}",
|
||||
"description": "Производитель окон «{{ COMPANY|escapejs }}»: оконные наборы, характеристики профилей и стеклопакетов, цены на установку в типовых домах.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ COMPANY_ID }}-{{ COMPANY_T }}",
|
||||
"image": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}"
|
||||
}{% if SETS %},
|
||||
"telephone": "{{ SETS.0.sOfficePhones|striptags|escapejs }}",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "{{ SETS.0.sOfficeAddress|escapejs }}",
|
||||
"addressCountry": "RU"
|
||||
},
|
||||
"geo": {
|
||||
"@type": "GeoCoordinates",
|
||||
"latitude": {{ SETS.0.fOfficeGeoCode_Latitude|stringformat:".7f" }},
|
||||
"longitude": {{ SETS.0.fOfficeGeoCode_Longitude|stringformat:".7f" }}
|
||||
},
|
||||
"sameAs": "{{ SETS.0.sMerchantMainURL.URL|escapejs }}"{% endif %}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% block Top_JS5 %}<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>{% endblock %}
|
||||
|
||||
|
||||
{% block Main_Content %}
|
||||
@@ -138,14 +112,7 @@
|
||||
{# ПРАВАЯ КОЛОНКА: НАЧАЛО #}<div class="col-md-6 col-xs-12">
|
||||
<table class="head3">
|
||||
<tr>
|
||||
<td>
|
||||
<h3>
|
||||
Оконный набор: «{{ i.sSetName|safe }}»
|
||||
<small style="font-size:xx-small;font-weight:normal;">
|
||||
<a href="/catalog/sets/#kit-card-{{ i.idSetKit }}" title="Открыть карточку этого набора в каталоге оконных наборов">в каталоге наборов</a>
|
||||
</small>
|
||||
</h3>
|
||||
</td>
|
||||
<td><h3>Оконный набор: «{{ i.sSetName|safe }}»</h3></td>
|
||||
<td align="right"><nobr class="badge badge4price" title="Рейтинг «Окнардии» для оконного набора «{{ i.sSetName }}»{% if i.fSetRating.RATING > -0.01 %} — {{ i.fSetRating.RATING|stringformat:".2f" }} баллов{% endif %}">{% for Star in i.fSetRating.STARS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if i.fSetRating.RATING > -0.01 %} {{ i.fSetRating.RATING|stringformat:".2f" }}{% endif %}</nobr></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -5,70 +5,18 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Подберите оконный профиль под свои требования: в каталоге «Окнардии» собраны производители, марки и ключевые характеристики.{% endblock %}
|
||||
{% block Description %}Каталог оконных профилей{% endblock %}
|
||||
|
||||
{% block Keywords %}оконные профили, каталог профилей, сравнение профилей, производители оконных профилей, характеристики оконных профилей, oknardia {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
{% block Keywords %}каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{{ CATALOG_LAST_UPDATE|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{{ CATALOG_LAST_UPDATE|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
<meta name="news_keywords" content="каталог оконных профилей, производители профилей, марки профилей" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Каталог оконных профилей | oknardia.ru" />
|
||||
<meta property="og:description" content="Производители и модели оконных профилей с характеристиками и рейтингом в каталоге Окнардии." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="twitter:title" content="Каталог оконных профилей | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Производители и модели оконных профилей с характеристиками и рейтингом в каталоге Окнардии." />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Дополнительные Metатags --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Каталог оконных профилей",
|
||||
"description": "Список производителей и моделей оконных профилей с переходом на карточки и характеристики.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Оконные профили",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
{# <!--- Хлебные крошки: НАЧАЛО --> #}<div class="row">
|
||||
@@ -79,7 +27,7 @@
|
||||
<li>Оконные профили</li>
|
||||
</ol>
|
||||
<h1>Каталог оконных профилей</h1>
|
||||
<p>Узнать о производителях, познакомиться с детальными характеристики и описаниями оконных профилей можно кликнув по ссылкам. Сейчас в каталоге «Окнардии» представлено {{ CATALOG_MANUFACT_NUM_W }} профилей ({{ CATALOG_PROFILE_NUM }} в базе).</p>
|
||||
<p>Узнать о производителях, познакомиться с детальными характеристики и описаниями оконных профилей можно кликнув по ссылкам. Сейчас в каталоге «Окнардии» представлено {{ CATALOG_MANUFACT_NUM_W }} профилей ({{ CATALOG_PROFILE_NUM }} в базе). Последнее обновление {{ CATALOG_LAST_UPDATE_W }}.</p>
|
||||
</div>
|
||||
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||
<div class="row">
|
||||
@@ -113,3 +61,4 @@
|
||||
{# ОТЛАДКА, ГАСИМ ВЕРХНЕЕ МЕНЮ #}
|
||||
{% endblock %}
|
||||
{% endcomment %}
|
||||
|
||||
|
||||
@@ -9,35 +9,48 @@
|
||||
|
||||
{% block Keywords %}{{ CATALOG_MANUFACT }}, оконные профили {{ CATALOG_MANUFACT }}, производитель {{ CATALOG_MANUFACT }}, {% for i in PROFILES %}{{ i.PROFILE_NAME }}, {% endfor %}каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metатеги --> #}
|
||||
{# Удалить: itemprop microdata и rel=standout в head (устаревшее), используем JSON-LD ниже #}
|
||||
{# Удалить: twitter:domain (устаревшее поле) #}
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags|default:CATALOG_MANUFACT }}" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}/" />
|
||||
{% block Top_Meta1 %}
|
||||
<!-- Дополнительные Metatags -->
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{{ PUB_DAT|date:"c" }}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»: оконные профили" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог «Окнардия»: оконные профили {{ CATALOG_MANUFACT }}" />
|
||||
<meta itemprop="headline" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||
<link rel="canonical" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
|
||||
<link rel="standout" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}/" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/profile/{{ CATALOG_URL }}" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="{{ HEADER|striptags|default:CATALOG_MANUFACT }} | oknardia.ru" />
|
||||
<meta property="og:description" content="{{ TIZER|striptags|truncatewords_html:25|default:'Оконные профили производителя в каталоге Окнардии.' }}" />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta name="twitter:title" content="{{ HEADER|striptags|default:CATALOG_MANUFACT }} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="{{ TIZER|striptags|truncatewords_html:25|default:'Оконные профили производителя в каталоге Окнардии.' }}" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="og:title" content="{{ HEADER|striptags }} | oknardia.ru" />
|
||||
<meta property="og:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="{{ HEADER|striptags }} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="{{ TIZER|striptags|truncatewords_html:25 }}" />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}/" />
|
||||
<meta name="twitter:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}">
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}">{% endblock %}
|
||||
|
||||
{% block Top_JS4 %}
|
||||
<script type="text/javascript" src="//www.gstatic.com/charts/loader.js"></script>
|
||||
@@ -66,73 +79,6 @@
|
||||
}
|
||||
</script>{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Оконные профили производства {{ CATALOG_MANUFACT|escapejs }}",
|
||||
"description": "Страница производителя {{ CATALOG_MANUFACT|escapejs }}: список профилей, рейтинг и описание производителя в каталоге Окнардии.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}/",
|
||||
"about": {
|
||||
"@type": "Organization",
|
||||
"name": "{{ CATALOG_MANUFACT|escapejs }}"
|
||||
},
|
||||
"subjectOf": {
|
||||
"@type": "CreativeWork",
|
||||
"name": "Рейтинг Окнардии и как он устроен",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/blogpost/13/rejting-oknardii-i-kak-on-ustroen-2"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Оконные профили",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "{{ CATALOG_MANUFACT|escapejs }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "ItemList",
|
||||
"name": "Профили {{ CATALOG_MANUFACT|escapejs }}",
|
||||
"itemListElement": [{% for i in PROFILES %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ i.PROFILE_ID }}-{{ CATALOG_MAN2URL }}/{{ i.PROFILE_ID }}-{{ i.PROFILE_URL }}/",
|
||||
"name": "{{ i.PROFILE_NAME|escapejs }}"
|
||||
}{% if not forloop.last %},{% endif %}{% endfor %}
|
||||
]
|
||||
}
|
||||
</script>{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
{# <!--- Хлебные крошки: НАЧАЛО --> #}<div class="row">
|
||||
@@ -159,9 +105,7 @@
|
||||
</tr>{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="small-note">Сравнить компонеты рейтинга профилей можно в разделе <a href="/stat/rating/profiles_rank/">Ретинги</a>.<br />
|
||||
Методика расчёта: <a href="/blogpost/13/rejting-oknardii-i-kak-on-ustroen-2" target="_blank"
|
||||
rel="nofollow">«Рейтинг Окнардии и как он устроен»</a>.</p>{% if not OFFERS_BY_MAUFACTURE == 0 %}
|
||||
<p class="small-note">Сравнить компонеты рейтинга профилей можно в разделе <a href="/stat/rating/profiles_rank/">Ретинги</a>.</p>{% if not OFFERS_BY_MAUFACTURE == 0 %}
|
||||
<h4>Доля предложений окон на основе профилей {{ CATALOG_MANUFACT }} в базе «Окнардия»</h4>
|
||||
<div id="donutchart"></div>
|
||||
<h5>Партнёры «Окнардия» использующие профили производства {{ CATALOG_MANUFACT }} в своих предложениях:</h5>
|
||||
|
||||
@@ -5,17 +5,31 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Оконный профиль {{ CATALOG_MODEL.sProfileName }} от {{ CATALOG_MODEL.sProfileManufacturer }}: характеристики, рейтинг, комплектация и применение в оконных предложениях партнёров Окнардии.{% endblock %}
|
||||
{% block Description %}Характеристики оконного профиля {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}{% endblock %}
|
||||
|
||||
{% block Keywords %}оконный профиль {{ CATALOG_MODEL.sProfileName }}, характеристики профиля {{ CATALOG_MODEL.sProfileName }}, описание профиля {{ CATALOG_MODEL.sProfileName }}, производитель оконный профилей {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
<meta name="news_keywords" content="{{ CATALOG_MODEL.sProfileName }}, {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, оконные профили" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL2 }}" />
|
||||
{% block Top_Meta1 %}
|
||||
<!-- Дополнительные Metatags -->
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{{ PUB_DAT|date:"c" }}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»: оконные профили" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог «Окнардия»: оконные профили {{ CATALOG_MODEL.sProfileName }}" />
|
||||
<meta itemprop="headline" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||
<meta name="news_keywords" content="{{ CATALOG_MODEL.sProfileName }}, характеристики {{ CATALOG_MODEL.sProfileName }}, описание {{ CATALOG_MODEL.sProfileName }}, оконные профили {{ CATALOG_MODEL.sProfileName }}, {{ CATALOG_MODEL.sProfileManufacturer }}, производитель {{ CATALOG_MODEL.sProfileManufacturer }}, каталог оконных профилей, каталог производителей оконных профилей, каталог профилей, оконные профили, oknardia, окнардия" />
|
||||
<link rel="canonical" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL2 }}/" />
|
||||
<link rel="standout" href="https://oknardia.ru//catalog/profile/{{ CATALOG_URL2 }}/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
@@ -23,100 +37,20 @@
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL2 }}" />
|
||||
<meta property="og:type" content="product" />
|
||||
<meta property="og:title" content="Оконный профиль {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||
<meta property="og:description" content="Оконный профиль {{ CATALOG_MODEL.sProfileName }} от {{ CATALOG_MODEL.sProfileManufacturer }}: характеристики, рейтинг и описание в каталоге Окнардии." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/profile/{{ CATALOG_URL2 }}" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Оконные профили {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||
<meta property="og:description" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Оконный профиль {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Характеристики, рейтинг и описание профиля {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}." />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:title" content="Оконные профили {{ CATALOG_MODEL.sProfileName }} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Описание и характеристики оконных профилей {{ CATALOG_MODEL.sProfileName }} производства {{ CATALOG_MODEL.sProfileManufacturer }}" />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL2 }}" />
|
||||
<meta name="twitter:image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}">
|
||||
{# <!-- END Дополнительные Metатags --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD для карточки оконного профиля и хлебных крошек #}<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Product",
|
||||
"name": "{{ CATALOG_MODEL.sProfileName|escapejs }}",
|
||||
"description": "Оконный профиль {{ CATALOG_MODEL.sProfileName|escapejs }} производства {{ CATALOG_MODEL.sProfileManufacturer|escapejs }}. Характеристики, рейтинг и применение в наборах партнёров Окнардии.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL2 }}",
|
||||
"image": "{% if IMG_FOR_BLOG %}{{ request.scheme }}://{{ request.get_host }}/media/{{ IMG_FOR_BLOG }}{% else %}{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg{% endif %}",
|
||||
"brand": {
|
||||
"@type": "Brand",
|
||||
"name": "{{ CATALOG_MODEL.sProfileManufacturer|escapejs }}"
|
||||
},
|
||||
"manufacturer": {
|
||||
"@type": "Organization",
|
||||
"name": "{{ CATALOG_MODEL.sProfileManufacturer|escapejs }}"
|
||||
},
|
||||
"category": "Оконные профили",
|
||||
"subjectOf": {
|
||||
"@type": "CreativeWork",
|
||||
"name": "Рейтинг Окнардии и как он устроен",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/blogpost/13/rejting-oknardii-i-kak-on-ustroen-2"
|
||||
},
|
||||
"additionalProperty": [
|
||||
{
|
||||
"@type": "PropertyValue",
|
||||
"name": "Метод ранжирования",
|
||||
"value": "Mann-Whitney (Манна-Уитни)"
|
||||
}
|
||||
]{% if CATALOG_MODEL.fProfileRating > -0.1 %},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "{{ CATALOG_MODEL.fProfileRating|stringformat:'.2f' }}",
|
||||
"bestRating": "5",
|
||||
"worstRating": "0"{% if PROFILE_RATING_SAMPLE_SIZE > 0 %},
|
||||
"ratingCount": "{{ PROFILE_RATING_SAMPLE_SIZE }}"{% endif %}
|
||||
}{% endif %}
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Оконные профили",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "{{ CATALOG_MODEL.sProfileManufacturer|escapejs }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 5,
|
||||
"name": "Профиль {{ CATALOG_MODEL.sProfileName|escapejs }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ CATALOG_URL2 }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}">{% endblock %}
|
||||
|
||||
|
||||
{% block Main_Content %}<div class="container-fluid">
|
||||
@@ -191,12 +125,7 @@
|
||||
<td colspan="3" {% if not CATALOG_MODEL.sProfileColor == "" %} title="Цвет оконного профиля: {{ CATALOG_MODEL.sProfileColor|capfirst }}"{% endif %}>{% if CATALOG_MODEL.sProfileColor == "" %}—{% else %}<small>{{ CATALOG_MODEL.sProfileColor|capfirst }}{% endif %}</small></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>{% if CATALOG_MODEL.fProfileRating > -0.1 %}
|
||||
<p class="small-note">Рейтинг модели рассчитан алгоритмом «Окнардии» по статистическому ранжированию
|
||||
характеристик (метод Манна-Уитни){% if PROFILE_RATING_SAMPLE_SIZE > 0 %} на выборке из
|
||||
{{ PROFILE_RATING_SAMPLE_SIZE }} моделей профилей{% endif %}. Методика расчёта:
|
||||
<a href="/blogpost/13/rejting-oknardii-i-kak-on-ustroen-2" target="_blank"
|
||||
rel="nofollow">«Рейтинг Окнардии и как он устроен»</a>.</p>{% endif %}{% if LIST_OTHER|length > 1 %}
|
||||
</table>{% if LIST_OTHER|length > 1 %}
|
||||
<h4>Прочие характеристики профиля:</h4>
|
||||
<ul>{% for LI_BULL in LIST_OTHER %}
|
||||
<li>{{ LI_BULL|safe }}</li>{% endfor %}
|
||||
|
||||
@@ -5,18 +5,30 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Каталог «Окнардия»: оконные и дверные профили, стеклопакеты, фурнитура, типовые серии домов, стандартные проёмы и партнёры-поставщики окон.{% endblock %}
|
||||
{% block Description %}Каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block Keywords %}Каталог, каталог оконных профилей, каталог стеклопакетов, каталог фурнитуры, каталог серий домов, каталог оконных проёмов, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
{# Удалить: itemprop microdata, rel=standout, twitter:domain — устаревшие теги #}
|
||||
<meta name="news_keywords" content="каталог окон, каталог оконных профилей, серии домов, стандартные проёмы" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/" />
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог «Окнардия»" />
|
||||
<meta itemprop="headline" content="Главная страница каталога «Окнардия»: оконные и дверные профили, стеклопакеты, фурнитуов, типовые серии домов, стандартные проемы, партнёры..." />
|
||||
<meta name="news_keywords" content="{{ HEADER }}" />
|
||||
<link rel="canonical" href="https://oknardia.ru//catalog/" />
|
||||
<link rel="standout" href="https://oknardia.ru//catalog/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
@@ -24,81 +36,21 @@
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Каталог «Окнардия» | oknardia.ru" />
|
||||
<meta property="og:description" content="Оконные и дверные профили, стеклопакеты, типовые серии домов, стандартные проёмы и партнёры-поставщики окон." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta property="og:description" content="Главная страница каталога «Окнардия»: оконные и дверные профили, стеклопакеты, фурнитуов, типовые серии домов, стандартные проемы, партнёры..." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Каталог «Окнардия» | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Оконные и дверные профили, стеклопакеты, типовые серии домов, стандартные проёмы и партнёры-поставщики окон." />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:title" content="{{ HEADER }}"/>
|
||||
<meta name="twitter:description" content="Главная страница каталога «Окнардия»: оконные и дверные профили, стеклопакеты, фурнитуов, типовые серии домов, стандартные проемы, партнёры..." />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="relap-image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Дополнительные Metатags --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD: корневая страница каталога — CollectionPage + BreadcrumbList + структура разделов #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Каталог «Окнардия»",
|
||||
"description": "Оконные и дверные профили, стеклопакеты, типовые серии домов, стандартные проёмы и партнёры-поставщики окон.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/",
|
||||
"hasPart": [
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Оконные и дверные профили",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/"
|
||||
},
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Каталог серий домов",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/"
|
||||
},
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Стандартные оконные проёмы и балконные блоки",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening/"
|
||||
},
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Производители и поставщики окон",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/"
|
||||
},
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Оконные наборы: характеристики, комплектации и сравнение",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/sets/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
@@ -114,7 +66,7 @@
|
||||
<dIv class="row -catalog2-">
|
||||
{# ПЕРВЫЙ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/profile">Оконные и дверные профили</a></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Каталог систем оконных и дверных профилей и описание <nobr>компаний-производителей</nobr>. Каталог содержит детальные характеристики профилей: сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер рамы и створки, тип и армирование, монтажная ширина и другие. Пластиковые (ПВХ), деревянные, комбинированные и другие системы профилей.</p>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Каталог систем оконных и дверных профилей и описание <nobr>компаний-производителей</nobr>. Каталог содержит детальные характеристики профилей: сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер рамы и створки, тип и армирования, монтажная ширина и другие. Пластиковые (ПВХ), деревянные, комбинированные и другие системы профилей.</p>
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/seria">Каталог серий домов</a></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Типовые проекты жилого строительства, вхождение стандартных оконных проёмов и балконных блоков в планировки типовых квартир серии, графики ввода в эксплуатацию зданий серии, география строительства, износ жилого фонда…</p>
|
||||
</div>
|
||||
@@ -124,10 +76,8 @@
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Размеры и рекомендованные схемы открывания стандартных проёмов и балконных блоков базы «Окнардия», коммерческие предложения партнёров агрегатора, условия поставки, комплектация, сопутствующие услуги и возможные скидки.</p>
|
||||
</div>
|
||||
{# И ОПЯТЬ РАЗДЕЛ С РЕКЛАМОЙ СБОКУ #}<div class="col-md-9 col-xs-8">
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/company">Производители и поставщики окон</a></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Компании-партнеры «Окнардии», контактная информация, условия и скидки, конфигурации и рейтинги их оконных предложений.</p>
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/sets/">Оконные наборы: характеристики, комплектации и сравнение</a></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Готовые комплектации окон разных поставщиков: профиль, стеклопакет, фурнитура и монтаж в одном предложении. Сравнивайте предложения компаний устанавливающих окна по характеристикам (теплопередача, звукоизоляция, состав услуг, рейтинг «Окнардии» и многое другое).</p>
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="/catalog/company">Производители и поставщики окон</a> <small style="font-size:xx-small;">(в разработке)</small></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Компании-партнеры «Окнардии», контатная информация, условия и скидки, конфигурации и рейтинги их оконных предложений.</p>
|
||||
{# ВТОРОЙ РАЗДЕЛ #}
|
||||
{# И ЕЩЁ ОДИН РАЗДЕЛ #}<h2 class="header"><a href="javascript://" class="not-ready">Каталог стеклопакетов</a> <small style="font-size:xx-small;">(в разработке)</small></h2>
|
||||
<p class="col-md-offset-1 col-xs-offset-1">Стеклопакеты и описание <nobr>компаний-производителей</nobr> стекла. Каталог содержит детальные характеристики: схемы стеклопакетов, наличие напыления k- и <nobr>i-микропленок</nobr>, тип <nobr>газа-заполнителя</nobr>, сопротивление теплопередаче <nobr><i>Ro</i> (<i>м²×°C/Вт</i>)</nobr>, коэффициент звукоизоляции (<i>дБ</i>), число камер, тонирование…</p>
|
||||
@@ -148,3 +98,5 @@
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>{% endblock %}
|
||||
|
||||
|
||||
|
||||
@@ -5,17 +5,30 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Каталог типовых серий домов России: панельные и блочные серии, ссылки на подробные страницы серий, их планировки и стандартные оконные проёмы.{% endblock %}
|
||||
{% block Description %}Каталог серий зданий и типовое панельное строительство оконного агрегатора Окнардия{% endblock %}
|
||||
|
||||
{% block Keywords %}типовое строительство, панельные серии, серии домов, серии зданий, типовые дома, типовые здания, каталог серий типового строительства, oknardia, окнардия{% endblock %}
|
||||
{% block Keywords %}типовое строительство, панельные серии, серии домов, серии зданий, типовые дома, типовые здания, каталог серий типового строительства, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}Серии домов : {% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Cерии домов : {% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
{# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/" />
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{{ PUB_DAT|date:"c" }}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог «Окнардия»" />
|
||||
<meta itemprop="headline" content="Серии типового строительства | oknardia.ru" />
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||
<link rel="canonical" href="https://oknardia.ru//catalog/seria/" />
|
||||
<link rel="standout" href="https://oknardia.ru//catalog/seria/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
@@ -23,64 +36,23 @@
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/seria/" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Каталог типовых серий домов | oknardia.ru" />
|
||||
<meta property="og:description" content="Серии типового строительства, планировки и ссылки на подробные страницы серий домов с данными по стандартным оконным проёмам." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta property="og:title" content="Каталог «Окнардия» | oknardia.ru" />
|
||||
<meta property="og:description" content="Серии типового строительства, типовые проекты жилого строительства, вхождение стандартных оконных проёмов и балконных блоков в планировки типовых квартир серии, графики ввода в эксплуатацию зданий серии, география строительства, износ жилого фонда..." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Каталог типовых серий домов | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Каталог типовых серий домов России: список серий и переходы на подробные страницы с планировками и окнами." />
|
||||
<meta name="twitter:description" content="Серии типового строительства, типовые проекты жилого строительства, вхождение стандартных оконных проёмов и балконных блоков в планировки типовых квартир серии, графики ввода в эксплуатацию зданий серии, география строительства, износ жилого фонда..." />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="relap-image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg">
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}">
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD для страницы списка типовых серий домов.
|
||||
CollectionPage + ItemList помогают поисковику трактовать страницу как каталог сущностей.
|
||||
{% endcomment %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Каталог серий типового строительства",
|
||||
"description": "Список типовых серий домов России с переходом на подробные страницы серий.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/",
|
||||
"inLanguage": "ru-RU",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "ItemList",
|
||||
"name": "Типовые серии домов",
|
||||
"numberOfItems": {{ SERIAS|length }},
|
||||
"itemListElement": [
|
||||
{% for i in SERIAS %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Thing",
|
||||
"name": "Серия {{ i.NAME|escapejs }}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ i.NAME_T }}/all{{ i.ID }}",
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/media/{{ i.URL }}"
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
{# <!--- Хлебные крошки: НАЧАЛО --> #}<div class="row">
|
||||
|
||||
@@ -1,385 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% load static %}
|
||||
{% load filters %}
|
||||
|
||||
{% block Title %}Оконные наборы: характеристики, комплектации и сравнение — каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Каталог оконных наборов «Окнардия»: готовые комплектации для замены окон с профилем, стеклопакетом и монтажом в одном предложении. Подробные характеристики, рейтинг и сравнение от разных поставщиков.{% endblock %}
|
||||
|
||||
{% block Keywords %}оконные наборы, комплектации окон, сравнение окон, профиль и стеклопакет, монтаж окон, окнардия{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/sets/" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/sets/" />
|
||||
<meta property="og:title" content="Оконные наборы: характеристики, комплектации и сравнение | oknardia.ru" />
|
||||
<meta property="og:description" content="Каталог готовых комплектаций окон от партнёров «Окнардии»: профиль, стеклопакет, фурнитура и монтаж. Сравнивайте по рейтингу и характеристикам." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Оконные наборы: каталог и сравнение | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Готовые комплектации окон — профиль, стеклопакет, фурнитура и монтаж от партнёров «Окнардии»." />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD: CollectionPage каталога наборов — BreadcrumbList + ItemList с кратким описанием каждого Product #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@graph": [
|
||||
{
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{"@type": "ListItem", "position": 1, "name": "Главная", "item": "{{ request.scheme }}://{{ request.get_host }}/"},
|
||||
{"@type": "ListItem", "position": 2, "name": "Каталог", "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"},
|
||||
{"@type": "ListItem", "position": 3, "name": "Оконные наборы",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/sets/"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"@type": "CollectionPage",
|
||||
"name": "Оконные наборы: характеристики, комплектации и сравнение",
|
||||
"description": "Каталог готовых комплектаций окон от партнёров «Окнардии»: профиль, стеклопакет, фурнитура и монтаж в одном предложении.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/sets/",
|
||||
"mainEntity": {
|
||||
"@type": "ItemList",
|
||||
"name": "Оконные наборы",
|
||||
"numberOfItems": {{ SET_LIST|length }},
|
||||
"itemListElement": [{% for item in SET_LIST %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Product",
|
||||
"name": "{{ item.kit.sSetName|escapejs }}",
|
||||
{% if item.merchant_name %}"brand": {"@type": "Brand", "name": "{{ item.merchant_name|escapejs }}"},{% endif %}
|
||||
"description": "Профиль {{ item.profile.sProfileName|escapejs }} ({{ item.profile.sProfileManufacturer|escapejs }}), стеклопакет {{ item.glazing.sGlazingMark|default:item.glazing.sGlazingName|escapejs }}.{% if item.profile.fProfileHeatTransf > 0.1 %} Ro профиля: {{ item.profile.fProfileHeatTransf }} м²·°C/Вт.{% endif %}{% if item.glazing.fGlazingHeatTransfer > 0.1 %} Ro стеклопакета: {{ item.glazing.fGlazingHeatTransfer }} м²·°C/Вт.{% endif %}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/compare_offers/{{ item.kit.id }}/",
|
||||
{% if item.kit.fSetRating > 0.1 %}
|
||||
"review": {
|
||||
"@type": "Review",
|
||||
"author": {
|
||||
"@type": "Organization",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
},
|
||||
"reviewRating": {
|
||||
"@type": "Rating",
|
||||
"ratingValue": "{{ item.kit.fSetRating|stringformat:".2f" }}",
|
||||
"bestRating": "5",
|
||||
"worstRating": "0"
|
||||
},
|
||||
"reviewBody": "Алгоритмический рейтинг «Окнардии», рассчитанный по критерию Манна-Уитни на основе характеристик профиля и стеклопакета, а также дополнительных услу и скидок"
|
||||
},
|
||||
{% endif %}
|
||||
"additionalProperty": [
|
||||
{"@type": "PropertyValue", "name": "Профиль", "value": "{{ item.profile.sProfileName|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Стеклопакет", "value": "{{ item.glazing.sGlazingName|escapejs }}"},
|
||||
{% if item.profile.iProfileThickness > 5 %}{"@type": "PropertyValue", "name": "Монтажная ширина профиля", "unitCode": "MMT", "unitText": "мм", "value": {{ item.profile.iProfileThickness }}},{% endif %}
|
||||
{% if item.glazing.iGlazingCamerasN >= 1 %}{"@type": "PropertyValue", "name": "Камер в стеклопакете", "unitText": "шт.", "value": {{ item.glazing.iGlazingCamerasN }}},{% endif %}
|
||||
{"@type": "PropertyValue", "name": "Доставка", "value": "{{ item.kit.sSetDelivery|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Монтаж", "value": "{{ item.kit.sSetUninstallInstall|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Метод ранжирования", "value": "Mann-Whitney (Манна-Уитни)"},
|
||||
{"@type": "PropertyValue", "name": "Источник данных", "value": "oknardia.ru"}
|
||||
]
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
{# CSS для плавающей панели выбора сравнения #}
|
||||
<style>
|
||||
/* Карточка набора — небольшой отступ снизу */
|
||||
.kit-card { margin-bottom: 16px; }
|
||||
/* Таблица характеристик — минимальные отступы */
|
||||
.kit-specs th { font-weight: normal; color: #777; white-space: nowrap; }
|
||||
.kit-specs th, .kit-specs td { padding: 2px 6px !important; font-size: 12px; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block Main_Content %}<!--- ------------------------------------------------------------------------------------------------------------------------- --->
|
||||
<div class="container-fluid">
|
||||
|
||||
{# Хлебные крошки #}
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li>Оконные наборы</li>
|
||||
</ol>
|
||||
<h1>Оконные наборы: характеристики, комплектации и сравнение</h1>
|
||||
<p>Оконный набор — готовая комплектация для замены окон в вашем доме: профиль, стеклопакет,
|
||||
фурнитура и монтаж в одном предложении от компаний-партнёров «Окнардии».
|
||||
Отметьте несколько интересных наборов и сравните их детально по всем характеристикам.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Список карточек #}
|
||||
{% for item in SET_LIST %}
|
||||
<div class="panel panel-default kit-card" id="kit-card-{{ item.kit.id }}">
|
||||
|
||||
{# ---- ШАПКА КАРТОЧКИ: название + рейтинг + логотип ---- #}
|
||||
<div class="panel-heading">
|
||||
<div class="row" style="display:flex;align-items:center;">
|
||||
|
||||
{# Название + звёздочки рейтинга #}
|
||||
<div class="col-xs-9 col-md-10">
|
||||
<h2 class="panel-title" style="font-size:1.15em;">{{ item.kit.sSetName }}</h2>
|
||||
<div style="margin-top:3px;"{% if item.kit.sSetDescription %} title="{{ item.kit.sSetDescription }}"{% endif %}>
|
||||
<nobr>{% for star in item.stars %}{% if star %}<b class="glyphicon glyphicon-star" style="color:#f0a500;"></b>{% else %}<i class="glyphicon glyphicon-star-empty" style="color:#ccc;"></i>{% endif %}{% endfor %}{% if item.kit.fSetRating > 0.1 %} <tt class="badge">{{ item.kit.fSetRating|stringformat:".2f" }}</tt>{% endif %}</nobr>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Логотип компании — кликабельный, ведёт на карточку компании в каталоге #}
|
||||
<div class="col-xs-3 col-md-2 text-right">
|
||||
{% if item.merchant_logo %}
|
||||
{% if item.merchant_id %}<a href="/catalog/company/{{ item.merchant_id }}-{{ item.merchant_slug }}/" title="{{ item.merchant_name }}">{% endif %}
|
||||
<img src="http://oknardia.ru/media/{{ item.merchant_logo }}"
|
||||
style="max-height:36px;max-width:110px;object-fit:contain;"
|
||||
alt="{{ item.merchant_name }}" />
|
||||
{% if item.merchant_id %}</a>{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>{# /panel-heading #}
|
||||
|
||||
{# ---- ТЕЛО КАРТОЧКИ: три колонки — условия | профиль | стеклопакет ---- #}
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
|
||||
{# == Колонка 1: компания и условия поставки == #}
|
||||
<div class="col-md-3 col-xs-12" style="border-right:1px solid #eee;margin-bottom:8px;">
|
||||
<h3 style="font-size:1em;font-weight:bold;margin-top:0;">Поставщик</h3>
|
||||
{% if item.merchant_id %}
|
||||
<p style="margin-bottom:6px;">
|
||||
<a href="/catalog/company/{{ item.merchant_id }}-{{ item.merchant_slug }}/">
|
||||
<strong>{{ item.merchant_name }}</strong>
|
||||
</a>
|
||||
</p>
|
||||
{% elif item.merchant_name %}
|
||||
<p style="margin-bottom:6px;"><strong>{{ item.merchant_name }}</strong></p>
|
||||
{% endif %}
|
||||
|
||||
<table class="table kit-specs" style="margin-bottom:4px;">
|
||||
{% if item.kit.sSetImplementAll %}
|
||||
<tr><th>Фурнитура:</th><td>{{ item.kit.sSetImplementAll|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetImplementHandles %}
|
||||
<tr><th><sup>∟</sup> Ручки:</th><td>{{ item.kit.sSetImplementHandles|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetImplementHinges %}
|
||||
<tr><th><sup>∟</sup> Петли:</th><td>{{ item.kit.sSetImplementHinges|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetImplementLatch %}
|
||||
<tr><th><sup>∟</sup> Запоры:</th><td>{{ item.kit.sSetImplementLatch|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetImplementLimiter %}
|
||||
<tr><th><sup>∟</sup> Огранич.:</th><td>{{ item.kit.sSetImplementLimiter|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetImplementCatch %}
|
||||
<tr><th><sup>∟</sup> Фиксаторы:</th><td>{{ item.kit.sSetImplementCatch|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
{% if item.kit.sSetClimateControl|length > 3 %}
|
||||
<tr><th>Климат-конт.:</th><td style="color:green;">{{ item.kit.sSetClimateControl|capfirst }}</td></tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<th>Подоконник:</th>
|
||||
<td {% if item.kit.sSetSill|capfirst == "Нет" or item.kit.sSetSill|length < 4 %}style="color:red;"{% endif %}>
|
||||
{% if item.kit.sSetSill %}{{ item.kit.sSetSill|capfirst }}{% else %}—{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Водоотлив:</th>
|
||||
<td {% if item.kit.sSetPanes|capfirst == "Нет" or item.kit.sSetPanes|length < 4 %}style="color:red;"{% endif %}>
|
||||
{% if item.kit.sSetPanes %}{{ item.kit.sSetPanes|capfirst }}{% else %}—{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Откос:</th>
|
||||
<td {% if item.kit.sSetSlope|capfirst == "Нет" or item.kit.sSetSlope|length < 4 %}style="color:red;"{% endif %}>
|
||||
{% if item.kit.sSetSlope %}{{ item.kit.sSetSlope|capfirst }}{% else %}—{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Доставка:</th>
|
||||
<td style="color:{% if item.kit.bSetDelivery %}green{% else %}red{% endif %};">
|
||||
{{ item.kit.sSetDelivery|capfirst }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Монтаж:</th>
|
||||
<td style="color:{% if item.kit.bSetUninstallInstall %}green{% else %}red{% endif %};">
|
||||
{{ item.kit.sSetUninstallInstall|capfirst }}
|
||||
</td>
|
||||
</tr>
|
||||
{% if item.kit.sSetOtherConditions %}
|
||||
<tr><th>Прочее:</th><td><small>{{ item.kit.sSetOtherConditions|capfirst }}</small></td></tr>
|
||||
{% endif %}
|
||||
</table>
|
||||
</div>{# /col компания #}
|
||||
|
||||
{# == Колонка 2: профиль == #}
|
||||
<div class="col-md-4 col-xs-12" style="border-right:1px solid #eee;margin-bottom:8px;">
|
||||
<h3 style="font-size:1em;font-weight:bold;margin-top:0;">
|
||||
Профиль:
|
||||
<a href="/catalog/profile/{{ item.profile.id }}-{{ item.profile_manufacturer_slug }}/{{ item.profile.id }}-{{ item.profile_slug }}/">{{ item.profile.sProfileName }}</a>
|
||||
<small style="font-weight:normal;color:#777;">— <a href="/catalog/profile/{{ item.profile.id }}-{{ item.profile_manufacturer_slug }}/">{{ item.profile.sProfileManufacturer }}</a></small>
|
||||
</h3>
|
||||
{% if item.profile.sProfileBriefDescription %}
|
||||
<p style="font-size:small;color:#666;margin-bottom:6px;">{{ item.profile.sProfileBriefDescription }}</p>
|
||||
{% endif %}
|
||||
<table class="table kit-specs">
|
||||
<tr><th>Производитель:</th><td>{{ item.profile.sProfileManufacturer }}</td></tr>
|
||||
{% if item.profile.iProfileCameras %}<tr><th>Камер рамы/створки:</th><td>{{ item.profile.iProfileCameras }} шт.</td></tr>{% endif %}
|
||||
{% if item.profile.iProfileThickness > 5 %}<tr><th>Монтажная ширина:</th><td>{{ item.profile.iProfileThickness }} мм</td></tr>{% endif %}
|
||||
{% if item.profile.iProfileGlazingThickness > 4 %}<tr><th>Макс. толщина СП:</th><td>{{ item.profile.iProfileGlazingThickness }} мм</td></tr>{% endif %}
|
||||
{% if item.profile.fProfileHeatTransf > 0.1 %}<tr><th>Теплопередача <i>Ro</i>:</th><td>{{ item.profile.fProfileHeatTransf }} м²·°C/Вт</td></tr>{% endif %}
|
||||
{% if item.profile.fProfileSoundproofing > 1 %}<tr><th>Звукоизоляция:</th><td>{{ item.profile.fProfileSoundproofing }} дБ</td></tr>{% endif %}
|
||||
{% if item.profile.fProfileSeals > 0 %}<tr><th>Контуры уплотнения:</th><td>{{ item.profile.fProfileSeals }} шт.</td></tr>{% endif %}
|
||||
{% if item.profile.iProfileHeight > 15 %}<tr><th>Высота в проёме:</th><td>{{ item.profile.iProfileHeight }} мм</td></tr>{% endif %}
|
||||
{% if item.profile.iProfileRabbet > 1 %}<tr><th>Фальц рамы:</th><td>{{ item.profile.iProfileRabbet }} мм</td></tr>{% endif %}
|
||||
{% if item.profile.sProfileColor %}<tr><th>Цвет:</th><td>{{ item.profile.sProfileColor|capfirst }}</td></tr>{% endif %}
|
||||
{% if item.profile.sProfileReinforcement %}<tr><th>Армирование:</th><td>{{ item.profile.sProfileReinforcement }}</td></tr>{% endif %}
|
||||
{% if item.profile.sProfileSealDescription %}<tr><th>Уплотнитель:</th><td>{{ item.profile.sProfileSealDescription|capfirst }}</td></tr>{% endif %}
|
||||
{% if item.profile.sProfileFillet %}<tr><th>Штапик:</th><td>{{ item.profile.sProfileFillet }}</td></tr>{% endif %}
|
||||
{% if item.profile.sProfileOther %}<tr><th>Прочие хар-ки:</th><td><small>{{ item.profile.sProfileOther }}</small></td></tr>{% endif %}
|
||||
</table>
|
||||
</div>{# /col профиль #}
|
||||
|
||||
{# == Колонка 3: стеклопакет == #}
|
||||
<div class="col-md-5 col-xs-12" style="margin-bottom:8px;">
|
||||
<h3 style="font-size:1em;font-weight:bold;margin-top:0;">
|
||||
Стеклопакет: {{ item.glazing.sGlazingName }}
|
||||
</h3>
|
||||
{% if item.glazing.sGlazingBriefDescription %}
|
||||
<p style="font-size:small;color:#666;margin-bottom:6px;">{{ item.glazing.sGlazingBriefDescription|capfirst }}</p>
|
||||
{% endif %}
|
||||
<table class="table kit-specs">
|
||||
{% if item.glazing.sGlazingMark and item.glazing.sGlazingMark != "—" %}<tr><th>Схема:</th><td>{{ item.glazing.sGlazingMark }}</td></tr>{% endif %}
|
||||
{% if item.glazing.sGlazingManufacturer and item.glazing.sGlazingManufacturer != "—//—" and item.glazing.sGlazingManufacturer != "—" %}<tr><th>Производитель:</th><td>{{ item.glazing.sGlazingManufacturer }}</td></tr>{% endif %}
|
||||
{% if item.glazing.iGlazingCamerasN >= 1 %}<tr><th>Камер:</th><td>{{ item.glazing.iGlazingCamerasN }} шт.</td></tr>{% endif %}
|
||||
{% if item.glazing.iGlazingThickness >= 3 %}<tr><th>Толщина:</th><td>{{ item.glazing.iGlazingThickness }} мм</td></tr>{% endif %}
|
||||
{% if item.glazing.fGlazingHeatTransfer > 0.1 %}<tr><th>Теплопередача <i>Ro</i>:</th><td>{{ item.glazing.fGlazingHeatTransfer }} м²·°C/Вт</td></tr>{% endif %}
|
||||
{% if item.glazing.fGlazingSoundproofing >= 10 %}<tr><th>Звукоизоляция:</th><td>{{ item.glazing.fGlazingSoundproofing }} дБ</td></tr>{% endif %}
|
||||
{% if item.glazing.fGlazingLightTransmission >= 1 %}<tr><th>Светопропускание:</th><td>{{ item.glazing.fGlazingLightTransmission }} %</td></tr>{% endif %}
|
||||
{% if item.glazing.fGlazingPassingSun >= 1 %}<tr><th>Солнцепропускание:</th><td>{{ item.glazing.fGlazingPassingSun }} %</td></tr>{% endif %}
|
||||
{% if item.glazing.sGlazingLightReflectance and item.glazing.sGlazingLightReflectance != "—/—" %}<tr><th>Светоотражение:</th><td>{{ item.glazing.sGlazingLightReflectance }} %</td></tr>{% endif %}
|
||||
{% if item.glazing.sGlazingReflectionAndAbsorptionOfHeat and item.glazing.sGlazingReflectionAndAbsorptionOfHeat != "—/—" %}<tr><th>Теплоотражение/погл.:</th><td>{{ item.glazing.sGlazingReflectionAndAbsorptionOfHeat }} %</td></tr>{% endif %}
|
||||
{% if item.glazing.sGlazingToning %}<tr><th>Тонирование:</th><td>{{ item.glazing.sGlazingToning|capfirst }}</td></tr>{% endif %}
|
||||
</table>
|
||||
</div>{# /col стеклопакет #}
|
||||
|
||||
</div>{# /row #}
|
||||
</div>{# /panel-body #}
|
||||
|
||||
{# ---- ПОДВАЛ КАРТОЧКИ: чекбокс «отметить» + кнопка сравнения ---- #}
|
||||
<div class="panel-footer" style="padding:6px 12px;">
|
||||
{# Чекбокс «отметить для сравнения» — учитывается при клике на кнопку любой карточки #}
|
||||
<label style="font-weight:normal;cursor:pointer;margin-right:14px;font-size:small;color:#555;">
|
||||
<input type="checkbox"
|
||||
class="kit-compare-check"
|
||||
value="{{ item.kit.id }}"
|
||||
style="vertical-align:middle;margin-right:3px;" />
|
||||
отметить
|
||||
</label>
|
||||
{# Кнопка: сравнивает текущую карточку с отмеченными (или с лучшей по рейтингу, если ничего не отмечено) #}
|
||||
<button type="button"
|
||||
class="btn btn-default btn-xs"
|
||||
onclick="compareWithKit('{{ item.kit.id }}')">
|
||||
<b class="glyphicon glyphicon-th-list"></b> Сравнить с другими
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>{# /panel kit-card #}
|
||||
{% empty %}
|
||||
<div class="alert alert-info">Нет доступных оконных наборов.</div>
|
||||
{% endfor %}
|
||||
|
||||
{# --- Баннер --- #}
|
||||
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
|
||||
|
||||
<div class="row">
|
||||
{% include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
|
||||
</div>{# /container-fluid #}
|
||||
|
||||
<!--- ------------------------------------------------------------------------------------------------------------------------- --->{% endblock %}
|
||||
|
||||
{% block Top_JS3 %}<script>
|
||||
/* Логика кнопки «Сравнить с другими» на карточке набора.
|
||||
ALL_KIT_IDS — все ID в порядке убывания рейтинга (как отсортирован queryset).
|
||||
best2 — два лучших ID по рейтингу (порядок как в queryset, т.е. убывание рейтинга).
|
||||
|
||||
compareWithKit(currentId):
|
||||
checked.length === 0 (ничего не отмечено):
|
||||
— currentId входит в best2 → сравниваем best2 (оба лидера);
|
||||
— иначе → сравниваем currentId с best2[0] (лучшим).
|
||||
checked.length >= 1 (что-то отмечено):
|
||||
— берём checked (до 5 штук), добавляем currentId без дублей → до 6;
|
||||
— если после сборки осталась только одна карточка (отметил только текущую
|
||||
и нажал её) → добавляем best2[0] или best2[1] как партнёра;
|
||||
— сортируем по возрастанию ID (стабильный URL).
|
||||
*/
|
||||
(function () {
|
||||
var MAX_COMPARE = 6;
|
||||
|
||||
/* Все ID наборов в порядке убывания рейтинга */
|
||||
var ALL_KIT_IDS = [{% for item in SET_LIST %}"{{ item.kit.id }}"{% if not forloop.last %},{% endif %}{% endfor %}];
|
||||
|
||||
/* Два лучших по рейтингу ID (первые два из отсортированного queryset) */
|
||||
var best2 = ALL_KIT_IDS.slice(0, 2);
|
||||
|
||||
function getChecked() {
|
||||
/* Возвращает массив ID всех отмеченных чекбоксов на странице */
|
||||
return Array.from(document.querySelectorAll('.kit-compare-check:checked'))
|
||||
.map(function (el) { return el.value; });
|
||||
}
|
||||
|
||||
window.compareWithKit = function (currentId) {
|
||||
currentId = String(currentId);
|
||||
var checked = getChecked();
|
||||
var ids;
|
||||
|
||||
if (checked.length === 0) {
|
||||
/* Ничего не отмечено → сравниваем currentId с лучшим по рейтингу */
|
||||
if (best2.indexOf(currentId) !== -1) {
|
||||
/* currentId уже один из двух лидеров → берём обоих лидеров */
|
||||
ids = best2.slice();
|
||||
} else {
|
||||
/* currentId — не лидер → сравниваем его с лучшим */
|
||||
ids = [currentId, best2[0]];
|
||||
}
|
||||
} else {
|
||||
/* Есть отмеченные → берём checked (до MAX_COMPARE-1=5), добавляем currentId без дублей */
|
||||
ids = checked.slice(0, MAX_COMPARE - 1);
|
||||
if (ids.indexOf(currentId) === -1) {
|
||||
ids.push(currentId);
|
||||
}
|
||||
/* Краевой случай: отмечен только текущий и нажали его же кнопку → одна карточка.
|
||||
Добавляем лучшего по рейтингу как партнёра для сравнения. */
|
||||
if (ids.length === 1) {
|
||||
var extra = (best2[0] !== currentId) ? best2[0] : (best2[1] || null);
|
||||
if (extra) { ids.push(extra); }
|
||||
}
|
||||
/* Сортируем по возрастанию ID для стабильного URL */
|
||||
ids.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });
|
||||
}
|
||||
|
||||
window.location.href = '/compare_offers/' + ids.join(',');
|
||||
};
|
||||
}());
|
||||
</script>{% endblock %}
|
||||
|
||||
@@ -1,23 +1,33 @@
|
||||
{% extends "base.html" %}{% load static %}
|
||||
|
||||
{% block Title %}Стандартные оконные проёмы и балконные блоки для типовых серий домов: размеры, схемы, каталог{% endblock %}
|
||||
{% block Title %} Стандартные оконные проёмы типовых серий домов :: каталог{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Найдите точные размеры (ширину и высоту) и схемы стандартных оконных проёмов и балконных блоков для самых распространённых типовых серий домов в России. Удобный каталог для подбора окон.{% endblock %}
|
||||
{% block Description %}Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов...{% endblock %}
|
||||
|
||||
{% block Keywords %}типовые окна, размеры окон, оконные проемы, балконный блок, стандартные окна, размеры окон в панельном доме, серия дома, каталог окон, схемы открывания окон, П-44, II-49, 1-515, oknardia, окнардия{% endblock %}
|
||||
{% block Keywords %}оконные проёмы, стандартные окна, стандартные оконные проемы, каталог, каталог оконных проёмов, oknardia, окнардия {{ META_KEYWORDS|default:"" }} {% endblock %}
|
||||
|
||||
{# Date4Meta/Last4Meta не переопределяем: используем дефолт из base.html #}
|
||||
{% block Date4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{{ PUB_DAT|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Author4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Каталог «Окнардия»{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
{# Legacy microdata (itemprop/itemscope) удалена: используем JSON-LD в ADD_TO_HEAD #}
|
||||
<meta itemprop="author" content="Каталог «Окнардия»" />{% if IMG_FOR_BLOG %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/media/{{ IMG_FOR_BLOG }}" />{% else %}
|
||||
<meta itemprop="image" content="https://oknardia.ru/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta itemprop="datePublished" content="{{ PUB_DAT|date:"c" }}" />
|
||||
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="Каталог «Окнардия»" /></span>
|
||||
<meta itemprop="articleSection" content="Каталог «Окнардия»" />
|
||||
<meta itemprop="headline" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||
<meta name="news_keywords" content="{{ HEADER|striptags }}" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening" />
|
||||
<link rel="canonical" href="https://oknardia.ru//catalog/" />
|
||||
<link rel="standout" href="https://oknardia.ru//catalog/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
@@ -25,67 +35,21 @@
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening" />
|
||||
<meta property="og:url" content="https://oknardia.ru//catalog/" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов | oknardia.ru" />
|
||||
<meta property="og:description" content="Каталог стандартных оконных проёмов и балконных блоков: размеры, схемы открывания и серии домов, в которых они встречаются." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta property="og:title" content="Каталог «Окнардия» | oknardia.ru" />
|
||||
<meta property="og:description" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||
<meta property="og:image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<link rel="image_src" href="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:"https://oknardia.ru/static/img/MerDY3gpU0w.jpg" }}" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Стандартные оконные проёмы и балконные блоки | oknardia.ru"/>
|
||||
<meta name="twitter:description" content="Размеры, схемы открывания и типовые серии домов для стандартных оконных проёмов в каталоге Окнардии." />
|
||||
<meta name="twitter:title" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов... | oknardia.ru"/>
|
||||
<meta name="twitter:description" content="Каталог «Окнардия»: стандартные оконные проёмы типовых серий домов..." />
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="relap-image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Дополнительные Metатags --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD для страницы-списка типовых оконных проемов.
|
||||
CollectionPage + ItemList помогают поисковику понять структуру каталога.
|
||||
{% endcomment %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Стандартные оконные проёмы и балконные блоки",
|
||||
"description": "Каталог стандартных оконных проёмов и балконных блоков с размерами, схемами открывания и привязкой к типовым сериям домов.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening",
|
||||
"inLanguage": "ru-RU",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "ItemList",
|
||||
"name": "Типовые оконные проёмы",
|
||||
"numberOfItems": {{ LIST_WIN_OPENING|length }},
|
||||
"itemListElement": [
|
||||
{% for i in LIST_WIN_OPENING %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Thing",
|
||||
"name": "{{ i.DESCRIPTION|escapejs }}",
|
||||
"description": "{{ i.DESCRIPTION_L|escapejs }}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening/price-{{ i.W|stringformat:'.0f' }}x{{ i.H|stringformat:'.0f' }}mm-tip{{ i.ID }}",
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}{% static i.URL2IMG %}",
|
||||
"additionalProperty": [
|
||||
{"@type": "PropertyValue", "name": "Ширина", "value": "{{ i.W|stringformat:'.0f' }} мм"},
|
||||
{"@type": "PropertyValue", "name": "Высота", "value": "{{ i.H|stringformat:'.0f' }} мм"},
|
||||
{"@type": "PropertyValue", "name": "Балконный блок: окно", "value": "{% if i.IS_NEAR_DOOR %}да{% else %}нет{% endif %}"},
|
||||
{"@type": "PropertyValue", "name": "Балконный блок: дверь", "value": "{% if i.IS_DOOR %}да{% else %}нет{% endif %}"}
|
||||
]
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
<meta name="twitter:domain" content="oknardia.ru" />
|
||||
<meta property="twitter:url" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
<meta name="relap-image" content="{% if IMG_FOR_BLOG %}https://oknardia.ru/media/{% endif %}{{ IMG_FOR_BLOG|default:'https://oknardia.ru/static/img/MerDY3gpU0w.jpg' }}" />
|
||||
{# <!-- END Дополнительные Metatags --> #}{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<div class="container-fluid">
|
||||
@@ -94,18 +58,18 @@ CollectionPage + ItemList помогают поисковику понять с
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li>Оконные проёмы и балконные блоки</li>
|
||||
<li>Оконные проёмы и балконные блоки</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||
<dIv class="row">
|
||||
{# ПЕРВЫЙ РАЗДЕЛ #}<div class="col-md-9 col-xs-8">
|
||||
<h1>Стандартные оконные проёмы и балконные блоки</h1>
|
||||
<p>Ценовая выдача «Окнардии» основана на базе стандартных оконных проёмов в типовых сериях домов. Для каждого проёма существуют рекоме­ндованные органи­зациями-проекти­ровщиками схемы открывание, но партнёры «Окнардии» могут предложить свои, более расширенные или наоборот сокращенные. В таблице приведены параметры стандартных проёмов базы.</p>
|
||||
<p>Ценовая выдача «Окнардии» основана на базе стандартных оконных проёмов в типовых сериях домов. Для каждого проёма существуют рекомендованные организациями-проектировщиками схемы открывание, но партнёры «Окнардии» могут предложить свои, более расширенные или наоборот сокращенные. В таблице приведены параметры стандартных проёмов базы.</p>
|
||||
</div>
|
||||
{# реклама Oknardia 250x250 СБОКУ #}<div class="col-md-3 col-xs-4 float-right">{% include "ad/bannet-250x250.html" %}</div>
|
||||
<div class="col-md-11 col-xs-12 catalog scrolled">
|
||||
<table class="table-striped table-hover table-responsive flap-catalog" style="margin-top: 1em">
|
||||
<table class="table-striped table-hover table-responsive flap-catalog">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="3" class="c">Размеры (мм)</th>
|
||||
@@ -133,16 +97,25 @@ CollectionPage + ItemList помогают поисковику понять с
|
||||
<td data-sort="{% if i.IS_DOOR %}1{% else %}0{% endif %}">{% if i.IS_DOOR %}да{% else %}—{% endif %}</td>
|
||||
<td>{{ i.DESCRIPTION }}</td>
|
||||
<td>{% for j in i.INCLUDING_IN_SERIA %}<a href="/catalog/seria/{{ j.NAME_T }}/all{{ j.ID }}">{{ j.NAME }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}</td>
|
||||
<td><a class="btn btn-default btn-xs" href="/catalog/standard_opening/price-{{ i.W|stringformat:".0f" }}x{{ i.H|stringformat:".0f" }}mm-tip{{ i.ID }}">цены</a></td>
|
||||
<td><a class="btn btn-default btn-xs" href="/tsena-odnogo-okna/{{ i.W|stringformat:".0f" }}x{{ i.H|stringformat:".0f" }}mm/tip{{ i.ID }}">цены</a></td>
|
||||
{# {% for j in SERIAS %}#}
|
||||
{# <td>{% if j.id in i.INCLUDING_IN_SERIA %}#{% endif %}</td>{% endfor %}#}
|
||||
</tr>{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<DIV class="col-xs-12" style="height:6em;"></DIV>
|
||||
</dIv>
|
||||
{# --- Баннер: НАЧАЛО --- #}<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>{# --- Баннер: конец --- #}
|
||||
|
||||
{# --- Баннер: НАЧАЛО --- #}
|
||||
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
|
||||
{# --- Баннер: конец --- #}
|
||||
<div class="row">
|
||||
{% include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>{% endblock %}
|
||||
|
||||
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
{% extends "base.html" %}{% load static %}
|
||||
|
||||
{% block Title %}Контакты маркетплейса Окнардия | Адрес, телефон, email для связи{% endblock %}
|
||||
{% block Title %}Контакты{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Date4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"Y-m-d" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
{% block Last4Meta %}{% if PUB_DAT %}{{ PUB_DAT|date:"c" }}{% else %}{% now "c" %}{% endif %}{% endblock %}
|
||||
|
||||
{% block Description %}Контактная информация маркетплейса Окнардия: адрес офиса, email info@oknardia.ru, руководство и учредители, персоны компании.{% endblock %}
|
||||
{% block Description %}Контактная информация маркетплейс-агрегатора «Окнардии»: адрес, телефоны и email для связи, персоны.{% endblock %}
|
||||
|
||||
{% block Keywords %}контакты окнардия, контактная информация, email для связи, адрес офиса, маркетплейс окон, агрегатор окон, руководство окнардии, организационные вопросы, партнерство{% endblock %}
|
||||
|
||||
{% block Author4Meta %}Контакты маркетплейса «Окнардия»{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Маркетплейс «Окнардия»{% endblock %}
|
||||
{% block Keywords %}Контакты, контактная информация, телефон для связи, email для связи, адрес, адрес офиса, персоны, Окнардия, маркетплейс-агрегатор «Окнардии»{% endblock %}
|
||||
|
||||
{% block Top_JS1%}
|
||||
<script type="text/javascript">
|
||||
@@ -22,101 +18,7 @@ $(window).load(function(){var images = $('.half');images.each(function(i){$(this
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metатags для контактов --> #}
|
||||
{# Удалить: устаревшие теги если появятся #}
|
||||
<meta name="news_keywords" content="контакты окнардия, адрес офиса, email, организационные вопросы, партнерство" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/contact/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/contact/" />
|
||||
<meta property="og:type" content="contact" />
|
||||
<meta property="og:title" content="Контакты маркетплейса Окнардия" />
|
||||
<meta property="og:description" content="Свяжитесь с командой Окнардия: адрес офиса, email info@oknardia.ru, руководство и учредители компании." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Контакты маркетплейса Окнардия" />
|
||||
<meta name="twitter:description" content="Адрес офиса, email для связи и руководство компании Окнардия." />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/contact/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Дополнительные Metатags для контактов --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD: страница контактов — Organization + ContactPoint + BreadcrumbList #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Окнардия",
|
||||
"legalName": "Маркетплейс-агрегатор Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/",
|
||||
"logo": "{{ request.scheme }}://{{ request.get_host }}/static/img/logo.png",
|
||||
"description": "Маркетплейс-агрегатор для сравнения цен на установку пластиковых и деревянных окон в зданиях типового строительства в России.",
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"contactType": "Customer Support",
|
||||
"email": "info@oknardia.ru",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/contact/"
|
||||
},
|
||||
"sameAs": [
|
||||
"https://www.facebook.com/oknardia",
|
||||
"https://t.me/oknardia"
|
||||
],
|
||||
"founders": [
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Сергей Еремин",
|
||||
"jobTitle": "CEO/CTO",
|
||||
"description": "Организационные вопросы, технические решения, партнерство"
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Тимофей Молдованин",
|
||||
"jobTitle": "CFO/COO",
|
||||
"description": "Финансовые и коммерческие вопросы"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Контакты",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/contact/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Main_Content %}<div class="container-fluid">
|
||||
{# Хлебные крошки: НАЧАЛО #}
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li class="active">Контакты</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
{# Хлебные крошки: КОНЕЦ #}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><h1>Контакты «Окнардия»</h1></div>
|
||||
</div>
|
||||
@@ -137,7 +39,7 @@ img {background-color: whitesmoke;}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-3" >
|
||||
<img class="img-circle" src="{{ request.scheme }}://{{ request.get_host }}/media/img_avatar/avatar_eserg_160x160.png" width="160" height="160" alt="Сергей Еремин — CEO/CTO «Окнардия», организационные вопросы, технические решения, партнерство" />
|
||||
<img class="img-circle" src="https://oknardia.ru/media/img_avatar/avatar_eserg_160x160.png" width="160" height="160" alt="Сергей Еремин — CEO/CTO «Окнардия», организационные вопросы, технические решения, партнерство" />
|
||||
<h3>Сергей Еремин</h3>
|
||||
<h4>CEO/CTO</h4>
|
||||
<h5>организационные вопросы, технические решения, партнерство</h5>
|
||||
@@ -159,7 +61,7 @@ img {background-color: whitesmoke;}
|
||||
</dl>
|
||||
</div>
|
||||
<div class="col-md-3" >
|
||||
<img class="img-circle" src="{{ request.scheme }}://{{ request.get_host }}/media/img_avatar/timofei_molodovanin.jpg" width="160" height="160" alt="Тимофей Молдованин — CFO/COO «Окнардия», финансовые и коммерческие вопросы" />
|
||||
<img class="img-circle" src="https://oknardia.ru/media/img_avatar/timofei_molodovanin.jpg" width="160" height="160" alt="Тимофей Молдованин — CFO/COO «Окнардия», финансовые и коммерческие вопросы" />
|
||||
<h3>Тимофей Молдованин</h3>
|
||||
<h4>CFO/COO</h4>
|
||||
<h5>финансовые и коммерческие вопросы</h5>
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>400 — Некорректный запрос</title>
|
||||
<!-- Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru -->
|
||||
<script src="/static/js/analytics.js" type="text/javascript"></script>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6; /* Полупрозрачность только для картинки */
|
||||
z-index: -1; /* Уводит картинку под текст */
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/static/img/oknardia_logo.gif'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">400</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Некорректный запрос</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Сервер не может обработать ваш запрос. Пожалуйста, проверьте корректность данных.</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>401 — Требуется авторизация</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">401</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Требуется авторизация</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Для доступа к этому ресурсу требуется авторизация.</h4>
|
||||
<p style="margin-top: 55px;"><a href="/login-logout">Войти в систему</a> или <a href="/">вернуться на главную</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>403 — Доступ запрещён</title>
|
||||
<!-- Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru -->
|
||||
<script src="/static/js/analytics.js" type="text/javascript"></script>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6; /* Полупрозрачность только для картинки */
|
||||
z-index: -1; /* Уводит картинку под текст */
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/static/img/oknardia_logo.gif'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">403</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Доступ запрещён</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">У вас нет прав для доступа к этому ресурсу. Если вы считаете это ошибкой, свяжитесь с администратором.</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>404 — Страница не найдена</title>
|
||||
<!-- Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru -->
|
||||
<script src="/static/js/analytics.js" type="text/javascript"></script>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6; /* Полупрозрачность только для картинки */
|
||||
z-index: -1; /* Уводит картинку под текст */
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/static/img/oknardia_logo.gif'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">404</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Страница не найдена</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">К сожалению, запрашиваемая страница не существует или была удалена.</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>413 — Файл слишком большой</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">413</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Файл слишком большой</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Размер загружаемого файла превышает допустимый лимит (максимум 10 МБ).</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>429 — Слишком много запросов</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">429</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Слишком много запросов</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Вы отправляете слишком много запросов. Пожалуйста, немного подождите и попробуйте снова.</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>500 — Внутренняя ошибка сервера</title>
|
||||
<!-- Аналитика: Google Analytics 4, Yandex.Metrika, Top.Mail.Ru -->
|
||||
<script src="/static/js/analytics.js" type="text/javascript"></script>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6; /* Полупрозрачность только для картинки */
|
||||
z-index: -1; /* Уводит картинку под текст */
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">500</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Внутренняя ошибка сервера</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">На нашем сервере произошла непредвиденная ошибка. Команда разработчиков уже работает над решением проблемы.</h4>
|
||||
<p style="color: #999; margin: 20px 0 0 30px; font-size: 14px;">Если проблема сохраняется, пожалуйста, свяжитесь с администратором: <a href="mailto:info@oknardia.ru">info@oknardia.ru</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>502 — Плохой шлюз</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">502</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Плохой шлюз</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Сервер приложения временно недоступен. Мы работаем над восстановлением работоспособности.</h4>
|
||||
<p style="color: #999; margin: 20px 0 0 30px; font-size: 14px;">Пожалуйста, попробуйте перезагрузить страницу через несколько минут. Если проблема сохраняется, свяжитесь с нами: <a href="mailto:info@oknardia.ru">info@oknardia.ru</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>503 — Сервис недоступен</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">503</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Сервис недоступен</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Сайт временно недоступен для плановых работ. Мы скоро вернёмся!</h4>
|
||||
<p style="color: #999; margin: 20px 0 0 30px; font-size: 14px;">Информация об обслуживании обновляется автоматически. Спасибо за терпение!</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>504 — Тайм-аут шлюза</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 120px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">504</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Тайм-аут шлюза</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Сервер приложения слишком долго отвечает на запрос. Это может быть перегрузка или технический сбой.</h4>
|
||||
<p style="color: #999; margin: 20px 0 0 30px; font-size: 14px;">Попробуйте перезагрузить страницу через несколько минут. Если проблема повторится, свяжитесь с поддержкой: <a href="mailto:info@oknardia.ru">info@oknardia.ru</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Технические работы</title>
|
||||
<style>
|
||||
.container::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background-image: url('/media/img_seria/1LG-504D12_2.jpg');
|
||||
opacity: 0.6;
|
||||
z-index: -1;
|
||||
background-position: 18% 15%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 200px auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container" style="margin: 10% 0 0 20%;">
|
||||
<h1 style="font-size: 80px; margin: 0; color: #ccc; background-image: url('/media/img_seria/1LG-504D12_2.jpg'); background-position: left 65%; background-repeat: no-repeat; background-size: 400px auto;"><i style="padding-left: 420px">⚙</i></h1>
|
||||
<h2 style="color: #333; font-size: 40px;">Технические работы</h2>
|
||||
<h4 style="color: #666; margin: 0 0 0 30px; font-size: 20px;">Приносим извинения. В данный момент сайт проходит техническое обслуживание. Мы скоро вернёмся!</h4>
|
||||
<p style="margin-top: 55px;"><a href="/">Вернуться на главную oknardia.ru</a></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,77 +1,24 @@
|
||||
{% extends "base.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block Title %}Окнардия: агрегатор цен на пластиковые окна и услуги их установки{% endblock %}
|
||||
{% block Title %}: выбор пластиковых окон в квартиру. Поставщики, цены, описания, характеристики, отзывы.{% endblock %}
|
||||
|
||||
{% block Description %}Агрегатор цен на пластиковые окна в типовых домах России. Введите адрес, укажите тип квартиры и сравните цены поставщиков на установку и характеристики предложений: оконный профиль, стеклопакет, скидки, дополнительные услуги.{% endblock %}
|
||||
{% block Description %}Окнардия: Здесь собраны цены на установку пластиковых окон. Просто введите адрес и получите актуальные предложения от ведущих поставщиков окон, подробные характеристики профилей и стеклопакетов, информацию о скидках. Никаких предварительных замеров! Мы уже знаем размеры проёмов в квартире, рекомендованные схемы открывания, требования к стеклопакетам, профилю и многое другое. Замена пластиковых окон — ответственное мероприятие. Мы помогаем сделать объективный выбор.{% endblock %}
|
||||
|
||||
{% block Keywords %}цены на окна, пластиковые окна, замена окон, услуги установки окон, профили окон, стеклопакеты, скидки на окна, окна в квартиру, размеры оконных проёмов, поставщики окон{% endblock %}
|
||||
{% block Keywords %}Цены на окна, цены на пластиковые окна, стоимость замены окон, пластиковые окна в квартиру, скидки на пластиковые окна, окна в квартиру, размеры окон, скидки на пластиковые окна, характеристики пластиковых окон, окна в панельный дом, окна в блочный дом.{% endblock %}
|
||||
|
||||
{% block Author4Meta %}ОКНАРДИЯ — Оконный Агрегатор{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}ОКНАРДИЯ — Оконный Агрегатор{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- Каноничная ссылка и мета-теги для соцсетей --> #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/" />
|
||||
{# <!-- Open Graph теги --> #}
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Окнардия: агрегатор цен на пластиковые окна" />
|
||||
<meta property="og:description" content="Введите адрес вашего дома — получите справочную информацию о размерах оконных проёмов и сравните цены от поставщиков на типовые комплекты окон с профилями, стеклопакетами, условиями установки." />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg" />
|
||||
{# <!-- Twitter Cards --> #}
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Окнардия — справочник цен на пластиковые окна" />
|
||||
<meta name="twitter:description" content="Сравните характеристики и цены окон от производителей и поставщиков по адресу вашего дома" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg" />
|
||||
{# <!-- /Meta-теги --> #}{% endblock %}
|
||||
|
||||
{% block Top_JS1 %}<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
{% block Top_JS1 %}{# comment #}
|
||||
<!-- script src="{% static 'js/gears_init.js' %}" type="text/javascript"></script>
|
||||
<script src="{% static 'js/geo.js' %}" type="text/javascript"></script>
|
||||
<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script -->{# endcomment #}
|
||||
<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script src="{% static 'js/jquery-ui.min.js' %}" type="text/javascript"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Top_CSS2 %} <link href="{% static 'css/jquery-ui.min.css' %}" rel="stylesheet" type="text/css" />
|
||||
{% block Top_CSS2 %}
|
||||
<link href="{% static 'css/jquery-ui.min.css' %}" rel="stylesheet" type="text/css" />
|
||||
{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{# <!-- Schema.org JSON-LD разметка для информационного агрегатора --> #}
|
||||
<script type="application/ld+json">
|
||||
[
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "ОКНАРДИЯ",
|
||||
"alternateName": "Информационный каталог цен на пластиковые окна",
|
||||
"description": "Независимый информационный сервис для сравнения цен на пластиковые окна, выбору оконного профиля, стеклопакета, условий и услуг их установки от производителей, поставщиков и монтажных компаний.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/",
|
||||
"logo": "{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg",
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/static/img/oknardia_logo.svg",
|
||||
"sameAs": [
|
||||
"https://www.facebook.com/oknardia/",
|
||||
"https://twitter.com/oknardia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "ОКНАРДИЯ",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/",
|
||||
"potentialAction": {
|
||||
"@type": "SearchAction",
|
||||
"target": {
|
||||
"@type": "EntryPoint",
|
||||
"urlTemplate": "{{ request.scheme }}://{{ request.get_host }}/get_address?addr={search_term_string}"
|
||||
},
|
||||
"query-input": "required name=search_term_string"
|
||||
},
|
||||
"description": "Поиск и сравнение цен на пластиковые окна по адресу типового дома"
|
||||
}
|
||||
]
|
||||
</script>
|
||||
{# <!-- /Schema.org JSON-LD --> #}{% endblock %}
|
||||
|
||||
{% block Main_Content %}
|
||||
<script type="text/javascript">
|
||||
// Дождёмся загрузки API и готовности DOM.
|
||||
|
||||
@@ -75,7 +75,11 @@
|
||||
<button type="submit" class="btn btn-primary btn-add">Найти</button>
|
||||
</span>
|
||||
</div>
|
||||
{% include 'report/report_last_user_visit.html' with background_color="None" %}
|
||||
{% if LAST_VISIT %}<div><h5>Ваши последние просмотры:</h5>
|
||||
<ul style="font-size:small">{% for ITEM in LAST_VISIT %}
|
||||
<li><a href="{{ ITEM.LastURL }}">{{ ITEM.LastApart }} <small>({{ ITEM.LastAddress }})</small></a> <small style="font-size: xx-small;">{{ ITEM.Time }}</small></li>{% endfor %}
|
||||
</ul>
|
||||
</div>{% endif %}
|
||||
|
||||
</form>
|
||||
<p></p>{% endwith %}
|
||||
@@ -23,7 +23,7 @@
|
||||
<div class="btn-toolbar" style="width:80%">{% for I_APART in LIST_APART %}
|
||||
<button type="button" class="btn btn-default" style="margin:1ex"
|
||||
accesskey="{{ I_APART.id }}"
|
||||
onclick="window.location.href='/price/seriaID{{ BASE_SERIA_ID }}--{{ BASE_SERIA_LAT }}/appartID{{ I_APART.id }}/addressID{{ ADDRESS_ID }}--{{ addr_T }}';try{yaCounter32997984.reachGoal('CHOICE_APP');}catch(e){}">
|
||||
onclick="window.location.href='/{{ ADDRESS_ID }}/{{ I_APART.id }}/{{ addr_T }}';try{yaCounter32997984.reachGoal('CHOICE_APP');}catch(e){}">
|
||||
{{ I_APART.sNameApartment|safe }}
|
||||
</button>{% endfor %}
|
||||
</div>
|
||||
|
||||
@@ -6,109 +6,17 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{# SEO-описание: информативно для поисковиков и людей, но кратно. #}
|
||||
{% block Description %}Лучшие цены на пластиковые окна для серии {{ APART|safe }} в доме по адресу {{ ADDRESS }}. Сравните {{ PRICE_FRAME|length }} предложений от ведущих компаний, узнайте стоимость окон для вашей квартиры и получите скидку!{% endblock %}
|
||||
{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
{# SEO-ключевые слова: расширяем, добавляем вариации, город, преимущества. #}
|
||||
{% block Keywords %}цены на окна, пластиковые окна, серия {{ BASE_SERIA }}, стоимость окон, окна для {{ BASE_SERIA }}, размеры окон, проемы серии {{ BASE_SERIA }}, окна в {{ APART|safe }}, скидки на окна, {{ ADDRESS }}, оконный профиль, монтаж окон, установка окон, сравнение цен, лучшие предложения, акции, рассрочка, {{ KEYWORDS_EXTRA }}{% endblock %}
|
||||
{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{# --- Микроразметка schema.org, Open Graph, Twitter Card, meta-даты --- #}
|
||||
{# --- JSON-LD микроразметка schema.org: хлебные крошки по новой структуре + остальные объекты --- #}
|
||||
<script type="application/ld+json">
|
||||
[
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Серия {{ BASE_SERIA }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ BASE_SERIA_LAT }}/all{{ BASE_SERIA_ID }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "{{ APART }}"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "Цены замены окон по адресу: {{ ADDRESS }}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "Organization",
|
||||
"name": "ОКНАРДИЯ — агрегатор цен на окна",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/",
|
||||
"logo": "{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}",
|
||||
"description": "Сравнение цен на установку оконных конструкций в типовых жилых домах России",
|
||||
"contactPoint": {"@type": "ContactPoint", "contactType": "Customer Service"}
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "Product",
|
||||
"name": "Окна для {{ APART|safe }} ({{ ADDRESS }})",
|
||||
"size": "{% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }}мм — {{ I_WIN_DIM.iQuantity }} шт.{% if not forloop.last %}; {% endif %}{% endfor %}",
|
||||
"description": "Цены на пластиковые окна для серии {{ APART|safe }} по адресу {{ ADDRESS }}. Сравните предложения, комплектации, получите скидки и выберите лучшее решение!",
|
||||
"image": {"@type": "ImageObject", "url": "{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}"},
|
||||
"brand": {"@type": "Brand", "name": "ОКНАРДИЯ"},
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}{{ request.path }}",
|
||||
"offers": {"@type": "AggregateOffer", "priceCurrency": "RUB", "itemCondition": "https://schema.org/NewCondition", "availability": "https://schema.org/InStock", "offerCount": "{{ PRICE_FRAME|length }}"}
|
||||
},
|
||||
{# --- ItemList с Offer для каждого предложения (цена, продавец, рейтинг, дата, внутренняя ссылка, профиль, стеклопакет, список окон) --- #}{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "ItemList",
|
||||
"itemListElement": [
|
||||
{% for CurOffer in PRICE_FRAME %}
|
||||
{
|
||||
"@type": "Offer",
|
||||
"position": {{ forloop.counter }},
|
||||
"name": "{{ CurOffer.SETS_NAME|escapejs }}",
|
||||
"seller": {"@type": "Organization", "name": "{{ CurOffer.MERCHANT|escapejs }}"},
|
||||
"windows": [
|
||||
{% for CurInOffer in CurOffer.DIM %}{"size": "{{ CurInOffer.WIDTH|stringformat:'d' }}x{{ CurInOffer.HIGHT|stringformat:'d' }}", "count": {{ CurInOffer.QUANTITY }}}{% if not forloop.last %}, {% endif %}{% endfor %}
|
||||
],
|
||||
"profile": "{{ CurOffer.PVC_NAME|escapejs }}",
|
||||
"glazing": "{{ CurOffer.GLAZING_NAME_B|escapejs }}",
|
||||
"price": "{{ CurOffer.FIN_PRICE|stringformat:'d' }}",
|
||||
"priceCurrency": "RUB",
|
||||
{% if CurOffer.SETS_RATING %}"aggregateRating": {"@type": "AggregateRating", "ratingValue": "{{ CurOffer.SETS_RATING|stringformat:'.2f' }}"}, {% endif %}
|
||||
{% if CurOffer.SETS_DATA_MODIFY %}"priceValidUntil": "{{ CurOffer.SETS_DATA_MODIFY|date:'Y-m-d' }}", {% endif %}
|
||||
"availability": "https://schema.org/InStock",
|
||||
"itemCondition": "https://schema.org/NewCondition",
|
||||
"url": "#offer_{{ CurOffer.SETS_ID }}"
|
||||
}{% if not forloop.last %},
|
||||
{% endif %}{% endfor %}
|
||||
]
|
||||
}
|
||||
]
|
||||
</script>
|
||||
{# --- Open Graph (OG) --- #}<meta property="og:title" content="Цены на окна для {{ APART|safe }} ({{ ADDRESS }})" />
|
||||
<meta property="og:description" content="Сравните цены, комплектации и получите лучшие предложения на пластиковые окна для серии {{ APART|safe }} по адресу {{ ADDRESS }}!" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}{{ request.path }}" />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}" />
|
||||
<meta property="og:site_name" content="ОКНАРДИЯ — агрегатор цен на окна" />
|
||||
{# --- Twitter Card --- #}<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:title" content="Цены на окна для {{ APART|safe }} ({{ ADDRESS }})" />
|
||||
<meta name="twitter:description" content="Сравните цены, комплектации и получите лучшие предложения на пластиковые окна для серии {{ APART|safe }} по адресу {{ ADDRESS }}!" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}" />
|
||||
{# --- Даты публикации и обновления --- #}<meta name="date" content="{{ META_DATA_PUBLISH|date:'Y-m-d' }}" />
|
||||
<meta property="article:published_time" content="{{ META_DATA_PUBLISH|date:'Y-m-d' }}" />
|
||||
<meta property="article:modified_time" content="{{ META_DATA_PUBLISH|date:'Y-m-d' }}" />
|
||||
{% endblock %}
|
||||
{% block Description %}Цены на окна для серии {{ APART|safe }} по адресу {{ ADDRESS }}. Размер окон (см.): {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }}{% if forloop.last %}.{% else %}; {% endif %}{% endfor %} Оконные наборы: {% for CurOffer in PRICE_FRAME %}{{ CurOffer.SETS_NAME }} – {{ CurOffer.FIN_PRICE|stringformat:".0f" }} рублей{% if forloop.last %}.{% else %}; {% endif %}{% endfor %}{% endblock %}
|
||||
|
||||
{% block Top_JS3%}<script type="text/javascript" src="{% static 'js/track_user_visit.js' %}"></script>
|
||||
<script type="text/javascript">
|
||||
{% comment %}{% block Description %}Цены на плаcтиковые окна для серии {{ BASE_SERIA }} ({{ APART }} квартира, {{ ADDRESS }}) :: {% for CurOffer in PRICE_FRAME %}Поставщик: {{ CurOffer.MERCHANT }}; Комплектация: {{ CurOffer.SETS_NAME }}; Цена: {{ CurOffer.FIN_PRICE }}₽ :: {% endfor %}{% endblock %}{% endcomment %}
|
||||
|
||||
{% block Keywords %}цены окон, серия {{ BASE_SERIA }}, {{ BASE_SERIA }}, стоимость окон, окна для {{ BASE_SERIA }}, размеры окон, проемы серии {{ BASE_SERIA }}, окна в {{ APART|safe }}, скидки на окна, {{ ADDRESS }}, оконный профиль, {% for CurOffer in PRICE_FRAME %}{{ CurOffer.MERCHANT }}, {{ CurOffer.PVC_NAME }}, {{ CurOffer.PVC_MANUFACTURER }}, {{ CurOffer.GLAZING_MARK }}, {% endfor %} характеристики пластиковых окон, {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }} см., {% endfor %}{{ META_KEYWORDS|default:"" }}{% endblock %}
|
||||
|
||||
{% block Top_JS3%}<script type="text/javascript">
|
||||
function show_phone_num( id ){ // колапсатор для отображения контатной информации постафшика окон
|
||||
$('#tel'+id).collapse('show');
|
||||
$('#hid'+id).collapse('hide');
|
||||
@@ -199,36 +107,26 @@ $(function () { // инициализация и обработка попове
|
||||
|
||||
{% block Top_CSS1 %}<link rel="stylesheet" type="text/css" href="{% static "css/csshake-vertical.min.css" %}">{% endblock %}
|
||||
|
||||
{% block Main_Content %}<div class="container-fluid">
|
||||
{# --- Хлебные крошки: НАЧАЛО --- #}<div class="row">
|
||||
<div class="col-md-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/seria/{{ BASE_SERIA_LAT }}/all{{ BASE_SERIA_ID }}">Серия {{ BASE_SERIA }}</a></li>
|
||||
<li>{{ APART }}</li>
|
||||
<li>Цены замены окон по адресу: {{ ADDRESS }}</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>{# --- Хлебные крошки: КОНЕЦ --- #}
|
||||
<div class="row">
|
||||
{% block Main_Content %}
|
||||
<span itemscope itemtype="http://schema.org/Product">
|
||||
<div class="row col-md-12">
|
||||
<div class="col-md-9">
|
||||
<h1>Цены на окна для серии {{ APART|safe }} <small><nobr>({{ ADDRESS }})</nobr></small></h1>
|
||||
<h1>Цены на окна для серии {{ APART|safe }} <small>({{ ADDRESS }})</small></h1>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<p>Квартира имеет проёмы (окна и балконные двери) следующих размеров: {% for I_WIN_DIM in FLAP_DIM %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }} см. — {{ I_WIN_DIM.iQuantity }} шт.{% endfor %} Проект (<a href="/catalog/seria/{{ BASE_SERIA_LAT }}/all{{ BASE_SERIA_ID }}">типовая серия {{ BASE_SERIA }}</a>) предполагает следующие схемы открывания окон:</p>
|
||||
</div>
|
||||
</div>
|
||||
{# Микроразмектка: названеи продукта #}<meta itemprop="name" content="Окна {{ APART|safe }} ({{ ADDRESS }})" />
|
||||
</div>
|
||||
|
||||
<div class="row ShowBigFlapPictures">
|
||||
<div class="col-sm-9">{% include 'report/show_big_flap_pictures.html' %}</div>
|
||||
<div class="row col-md-12 ShowBigFlapPictures">
|
||||
<div class="col-sm-9">
|
||||
{% include 'report/show_big_flap_pictures.html' %}
|
||||
</div>
|
||||
<div class="col-sm-3 visible-md visible-lg ap_list">
|
||||
<h6>Другие типовые квартиры в этом доме:</h6>
|
||||
<ul>{% for I_APART in APARTMENT_IN_BUILDING %}
|
||||
{% if I_APART.APT_ID == '!' %}<li>{{ I_APART.APT_NAME|safe }}</li>{% else %}
|
||||
{# Новый формат роутинга для перехода между квартирами #}
|
||||
<li><a href="/price/seriaID{{ BASE_SERIA_ID }}--{{ BASE_SERIA_LAT }}/appartID{{ I_APART.APT_ID }}/addressID{{ BUILD_ID }}--{{ ADDRESS_T }}/">{{ I_APART.APT_NAME|safe }}</a></li>
|
||||
{% endif %}{% endfor %}
|
||||
{% if I_APART.APT_ID == '!' %}<li>{{ I_APART.APT_NAME|safe }}</li>{% else %}<li><a href="/{{ BUILD_ID }}/{{ I_APART.APT_ID }}/{{ ADDRESS_T }}">{{ I_APART.APT_NAME|safe }}</a></li>{% endif %}{% endfor %}
|
||||
</ul>
|
||||
<a href="/catalog/seria/{{ BASE_SERIA_LAT }}/all{{ BASE_SERIA_ID }}">Информация по серии {{ BASE_SERIA }}</a>
|
||||
</div>
|
||||
@@ -236,8 +134,10 @@ $(function () { // инициализация и обработка попове
|
||||
|
||||
<div class="row col-md-12">
|
||||
<div class="col-md-12">
|
||||
<p id="tab-note">Таблица содержит цены поставщиков. Клик на название отобразит детальные спецификации каждого предложения: марку профиля рамы и створки, схему стеклопакета, тип фурнитуры, элементы отделки (отлив, подоконник, откос, клапан <nobr>климат-контроля</nobr>) и сопутствующие услуги. Предложения выводятся покадрово, получите следующий кадр кнопкой «Ещё коммерческие предложения окон» под таблицей. Просмотреть и сравнить технические характеристики стеклопакетов, профилей и детальное описание сопутствующих услуг возможно с помощью кнопки «Сравнить выбранные».</p>
|
||||
<p id="tab-note">Таблица содержит цены поставщиков. Клик на название отобразит детальные спецификации каждого предложения: марку профиля рамы и створки, схему стеклопакета, тип фурнитуры, элементы отделки (отлив, подоконник, откос, клапан <nobr>климат-контроля</nobr>) и сопутствующие услуги. Предложения выводятся покадрово, получите следующий кадр кнопкой «Ещё коммерческие предложения окон» под таблицей. Просмотреть и сравнить технические характеристик стеклопакетов, профилей и детальное описание сопутствующих услуг возможно с помощью кнопки «Сравнить выбранные».</p>
|
||||
</div>
|
||||
{# Микроразмектка: названеи продукта #}
|
||||
<meta itemprop="name" content="Окна {{ APART|safe }} ({{ ADDRESS }})"/>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -268,7 +168,8 @@ $(function () { // инициализация и обработка попове
|
||||
{% include "price/price_list_frame.html" %}
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</form>
|
||||
</span>
|
||||
{% with SERIA_BASE=BASE_SERIA %}{% include "report/build_info_in_table.html" %}{% endwith %}
|
||||
{# --- Баннер: НАЧАЛО --- #}
|
||||
<div class="row"><div class="col-md-12 col-xs-12"><hr class="dotted-black" />{% include "ad/bannet-wide.html" %}</div></div>
|
||||
@@ -279,13 +180,6 @@ $(function () { // инициализация и обработка попове
|
||||
<p id="shadow_buffer"></p>
|
||||
</div>
|
||||
|
||||
{# Скрытый элемент для отслеживания визитов пользователя (передача данных в JS track_user_visit.js) #}
|
||||
<div id="tracking-data"
|
||||
data-current-url="{{ request.path }}"
|
||||
data-address="{{ ADDRESS }}"
|
||||
data-apart="{{ APART }}"
|
||||
style="display: none;"></div>
|
||||
|
||||
{# модальное окно #}
|
||||
<div class="modal fade bs-example-modal-sm" id="modal-exclamation" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog modal-sm">
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
{% if forloop.first %}
|
||||
<th rowspan="{% if CurOffer.DIM|length == 1 %}2{% else %}{{ CurOffer.DIM|length }}{% endif %}" title="Добавить коммерческое предложение окон к сравнению">{# красивые чекбоксы BEGIN #}<div class="checkbox"><label><input id="CHK{{ CurOffer.SETS_ID }}" type="checkbox" name="ForCompare" value="{{ CurOffer.SETS_ID }}" onChange="ChangeCountCheckedBox({{ CurOffer.SETS_ID }});" /><span class="cr"><i class="cr-icon glyphicon glyphicon-ok"></i></span></label></div>{# красивые чекбоксы END #}</th>
|
||||
<td rowspan="{% if CurOffer.DIM|length == 1 %}2{% else %}{{ CurOffer.DIM|length }}{% endif %}"{% if CurOffer.IS_COMMERCIAL %} style="background-image: url(/media/{{ CurOffer.MERCHANT_LOGO }})"{% endif %} title="Краткая спецификация коммерческого предложения">
|
||||
<span>
|
||||
<h3 class="set-name shake-trigger" id="btn{{ CurOffer.SETS_ID }}"><a href="javascript://" onclick="show_dtl({{ CurOffer.SETS_ID }})">{{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}<i class="glyphicon glyphicon-chevron-down shake-vertical"></i></a></h3>
|
||||
<span itemprop="description">
|
||||
<h3 class="set-name shake-trigger" id="btn{{ CurOffer.SETS_ID }}"><a href="javascript://" onclick="show_dtl({{ CurOffer.SETS_ID }})">{{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}<i class="glyphicon glyphicon-chevron-down shake-vertical"></i></a></h3>
|
||||
|
||||
<DiV id="dtl{{ CurOffer.SETS_ID }}" class="collapse">■ Профиль: <a href="/catalog/profile/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_MANUFACTURER_T }}/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_NAME_T }}">{{ CurOffer.PVC_NAME|safe }}</a> (<a href="/catalog/profile/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_MANUFACTURER_T }}">{{ CurOffer.PVC_MANUFACTURER }}</a>)
|
||||
■ {{ CurOffer.GLAZING_NAME_B|safe }} <nobr>({{ CurOffer.GLAZING_MARK }})</nobr>
|
||||
@@ -40,8 +40,10 @@
|
||||
title="{% if CurOffer.SETS_RATING > 0.01 %}<b> Рейтинг {{ CurOffer.SETS_RATING|stringformat:".2f" }}</b> для оконого набора «{{ CurOffer.SETS_NAME }}» компании «{{ CurOffer.MERCHANT }}» состоит из:{% else %}Рейтинг не присвоен{% endif %}"
|
||||
data-toggle="popover">рейтинг</a>: {% for Star in CurOffer.SETS_RATING_STARTS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if CurOffer.SETS_RATING > -0.1 %} {{ CurOffer.SETS_RATING|stringformat:".2f" }}{% endif %}</nobr>
|
||||
</span>
|
||||
{# Удалить: старая микроразметка schema.org (brand, meta) #}
|
||||
</td>
|
||||
<span itemprop="brand" itemscope itemtype="http://schema.org/Brand">
|
||||
<meta itemprop="name" content="{{ CurOffer.MERCHANT }}" />
|
||||
<meta itemprop="logo" content="https://oknardia.ru/media/{{ CurOffer.MERCHANT_LOGO }}" />
|
||||
</span></td>
|
||||
<!--- Конец большой ячейки со спецификацией оконного предложения --->
|
||||
{% endif %}
|
||||
|
||||
@@ -56,9 +58,10 @@
|
||||
|
||||
<td class="rnw" title="Стоимость {{ CurOffer.TOTAL|stringformat:".2f" }} рублей за все окна квартиры {{ APART|safe }}.">{{ CurOffer.TOTAL|stringformat:".2f"|price_format }}</td>
|
||||
<th{% if CurOffer.DISCOUNT_COLOR2 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR2 }};"{% endif %} title="{% if CurOffer.DISCOUNT < 0.1 %}Нет скидки{% else %}Скидка — {{ CurOffer.DISCOUNT|stringformat:".1f" }}%{% endif %}">{% if CurOffer.DISCOUNT < 0.1 %}—{% else %}−{{ CurOffer.DISCOUNT|stringformat:".1f" }}%{% endif %}</th>
|
||||
<th{% if CurOffer.DISCOUNT_COLOR1 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR1 }};"{% endif %} title="Итого за все окна с учетом скидки: {{ CurOffer.FIN_PRICE|stringformat:".2f" }} рублей">
|
||||
<th{% if CurOffer.DISCOUNT_COLOR1 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR1 }};"{% endif %} itemprop="offers" itemscope itemtype="http://schema.org/Offer" title="Итого за все окна с учетом скидки: {{ CurOffer.FIN_PRICE|stringformat:".2f" }} рублей">
|
||||
Итого: {{ CurOffer.FIN_PRICE|stringformat:".2f"|price_format }} <small class="glyphicon glyphicon-ruble" aria-label="₽ (руб.)" title="₽ (руб.)"></small>
|
||||
{# Удалить: старая микроразметка schema.org (meta price, priceCurrency) #}
|
||||
<meta itemprop="price" content="{{ CurOffer.FIN_PRICE }}" />
|
||||
<meta itemprop="priceCurrency" content="RUB" />
|
||||
</th>
|
||||
{% if CurOffer.DIM|length == 1 %}
|
||||
|
||||
|
||||
@@ -5,12 +5,11 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{# SEO блоки дат:#}
|
||||
{# - Date4Meta: дата публикации (первого появления) — используем дату модификации данных. #}
|
||||
{# - Last4Meta: дата последнего обновления — будет по умолчанию now из base.html. #}
|
||||
{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %}
|
||||
{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Top_JS4 %}{# Для построения круговой диаграммы #}
|
||||
{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
{% block Top_JS4 %}
|
||||
<script type="text/javascript" src="//www.gstatic.com/charts/loader.js"></script>
|
||||
<script type="text/javascript">
|
||||
google.charts.load("current", {packages: ["corechart"]});
|
||||
@@ -36,140 +35,6 @@
|
||||
}
|
||||
</script>{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD микроразметка для поисковых систем (Schema.org):
|
||||
- BreadcrumbList: хлебные крошки для навигации в поиске
|
||||
- Organization: информация о бренде/компании
|
||||
- Product: типовое окно с полной информацией
|
||||
- Рейтинги и цены берутся из таблицы предложений (price_offers_for_one_window_frame.html)
|
||||
{% endcomment %}<script type="application/ld+json">
|
||||
[
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Оконные проёмы и балконные блоки",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/standard_opening/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "Окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }}{% endfor %} мм",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}{{ request.path }}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "Organization",
|
||||
"name": "ОКНАРДИЯ — агрегатор цен на окна",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/",
|
||||
"logo": "{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}",
|
||||
"description": "Сравнение цен на установку оконных конструкций в типовых жилых домах России",
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"contactType": "Customer Service"
|
||||
}
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "Product",
|
||||
"name": "Типовое пластиковое окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}×{{ I_WIN_DIM.iWinHight|floatformat:0 }} см{% endfor %}",
|
||||
"size": "{% for I_WIN_DIM in FLAP_DIM %}{% if not forloop.first %}, {% endif %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }} мм{% endfor %}",
|
||||
"description": "Цены на пластиковое окно стандартного размера для типовых жилых домов серий {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}{{ I.sName }}{% endfor %}. Сравните предложения различных производителей и установщиков, узнайте актуальные цены, технические характеристики стеклопакетов, профилей, фурнитуры и условия доставки/монтажа.",
|
||||
"image": {
|
||||
"@type": "ImageObject",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}{% static 'img/oknardia_logo.svg' %}"
|
||||
},
|
||||
"brand": {
|
||||
"@type": "Brand",
|
||||
"name": "ОКНАРДИЯ"
|
||||
},
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}{{ request.path }}",
|
||||
"offers": {
|
||||
"@type": "AggregateOffer",
|
||||
"priceCurrency": "RUB",
|
||||
"itemCondition": "https://schema.org/NewCondition",
|
||||
"availability": "https://schema.org/InStock",
|
||||
"offerCount": "{{ NUM_TOTAL_OFFER_N_WORD|safe }}"
|
||||
},
|
||||
"datePublished": "{{ META_DATA_PUBLISH|date:'Y-m-d' }}",
|
||||
"dateModified": "{{ META_DATA_PUBLISH|date:'Y-m-d' }}"
|
||||
},
|
||||
{
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "ItemList",
|
||||
"name": "Коммерческие предложения для типового окна",
|
||||
"numberOfItems": "{{ PRICE_FRAME|length }}",
|
||||
"itemListElement": [
|
||||
{% for CurOffer in PRICE_FRAME %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Offer",
|
||||
"name": "{{ CurOffer.SETS_NAME|striptags|escapejs }}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}{{ request.path }}#btn{{ CurOffer.SETS_ID }}",
|
||||
"price": "{{ CurOffer.FIN_PRICE|stringformat:'.2f' }}",
|
||||
"priceCurrency": "RUB",
|
||||
"itemCondition": "https://schema.org/NewCondition",
|
||||
"availability": "https://schema.org/InStock",
|
||||
"seller": {
|
||||
"@type": "Organization",
|
||||
"name": "{{ CurOffer.MERCHANT|striptags|escapejs }}"
|
||||
},
|
||||
"itemOffered": {
|
||||
"@type": "Product",
|
||||
"name": "{{ CurOffer.SETS_NAME|striptags|escapejs }}",
|
||||
"additionalProperty": [
|
||||
{
|
||||
"@type": "PropertyValue",
|
||||
"name": "Оконный профиль",
|
||||
"value": "{{ CurOffer.PVC_NAME|striptags|escapejs }}{% if CurOffer.PVC_MANUFACTURER %} ({{ CurOffer.PVC_MANUFACTURER|striptags|escapejs }}){% endif %}"
|
||||
}{% if CurOffer.PVC_MANUFACTURER %},
|
||||
{
|
||||
"@type": "PropertyValue",
|
||||
"name": "Производитель профиля",
|
||||
"value": "{{ CurOffer.PVC_MANUFACTURER|striptags|escapejs }}"
|
||||
}{% endif %}{% if CurOffer.GLAZING_MARK %},
|
||||
{
|
||||
"@type": "PropertyValue",
|
||||
"name": "Стеклопакет",
|
||||
"value": "{{ CurOffer.GLAZING_MARK|striptags|escapejs }}"
|
||||
}{% endif %}
|
||||
]
|
||||
},
|
||||
"dateModified": "{{ CurOffer.SETS_DATA_MODIFY|date:'Y-m-d' }}"{% if CurOffer.SETS_RATING > -0.1 %},
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "{{ CurOffer.SETS_RATING|stringformat:'.2f' }}",
|
||||
"bestRating": "5",
|
||||
"worstRating": "0",
|
||||
"ratingCount": "1"
|
||||
}{% endif %}
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
}
|
||||
]
|
||||
</script>{% endblock %}
|
||||
|
||||
{% block Description %}Цены на типовое окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:0 }}x{{ I_WIN_DIM.iWinHight|floatformat:0 }} см. для домов серий {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}{{ I.sName }}{% endfor %}{% endfor %}.{% endblock %}
|
||||
|
||||
{% comment %}{% block Description %}Цены на пластиковые окна для серии {{ BASE_SERIA }} ({{ APART }} квартира, {{ ADDRESS }}) :: {% for CurOffer in PRICE_FRAME %}Поставщик: {{ CurOffer.MERCHANT }}; Комплектация: {{ CurOffer.SETS_NAME }}; Цена: {{ CurOffer.FIN_PRICE }}₽ :: {% endfor %}{% endblock %}{% endcomment %}
|
||||
@@ -281,14 +146,12 @@ $(function () { // инициализация и обработка попове
|
||||
<span itemscope itemtype="http://schema.org/Product">
|
||||
<div class="row">
|
||||
<div class="col-md-9">
|
||||
<h1 itemprop="name">Цены на окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }}{% endfor %} мм. <small>(типовое)</small></h1>
|
||||
<h1>Цены на окно {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth_mm|floatformat:0 }}×{{ I_WIN_DIM.iWinHight_mm|floatformat:0 }}{% endfor %} мм. <small>(типовое)</small></h1>
|
||||
</div>
|
||||
<div class="col-md-9">
|
||||
<p itemprop="description">Типовой проём {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:1 }}×{{ I_WIN_DIM.iWinHight|floatformat:1 }}{% endfor %} cм. представлен в домах серий: {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}<a href="/catalog/seria/{{ I.sNameLat }}/all{{ I.id }}">{{ I.sName }}</a>{% endfor %}. База «Окнардии» размещено {{ NUM_TOTAL_OFFER_N_WORD }} цен для окон в такой проем (из них в архиве {{ NUM_ARCHIVE_OFFER }}). Предложено {{ NUM_FLAP_VARIATION_IN_WORD }} открывания от {{ NUM_TOTAL_FIRM_N_WORD }}.</p>
|
||||
<p>Типовой проём {% for I_WIN_DIM in FLAP_DIM %}{{ I_WIN_DIM.iWinWidth|floatformat:1 }}×{{ I_WIN_DIM.iWinHight|floatformat:1 }}{% endfor %} cм. представлен в домах серий: {% for I in SERIA_FOR_WIN %}{% if forloop.last %} и {% elif forloop.first %}{% else %}, {% endif %}<a href="/catalog/seria/{{ I.sNameLat }}/all{{ I.id }}">{{ I.sName }}</a>{% endfor %}. База «Окнардии» размещено {{ NUM_TOTAL_OFFER_N_WORD }} цен для окон в такой проем (из них в архиве {{ NUM_ARCHIVE_OFFER }}). Предложено {{ NUM_FLAP_VARIATION_IN_WORD }} открывания от {{ NUM_TOTAL_FIRM_N_WORD }}.</p>
|
||||
</div>
|
||||
{# Микроразметка: название продукта и марка #}
|
||||
<meta itemprop="brand" content="ОКНАРДИЯ — агрегатор цен на окна" />
|
||||
<meta itemprop="productionDate" content="{{ META_DATA_PUBLISH|date:'Y-m-d' }}" />
|
||||
{# Микроразмектка: названеи продукта #}<meta itemprop="name" content="Окна {{ APART|safe }} ({{ ADDRESS }})" />
|
||||
</div>
|
||||
|
||||
<div class="row ShowBigFlapPictures">
|
||||
@@ -313,6 +176,8 @@ $(function () { // инициализация и обработка попове
|
||||
<div class="col-md-12">
|
||||
<p id="tab-note">В таблице представлены только цены поставщиков из базы «Окнардия». Клик на названии набора отобразит детальную спецификацию каждого предложения: профиль рамы и створки, схему стеклопакета, фурнитуру, элементы отлива, подоконника, откоса, системы <nobr>климат-контроля</nobr>) и сопутствующие услуги. Предложения выводятся блоками. Очередной блок выводится кнопкой «Ещё коммерческие предложения окон» под таблицей. Детальные технические характеристики стеклопакетов, профилей и описание сопутствующих услуг можно посмотреть и сравнить с помощью кнопки «Сравнить выбранные».</p>
|
||||
</div>
|
||||
{# Микроразмектка: названеи продукта #}
|
||||
<meta itemprop="name" content="Окна {{ APART|safe }} ({{ ADDRESS }})"/>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
{% if forloop.first %}
|
||||
<th rowspan="{% if CurOffer.DIM|length == 1 %}2{% else %}{{ CurOffer.DIM|length }}{% endif %}" title="Добавить коммерческое предложение окна к сравнению">{# красивые чекбоксы BEGIN #}<div class="checkbox"><label><input id="CHK{{ CurOffer.SETS_ID }}" type="checkbox" name="ForCompare" value="{{ CurOffer.SETS_ID }}" onChange="ChangeCountCheckedBox({{ CurOffer.SETS_ID }});" /><span class="cr"><i class="cr-icon glyphicon glyphicon-ok"></i></span></label></div>{# красивые чекбоксы END #}</th>
|
||||
<td rowspan="{% if CurOffer.DIM|length == 1 %}2{% else %}{{ CurOffer.DIM|length }}{% endif %}"{% if CurOffer.IS_COMMERCIAL %} style="background-image: url(/media/{{ CurOffer.MERCHANT_LOGO }})"{% endif %} title="Краткая спецификация коммерческого предложения">
|
||||
<span>
|
||||
<h3 class="set-name shake-trigger" id="btn{{ CurOffer.SETS_ID }}"><a href="javascript://" onclick="show_dtl({{ CurOffer.SETS_ID }})">{{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}<i class="glyphicon glyphicon-chevron-down shake-vertical"></i></a></h3>
|
||||
<span itemprop="description">
|
||||
<h3 class="set-name shake-trigger" id="btn{{ CurOffer.SETS_ID }}"><a href="javascript://" onclick="show_dtl({{ CurOffer.SETS_ID }})">{{ CurOffer.MERCHANT }} – {{ CurOffer.SETS_NAME }}<i class="glyphicon glyphicon-chevron-down shake-vertical"></i></a></h3>
|
||||
|
||||
<DiV id="dtl{{ CurOffer.SETS_ID }}" class="collapse">■ Профиль: <a href="/catalog/profile/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_MANUFACTURER_T }}/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_NAME_T }}">{{ CurOffer.PVC_NAME|safe }}</a> (<a href="/catalog/profile/{{ CurOffer.PVC_ID }}-{{ CurOffer.PVC_MANUFACTURER_T }}">{{ CurOffer.PVC_MANUFACTURER }}</a>)
|
||||
■ {{ CurOffer.GLAZING_NAME_B|safe }} <nobr>({{ CurOffer.GLAZING_MARK }})</nobr>
|
||||
@@ -29,15 +29,17 @@
|
||||
</DiV>
|
||||
<!-- Дата обновления -->
|
||||
<nobr class="badge badge4price" title="Дата обновления коммерческого предложения окон — {{ CurOffer.SETS_DATA_MODIFY|date:"d.M.Y" }}"><b class="glyphicon glyphicon-calendar"></b> {{ CurOffer.SETS_DATA_MODIFY|date:"d.M.Y" }}</nobr>
|
||||
<!-- Звездочки рейтинга с микроразметкой Rating -->
|
||||
<nobr class="badge badge4price" title="Рейтинг «Окнардии»{% if CurOffer.SETS_RATING > -0.1 %} — {{ CurOffer.SETS_RATING|stringformat:".2f" }} баллов{% endif %}">
|
||||
<a
|
||||
<!-- Звездочки рейтинга -->
|
||||
<nobr class="badge badge4price" title="Рейтинг «Окнардии»{% if CurOffer.SETS_RATING > -0.1 %} — {{ CurOffer.SETS_RATING|stringformat:".2f" }} баллов{% endif %}"><a
|
||||
href="javascript://"
|
||||
id-set="{{ CurOffer.SETS_ID }}"
|
||||
data-trigger="focus" tabindex="0"
|
||||
title="{% if CurOffer.SETS_RATING > 0.01 %}<b> Рейтинг {{ CurOffer.SETS_RATING|stringformat:".2f" }}</b> для оконого набора «{{ CurOffer.SETS_NAME }}» компании «{{ CurOffer.MERCHANT }}» состоит из:{% else %}Рейтинг не присвоен{% endif %}"
|
||||
data-toggle="popover">рейтинг</a>: {% for Star in CurOffer.SETS_RATING_STARTS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if CurOffer.SETS_RATING > -0.1 %}{{ CurOffer.SETS_RATING|stringformat:".2f" }}{% endif %}</nobr>
|
||||
data-toggle="popover">рейтинг</a>: {% for Star in CurOffer.SETS_RATING_STARTS %}{% if Star == 0 %}<b class="glyphicon glyphicon-star-empty"></b>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %} {% if CurOffer.SETS_RATING > -0.1 %} {{ CurOffer.SETS_RATING|stringformat:".2f" }}{% endif %}</nobr>
|
||||
</span>
|
||||
<span itemprop="brand" itemscope itemtype="http://schema.org/Brand">
|
||||
<meta itemprop="name" content="{{ CurOffer.MERCHANT }}" />
|
||||
<meta itemprop="logo" content="https://oknardia.ru/media/{{ CurOffer.MERCHANT_LOGO }}" />
|
||||
</span></td>
|
||||
<!--- Конец большой ячейки со спецификацией оконного предложения --->
|
||||
{% endif %}
|
||||
@@ -48,8 +50,10 @@
|
||||
|
||||
<td class="rnw" title="Стоимость {{ CurOffer.TOTAL|stringformat:".2f" }} рублей за все окна квартиры {{ APART|safe }}.">{{ CurOffer.TOTAL|stringformat:".2f"|price_format }}</td>
|
||||
<th{% if CurOffer.DISCOUNT_COLOR2 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR2 }};"{% endif %} title="{% if CurOffer.DISCOUNT < 0.1 %}Нет скидки{% else %}Скидка — {{ CurOffer.DISCOUNT|stringformat:".1f" }}%{% endif %}">{% if CurOffer.DISCOUNT < 0.1 %}—{% else %}−{{ CurOffer.DISCOUNT|stringformat:".1f" }}%{% endif %}</th>
|
||||
<th{% if CurOffer.DISCOUNT_COLOR1 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR1 }};"{% endif %} title="Итого за все окна с учетом скидки: {{ CurOffer.FIN_PRICE|stringformat:".2f" }} рублей">
|
||||
<th{% if CurOffer.DISCOUNT_COLOR1 != "" %} style="background-color:{{ CurOffer.DISCOUNT_COLOR1 }};"{% endif %} itemprop="offers" itemscope itemtype="http://schema.org/Offer" title="Итого за все окна с учетом скидки: {{ CurOffer.FIN_PRICE|stringformat:".2f" }} рублей">
|
||||
Итого: {{ CurOffer.FIN_PRICE|stringformat:".2f"|price_format }} <small class="glyphicon glyphicon-ruble" aria-label="₽ (руб.)" title="₽ (руб.)"></small>
|
||||
<meta itemprop="price" content="{{ CurOffer.FIN_PRICE }}" />
|
||||
<meta itemprop="priceCurrency" content="RUB" />
|
||||
</th>
|
||||
{% if CurOffer.DIM|length == 1 %}
|
||||
|
||||
|
||||
@@ -1,101 +1,21 @@
|
||||
{% extends "base.html" %}{% load static %}
|
||||
|
||||
{% block Title %}Рейтинг оконных профилей | Ранжирование PVC профилей по характеристикам | Окнардия{% endblock %}
|
||||
{% block Title %}: Тарифы и услуги{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Рейтинг оконных PVC профилей в базе Окнардия: ранжирование моделей профилей по теплопередаче, звукоизоляции и другим характеристикам. Сравнение пластиковых профилей.{% endblock %}
|
||||
{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #}
|
||||
|
||||
{% block Keywords %}рейтинг окон, рейтинг оконных профилей, рейтинг pvc профилей, производители окон, ранжирование профилей, сравнение пластиковых окон, характеристики окон, теплопередача профилей, звукоизоляция окон{% endblock %}
|
||||
{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #}
|
||||
|
||||
{% block Author4Meta %}Рейтинг оконных профилей Окнардия{% endblock %}
|
||||
{% block Description %}Тарифы и услуги маркетплейс-агрегатора Окнардия. Размещение предложений пластиковых и деревянных окон, обновление цен на окна, рекламные баннеры и виджеты на сайт оконной компании.{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}Окнардия — агрегатор цен на окна{% endblock %}
|
||||
{% block Keywords %}типовые проекты зданий, панельное строительство, {% for CountSeria in SERIA_NAV_DIM %}серия {{ CountSeria.SERIA_R }}, {{ CountSeria.SERIA_R }}, {% endfor %}, года постройки, регионы постройки, распространённость{% endblock %}
|
||||
|
||||
{% block Top_JS5 %}
|
||||
<script src="{% static 'js/sortable-table.js' %}" type="text/javascript"></script>{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Метатеги для социальных сетей --> #}
|
||||
<meta name="news_keywords" content="рейтинг окон, рейтинг профилей, производители окон, pvc окна, характеристики профилей" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/stat/rating/profiles_rank/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/stat/rating/profiles_rank/" />
|
||||
<meta property="og:type" content="reference" />
|
||||
<meta property="og:title" content="Рейтинг оконных профилей | Окнардия" />
|
||||
<meta property="og:description" content="Ранжирование PVC профилей по теплопередаче, звукоизоляции и другим характеристикам на основе данных участников маркетплейса Окнардия." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Рейтинг оконных профилей | Окнардия" />
|
||||
<meta name="twitter:description" content="Сравнение и ранжирование PVC профилей по характеристикам теплопередачи и звукоизоляции." />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/stat/rating/profiles_rank/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Метатеги для социальных сетей --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD: BreadcrumbList для рейтинга профилей #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Статистика",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/stat_all/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Рейтинг оконных профилей",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/stat/rating/profiles_rank/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{# JSON-LD: CollectionPage для рейтинга #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Рейтинг оконных профилей",
|
||||
"description": "Ранжирование оконных профилей по теплопередаче, звукоизоляции и другим характеристикам на основе данных участников маркетплейса Окнардия.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/stat/rating/profiles_rank/",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Main_Content %}<div class="container-fluid">
|
||||
{# Хлебные крошки: НАЧАЛО #}
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/stat_all/">Статистика</a></li>
|
||||
<li class="active">Рейтинг оконных профилей</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
{# Хлебные крошки: КОНЕЦ #}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><h1>Рейтинг оконных профилей базы «Окнардия»</h1></div>
|
||||
</div>
|
||||
|
||||
@@ -2,176 +2,19 @@
|
||||
{% load static %}
|
||||
{% load filters %}
|
||||
|
||||
{# Заголовок: человекочитаемый, ключевые слова в начале #}
|
||||
{% block Title %}Сравнение окон: {% for Count in SET_LIST %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}«{{ Count.SET_NAME }}» ({{ Count.MERCHANT }}){% endfor %} — характеристики профилей и стеклопакетов{% endblock %}
|
||||
{% block Title %} Сравнение характеристик оконных профилей: {% for PROFILE in LIST_PROFILE %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ PROFILE }}{% endfor %}. Сравнение характеристик стеклопакетов: {% for GLAZING in LIST_GLAZING %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ GLAZING }}{% endfor %}. Сравнение предложений окон: {% for MERCANT in LIST_MERCHANT %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ MERCANT }}{% endfor %}.{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %}
|
||||
{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"Y-m-d" }}{% endblock %}
|
||||
{% block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
{# Description: первое слово — целевой запрос, потом конкретика #}
|
||||
{% block Description %}Детальное сравнение оконных наборов: {% for Count in SET_LIST %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}«{{ Count.SET_NAME }}» от {{ Count.MERCHANT }}{% endfor %}. Профили: {% for PROFILE in LIST_PROFILE %}{{ PROFILE }}{% if not forloop.last %}, {% endif %}{% endfor %}. Стеклопакеты: {% for GLAZING in LIST_GLAZING %}{{ GLAZING }}{% if not forloop.last %}, {% endif %}{% endfor %}. Теплопередача, звукоизоляция, условия монтажа.{% endblock %}
|
||||
{% block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock %}
|
||||
|
||||
|
||||
{% block Description %}Сравнение характеристик окон от поставщиков: {% for MERCANT in LIST_MERCHANT %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ MERCANT }}{% endfor %}. Сравнение профилей пластиковых окон: {% for PROFILE in LIST_PROFILE %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ PROFILE }}{% endfor %}. Сравнение характеристик стеклопакетов: {% for GLAZING in LIST_GLAZING %}{% if forloop.first %}{% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ GLAZING }}{% endfor %}.{% endblock %}
|
||||
|
||||
{% block Keywords %}сравнение профилей пластиковых окон, {% for PROFILE in LIST_PROFILE %}{{ PROFILE }}, {% endfor %}сравнение стеклопакетов, {% for GLAZING in LIST_GLAZING %}{{ GLAZING }}, {% endfor %}сравнение поставщиков пластиковых окон, {% for MERCANT in LIST_MERCHANT %}{{ MERCANT }}, {% endfor %}характеристики пластиковых окон.{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}
|
||||
{# Canonical — предотвращает дубли при разном порядке ID (1,2 и 2,1 — одна страница) #}
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/compare_offers/{% for Count in SET_LIST %}{{ Count.SET_ID }}{% if not forloop.last %},{% endif %}{% endfor %}/" />
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/compare_offers/{% for Count in SET_LIST %}{{ Count.SET_ID }}{% if not forloop.last %},{% endif %}{% endfor %}/" />
|
||||
<meta property="og:title" content="Сравнение окон: {% for Count in SET_LIST %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}«{{ Count.SET_NAME }}» ({{ Count.MERCHANT|escapejs }}){% endfor %} | oknardia.ru" />
|
||||
<meta property="og:description" content="Сравнение характеристик оконных профилей и стеклопакетов: {% for Count in SET_LIST %}{% if not forloop.first %}, {% endif %}{{ Count.SET_NAME }} от {{ Count.MERCHANT }}{% endfor %}. Теплопередача, звукоизоляция, условия монтажа — агрегатор Окнардия." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Сравнение окон: {% for Count in SET_LIST %}{% if not forloop.first %}, {% endif %}{{ Count.SET_NAME }}{% endfor %} | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Детальная таблица сравнения характеристик оконных профилей и стеклопакетов от поставщиков: {% for MERCANT in LIST_MERCHANT %}{{ MERCANT }}{% if not forloop.last %}, {% endif %}{% endfor %}." />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD разметка для страницы сравнения оконных наборов.
|
||||
BreadcrumbList: хлебные крошки в сниппете Google.
|
||||
TechArticle + mainEntity ItemList: описывает страницу как технический сравнительный материал.
|
||||
Каждый набор — Product с:
|
||||
- additionalProperty: полный список условий поставки и монтажа
|
||||
- hasPart[0]: профиль ПВХ как вложенный Product со всеми техническими PropertyValue
|
||||
- hasPart[1]: стеклопакет как вложенный Product со всеми техническими PropertyValue
|
||||
Хак с запятыми: последним в каждом additionalProperty ставим фиксированный элемент
|
||||
{"@type":"PropertyValue","name":"Источник данных","value":"oknardia.ru"} — благодаря этому
|
||||
все условные элементы выше могут безопасно завершаться запятой.
|
||||
{% endcomment %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@graph": [
|
||||
{
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{"@type": "ListItem", "position": 1, "name": "Главная", "item": "{{ request.scheme }}://{{ request.get_host }}/"},
|
||||
{"@type": "ListItem", "position": 2, "name": "Каталог", "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"},
|
||||
{"@type": "ListItem", "position": 3, "name": "Оконные наборы", "item": "{{ request.scheme }}://{{ request.get_host }}/catalog/sets/"},
|
||||
{"@type": "ListItem", "position": 4,
|
||||
"name": "Сравнение: {% for Count in SET_LIST %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME|escapejs }}{% endfor %}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/compare_offers/{% for Count in SET_LIST %}{{ Count.SET_ID }}{% if not forloop.last %},{% endif %}{% endfor %}/"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"@type": "TechArticle",
|
||||
"inLanguage": "ru-RU",
|
||||
"headline": "Сравнение оконных наборов: {% for Count in SET_LIST %}{% if not forloop.first %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME|escapejs }} ({{ Count.MERCHANT|escapejs }}){% endfor %}",
|
||||
"description": "Детальная техническая таблица сравнения оконных профилей ({% for PROFILE in LIST_PROFILE %}{{ PROFILE|escapejs }}{% if not forloop.last %}, {% endif %}{% endfor %}) и стеклопакетов ({% for GLAZING in LIST_GLAZING %}{{ GLAZING|escapejs }}{% if not forloop.last %}, {% endif %}{% endfor %}) от поставщиков «Окнардии» — характеристики теплопередачи, звукоизоляции, условия монтажа.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/compare_offers/{% for Count in SET_LIST %}{{ Count.SET_ID }}{% if not forloop.last %},{% endif %}{% endfor %}/",
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg",
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}",
|
||||
"logo": {"@type": "ImageObject", "url": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg"}
|
||||
},
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия — агрегатор цен на замену окон",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "ItemList",
|
||||
"name": "Сравниваемые оконные наборы",
|
||||
"numberOfItems": {{ SET_LIST|length }},
|
||||
"itemListElement": [{% for Count in SET_LIST %}
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": {{ forloop.counter }},
|
||||
"item": {
|
||||
"@type": "Product",
|
||||
"@id": "{{ request.scheme }}://{{ request.get_host }}/compare_offers/{% for C in SET_LIST %}{{ C.SET_ID }}{% if not forloop.last %},{% endif %}{% endfor %}/#set-{{ Count.SET_ID }}",
|
||||
"name": "{{ Count.SET_NAME|escapejs }}",
|
||||
"brand": {"@type": "Brand", "name": "{{ Count.MERCHANT|escapejs }}"},
|
||||
"description": "Оконный набор с профилем {{ Count.PROFILE_NAME|escapejs }} ({{ Count.PROFILE_MANUFACTURER|escapejs }}) и стеклопакетом {{ Count.GLAZING_MARK|escapejs }}.{% if Count.PROFILE_HEAT_TRANSFER > 0.1 %} Сопротивление теплопередаче профиля {{ Count.PROFILE_HEAT_TRANSFER|stringformat:".2f" }} м²·°C/Вт.{% endif %}{% if Count.GLAZING_HEAT_TRANSFER > 0.1 %} Теплопередача стеклопакета {{ Count.GLAZING_HEAT_TRANSFER|stringformat:".2f" }} м²·°C/Вт.{% endif %}",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/company/{{ Count.MERCHANT_ID }}-{{ Count.MERCHANT_T }}/",
|
||||
"image": "http://oknardia.ru/media/{{ Count.MERCHANT_LOGO }}",
|
||||
{% if Count.RATING_SET_N > 0.1 %}
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "{{ Count.RATING_SET_N|stringformat:".2f" }}",
|
||||
"bestRating": "5", "worstRating": "0", "reviewCount": "1"
|
||||
},
|
||||
{% endif %}
|
||||
"additionalProperty": [
|
||||
{% if Count.SET_IMPLEMENTS_ALL %}{"@type": "PropertyValue", "name": "Фурнитура", "value": "{{ Count.SET_IMPLEMENTS_ALL|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_IMPLEMENTS_HANDLES %}{"@type": "PropertyValue", "name": "Ручки", "value": "{{ Count.SET_IMPLEMENTS_HANDLES|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_IMPLEMENTS_HINGES %}{"@type": "PropertyValue", "name": "Петли", "value": "{{ Count.SET_IMPLEMENTS_HINGES|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_IMPLEMENTS_LATCH %}{"@type": "PropertyValue", "name": "Механизмы запирания", "value": "{{ Count.SET_IMPLEMENTS_LATCH|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_IMPLEMENTS_LIMITER %}{"@type": "PropertyValue", "name": "Ограничители открывания", "value": "{{ Count.SET_IMPLEMENTS_LIMITER|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_IMPLEMENTS_CATCH %}{"@type": "PropertyValue", "name": "Фиксаторы открывания", "value": "{{ Count.SET_IMPLEMENTS_CATCH|escapejs }}"},{% endif %}
|
||||
{% if Count.SET_CLIMATE_CONTROL|length > 3 %}{"@type": "PropertyValue", "name": "Климат-контроль", "value": "{{ Count.SET_CLIMATE_CONTROL|escapejs }}"},{% endif %}
|
||||
{"@type": "PropertyValue", "name": "Подоконники", "value": "{{ Count.SET_STILL|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Водоотливы", "value": "{{ Count.SET_PANES|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Откосы", "value": "{{ Count.SET_SLOPE|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Доставка", "value": "{{ Count.SET_DELIVERY|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Демонтаж и монтаж", "value": "{{ Count.SET_UNINSTALL_INSTALL|escapejs }}"},
|
||||
{% if Count.SET_OTHER_CONDITIONS %}{"@type": "PropertyValue", "name": "Прочие условия", "value": "{{ Count.SET_OTHER_CONDITIONS|escapejs }}"},{% endif %}
|
||||
{"@type": "PropertyValue", "name": "Источник данных", "value": "oknardia.ru"}
|
||||
],
|
||||
"hasPart": [
|
||||
{
|
||||
"@type": "Product",
|
||||
"@id": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ Count.PROFILE_ID }}-{{ Count.PROFILE_MANUFACTURER_T }}/{{ Count.PROFILE_ID }}-{{ Count.PROFILE_NAME_T }}/",
|
||||
"name": "{{ Count.PROFILE_NAME|escapejs }}",
|
||||
"description": "ПВХ-профиль {{ Count.PROFILE_MANUFACTURER|escapejs }} {{ Count.PROFILE_NAME|escapejs }}",
|
||||
"brand": {"@type": "Brand", "name": "{{ Count.PROFILE_MANUFACTURER|escapejs }}"},
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/profile/{{ Count.PROFILE_ID }}-{{ Count.PROFILE_MANUFACTURER_T }}/{{ Count.PROFILE_ID }}-{{ Count.PROFILE_NAME_T }}/",
|
||||
"additionalProperty": [
|
||||
{% if Count.PROFILE_NUM_COLOR %}{"@type": "PropertyValue", "name": "Цвет профиля", "value": "{{ Count.PROFILE_NUM_COLOR|escapejs }}"},{% endif %}
|
||||
{% if Count.PROFILE_NUM_CAMERAS and Count.PROFILE_NUM_CAMERAS != "—" %}{"@type": "PropertyValue", "name": "Число камер рамы/створки", "unitText": "шт.", "value": "{{ Count.PROFILE_NUM_CAMERAS }}"},{% endif %}
|
||||
{% if Count.PROFILE_NUM_SEALS > 0 %}{"@type": "PropertyValue", "name": "Контуры уплотнения", "unitText": "шт.", "value": {{ Count.PROFILE_NUM_SEALS }}},{% endif %}
|
||||
{% if Count.PROFILE_THICKNESS > 5 %}{"@type": "PropertyValue", "name": "Монтажная ширина профиля", "unitCode": "MMT", "unitText": "мм", "value": {{ Count.PROFILE_THICKNESS }}},{% endif %}
|
||||
{% if Count.PROFILE_GLAZING_THICKNESS > 4 %}{"@type": "PropertyValue", "name": "Макс. толщина стеклопакета", "unitCode": "MMT", "unitText": "мм", "value": {{ Count.PROFILE_GLAZING_THICKNESS }}},{% endif %}
|
||||
{% if Count.PROFILE_HEAT_TRANSFER > 0.1 %}{"@type": "PropertyValue", "name": "Сопротивление теплопередаче (Ro)", "unitText": "м²·°C/Вт", "value": {{ Count.PROFILE_HEAT_TRANSFER|stringformat:".2f" }}},{% endif %}
|
||||
{% if Count.PROFILE_SOUND_PROOFING > 1 %}{"@type": "PropertyValue", "name": "Коэффициент звукоизоляции", "unitText": "дБ", "value": {{ Count.PROFILE_SOUND_PROOFING|stringformat:".1f" }}},{% endif %}
|
||||
{% if Count.PROFILE_HEIGHT > 15 %}{"@type": "PropertyValue", "name": "Высота в световом проеме (рама+створка)", "unitCode": "MMT", "unitText": "мм", "value": {{ Count.PROFILE_HEIGHT }}},{% endif %}
|
||||
{% if Count.PROFILE_RABBET > 1 %}{"@type": "PropertyValue", "name": "Фальц рамы", "unitCode": "MMT", "unitText": "мм", "value": {{ Count.PROFILE_RABBET }}},{% endif %}
|
||||
{% if Count.PROFILE_REINFORCEMENT %}{"@type": "PropertyValue", "name": "Армирование профиля", "value": "{{ Count.PROFILE_REINFORCEMENT|escapejs }}"},{% endif %}
|
||||
{% if Count.PROFILE_FILLET %}{"@type": "PropertyValue", "name": "Штапик", "value": "{{ Count.PROFILE_FILLET|escapejs }}"},{% endif %}
|
||||
{% if Count.PROFILE_SEAL_DESCRIPTION %}{"@type": "PropertyValue", "name": "Уплотнитель", "value": "{{ Count.PROFILE_SEAL_DESCRIPTION|escapejs }}"},{% endif %}
|
||||
{% if Count.PROFILE_OTHER %}{"@type": "PropertyValue", "name": "Прочие характеристики профиля", "value": "{{ Count.PROFILE_OTHER|escapejs }}"},{% endif %}
|
||||
{"@type": "PropertyValue", "name": "Источник данных", "value": "oknardia.ru"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"@type": "Product",
|
||||
"name": "{{ Count.GLAZING_MARK|escapejs }}",
|
||||
"description": "{% if Count.GLAZING_BRIEF_DESCRIPTION %}{{ Count.GLAZING_BRIEF_DESCRIPTION|escapejs }}{% else %}Стеклопакет {{ Count.GLAZING_MARK|escapejs }}{% endif %}",
|
||||
{% if Count.GLAZING_MANUFACTURER and Count.GLAZING_MANUFACTURER != "—//—" %}"brand": {"@type": "Brand", "name": "{{ Count.GLAZING_MANUFACTURER|escapejs }}"},{% endif %}
|
||||
"additionalProperty": [
|
||||
{% if Count.GLAZING_CAMERAS_NUM >= 1 %}{"@type": "PropertyValue", "name": "Камер в стеклопакете", "unitText": "шт.", "value": {{ Count.GLAZING_CAMERAS_NUM }}},{% endif %}
|
||||
{% if Count.GLAZING_THICKNESS >= 3 %}{"@type": "PropertyValue", "name": "Толщина стеклопакета", "unitCode": "MMT", "unitText": "мм", "value": {{ Count.GLAZING_THICKNESS }}},{% endif %}
|
||||
{% if Count.GLAZING_HEAT_TRANSFER > 0.1 %}{"@type": "PropertyValue", "name": "Сопротивление теплопередаче (Ro)", "unitText": "м²·°C/Вт", "value": {{ Count.GLAZING_HEAT_TRANSFER|stringformat:".2f" }}},{% endif %}
|
||||
{% if Count.GLAZING_SOUNDPROOFING >= 10 %}{"@type": "PropertyValue", "name": "Коэффициент звукоизоляции", "unitText": "дБ", "value": {{ Count.GLAZING_SOUNDPROOFING|stringformat:".1f" }}},{% endif %}
|
||||
{% if Count.GLAZING_LIGHT_TRANSMISSION >= 1 %}{"@type": "PropertyValue", "name": "Коэффициент светопропускания", "unitCode": "P1", "unitText": "%", "value": {{ Count.GLAZING_LIGHT_TRANSMISSION|stringformat:".0f" }}},{% endif %}
|
||||
{% if Count.GLAZING_PASSING_SUN >= 1 %}{"@type": "PropertyValue", "name": "Коэффициент солнцепропускания", "unitCode": "P1", "unitText": "%", "value": {{ Count.GLAZING_PASSING_SUN|stringformat:".0f" }}},{% endif %}
|
||||
{% if Count.GLAZING_LIGHT_REFLECTION and Count.GLAZING_LIGHT_REFLECTION != "—/—" %}{"@type": "PropertyValue", "name": "Коэффициент светоотражения (внешний/внутренний)", "unitText": "%", "value": "{{ Count.GLAZING_LIGHT_REFLECTION|escapejs }}"},{% endif %}
|
||||
{% if Count.GLAZING_REFLECTION_AND_ABSORPTION and Count.GLAZING_REFLECTION_AND_ABSORPTION != "—/—" %}{"@type": "PropertyValue", "name": "Теплоотражение/теплопоглощение", "unitText": "%", "value": "{{ Count.GLAZING_REFLECTION_AND_ABSORPTION|escapejs }}"},{% endif %}
|
||||
{"@type": "PropertyValue", "name": "Тонирование", "value": "{{ Count.GLAZING_TONING|escapejs }}"},
|
||||
{"@type": "PropertyValue", "name": "Источник данных", "value": "oknardia.ru"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}{% if not forloop.last %},{% endif %}{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Top_JS3%}<script type="text/javascript">
|
||||
$(function () {
|
||||
$('[data-toggle="popover"]').popover({
|
||||
@@ -193,31 +36,23 @@ TechArticle + mainEntity ItemList: описывает страницу как т
|
||||
})
|
||||
</script>{% endblock %}
|
||||
|
||||
|
||||
{% block Top_CSS1 %}{% endblock %}
|
||||
|
||||
{% block Main_Content %}<!--- ------------------------------------------------------------------------------------------------------------------------- --->
|
||||
<div class="row col-xs-12">
|
||||
<div class="col-md-9 col-xs-8">
|
||||
{# Хлебные крошки: Главная → Каталог → Оконные наборы (ссылка) → текущее сравнение #}
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/sets/">Оконные наборы</a></li>
|
||||
<li>Сравнение:{% for Count in SET_LIST %}{% if forloop.first %} {% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}«{{ Count.SET_NAME }}»{% endfor %}</li>
|
||||
</ol>
|
||||
{# Исправлена опечатка: «Сравнении» → «Сравнение» #}
|
||||
<h1>Сравнение оконных наборов:{% for Count in SET_LIST %}{% if forloop.first %} {% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME }}{% if forloop.last %}.{% endif %}{% endfor %}</h1>
|
||||
<h1>Сравнении оконных наборов:{% for Count in SET_LIST %}{% if forloop.first %} {% else %}{% if forloop.last %} и {% else %}, {% endif %}{% endif %}{{ Count.SET_NAME }}{% if forloop.last %}.{% endif %}{% endfor %}</h1>
|
||||
<p>Оконный набор — это комплект оконного профиля (рамы и сворки), стеклопакета, фурнитуры и уплотнителей — готовое окно в сборе для установки в проём. В набор может входить отлив, подоконник, откос, встраиваемые системы <nobr>климат-контроля</nobr>, оконная фурнитура открывания, запоры, уплотнители, москитная сетка… а также сопутствующие услуги: демонтаж старых и установка новых окон, доставка, гарантийное обслуживание, уборка, вынос и утилизация строительного мусора, защитное укрытие мебели на время монтажа и другое.</p>
|
||||
{# h4 → h2 для правильной иерархии заголовков (SEO); визуальный размер сохраняем через style #}
|
||||
<h2 style="font-size:1em;font-weight:bold;margin-top:1em;">В таблицу сравнения услуг и условий, входящих в оконные наборы, добавлены следующие производители и поставщики:</h2>
|
||||
<h4>В таблицу сравнения услуг и условий, входящих в оконные наборы, добавлены следующие производители и поставщики:</h4>
|
||||
<ul>{% for MERCANT in LIST_MERCHANT %}
|
||||
<li>{{ MERCANT }}.</li>{% endfor %}
|
||||
</ul>
|
||||
<h2 style="font-size:1em;font-weight:bold;margin-top:1em;">В средней части таблицы вы сможете сравнить характеристики оконных профилей в наборах:</h2>
|
||||
<h4>В средней части таблице вы сможете сравнить характеристики оконных профилей в наборах:</h4>
|
||||
<ul>{% for PROFILE in LIST_PROFILE %}
|
||||
<li>{{ PROFILE }}.</li>{% endfor %}
|
||||
</ul>
|
||||
<h2 style="font-size:1em;font-weight:bold;margin-top:1em;">Нижний блок таблицы посвящен характеристикам и сравнению стеклопакетов в наборах. Формулы выбранных стеклопакетов:</h2>
|
||||
<h4>Нижний блок таблицы посвящен характеристикам и сравнению стеклопакетов в наборах. Формулы выбранных стеклопакетов:</h4>
|
||||
<ul>{% for GLAZING in LIST_GLAZING %}
|
||||
<li>{{ GLAZING }}.</li>{% endfor %}
|
||||
</ul>
|
||||
@@ -231,18 +66,14 @@ TechArticle + mainEntity ItemList: описывает страницу как т
|
||||
<thead>
|
||||
<tr style="background:white;">
|
||||
<th class="col-sm-2">Поставщик:<br /><small style="font-size:small;font-weight:100;">компания, предлагающая установку окон</small></th>{% for Count in SET_LIST %}
|
||||
<th class="col-xs-1" title="Установку окон предлагает компания «{{ Count.MERCHANT }}»">
|
||||
{# h2 в ячейке таблицы — семантический мусор; заменяем на strong #}
|
||||
<strong>{{ Count.MERCHANT }}</strong><br />
|
||||
<th class="col-xs-1" title="Установку окон предлагает компания «{{ Count.MERCHANT }}»"><h2 style="font-size:1em;margin:0;font-weight:bold;">{{ Count.MERCHANT }}</h2><br />
|
||||
<img src="http://oknardia.ru/media/{{ Count.MERCHANT_LOGO }}" style="height: 25px;width:auto;" alt="{{ Count.MERCHANT }}"><br />
|
||||
<div class="url"><nobr>{% if Count.IS_COMMERCIAL %}<a href="{{ Count.MERCHANT_URL }}" target="_blank" rel="nofollow">{{ Count.MERCHANT_URL_SHOT|truncatechars:30 }}</a>{% else %}{{ Count.MERCHANT_URL_SHOT|truncatechars:30 }}{% endif %}</nobr><br /><a href="/catalog/company/{{ Count.MERCHANT_ID }}-{{ Count.MERCHANT_T }}/">в каталоге</a></div>
|
||||
</th>{% endfor %}
|
||||
</tr>
|
||||
<tr>
|
||||
</tr><tr>
|
||||
<th>Название набора:</th>{% for Count in SET_LIST %}
|
||||
<th title="Название оконного набора: «{{ Count.SET_NAME }}»">{{ Count.SET_NAME|truncatechars:25 }}</th>{% endfor %}
|
||||
</tr>
|
||||
<tr class="rating">
|
||||
</tr><tr class="rating">
|
||||
<th><nobr>Рейтиг «Окнардии»:</nobr></th>{% for Count in SET_LIST %}
|
||||
<td{% if Count.RATING_SET_COLOR != "" %} style="background:{{ Count.RATING_SET_COLOR }};"{% endif %}>
|
||||
<nobr title="Рейтинг «Окнардии» для окон набора «{{ Count.SET_NAME }}» компании «{{ Count.MERCHANT }}» — {% if Count.RATING_SET_N > 0.1 %}{{ Count.RATING_SET_N|stringformat:".2f" }}{% else %}не присвоен{% endif %}"><!-- НАЧАЛО звездочки рейтинга -->{% for Star in Count.RATING_SET %}{% if Star == 0 %}<i class="glyphicon glyphicon-star-empty"></i>{% else %}<b class="glyphicon glyphicon-star"></b>{% endif %}{% endfor %}<!-- КОНЕЦ звездочки рейтинга НАЧАЛО бедж --> {% if Count.RATING_SET_N > 0.1 %}<tt class="badge">{{ Count.RATING_SET_N|stringformat:".2f" }}</tt>{% endif %}<!-- КОНЕЦ бедж --> <a
|
||||
@@ -343,7 +174,7 @@ TechArticle + mainEntity ItemList: описывает страницу как т
|
||||
<td{% if Count.PROFILE_FILLET != "" %} title="Характеристики штапика: {{ Count.PROFILE_FILLET }}"{% endif %}>{% if Count.PROFILE_FILLET != "" %}{{ Count.PROFILE_FILLET }}{% else %}—{% endif %}</td>{% endfor %}
|
||||
</tr><tr>
|
||||
<th>Уплотнитель:</th>{% for Count in SET_LIST %}
|
||||
<td{% if Count.PROFILE_SEAL_DESCRIPTION != "" %} title="Характеристики уплотнитель стеклопакета и контуров рама-створка: {{ Count.PROFILE_SEAL_DESCRIPTION|lower }}"{% endif %}>{% if Count.PROFILE_SEAL_DESCRIPTION != "" %}{{ Count.PROFILE_SEAL_DESCRIPTION|capfirst }}{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td{% if Count.PROFILE_SEAL_DESCRIPTION != "" %} title="Хараектеристики уплотнитель стеклопакета и контуров рама-створка: {{ Count.PROFILE_SEAL_DESCRIPTION|lower }}"{% endif %}>{% if Count.PROFILE_SEAL_DESCRIPTION != "" %}{{ Count.PROFILE_SEAL_DESCRIPTION|capfirst }}{% else %}—{% endif %}</td>{% endfor %}
|
||||
</tr><tr>
|
||||
<th>Прочие характеристики:</th>{% for Count in SET_LIST %}
|
||||
<td{% if Count.PROFILE_OTHER != "" %} title="Прочие характеристики рамы и створки: {{ Count.PROFILE_OTHER }}"{% endif %}><small>{% if Count.PROFILE_OTHER != "" %}{{ Count.PROFILE_OTHER }}{% else %}—{% endif %}</small></td>{% endfor %}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{% load static %}<!-- Информация об адресах, просмотренных текущим пользователем (читается из браузерных кук) -->
|
||||
<div class="col-xs-12">
|
||||
<div class="col-md-11 col-xs-12{% if background_color != "None" %} last_user_visit{% endif %}" id="last_user_visit_container" style="display:none;">
|
||||
<h5>Цены на окна просмотренные вами:</h5>
|
||||
<ul id="last_visits_list"></ul>
|
||||
<!--- Информация об адресах просмотренных текущим пользователем --->{% load filters %}
|
||||
{% if LAST_VISIT and LAST_VISIT|length >= 1 %}<div class="col-xs-12">
|
||||
<div class="col-md-11 col-xs-12 last_user_visit"><h5>Цены на окна просмотренные вами:</h5>
|
||||
<ul>{% for ITEM in LAST_VISIT %}
|
||||
<li><a href="{{ ITEM.LastURL }}">Цены на окна для серии {{ ITEM.LastApart }} <small>({{ ITEM.LastAddress }})</small></a> <small>{{ ITEM.Time }}</small></li>{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" src="{% static 'js/last_user_visit.js' %}"></script>
|
||||
</div>{% endif %}
|
||||
@@ -1,4 +1,4 @@
|
||||
{# Отрисовка больших картинок с проемами и схемами открывания #}{% load static %}{% if WIN_DIM %}
|
||||
{# Отрисовка больших картинок с проемами и схамаи открывания #}{% load static %}{% if WIN_DIM %}
|
||||
{% for I_WIN_DIM in FLAP_DIM %}
|
||||
<div class="win_discr pull-left" id="flap{{ forloop.counter0 }}">
|
||||
<div><img src="{% static I_WIN_DIM.url2img %}" alt="{{ I_WIN_DIM.sDescription }}. Размер {{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 (Ш х В, мм.). Типовая схема открывания." title="{{ I_WIN_DIM.sDescription }}. Размер {{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
@@ -6,7 +6,7 @@
|
||||
<nobr>{{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0×{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 мм.</nobr><br />{% if not I_WIN_DIM.iQuantity == 0 %}
|
||||
<nobr><b>{{ I_WIN_DIM.iQuantity }} шт.</b>{% for I_II in I_WIN_DIM.qStr %}<span class="color-bullet" style="background-image:url('{% static 'img/svg/mark' %}{{ I_II }}.svg');"></span>{% endfor %}</nobr><br />{% endif %}
|
||||
{{ I_WIN_DIM.sDescription }}{% if not I_WIN_DIM.iQuantity == 0 %}<br />
|
||||
<a href="/catalog/standard_opening/price-{{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0mm-tip{{ I_WIN_DIM.id }}">цены только этого типового окна</a>{% endif %}
|
||||
<a href="/tsena-odnogo-okna/{{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0mm/tip{{ I_WIN_DIM.id }}">цены только этого типового окна</a>{% endif %}
|
||||
</div>
|
||||
</div>{% endfor %}{% comment %}
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -7,107 +7,9 @@
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Серия {{ THIS_SERIA_NAME }}: типовые размеры оконных проёмов, схемы открывания, планировки квартир, карта зданий, статистика и цены на замену окон в домах этой серии.{% endblock %}
|
||||
{% block Description %}Дома серии {{ THIS_SERIA_NAME }}: детальная информация{% endblock %}
|
||||
|
||||
{% block Keywords %}{{ THIS_SERIA_NAME }}, серия {{ THIS_SERIA_NAME }}, проект {{ THIS_SERIA_NAME }}, года постройки зданий серии {{ THIS_SERIA_NAME }}, размеры окон в домах серии {{ THIS_SERIA_NAME }}, оконные проемы зданий серии {{ THIS_SERIA_NAME }}, дома серии {{ THIS_SERIA_NAME }} на карте, установка окон, цены на пластиковые окна{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}
|
||||
{# Canonical — предотвращает дубли при возможных GET-параметрах #}<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/" />
|
||||
<meta property="og:title" content="Серия {{ THIS_SERIA_NAME }}: размеры окон, планировки и карта домов | oknardia.ru" />
|
||||
<meta property="og:description" content="Типовые размеры и схемы открывания оконных проёмов в домах серии {{ THIS_SERIA_NAME }}. Карта зданий, статистика ввода в эксплуатацию по годам и цены на замену окон." />{% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %}
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/media/{{ THIS_SERIA_IMAGE_URL }}" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/media/{{ THIS_SERIA_IMAGE_URL }}" />{% else %}
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta name="twitter:title" content="Серия {{ THIS_SERIA_NAME }}: размеры окон, планировки и карта домов | oknardia.ru" />
|
||||
<meta name="twitter:description" content="Типовые оконные проёмы, схемы открывания и цены на замену окон в домах серии {{ THIS_SERIA_NAME }}." />{% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %}
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/media/{{ THIS_SERIA_IMAGE_URL }}" />{% else %}
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />{% endif %}
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/" />
|
||||
{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}{% comment %}
|
||||
JSON-LD для страницы серии типового строительства.
|
||||
BreadcrumbList: Google показывает хлебные крошки в сниппете вместо сырого URL — это важно,
|
||||
т.к. URL вида /catalog/seria/p-44/all7 выглядит некрасиво без расшифровки.
|
||||
TechArticle: описывает страницу как технический справочный материал по серии домов.
|
||||
{% endcomment %}
|
||||
{# JSON-LD: BreadcrumbList #}<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Каталог",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 3,
|
||||
"name": "Типовые серии домов",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 4,
|
||||
"name": "Серия {{ THIS_SERIA_NAME|escapejs }}",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{# JSON-LD: TechArticle — технический справочный материал о серии типового строительства #}<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "TechArticle",
|
||||
"inLanguage": "ru-RU",
|
||||
"headline": "Серия {{ THIS_SERIA_NAME|escapejs }}: типовые размеры оконных проёмов, схемы открывания и карта зданий",
|
||||
"description": "Технические характеристики оконных проёмов в домах типовой серии {{ THIS_SERIA_NAME|escapejs }}: размеры, схемы открывания, планировки квартир, карта зданий на территории России. Статистика ввода зданий в эксплуатацию по годам.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/catalog/seria/{{ THIS_SERIA_NAME_T }}/all{{ THIS_SERIA_ID }}/", {% if THIS_SERIA_IMAGE_URL and THIS_SERIA_IMAGE_URL != "null.gif" %}
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/media/{{ THIS_SERIA_IMAGE_URL }}",{% else %}
|
||||
"image": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg",{% endif %}
|
||||
"about": {
|
||||
"@type": "Thing",
|
||||
"name": "Серия типового строительства {{ THIS_SERIA_NAME|escapejs }}",
|
||||
"description": "Типовой проект жилых зданий серии {{ THIS_SERIA_NAME|escapejs }} в России"
|
||||
},
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg"
|
||||
}
|
||||
},
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия — агрегатор цен на замену окон",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% block Keywords %} {{ THIS_SERIA_NAME }}, серия {{ THIS_SERIA_NAME }}, проект {{ THIS_SERIA_NAME }}, года постройки зданий серии {{ THIS_SERIA_NAME }}, размеры окон в домах серии {{ THIS_SERIA_NAME }}, оконные проемы зданий серии {{ THIS_SERIA_NAME }}, дома серии {{ THIS_SERIA_NAME }} на карте, установка окон, цены на пластиковые окна{% endblock %}
|
||||
|
||||
{% block Top_JS1 %}
|
||||
<script type="text/javascript">
|
||||
@@ -132,47 +34,44 @@ TechArticle: описывает страницу как технический
|
||||
</div>
|
||||
</div>{# <!--- Хлебные крошки: КОНЕЦ ---> #}
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{# ВЕРХНЯЯ СТАТЬЯ: рендерится динамически (из БД), можно редактировать через админку #}
|
||||
<div>{{ THIS_SERIA_DESCRIPTION|safe }}</div>
|
||||
</div>
|
||||
<div class="col-md-12">{{ THIS_SERIA_DESCRIPTION|safe }}</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии {{ THIS_SERIA_NAME }}: типовые размеры и схемы открывания</h2>
|
||||
<h2 class="header">Дома серии {{ THIS_SERIA_NAME }}: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
{# СХЕМЫ ОТКРЫВАНИЯ: статическая часть, если используется кеш #}
|
||||
{% if PRE_RENDERED_STATIC_FLAPS_PATH %}
|
||||
{% include PRE_RENDERED_STATIC_FLAPS_PATH %}
|
||||
{% else %}
|
||||
{% include 'report/show_big_flap_pictures.html' %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии {{ THIS_SERIA_NAME }}</nobr></h3>
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии {{ THIS_SERIA_NAME }}</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
{# ТАБЛИЦА ОКОН: часть, которая считается при каждом запросе #}
|
||||
{% include "seria_info/all_seria_info_pre_light_dynamic_include.html" %}
|
||||
</div>
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% templatetag openblock %} for row in TABLE_OF_WINDOWS {% templatetag closeblock %}
|
||||
<tr class="tr2">
|
||||
<td>{% templatetag openvariable %} row.APART_NAME|safe {% templatetag closevariable %}</td>{% templatetag openblock %} for col in row.WIN_IN_APART {% templatetag closeblock %}
|
||||
<td class="cntr">{% templatetag openblock %} if col.WIN_ID {% templatetag closeblock %}<nobr title="{% templatetag openvariable %} col.WIN_Q {% templatetag closevariable %} × {% templatetag openvariable %} col.WIN_DESCRIPTION {% templatetag closevariable %}: {% templatetag openvariable %} col.WIN_WIDTH {% templatetag closevariable %}шт.: {% templatetag openvariable %} col.WIN_HEIGHT {% templatetag closevariable %} (Ш×В, см.). Схема открывания: {% templatetag openvariable %} col.WIN_FLAPCFG {% templatetag closevariable %}">{% templatetag openblock %} for I_II in col.WIN_NUM {% templatetag closeblock %}<span style="background-image:url('{% static 'img/svg/mark' %}{% templatetag openvariable %} I_II {% templatetag closevariable %}.svg');"> </span>{% templatetag openblock %} endfor {% templatetag closeblock %}</nobr>{% templatetag openblock %} else {% templatetag closeblock %}—{% templatetag openblock %} endif {% templatetag closeblock %}</td>{% templatetag openblock %} endfor {% templatetag closeblock %}
|
||||
<td style="background:#f9f9f9;"><a href="#{% templatetag openvariable %} row.APART_ID {% templatetag closevariable %}" class="badge" title="Оконных предложений для квартиры: {% templatetag openvariable %} row.NUM_OFFERS {% templatetag closevariable %}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {% templatetag openvariable %} row.NUM_OFFERS {% templatetag closevariable %}</a></td>
|
||||
</tr>{% templatetag openblock %} endfor {% templatetag closeblock %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-{% now "Y" %}, данные: oknardia.ru</td>{% templatetag openblock %} for i in WIN_OFFER_AND_MERCHANT {% templatetag closeblock %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{% templatetag openvariable %} i.WIN_W|floatformat:0 {% templatetag closevariable %}0x{% templatetag openvariable %} i.WIN_H|floatformat:0 {% templatetag closevariable %}0mm/tip{% templatetag openvariable %} i.WIN_ID {% templatetag closevariable %}" class="badge" title="Ценовых предложений для окна: {% templatetag openvariable %} i.WIN_OFFER {% templatetag closevariable %}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {% templatetag openvariable %} i.WIN_OFFER {% templatetag closevariable %}</a></td>{% templatetag openblock %} endfor {% templatetag closeblock %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия {{ THIS_SERIA_NAME }}: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;" id="graph">
|
||||
{# ГРАФИК: статическая часть, если используется кеш #}
|
||||
{% if PRE_RENDERED_STATIC_GRAPH_PATH %}
|
||||
{% include PRE_RENDERED_STATIC_GRAPH_PATH %}
|
||||
{% else %}
|
||||
{% include 'seria_info/all_seria_info_pre_light_static_graph.html' %}
|
||||
{% endif %}
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
{% include 'seria_info/yaer_graph.html' %}
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-{% now "Y" %}, данные: oknardia.ru</div>
|
||||
@@ -185,41 +84,34 @@ TechArticle: описывает страницу как технический
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<div id="SeriaMap" style="height: 100%;"></div>
|
||||
</div>
|
||||
<div style="height:350px;">{% include 'seria_info/geo_map.html' %}</div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-{% now "Y" %}, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
{# КАРТА И СТАТИСТИКА: статическая часть, если используется кеш #}
|
||||
{% if PRE_RENDERED_STATIC_MAP_STATS_PATH %}
|
||||
{% include PRE_RENDERED_STATIC_MAP_STATS_PATH %}
|
||||
{% else %}
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии {{ THIS_SERIA_NAME }}</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>{{ ACCOUNTS|price_format }}</strong> квартир.</li>
|
||||
<li>Проживает <strong>{{ APARTMENTS|price_format }}</strong> семей <small>(<strong>{{ RESIDENTS|price_format }}</strong> человек)</small>.</li>
|
||||
<li><strong>{{ RESIDENTIAL_M2|stringformat:".1f"|price_format }} м²</strong> жилых помещений.</li>
|
||||
<li><strong>{{ MUNICIPAL_M2|stringformat:".1f"|price_format }} м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>{{ GOVERNMENT_M2|stringformat:".1f"|price_format }} м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии {{ THIS_SERIA_NAME }} — <strong>{{ CONDITION_MAX|stringformat:".2f" }} %</strong>. Минимальный — <strong>{{ CONDITION_MIN|stringformat:".2f" }} %</strong>. </li>
|
||||
<li><strong>{{ RESIDENTIAL_M2|stringformat:".1f"|price_format }} м²</strong> жилых помещений.</li>
|
||||
<li><strong>{{ MUNICIPAL_M2|stringformat:".1f"|price_format }} м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>{{ GOVERNMENT_M2|stringformat:".1f"|price_format }} м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии {{ THIS_SERIA_NAME }} — <strong>{{ CONDITION_MAX|stringformat:".2f" }} %</strong>. Минимальный — <strong>{{ CONDITION_MIN|stringformat:".2f" }} %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">{# <div class="col-md-4"> #}
|
||||
<h5>Информация о других, отличных от {{ THIS_SERIA_NAME }}, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d">{% include 'seria_info/seria_nav.html' with current_seria_id=THIS_SERIA_ID %}</div>
|
||||
<p style="text-align:left;padding: 1em 50% 2em 0;"><small>Смотри так же <a href="/stat_all/">агрегированную информацию</a> по типовым сериям типового строительства в базе «Окнардия».</small></p>
|
||||
<div class="href_d">{% include 'seria_info/seria_nav.html' %}</div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{% include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
{% templatetag openblock %}include "report/report_last_user_visit.html" {% templatetag closeblock %}
|
||||
{% templatetag openblock %} include "report/report_log_user_visit.html" {% templatetag closeblock %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,43 +0,0 @@
|
||||
{# ============================================================================ #}
|
||||
{# ДИНАМИЧЕСКИЕ ДАННЫЕ ДЛЯ СЕРИИ (НЕ кешируемая часть) #}
|
||||
{# Содержит: Таблица раскладки окон по квартирам + статистика предложений #}
|
||||
{# ЗАМЕЧАНИЕ: этот блок ЧАСТО меняется (при добавлении новых предложений) #}
|
||||
{# ============================================================================ #}
|
||||
|
||||
<div class="col-md-9 col-xs-12" style="padding:0;">
|
||||
<table style="padding:2px;">
|
||||
{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>
|
||||
{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">
|
||||
{% if col.WIN_ID %}
|
||||
<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">
|
||||
{% for I_II in col.WIN_NUM %}
|
||||
<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>
|
||||
{% endfor %}
|
||||
</nobr>
|
||||
{% else %}—{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
<td style="background:#f9f9f9;">
|
||||
<a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}">
|
||||
<small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2026, данные: oknardia.ru</td>
|
||||
{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;">
|
||||
<a href="/catalog/standard_opening/price-{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm-tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}">
|
||||
<small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}
|
||||
</a>
|
||||
</td>
|
||||
{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
{# ============================================================================ #}
|
||||
{# СХЕМЫ ОТКРЫВАНИЯ И РАЗМЕРЫ (кешируемая статическая часть) #}
|
||||
{# ============================================================================ #}
|
||||
{% load static %}
|
||||
{% load filters %}
|
||||
|
||||
{% if WIN_DIM %}
|
||||
{% for I_WIN_DIM in FLAP_DIM %}
|
||||
<div class="win_discr pull-left" id="flap{{ forloop.counter0 }}">
|
||||
<div><img src="{% static I_WIN_DIM.url2img %}" alt="{{ I_WIN_DIM.sDescription }}. Размер {{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 (Ш х В, мм.). Типовая схема открывания." title="{{ I_WIN_DIM.sDescription }}. Размер {{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:{{ I_WIN_DIM.W }}px;min-width:13ex;">
|
||||
<nobr>{{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0×{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0 мм.</nobr><br />{% if not I_WIN_DIM.iQuantity == 0 %}
|
||||
<nobr><b>{{ I_WIN_DIM.iQuantity }} шт.</b>{% for I_II in I_WIN_DIM.qStr %}<span class="color-bullet" style="background-image:url('{% static 'img/svg/mark' %}{{ I_II }}.svg');"></span>{% endfor %}</nobr><br />{% endif %}
|
||||
{{ I_WIN_DIM.sDescription }}{% if not I_WIN_DIM.iQuantity == 0 %}<br />
|
||||
<a href="/catalog/standard_opening/price-{{ I_WIN_DIM.iWinWidth|stringformat:".0f" }}0x{{ I_WIN_DIM.iWinHight|stringformat:".0f" }}0mm-tip{{ I_WIN_DIM.id }}">цены только этого типового окна</a>{% endif %}
|
||||
</div>
|
||||
</div>{% endfor %}
|
||||
{% else %}
|
||||
<h1>Нет данных о проемах и рекомендованных схемах открывания окон</h1>
|
||||
{% endif %}
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
{# ============================================================================ #}
|
||||
{# ГРАФИК ВВОДА В ЭКСПЛУАТАЦИЮ (кешируемая статическая часть) #}
|
||||
{# ============================================================================ #}
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],{% for row in DATA4GRAPH %}
|
||||
["{{ row.YEAR }}",{{ row.NUMS }},"color: #99{{ row.CLRS }}99"]{% if not forloop.last %},{% endif %}{% endfor %}
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
{# ============================================================================ #}
|
||||
{# КАРТА И СТАТИСТИКА СЕРИИ (кешируемая статическая часть) #}
|
||||
{# ============================================================================ #}
|
||||
{% load humanize %}
|
||||
{% load filters %}
|
||||
|
||||
{# БЛОК КАРТА: левая часть (col-md-7) #}
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
// Функция для декодирования Base64-обфускованных геоданных (защита координат)
|
||||
function decodeGeoData(b64str) {
|
||||
try {
|
||||
var json = atob(b64str);
|
||||
return JSON.parse(json);
|
||||
} catch(e) {
|
||||
console.error('Ошибка декодирования геоданных:', e);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
|
||||
const linkText = 'Смотреть коммерческие предложения</a>';
|
||||
const hintText = '<b>Здание серии {{ THIS_SERIA_NAME }}</b>';
|
||||
const apartmentId = {{ first_apart_id|default:0 }};
|
||||
const seriaId = {{ THIS_SERIA_ID }};
|
||||
const seriaSlug = '{{ THIS_SERIA_NAME_T }}';
|
||||
|
||||
// Декодируем обфускованные геоданные: [lat, lon, addr_id, seria_id]
|
||||
var geoData = decodeGeoData('{{ DATA4GEO_B64 }}');
|
||||
|
||||
// Создаем метки для каждого здания серии
|
||||
for(var i = 0, len = geoData.length; i < len; i++) {
|
||||
const latitude = geoData[i][0];
|
||||
const longitude = geoData[i][1];
|
||||
const buildingId = geoData[i][2];
|
||||
// Формируем SEO-URL для каждой метки
|
||||
const balloonLink = `<a href="/price/seriaID${seriaId}--${seriaSlug}/appartID${apartmentId}/addressID${buildingId}--null">`;
|
||||
|
||||
geoObjects[i] = new ymaps.Placemark( [longitude, latitude],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: balloonLink + linkText,
|
||||
hintContent: hintText
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
|
||||
{# БЛОК СТАТИСТИКА: правая часть (col-md-4) #}
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии {{ THIS_SERIA_NAME }}</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>{{ ACCOUNTS|price_format }}</strong> квартир.</li>
|
||||
<li>Проживает <strong>{{ APARTMENTS|price_format }}</strong> семей <small>(<strong>{{ RESIDENTS|price_format }}</strong> человек)</small>.</li>
|
||||
<li><strong>{{ RESIDENTIAL_M2|stringformat:".1f"|price_format }} м²</strong> жилых помещений.</li>
|
||||
<li><strong>{{ MUNICIPAL_M2|stringformat:".1f"|price_format }} м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>{{ GOVERNMENT_M2|stringformat:".1f"|price_format }} м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии {{ THIS_SERIA_NAME }} — <strong>{{ CONDITION_MAX|stringformat:".2f" }} %</strong>. Минимальный — <strong>{{ CONDITION_MIN|stringformat:".2f" }} %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
{% load filters %}
|
||||
{% load humanize %}
|
||||
|
||||
{% block Title %} Статистика типовых серий домов в России | Панельное строительство{% endblock %}
|
||||
{% block Title %} Статистика типового строительства СССР и России.{% endblock %}
|
||||
|
||||
{% block Add_Body_Attribute %} style="padding-top:70px;"{% endblock %}
|
||||
|
||||
{% block Description %}Статистика типового строительства в России: анализ распределения панельных домов по сериям и регионам. Данные о 18228 зданиях, общей площади жилого фонда, графиках ввода в эксплуатацию. Здания серий: {% for CountSeria in SERIA_NAV_DIM %}{{ CountSeria.SERIA_R }}{% if not forloop.last %}, {% endif %}{% endfor %}.{% endblock %}
|
||||
{# block Date4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #}
|
||||
|
||||
{% block Keywords %}типовые серии домов, панельное строительство, статистика жилого фонда, каталог типовых зданий, распределение серий по регионам, статистика типовых домов, кирпичные дома, износ жилого фонда, площадь жилого фонда, количество зданий, годы возведения, анализ панельной застройки{% endblock %}
|
||||
{# block Last4Meta %}{{ META_DATA_PUBLISH|date:"c" }}{% endblock #}
|
||||
|
||||
{% block Author4Meta %}: Статистика типовых серий домов «Окнардия»{% endblock %}
|
||||
{% block Description %}Статистика типового строительства СССР и России. Географи, график ввода в эксплуатацтяю, метраж. Здания проектов серии: {% for CountSeria in SERIA_NAV_DIM %}{{ CountSeria.SERIA_R }}{% if not forloop.last %}, {% endif %}{% endfor %}.{% endblock %}
|
||||
|
||||
{% block CopyrightAuthor4Meta %}: Статистика типовых серий домов «Окнардия»{% endblock %}
|
||||
{% block Keywords %}типовые проекты зданий, панельное строительство, {% for CountSeria in SERIA_NAV_DIM %}серия {{ CountSeria.SERIA_R }}, {{ CountSeria.SERIA_R }}, {% endfor %}, года простойки, регионы построки, распространенность{% endblock %}
|
||||
|
||||
{% block Top_JS1%}
|
||||
<script type="text/javascript">
|
||||
@@ -21,95 +21,7 @@ $(window).load(function(){let images = $('.half');images.each(function(i){$(this
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Top_Meta1 %}{# <!-- BEGIN Дополнительные Metatags --> #}
|
||||
{# Удалить: itemprop microdata, rel=standout, twitter:domain — устаревшие теги #}
|
||||
<meta name="news_keywords" content="типовые серии домов, панельное строительство, статистика жилого фонда, распределение серий по регионам" />
|
||||
<link rel="canonical" href="{{ request.scheme }}://{{ request.get_host }}/stat_all/" />
|
||||
<!-- Разметка для соц-сетей Facebook Open Graph -->
|
||||
<meta property="fb:admins" name="admins" content="100000084781830" />
|
||||
<meta property="fb:pages" content="276108456054163" />
|
||||
<meta property="fb:app_id" content="258354027974262" />
|
||||
<meta property="fb:profile_id" name="profile_id" content="https://www.facebook.com/oknardia/" />
|
||||
<meta property="og:locale" content="ru_RU" />
|
||||
<meta property="og:site_name" content="oknardia.ru" />
|
||||
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}/stat_all/" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="Статистика типового строительства - Окнардия" />
|
||||
<meta property="og:description" content="Статистика типового строительства в России. Анализ распределения серий домов по регионам, площадь жилого фонда, количество зданий." />
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<link rel="image_src" href="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<!-- Разметка для соц-сетей Twitter Card -->
|
||||
<meta name="twitter:title" content="Статистика типового строительства - Окнардия" />
|
||||
<meta name="twitter:description" content="Статистика типового строительства в России. Анализ распределения серий домов по регионам." />
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@oknardia" />
|
||||
<meta property="twitter:url" content="{{ request.scheme }}://{{ request.get_host }}/stat_all/" />
|
||||
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
<meta name="relap-image" content="{{ request.scheme }}://{{ request.get_host }}/static/img/MerDY3gpU0w.jpg" />
|
||||
{# <!-- END Дополнительные Metатags --> #}{% endblock %}
|
||||
|
||||
{% block ADD_TO_HEAD %}
|
||||
{# JSON-LD: страница статистики типовых серий — CollectionPage + BreadcrumbList + DataCatalog #}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Статистика типовых серий домов",
|
||||
"description": "Анализ распределения типовых серий строительства в России: количество зданий, общая площадь, география и годы возведения.",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/stat_all/",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"name": "Окнардия",
|
||||
"url": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "DataCatalog",
|
||||
"name": "Статистика типовых серий",
|
||||
"description": "База данных типовых серий строительства в СССР и России",
|
||||
"dataset": [{% for CountSeria in SERIA_NAV_DIM %}
|
||||
{
|
||||
"@type": "Dataset",
|
||||
"name": "Данные серии {{ CountSeria.SERIA_R }}",
|
||||
"description": "Информация о типовой серии {{ CountSeria.SERIA_R }}"
|
||||
}{% if not forloop.last %},{% endif %}{% endfor %}
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "Главная",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Статистика",
|
||||
"item": "{{ request.scheme }}://{{ request.get_host }}/stat_all/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block Main_Content %}<div class="container-fluid">
|
||||
{# Хлебные крошки: НАЧАЛО #}
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li class="active">Статистика типового строительства России</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
{# Хлебные крошки: КОНЕЦ #}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><h1>Типовые серии домов в базе «Окнардия»</h1></div>
|
||||
</div>
|
||||
@@ -126,6 +38,15 @@ DimColor = [];
|
||||
for (i1=0; i1<=step; i1++ )
|
||||
for (i2=step; i2>=0; i2-- )
|
||||
for (i3=0; i3<=step; i3++ ) {
|
||||
//document.write(" <span style='color:#"
|
||||
// + ("00"+(i1*step_tone).toString(16)).substr(-2)
|
||||
// + ("00"+(i2*step_tone).toString(16)).substr(-2)
|
||||
// + ("00"+(i3*step_tone).toString(16)).substr(-2)
|
||||
// + ";'>█</span> -- ");
|
||||
//document.write( "#"
|
||||
// + ("00"+(i1*step_tone).toString(16)).substr(-2)
|
||||
// + ("00"+(i2*step_tone).toString(16)).substr(-2)
|
||||
// + ("00"+(i3*step_tone).toString(16)).substr(-2) + "<br>");
|
||||
DimColor.push("#"
|
||||
+ ("00"+(i1*step_tone).toString(16)).substr(-2)
|
||||
+ ("00"+(i2*step_tone).toString(16)).substr(-2)
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
{% block Top_JS5 %}<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
{% if MAP_JS %}<script src="{% static '' %}{{ MAP_JS }}" charset="utf-8" type="text/javascript"></script>{% else %}<script type="text/javascript">
|
||||
let points = [{% for count in DATA4GEO %}{% if forloop.last %}[{{ count.LONGITUDE|stringformat:"f" }},{{ count.LATITUDE|stringformat:"f" }}]{% else %}[{{ count.LONGITUDE|stringformat:"f" }},{{ count.LATITUDE|stringformat:"f" }}],{% endif %}{% endfor %}];
|
||||
let forURL = [{% for count in DATA4GEO %}{ id: {{ count.ADDR_ID }} }{% if not forloop.last %},{% endif %}{% endfor %}];
|
||||
let forURL = [{% for count in DATA4GEO %}{{ count.ADDR_ID }}{# ,rus: '{{ count.ADDR_RUS }}',lat: '{{ count.ADDR_LAT }}' #}{% if not forloop.last %},{% endif %}{% endfor %}];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
@@ -22,23 +23,15 @@ ymaps.ready(function () {
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
|
||||
const linkText = 'Смотреть коммерческие предложения</a>';
|
||||
const hintText = '<b>Здание серии {{ THIS_SERIA_NAME }}</b>';
|
||||
const apartmentId = {{ first_apart_id|default:0 }};
|
||||
const seriaId = {{ THIS_SERIA_ID }};
|
||||
const seriaSlug = '{{ THIS_SERIA_NAME_T }}';
|
||||
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии {{ THIS_SERIA_NAME }}</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
const buildingId = forURL[i].id;
|
||||
// Формируем SEO-URL для каждой метки
|
||||
const balloonLink = `<a href="/price/seriaID${seriaId}--${seriaSlug}/appartID${apartmentId}/addressID${buildingId}--null">`;
|
||||
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: balloonLink + linkText,
|
||||
hintContent: hintText
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# Игнорируем все файлы в этой папке (генерируются динамически)
|
||||
# Содержит кеш-файлы со статик-шаблонами:
|
||||
# - *_id_static_flaps.html
|
||||
# - *_id_static_graph.html
|
||||
# - *_id_static_map_stats.html
|
||||
#
|
||||
# Эти файлы генерируются при запуске management-команды:
|
||||
# python manage.py regenerate_seria_prerender
|
||||
#
|
||||
# В продакшене они сохраняются на диск и включаются в шаблоны
|
||||
# за счет системы двухуровневого кеширования.
|
||||
*
|
||||
!.gitignore
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,368 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:31:05.856942+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:31:05.857034+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:31:05.857082+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии ПД-4: детальная информация" />
|
||||
<meta name="keywords" content=" ПД-4, серия ПД-4, проект ПД-4, года постройки зданий серии ПД-4, размеры окон в домах серии ПД-4, оконные проемы зданий серии ПД-4, дома серии ПД-4 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии ПД-4 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия ПД-4</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ ПД-4</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии ПД-4: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/116x142H216WN(G)(L_).png" alt="Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:134px;min-width:13ex;">
|
||||
<nobr>1160×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ<br />
|
||||
<a href="/tsena-odnogo-okna/1160x1420mm/tip2">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/067x216H216D-(L).png" alt="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:77px;min-width:13ex;">
|
||||
<nobr>670×2160 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/670x2160mm/tip16">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/116x142H216W-(G_)(L).png" alt="Окно двустворчатое для серии ПД-4. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серии ПД-4. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:134px;min-width:13ex;">
|
||||
<nobr>1160×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серии ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/1160x1420mm/tip45">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/147x142H216W-(G)(L_).png" alt="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:170px;min-width:13ex;">
|
||||
<nobr>1470×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ<br />
|
||||
<a href="/tsena-odnogo-okna/1470x1420mm/tip1">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap4">
|
||||
<div><img src="/static/img/_flap.cfg/206x142H216W-(G)(G)(L).png" alt="Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4. Размер 2060x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4. Размер 2060x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:238px;min-width:13ex;">
|
||||
<nobr>2060×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markE.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/2060x1420mm/tip10">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии ПД-4</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия ПД-4: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1961",4,"color: #99a899"],
|
||||
["1962",11,"color: #99c499"],
|
||||
["1963",6,"color: #99b099"],
|
||||
["1964",1,"color: #999c99"],
|
||||
["1995",1,"color: #999c99"],
|
||||
["1996",6,"color: #99b099"],
|
||||
["1997",13,"color: #99cc99"],
|
||||
["1998",6,"color: #99b099"],
|
||||
["1999",11,"color: #99c499"],
|
||||
["2000",9,"color: #99bc99"],
|
||||
["2001",8,"color: #99b899"],
|
||||
["2002",6,"color: #99b099"],
|
||||
["2003",6,"color: #99b099"],
|
||||
["2004",5,"color: #99ac99"],
|
||||
["2005",1,"color: #999c99"],
|
||||
["2006",2,"color: #99a099"],
|
||||
["2008",2,"color: #99a099"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии ПД-4 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии ПД-4 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.564053,37.570941],[55.562907,37.570366],[55.563656,37.569306],[55.662364,37.779098],[55.748812,37.985073],[55.663486,37.765363],[55.490585,37.297512],[55.663888,37.769397],[55.633760,37.739600],[55.632916,37.738575],[55.632987,37.769558],[55.655437,37.764519],[55.863576,37.432025],[55.864818,37.431154],[55.567667,37.570923],[55.568110,37.571606],[55.568089,37.569701],[55.568354,37.568192],[55.568777,37.568821],[55.568782,37.566880],[55.569011,37.565353],[55.569494,37.566126],[55.569443,37.564168],[55.858074,37.568120],[55.739448,37.853048],[55.739868,37.853874],[55.550723,37.556208],[55.551599,37.556622],[55.550611,37.558167],[55.550101,37.558059],[55.550244,37.559173],[55.550789,37.559056],[55.546190,37.557780],[55.546908,37.558751],[55.548294,37.559451],[55.548660,37.560224],[55.545258,37.557879],[55.546083,37.558805],[55.546699,37.559460],[55.546842,37.560251],[55.736650,37.846760],[55.736883,37.847927],[55.735748,37.847119],[55.843222,37.386903],[55.842464,37.387622],[55.854704,37.360897],[55.855441,37.359504],[55.855896,37.358462],[55.837702,37.390532],[55.838668,37.390415],[55.750707,37.992790],[55.747819,37.988370],[55.750707,37.991775],[55.750727,37.989807],[55.750758,37.988783],[55.750778,37.987777],[55.956965,38.063846],[55.958321,38.062122],[55.922696,37.722361],[55.662699,37.766306],[55.840502,37.527399],[55.840442,37.528424],[55.654625,37.606137],[55.653898,37.606155],[55.840629,37.529852],[55.633932,37.747253],[55.631966,37.768175],[55.863379,37.430714],[55.857235,37.568201],[55.548044,37.560871],[55.854082,37.362136],[59.881525,30.454595],[59.883905,30.487096],[59.882049,30.483602],[59.881313,30.482003],[59.880600,30.480413],[59.879931,30.478858],[59.874110,30.476658],[59.880911,30.469776],[59.878130,30.464234],[59.881214,30.461710],[59.879371,30.463425],[59.881074,30.462859],[59.879827,30.464198],[59.879191,30.464333],[59.879647,30.465240],[59.881498,30.464620],[59.881850,30.465249],[59.879827,30.466273],[59.880017,30.466902],[59.880419,30.467728],[59.880433,30.468645],[59.881728,30.477421],[55.745336,38.023171],[55.746015,38.021311],[55.428066,37.561059],[55.923473,37.724086],[55.924204,37.722397]];
|
||||
let forURL = [386,388,10894,20193,71407,982,2134,12210,12704,12750,12833,12869,13603,13621,14936,14937,14938,14939,14940,14941,14946,14947,14948,15636,22141,22148,26758,26760,26761,26762,26763,26764,26767,26768,26769,26771,26772,26773,26774,26775,27668,27669,27724,32273,32274,32291,32293,32297,32302,32303,71401,71429,71436,71471,71474,71476,80428,80430,97640,983,20787,20788,1110,1111,9538,12718,12830,13625,15635,26770,32285,37770,39797,39801,39810,39815,39819,39829,40580,51926,51929,51930,51931,51934,51936,51937,51939,51941,51942,51943,51948,51953,51978,71533,71542,77732,97641,97647];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии ПД-4</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии ПД-4 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии ПД-4</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>16 024</strong> квартир.</li>
|
||||
<li>Проживает <strong>14 641</strong> семей <small>(<strong>69 926</strong> человек)</small>.</li>
|
||||
<li><strong>825 653.9 м²</strong> жилых помещений.</li>
|
||||
<li><strong>22 532.1 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>28 434.2 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии ПД-4 — <strong>30.00 %</strong>. Минимальный — <strong>1.40 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от ПД-4, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,346 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:30:27.483379+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:30:27.483423+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:30:27.483448+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии К-7: детальная информация" />
|
||||
<meta name="keywords" content=" К-7, серия К-7, проект К-7, года постройки зданий серии К-7, размеры окон в домах серии К-7, оконные проемы зданий серии К-7, дома серии К-7 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии К-7 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия К-7</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ К-7</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии К-7: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/132x153H153W-(G)(L_).png" alt="Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:215px;min-width:13ex;">
|
||||
<nobr>1320×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9<br />
|
||||
<a href="/tsena-odnogo-okna/1320x1530mm/tip23">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/188x153H153W-(G_)(G_)(L).png" alt="Окно трёхстворчатое для серии К9 и 1-515/9Ш. Размер 1880x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии К9 и 1-515/9Ш. Размер 1880x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:307px;min-width:13ex;">
|
||||
<nobr>1880×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии К9 и 1-515/9Ш<br />
|
||||
<a href="/tsena-odnogo-okna/1880x1530mm/tip38">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии К-7</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия К-7: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1926",1,"color: #999a99"],
|
||||
["1929",3,"color: #999c99"],
|
||||
["1959",7,"color: #99a099"],
|
||||
["1960",6,"color: #999f99"],
|
||||
["1961",25,"color: #99b399"],
|
||||
["1962",23,"color: #99b199"],
|
||||
["1963",48,"color: #99cc99"],
|
||||
["1964",36,"color: #99bf99"],
|
||||
["1965",10,"color: #99a399"],
|
||||
["1966",18,"color: #99ac99"],
|
||||
["1967",2,"color: #999b99"],
|
||||
["1976",1,"color: #999a99"],
|
||||
["1978",1,"color: #999a99"],
|
||||
["1984",1,"color: #999a99"],
|
||||
["1989",1,"color: #999a99"],
|
||||
["1991",1,"color: #999a99"],
|
||||
["1996",1,"color: #999a99"],
|
||||
["1998",1,"color: #999a99"],
|
||||
["2000",1,"color: #999a99"],
|
||||
["2003",1,"color: #999a99"],
|
||||
["2004",1,"color: #999a99"],
|
||||
["2010",11,"color: #99a499"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии К-7 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии К-7 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.862510,37.560440],[55.861646,37.560170],[55.861863,37.558885],[55.863510,37.559371],[55.872774,37.549642],[55.858518,37.561293],[55.859261,37.561329],[55.860064,37.561419],[55.860009,37.560655],[55.859797,37.559936],[55.851551,37.432007],[55.852435,37.431989],[55.769393,37.475243],[55.769524,37.471560],[55.769524,37.471560],[55.774087,37.462918],[55.775358,37.460951],[55.775798,37.460421],[55.862853,37.558400],[55.863181,37.558885],[55.673610,37.497575],[55.672661,37.495887],[55.788672,37.785557],[55.788692,37.787336],[55.668965,37.510987],[55.668894,37.509514],[55.666096,37.509846],[55.666096,37.509119],[55.666091,37.508409],[55.774482,37.474426],[55.774482,37.474426],[55.774482,37.474426],[55.775322,37.471255],[55.774862,37.471767],[55.774958,37.471102],[55.775039,37.470428],[55.776112,37.462676],[55.776208,37.462002],[55.776310,37.461337],[55.871976,37.641459],[55.871471,37.636176],[55.872062,37.635602],[55.871334,37.634676],[55.871991,37.634865],[55.871920,37.634119],[55.871198,37.633185],[55.871854,37.633365],[55.872087,37.642950],[55.885186,37.656407],[55.885635,37.656047],[55.886347,37.655481],[55.886796,37.655140],[55.884731,37.656766],[55.855138,37.645294],[55.854401,37.644710],[55.855841,37.644980],[55.856326,37.642698],[55.855542,37.642150],[55.855108,37.639635],[55.855108,37.639635],[55.856801,37.640390],[55.856801,37.640390],[55.856331,37.639159],[55.857043,37.638692],[55.880960,37.644513],[55.882707,37.648349],[55.882141,37.649274],[55.883232,37.650020],[55.883035,37.651717],[55.874471,37.627813],[55.874294,37.625837],[55.874865,37.626493],[55.875971,37.626852],[55.875334,37.623465],[55.875031,37.624921],[55.875890,37.625424],[55.874758,37.623061],[55.871723,37.631963],[55.871784,37.632619],[55.878405,37.620061],[55.473265,37.539006],[55.343200,37.638458],[55.343200,37.638458],[55.343200,37.638458],[55.860630,37.473114],[55.865273,37.471372],[55.863121,37.425477],[55.857700,37.425656],[55.857745,37.424147],[55.723100,37.567590],[55.723962,37.568408],[55.723775,37.569009],[55.723212,37.568713],[55.867834,37.673169],[55.867177,37.673268],[55.865945,37.678505],[55.867692,37.674714],[55.822428,37.587290],[55.821897,37.584990],[55.822620,37.584730],[55.823312,37.584182],[55.878243,37.633167],[55.878758,37.628110],[55.878066,37.623232],[55.878152,37.622432],[55.879329,37.621669],[55.878233,37.621651],[55.878314,37.620851],[55.879601,37.639653],[55.772456,37.471821],[55.772548,37.471165],[55.772968,37.473420],[55.773054,37.472791],[55.773570,37.474022],[55.773667,37.473366],[55.773763,37.472710],[55.773763,37.472710],[55.770704,37.470734],[55.770487,37.472827],[55.770704,37.473959],[55.771935,37.471120],[55.771403,37.470877],[55.660800,37.519207],[55.661978,37.514733],[55.661978,37.514733],[55.661978,37.514733],[55.661978,37.514733],[55.661237,37.513422],[55.660937,37.513853],[55.660892,37.514661],[55.875319,37.634407],[55.875511,37.631999],[55.875935,37.635188],[55.882853,37.641144],[55.872127,37.636347],[55.873198,37.635709],[55.874395,37.634766],[55.861444,37.555220],[55.861752,37.556469],[55.854224,37.650091],[55.810840,37.569207],[55.853001,37.422970],[55.853087,37.423761],[55.859499,37.474974],[55.856962,37.477067],[55.858306,37.476878],[55.857068,37.479582],[55.857639,37.480139],[55.859221,37.479573],[55.858488,37.480489],[55.857750,37.481343],[55.821042,37.584586],[55.820329,37.587191],[55.821138,37.585251],[55.821269,37.585880],[55.820430,37.583805],[55.800701,37.727302],[55.796840,37.615345],[55.794836,37.615470],[55.821295,37.582556],[55.821457,37.583230],[55.822068,37.582484],[55.822473,37.580643],[55.822625,37.581298],[55.822776,37.581963],[55.858473,37.559371],[55.859398,37.558472],[55.859600,37.559200],[55.859539,37.557430],[55.859539,37.557430],[55.859539,37.557430],[55.476664,37.295131],[55.476490,37.296209],[55.481087,37.300117],[55.475888,37.295086],[55.672184,37.495033],[55.671712,37.494180],[55.768203,37.711347],[55.870662,37.464625],[55.872157,37.463610],[55.866031,37.472135],[55.858513,37.475010],[55.893243,37.539940],[55.651821,37.553765],[55.805832,37.817492],[55.808245,37.816603],[55.861595,37.555831],[55.673016,37.754556],[55.804941,37.614832],[55.719794,37.802814],[55.717492,37.809614],[59.737400,30.462752],[59.737686,30.462123],[59.736090,30.464405],[59.735813,30.465042],[59.736806,30.462859],[59.737074,30.462231],[59.736108,30.465608],[59.733273,30.466614],[59.734167,30.468070],[59.733273,30.466614],[59.734167,30.468070]];
|
||||
let forURL = [172,173,174,175,217,218,251,255,256,257,1521,1522,2819,2821,2823,2828,2833,2835,3517,3518,6168,6173,6531,6533,6738,6739,6772,6775,6778,6968,6969,6970,6973,6974,6975,6976,6987,6988,6989,8139,8151,8152,8159,8160,8161,8169,8170,8180,8300,8302,8305,8307,8316,9162,9163,9164,9165,9166,9168,9169,9170,9171,9172,9173,9727,9740,9743,9747,9755,9856,9860,9865,9866,9867,9869,9871,9873,9877,9878,9881,9937,10233,10234,10236,12173,12195,13600,14497,14503,15383,15392,15393,15394,20459,20460,20489,20490,20621,20622,20624,20626,20967,20974,20986,20987,20988,20989,20990,20994,21566,21567,21574,21575,21581,21582,21583,21584,21606,21625,21634,21640,21641,21961,22691,22692,22693,22694,22704,22710,22712,24914,24916,24920,24938,24948,24967,24971,26531,26538,26881,28275,28491,28492,28961,28962,28968,28982,28986,28988,28989,28990,29242,29243,29245,29247,29256,29418,30266,30291,30912,30913,30915,30918,30919,30920,31583,31584,31585,31586,31587,31588,2154,2155,2168,2174,6180,6185,19284,7965,7968,12166,28959,15424,22687,23546,23563,26537,27593,30279,29517,29525,45464,45465,45499,45500,45502,45503,45505,45535,45538,45555,45558];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии К-7</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии К-7 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии К-7</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>19 354</strong> квартир.</li>
|
||||
<li>Проживает <strong>16 839</strong> семей <small>(<strong>82 948</strong> человек)</small>.</li>
|
||||
<li><strong>539 518.2 м²</strong> жилых помещений.</li>
|
||||
<li><strong>93 304.8 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>27 709.9 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии К-7 — <strong>69.00 %</strong>. Минимальный — <strong>4.80 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от К-7, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,359 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:28:02.157690+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:28:02.157739+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:28:02.157763+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии 1-335: детальная информация" />
|
||||
<meta name="keywords" content=" 1-335, серия 1-335, проект 1-335, года постройки зданий серии 1-335, размеры окон в домах серии 1-335, оконные проемы зданий серии 1-335, дома серии 1-335 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии 1-335 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия 1-335</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ 1-335</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"><p>Пятиэтажка 1–335 проектировалась Ленинградским Отделением Горстройпроекта (архитекторы Баныкин Б. Н., Артемьева И. Б. и Смирнова Л. А.) и стала одним из первых зданий «полукаркасной» схемы (неполный каркас и навесные панели). Возводилась по всей территории СССР с 1956 года. Последние здания серии сданы в эксплуатацию в 1968 году.</p>
|
||||
<p>Проект 1–335 так и не получил дальнейшей модернизации, <nobr>из-за</nobr> ряда недостатков. Так, профильные навесные бетонные панели толщиной 30 см. приводили к теплопотерям, и замена на керамзитбетонные (40 см.) для регионов с суровым климатом не спасало. Внешняя облицовка утепляющими материалами увеличивала стоимость и эксплуатационные расходы, потому 1–335 возводились только в Ленинграде, где климат мягче.</p>
|
||||
<p>Внешний вид 1–335 не сильно отличается от других панельных зданий того периода. Серию можно узнать по боковому фасаду: без балконов, две панели без окон в центре или по краям. Как и у многих «хрущёвок», серия 1–335 с железной четырёхскатной крышей (поздние модификации строились с плоской крышей без чердаков), секции без лифта (по четыре квартиры: 1-, 2- и <nobr>3-комнатные</nobr>), потолки 255 см., санузер совмещенный.</p>
|
||||
<p>Оконные проемы серии 1–335 на 10–15 см шире чем у других «хрущёвок», но максимум пять этажей подразумевают низкие ветровые нагрузки. Это означает, что при замене окон использование усиленных профилей не обязательно. Кроме того, нецелесообразно использование стеклопакетов с заполнением инертным газом и высоким сопротивлением теплопередаче — утечки тепла через панели сведут на нет их преимущество. Благодаря хорошей вытяжной вентиляции здания можно сэкономить на встраиваемых в окна клапанах <nobr>климат-контроля</nobr>.</p></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии 1-335: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/126x138H207WN(G)(L).png" alt="Окно двустворчатое «Хрущевка» на балкон (серии 1-335). Размер 1260x1380 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое «Хрущевка» на балкон (серии 1-335). Размер 1260x1380 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:152px;min-width:13ex;">
|
||||
<nobr>1260×1380 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно двустворчатое «Хрущевка» на балкон (серии 1-335)<br />
|
||||
<a href="/tsena-odnogo-okna/1260x1380mm/tip49">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/068x207H207D-(L).png" alt="Дверь на балкон «Хрущевка» (серии 1-335, 507, 510, 511 и 515/5). Размер 680x2070 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон «Хрущевка» (серии 1-335, 507, 510, 511 и 515/5). Размер 680x2070 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:82px;min-width:13ex;">
|
||||
<nobr>680×2070 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Дверь на балкон «Хрущевка» (серии 1-335, 507, 510, 511 и 515/5)<br />
|
||||
<a href="/tsena-odnogo-okna/680x2070mm/tip40">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/128x138H207W-(G)(L).png" alt="Окно двустворчатое «Хрущевка» (серии 1-335). Размер 1280x1380 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое «Хрущевка» (серии 1-335). Размер 1280x1380 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:154px;min-width:13ex;">
|
||||
<nobr>1280×1380 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Окно двустворчатое «Хрущевка» (серии 1-335)<br />
|
||||
<a href="/tsena-odnogo-okna/1280x1380mm/tip48">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/194x138H207W-(G)(L)(L).png" alt="Окно трёхстворчатое «Хрущевка» (серии 1-335). Размер 1940x1380 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое «Хрущевка» (серии 1-335). Размер 1940x1380 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:234px;min-width:13ex;">
|
||||
<nobr>1940×1380 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое «Хрущевка» (серии 1-335)<br />
|
||||
<a href="/tsena-odnogo-okna/1940x1380mm/tip47">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии 1-335</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия 1-335: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1956",1,"color: #999a99"],
|
||||
["1957",1,"color: #999a99"],
|
||||
["1959",11,"color: #99a499"],
|
||||
["1960",25,"color: #99b299"],
|
||||
["1961",50,"color: #99cc99"],
|
||||
["1962",37,"color: #99be99"],
|
||||
["1963",7,"color: #99a099"],
|
||||
["1964",29,"color: #99b699"],
|
||||
["1965",18,"color: #99ab99"],
|
||||
["1966",20,"color: #99ad99"],
|
||||
["1967",18,"color: #99ab99"],
|
||||
["1968",1,"color: #999a99"],
|
||||
["1969",1,"color: #999a99"],
|
||||
["2000",2,"color: #999b99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии 1-335 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии 1-335 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.797847,37.813495],[55.797857,37.814241],[55.797908,37.818579],[55.797898,37.817825],[55.797888,37.817061],[55.802568,37.813504],[55.802077,37.812534],[55.802103,37.814483],[55.788960,37.786366],[55.819772,37.623492],[55.819793,37.622792],[55.732342,37.425171],[55.787118,37.454672],[55.869617,37.673969],[55.799456,37.812677],[55.799467,37.813441],[55.799477,37.814178],[55.798667,37.814627],[55.798677,37.815310],[55.799527,37.818508],[55.799507,37.817762],[55.799502,37.816998],[55.798692,37.816639],[55.798682,37.815974],[55.796618,37.482897],[60.009534,30.415527],[60.009521,30.417270],[59.988005,30.419004],[59.987839,30.417926],[60.011163,30.432703],[55.802614,37.817430],[55.802143,37.818364],[55.682295,37.745268],[55.874466,37.712605],[60.094954,29.975173],[60.101176,29.978479],[59.928690,30.414494],[59.972613,30.430331],[60.016348,30.369965],[59.922864,30.422193],[60.019298,30.409329],[60.019451,30.408700],[60.019536,30.411467],[60.019212,30.411997],[60.019068,30.412662],[59.925173,30.422687],[59.924050,30.422408],[59.924055,30.423010],[59.922747,30.423298],[59.955512,30.436647],[59.955611,30.435245],[59.955687,30.433637],[59.955773,30.432110],[59.955863,30.430502],[59.966174,30.434886],[59.969912,30.434203],[59.972830,30.434428],[59.972199,30.432640],[59.972186,30.427933],[59.920997,30.423801],[59.921205,30.424474],[59.927017,30.429155],[59.927640,30.431661],[59.928735,30.430251],[60.009215,30.433476],[60.009926,30.432047],[60.017306,30.411871],[60.013564,30.406984],[59.967399,30.433242],[59.969299,30.433071],[59.925398,30.417009],[59.926792,30.418725],[59.926512,30.420396],[59.958363,30.424178],[59.957890,30.426729],[59.957751,30.428247],[59.958647,30.429424],[59.958440,30.430790],[59.958850,30.413210],[55.591447,37.642060],[55.590562,37.642411],[55.681696,37.571857],[55.681427,37.572585],[55.681189,37.573321],[55.674529,37.578594],[55.674184,37.578235],[55.673864,37.577912],[59.932180,30.414656],[59.930304,30.413254],[59.929849,30.414692],[59.930660,30.415105],[59.929366,30.415033],[59.929227,30.417045],[59.929673,30.416560],[59.929799,30.421160],[59.930178,30.423369],[59.930944,30.427942],[59.928181,30.414288],[59.927860,30.415105],[59.927860,30.415105],[59.926990,30.416174],[59.926990,30.416174],[59.925642,30.415851],[59.924339,30.417405],[59.923667,30.418312],[59.922990,30.419273],[59.923410,30.420495],[59.921913,30.420755],[59.922305,30.421986],[59.921971,30.423001],[59.920830,30.422292],[59.932017,30.415348],[59.928519,30.421043],[59.927915,30.420513],[59.930886,30.416183],[59.928009,30.421654],[59.928009,30.421654],[59.927671,30.422004],[59.929344,30.417611],[59.927220,30.421276],[59.927125,30.422579],[59.928627,30.418447],[59.928095,30.418357],[59.926774,30.422983],[59.928460,30.416965],[59.926142,30.422633],[59.927482,30.417764],[59.923775,30.425867],[59.927243,30.419291],[59.927071,30.420252],[59.925777,30.421806],[59.924474,30.423549],[59.923595,30.423612],[59.923707,30.424618],[59.922959,30.423926],[59.922373,30.424295],[59.922900,30.425732],[59.922048,30.426882],[59.982658,30.411673],[59.986596,30.422786],[59.920636,30.423387],[59.921412,30.425112],[59.921813,30.425525],[59.921615,30.426280],[59.923423,30.428131],[59.925196,30.428436],[59.927044,30.427699],[59.926684,30.430421],[59.927247,30.430565],[59.927901,30.428876],[59.927906,30.430340],[59.928573,30.431032],[59.932414,30.322022],[59.932085,30.321725],[59.931544,30.321105],[59.931314,30.320512],[59.933681,30.323207],[59.933510,30.323055],[59.932748,30.322336],[59.924957,30.417162],[59.925087,30.418195],[59.925002,30.420719],[59.926224,30.416857],[59.925547,30.420387],[59.895615,30.422094],[59.895226,30.421016],[59.894450,30.420782],[59.894780,30.419641],[59.973320,30.425301],[59.972181,30.424061],[59.973325,30.428768],[60.017004,30.375435],[60.016780,30.376738],[60.013227,30.402645],[59.965660,30.401774],[60.015597,30.369713],[60.014522,30.369686],[60.014576,30.370477],[60.014248,30.374115],[60.014113,30.374869],[60.013353,30.374762],[59.964332,30.435326],[59.971105,30.433044],[59.974923,30.404226],[59.972839,30.422283],[60.007888,30.431284],[60.009215,30.433476],[60.012210,30.415240],[59.968142,30.435155],[59.958341,30.426020],[59.958602,30.430134],[59.973284,30.432487],[60.016492,30.394228],[60.013771,30.402250],[60.012534,30.405376],[60.016447,30.372911],[59.930403,30.412554],[60.012669,30.403786],[60.010659,30.412644],[60.010717,30.413488],[60.009193,30.419839],[60.009004,30.420477],[60.014009,30.375624],[59.973766,30.404837],[59.973910,30.403687],[59.972762,30.403723],[59.973136,30.404155],[59.973239,30.405655],[59.973816,30.407532],[60.006984,30.429173],[60.007047,30.431544],[60.007663,30.429451],[60.016901,30.373163],[59.955647,30.434464],[59.955818,30.431302],[59.972019,30.406688],[59.984283,30.402600],[59.983671,30.406625],[59.954119,30.433332],[59.954092,30.434086],[55.032480,82.904197]];
|
||||
let forURL = [500,501,506,507,508,1186,1187,1188,6532,10981,10982,15807,15993,19036,23453,23454,23455,23456,23457,23512,23513,23514,23515,23516,25685,42831,42833,47423,47428,53621,1195,1196,5964,19285,36627,36648,40749,42235,42826,43196,43811,43812,43815,43817,43818,44775,44777,44778,44782,44947,44948,44951,44955,44959,44998,45003,45008,45010,47599,48689,48690,48705,48713,48715,53618,53620,54364,54392,54485,54487,54693,54699,54700,56026,56029,56032,56033,56036,56047,9494,9495,17262,17263,17264,18444,18445,18446,38621,40744,40746,40750,40751,40754,40756,40760,40763,40770,43156,43157,43158,43163,43165,43176,43178,43184,43191,43192,43194,43195,43197,43203,44740,44743,44745,44747,44748,44749,44750,44751,44753,44755,44757,44758,44760,44761,44762,44765,44768,44770,44772,44774,44776,44779,44780,44781,44783,44784,44785,46886,47434,48688,48691,48692,48693,48696,48700,48702,48709,48710,48711,48712,48714,49929,49930,49931,49932,49933,49934,49935,54687,54690,54694,54696,54697,40667,40669,40672,40675,42229,51740,42233,42798,42808,42814,43407,44361,44419,44420,44422,44423,44424,44996,45006,50273,51741,53614,53619,54381,54491,56027,56034,42239,42807,42813,42818,42871,43146,42815,42828,42829,42843,42844,44417,46392,46395,46396,46397,46398,50266,53610,53612,53613,42882,44950,44957,46399,46880,46883,47193,47194,58339];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии 1-335</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии 1-335 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии 1-335</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>19 742</strong> квартир.</li>
|
||||
<li>Проживает <strong>20 521</strong> семей <small>(<strong>98 798</strong> человек)</small>.</li>
|
||||
<li><strong>904 827.7 м²</strong> жилых помещений.</li>
|
||||
<li><strong>6 470.2 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>31 829.0 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии 1-335 — <strong>70.00 %</strong>. Минимальный — <strong>6.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от 1-335, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,387 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:31:02.370699+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:31:02.370777+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:31:02.370817+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии П-55: детальная информация" />
|
||||
<meta name="keywords" content=" П-55, серия П-55, проект П-55, года постройки зданий серии П-55, размеры окон в домах серии П-55, оконные проемы зданий серии П-55, дома серии П-55 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии П-55 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия П-55</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ П-55</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"><p>Типовой проект жилой серии П-55 <nobr>и П-55М</nobr> проектировался в конце 1970-х как шумозащитный. Размещение домов предполагалось вдоль больших автомагистралей или на границе промышленных зон. Возведением серии занимались в основном ДСК-4 и АО «Моспромстроиматериалов». Повышенная шумоизоляция достигалась благодаря использованию специальных трёхслойных керамзитбетонных панелей и оригинальной планировкой, благодаря которой на неблагоприятную сторону выходили главным образом нежилые помещения. Кроме того, внешний фасад имел минимальное число балконов, таким образом уменьшая проникновение пыли в жилые комнаты.</p>
|
||||
<p>Внешний фасад серии П-55 и П-55М выстраивался уступами, что значительной степени отражало шум. Сверх того, дома серии часто строили в виде Г- и П-образных конструкций и снабжали арками, что повышало защиту дворов. Но даже рядные — обычно двух- и трехсекционные блок-дома — в силу большой высотности<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>10−14 этажей) являлись достаточным препятствием для проникновения шума и пыли в дворы, в стороны которых выходили окна жилых комнат и большое число балконов.</p>
|
||||
<p>Являясь поздними<span style="margin-right:0.44em;"> </span><span style="margin-left:-0.44em;">«</span>брежневскими» серией панельного строительства, в П-55 значительное внимание уделялось удобству: в подъездах расположено по два пассажирских лифта, большинство квартир с несколькими балконами, много трёх- и четырёхкомнатных квартир. Кроме того, проект П-55 отличает более высокие чем у предыдущих серий <nobr>потолки<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>2 м 65 см)</nobr> и увеличенные размеры ванной и туалетной комнаты. Улучшенная серия П-55М ещё более комфортна: вторые санузлы в трёх- и четырёхкомнатных квартирах; входной блок подъезда и лифт адаптирован для инвалидов-колясочников.</p>
|
||||
<strong><p>В силу расположенности зданий серий П-55 вдоль шумных магистралей и промышленных зон, замена окон в них предполагает установку более качественных, дорогих, но и более защищённых конструкций<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>особенно для внешнего фасада). В первую очередь следует отдавать предпочтение предложениям с повышенной шумоизоляцией:</p>
|
||||
<ul><li>двухкамерные стеклопакеты высокой звукоизоляции<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>32 дБ и более) с несимметричными камерами или заполненные инертным газом;</li>
|
||||
<li>пятикамерные<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>и выше) профили с шумовой защитой на ниже 3-го класса<span style="margin-right:0.3em;"> </span><span style="margin-left:-0.3em;">(</span>коэффициент звукоизоляции от 35 дБ)</li>
|
||||
<li>три и более контура уплотнения.</li></ul></strong></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии П-55: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/087x142H216WN(G).png" alt="Окно на балкон для серии П-30, П-46 и П-55. Размер 870x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно на балкон для серии П-30, П-46 и П-55. Размер 870x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:100px;min-width:13ex;">
|
||||
<nobr>870×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно на балкон для серии П-30, П-46 и П-55<br />
|
||||
<a href="/tsena-odnogo-okna/870x1420mm/tip12">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/067x216H216D-(L).png" alt="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:77px;min-width:13ex;">
|
||||
<nobr>670×2160 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/670x2160mm/tip16">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/147x142H216W-(G)(L_).png" alt="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:170px;min-width:13ex;">
|
||||
<nobr>1470×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ<br />
|
||||
<a href="/tsena-odnogo-okna/1470x1420mm/tip1">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/206x142H216W-(G)(G)(L).png" alt="Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4. Размер 2060x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4. Размер 2060x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:238px;min-width:13ex;">
|
||||
<nobr>2060×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии КОПЭ, П-55 и ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/2060x1420mm/tip10">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии П-55</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия П-55: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1911",1,"color: #999b99"],
|
||||
["1926",1,"color: #999b99"],
|
||||
["1938",1,"color: #999b99"],
|
||||
["1958",1,"color: #999b99"],
|
||||
["1959",1,"color: #999b99"],
|
||||
["1960",1,"color: #999b99"],
|
||||
["1961",1,"color: #999b99"],
|
||||
["1965",1,"color: #999b99"],
|
||||
["1966",1,"color: #999b99"],
|
||||
["1967",2,"color: #999d99"],
|
||||
["1972",1,"color: #999b99"],
|
||||
["1981",9,"color: #99ac99"],
|
||||
["1982",4,"color: #99a199"],
|
||||
["1983",7,"color: #99a899"],
|
||||
["1984",8,"color: #99aa99"],
|
||||
["1985",6,"color: #99a699"],
|
||||
["1986",5,"color: #99a499"],
|
||||
["1987",12,"color: #99b399"],
|
||||
["1988",5,"color: #99a499"],
|
||||
["1989",7,"color: #99a899"],
|
||||
["1990",5,"color: #99a499"],
|
||||
["1991",8,"color: #99aa99"],
|
||||
["1992",13,"color: #99b599"],
|
||||
["1993",8,"color: #99aa99"],
|
||||
["1994",16,"color: #99bc99"],
|
||||
["1995",23,"color: #99cc99"],
|
||||
["1996",4,"color: #99a199"],
|
||||
["1997",10,"color: #99af99"],
|
||||
["1998",2,"color: #999d99"],
|
||||
["1999",4,"color: #99a199"],
|
||||
["2000",4,"color: #99a199"],
|
||||
["2001",3,"color: #999f99"],
|
||||
["2002",3,"color: #999f99"],
|
||||
["2003",4,"color: #99a199"],
|
||||
["2004",4,"color: #99a199"],
|
||||
["2005",2,"color: #999d99"],
|
||||
["2006",5,"color: #99a499"],
|
||||
["2009",1,"color: #999b99"],
|
||||
["2011",1,"color: #999b99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии П-55 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии П-55 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.984295,37.165136],[55.988117,37.157159],[55.700628,37.851754],[55.699218,37.854449],[55.775322,37.489850],[55.758737,37.820825],[55.758311,37.820502],[55.747844,37.817313],[55.870950,37.569135],[55.872885,37.568309],[55.874804,37.567536],[55.876046,37.566916],[55.877617,37.566368],[55.878692,37.566162],[55.876748,37.709488],[55.682234,37.855581],[55.545992,37.529852],[55.630944,37.479906],[55.629450,37.478127],[55.628647,37.475531],[55.543516,37.511544],[55.662273,37.532816],[55.661877,37.529807],[55.636356,37.747639],[55.634237,37.748601],[55.542202,37.512640],[55.686127,37.920871],[55.686051,37.857953],[55.683011,37.854404],[55.681250,37.852275],[55.852834,37.438071],[55.879662,37.571597],[55.806287,37.417994],[55.826068,37.807458],[55.636717,37.671166],[55.637088,37.667519],[55.637347,37.663836],[55.637459,37.660575],[55.636255,37.678649],[55.636448,37.675648],[55.864293,37.592258],[55.865621,37.593587],[55.795089,37.574022],[55.794953,37.572288],[55.587031,37.674777],[55.624281,37.664958],[55.623722,37.665884],[55.652105,37.744037],[55.724089,37.621390],[55.724900,37.621696],[55.724829,37.623151],[55.728322,37.622504],[55.722294,37.621534],[55.721265,37.623196],[55.726583,37.622064],[55.878117,37.698906],[55.877041,37.697783],[55.536405,37.580526],[55.537928,37.580921],[55.539574,37.581307],[55.772193,37.489571],[55.711584,37.755302],[55.712431,37.758554],[55.710788,37.752050],[55.742787,37.403621],[55.889386,37.675532],[55.890643,37.675163],[55.892117,37.674813],[55.859256,37.602058],[55.745407,37.785638],[55.703175,37.845547],[55.872546,37.590515],[55.846517,37.454753],[55.862878,37.447431],[55.865354,37.446470],[55.824187,37.803874],[55.824723,37.804790],[55.825285,37.805814],[55.878814,37.700882],[55.871147,37.590416],[55.717523,37.407295],[55.822837,37.757260],[55.823798,37.758275],[55.824026,37.759300],[55.741070,37.432232],[55.854517,37.683060],[55.879435,37.723115],[55.852501,37.680320],[55.784916,37.447917],[55.786465,37.447935],[55.856432,37.449641],[55.858554,37.448833],[55.800691,37.571704],[55.801283,37.571659],[55.801374,37.570330],[55.802664,37.569512],[55.802422,37.568713],[55.687066,37.566970],[55.682610,37.453765],[55.841134,37.527768],[55.841311,37.529151],[55.707912,37.481460],[55.706944,37.481864],[55.705858,37.480750],[55.705387,37.479950],[55.721128,37.567087],[55.822149,37.512074],[55.737461,37.584631],[55.724778,37.567069],[55.869849,37.660314],[55.828142,37.583661],[55.827100,37.585278],[55.826159,37.586778],[55.877304,37.679673],[55.875324,37.674535],[55.682305,37.454654],[55.681828,37.453693],[55.775251,37.642195],[55.788196,37.615066],[55.671747,37.746157],[55.703946,37.845098],[55.702368,37.848466],[55.545997,37.531927],[55.864783,37.475755],[55.689583,37.860477],[55.687731,37.859345],[55.567519,37.566961],[55.567519,37.566961],[55.567219,37.569171],[55.573831,37.582071],[55.577907,37.576843],[55.578503,37.574004],[55.578528,37.572603],[55.568313,37.587632],[55.569286,37.583472],[55.742874,37.852545],[55.742417,37.855734],[55.742990,37.858141],[55.743036,37.859111],[55.743406,37.862354],[55.744556,37.868014],[55.744733,37.869460],[55.745022,37.870430],[55.745448,37.872721],[55.745909,37.875056],[55.589274,37.640659],[55.648062,37.470042],[55.664218,37.747217],[55.668198,37.764007],[55.687335,37.564123],[55.677712,37.444440],[55.719906,37.412056],[55.852192,37.438206],[55.673184,37.816828],[55.865793,37.598250],[55.867667,37.592258],[55.862439,37.608859],[55.873541,37.705095],[55.683133,37.585449],[55.674199,37.748358],[55.673879,37.749508],[55.893970,37.542024],[55.875087,37.676205],[55.731881,37.589743],[55.830407,37.580104],[55.865384,37.679026],[55.676834,37.444826],[55.651242,37.725298],[55.869071,37.443488],[55.764420,37.702706],[55.740700,37.847990],[55.798303,37.402875],[55.798141,37.396497],[55.707781,37.742869],[55.707187,37.741360],[55.706776,37.740354],[55.718654,37.511275],[55.859670,37.499839],[55.826832,37.825290],[55.806125,37.614644],[55.539487,37.532187],[55.535121,37.517752],[55.535473,37.514967],[55.892345,37.541395],[55.664136,37.293927],[55.662928,37.291098],[55.896357,37.542356],[60.004600,30.452798],[60.004942,30.453840],[59.955741,30.428238],[59.963917,30.303004],[60.009008,30.432595],[55.749258,38.000147],[55.408900,37.559936],[55.681646,37.866082]];
|
||||
let forURL = [1660,1663,6878,6879,6944,7456,7459,7470,8401,8403,8405,8409,8410,8411,9800,10490,10617,10839,10843,10848,11079,11114,11116,12716,12717,13016,13937,14399,14402,14407,14477,16716,16808,16943,16956,16974,16975,16984,16987,16999,17030,17033,17252,17254,19136,19303,19305,19398,19447,19448,19449,19450,19451,19455,19460,19590,19591,20434,20435,20436,20862,22802,22809,22843,23073,23107,23108,23109,23247,24241,25175,25787,26358,26397,26415,28657,28658,28659,29699,31165,32025,32105,32106,32107,32336,32752,32763,32776,2947,2951,26383,29217,3652,3653,3654,3655,3656,17278,4481,9536,9537,13347,13348,13349,13350,15973,16379,16453,17771,20473,20605,20607,20609,23111,23114,23272,25089,27185,28382,5961,6882,6883,10615,12184,14388,14391,14913,14914,14951,25727,27337,27343,27344,27366,27369,27692,27699,27702,27703,27706,27709,27710,27711,27713,27716,9481,10741,13453,13468,16493,21660,32013,14480,14676,15150,15166,15154,23337,15277,18265,18273,31484,19056,19361,20614,26023,23287,24133,26427,27086,27682,27903,27913,28142,28150,28148,28641,28969,29377,30281,30664,30689,30692,31476,101581,101583,31489,43357,43358,47186,52972,53615,71678,77269,94744];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии П-55</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии П-55 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии П-55</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>26 772</strong> квартир.</li>
|
||||
<li>Проживает <strong>31 072</strong> семей <small>(<strong>171 092</strong> человек)</small>.</li>
|
||||
<li><strong>1 724 085.9 м²</strong> жилых помещений.</li>
|
||||
<li><strong>232 384.8 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>70 828.3 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии П-55 — <strong>60.80 %</strong>. Минимальный — <strong>1.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от П-55, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,368 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:29:49.428154+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:29:49.428202+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:29:49.428224+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии 1Р-303: детальная информация" />
|
||||
<meta name="keywords" content=" 1Р-303, серия 1Р-303, проект 1Р-303, года постройки зданий серии 1Р-303, размеры окон в домах серии 1Р-303, оконные проемы зданий серии 1Р-303, дома серии 1Р-303 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии 1Р-303 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия 1Р-303</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ 1Р-303</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии 1Р-303: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/062x132H210WN(G).png" alt="Окно одностворчатое на балкон для серии 1P-303. Размер 620x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно одностворчатое на балкон для серии 1P-303. Размер 620x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:73px;min-width:13ex;">
|
||||
<nobr>620×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно одностворчатое на балкон для серии 1P-303<br />
|
||||
<a href="/tsena-odnogo-okna/620x1320mm/tip73">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/120x132H210WN(G)(L_).png" alt="Окно двустворчатое на балкон для серии 1P-303. Размер 1200x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое на балкон для серии 1P-303. Размер 1200x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:142px;min-width:13ex;">
|
||||
<nobr>1200×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Окно двустворчатое на балкон для серии 1P-303<br />
|
||||
<a href="/tsena-odnogo-okna/1200x1320mm/tip74">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/068x210H210D-(G).png" alt="Дверь на балкон для серий 1P-303, 1P-303.16 и 1ЛГ-504. Размер 680x2100 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серий 1P-303, 1P-303.16 и 1ЛГ-504. Размер 680x2100 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:80px;min-width:13ex;">
|
||||
<nobr>680×2100 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серий 1P-303, 1P-303.16 и 1ЛГ-504<br />
|
||||
<a href="/tsena-odnogo-okna/680x2100mm/tip77">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/128x132H210W-(G)(L).png" alt="Окно двустворчатое для серии МГ-601 и 1P-303. Размер 1280x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серии МГ-601 и 1P-303. Размер 1280x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:152px;min-width:13ex;">
|
||||
<nobr>1280×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серии МГ-601 и 1P-303<br />
|
||||
<a href="/tsena-odnogo-okna/1280x1320mm/tip52">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap4">
|
||||
<div><img src="/static/img/_flap.cfg/186x132H210W-(G)(L_)(L).png" alt="Окно трёхстворчатое для серии 1P-303. Размер 1860x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии 1P-303. Размер 1860x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:221px;min-width:13ex;">
|
||||
<nobr>1860×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markE.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии 1P-303<br />
|
||||
<a href="/tsena-odnogo-okna/1860x1320mm/tip72">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии 1Р-303</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия 1Р-303: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1960",2,"color: #999e99"],
|
||||
["1964",6,"color: #99aa99"],
|
||||
["1965",6,"color: #99aa99"],
|
||||
["1966",5,"color: #99a799"],
|
||||
["1967",5,"color: #99a799"],
|
||||
["1968",7,"color: #99ac99"],
|
||||
["1969",6,"color: #99aa99"],
|
||||
["1970",7,"color: #99ac99"],
|
||||
["1971",10,"color: #99b599"],
|
||||
["1972",7,"color: #99ac99"],
|
||||
["1973",11,"color: #99b899"],
|
||||
["1974",11,"color: #99b899"],
|
||||
["1975",5,"color: #99a799"],
|
||||
["1976",8,"color: #99af99"],
|
||||
["1977",3,"color: #99a199"],
|
||||
["1978",5,"color: #99a799"],
|
||||
["1979",2,"color: #999e99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии 1Р-303 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии 1Р-303 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.476082,37.305048],[55.474919,37.303701],[56.014202,37.467644],[56.015701,37.463933],[56.014806,37.462900],[56.015877,37.462712],[56.015228,37.462505],[56.014705,37.462029],[56.014594,37.466772],[56.014947,37.465604],[55.650785,37.407268],[55.790762,37.966235],[55.790534,37.968886],[55.792706,37.960441],[55.791425,37.960414],[55.791218,37.961052],[55.791946,37.962445],[55.792792,37.964448],[55.791987,37.965616],[55.793288,37.968957],[55.893480,37.451088],[55.893415,37.450072],[56.369417,37.531586],[56.365553,37.532717],[56.369177,37.539958],[56.364486,37.532484],[56.364815,37.533086],[56.363892,37.534029],[56.364002,37.534981],[56.365523,37.539266],[56.366206,37.539724],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.348422,37.524992],[56.354193,37.549983],[56.341488,37.519647],[56.341318,37.520716],[56.341099,37.521776],[56.334408,37.535655],[56.334752,37.536526],[56.338509,37.546956],[56.336987,37.546911],[56.336423,37.545968],[56.337806,37.548061],[56.338444,37.547630],[56.337875,37.547288],[56.338130,37.548869],[56.341064,37.547270],[56.337257,37.552193],[56.337027,37.549327],[56.339682,37.544962],[56.338404,37.519126],[56.337716,37.515111],[56.340161,37.536212],[56.339732,37.538296],[56.355894,37.527741],[56.341702,37.518533],[56.339382,37.518785],[56.284079,37.486760],[56.283480,37.488269],[56.283405,37.487640],[55.939802,36.710148],[55.939958,36.711603],[55.939303,36.711828],[55.939504,36.712574],[55.940427,36.712583],[55.939313,36.709169],[55.938632,36.709421],[55.938859,36.710157],[55.906471,37.729997],[55.904195,37.726574],[55.901031,37.723825],[55.900153,37.722837],[55.899320,37.721840],[55.898492,37.722828],[55.906592,37.728649],[55.892092,37.715695],[55.892274,37.714923],[55.943240,37.777158],[55.907460,37.728631],[55.909060,37.725200],[55.908439,37.723690],[55.905719,37.731874],[55.906254,37.730940],[55.891850,37.716576],[56.458328,38.093087],[56.738616,37.532969],[56.738611,37.531631],[56.739031,37.530948],[56.739322,37.528172],[56.739994,37.528684],[56.741134,37.529376],[56.741573,37.529484],[56.742773,37.529430],[56.742462,37.538341],[56.725561,37.516126],[56.738942,37.528936],[56.740749,37.528531],[55.694885,37.750963],[56.047650,37.481855],[56.047042,37.481271],[56.046509,37.480256],[56.048329,37.482232],[56.047243,37.480714],[56.048053,37.482798],[56.046771,37.481729],[56.367946,37.536634],[56.319774,36.760005],[56.365069,37.538224],[56.366410,37.538898],[55.939857,36.713346],[55.942086,36.712133],[55.941556,36.712259],[55.941344,36.711630],[55.941133,36.710984],[55.939207,36.710957]];
|
||||
let forURL = [2259,2263,75796,75797,75800,75802,75803,75804,75805,75807,14599,69570,69573,69963,69965,69966,69967,69968,69973,69976,81184,81199,86240,86246,86252,86260,86267,86272,86273,86275,86276,86283,86288,86290,86295,86296,86297,86299,86300,86301,86302,86304,86429,86449,86450,86451,86469,86470,86533,86540,86542,86544,86545,86546,86549,86550,86552,86554,86569,86570,86585,86595,86596,86613,86631,86677,86778,86779,86780,89386,89390,89391,89392,89394,89413,89414,89415,97269,97278,97290,97294,97298,97299,97308,97703,97704,98024,98059,98068,98069,98076,98079,98090,109134,111240,111241,111242,111247,111248,111249,111252,111257,111266,111302,114852,114853,114854,83160,83161,83162,83167,83169,83175,83176,86243,91347,86274,86277,89393,89395,89396,89397,89398,89416];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии 1Р-303</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии 1Р-303 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии 1Р-303</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>7 899</strong> квартир.</li>
|
||||
<li>Проживает <strong>9 247</strong> семей <small>(<strong>45 176</strong> человек)</small>.</li>
|
||||
<li><strong>345 222.8 м²</strong> жилых помещений.</li>
|
||||
<li><strong>64 146.2 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>0.0 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии 1Р-303 — <strong>60.00 %</strong>. Минимальный — <strong>10.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от 1Р-303, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,379 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:30:35.978140+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:30:35.978187+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:30:35.978209+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии МГ-601: детальная информация" />
|
||||
<meta name="keywords" content=" МГ-601, серия МГ-601, проект МГ-601, года постройки зданий серии МГ-601, размеры окон в домах серии МГ-601, оконные проемы зданий серии МГ-601, дома серии МГ-601 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии МГ-601 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия МГ-601</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ МГ-601</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии МГ-601: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/117x132H225WN(G).png" alt="Окно одностворчатое, балкон для серии МГ-601. Размер 1170x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно одностворчатое, балкон для серии МГ-601. Размер 1170x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:130px;min-width:13ex;">
|
||||
<nobr>1170×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно одностворчатое, балкон для серии МГ-601<br />
|
||||
<a href="/tsena-odnogo-okna/1170x1320mm/tip53">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/167x132H225WN(G)(L)(L).png" alt="Окно трёхстворчатое, балкон для серии МГ-601. Размер 1670x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое, балкон для серии МГ-601. Размер 1670x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:185px;min-width:13ex;">
|
||||
<nobr>1670×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое, балкон для серии МГ-601<br />
|
||||
<a href="/tsena-odnogo-okna/1670x1320mm/tip54">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/082x225H225D-(L).png" alt="Дверь на балкон для серии II-68 и МГ-601. Размер 820x2250 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серии II-68 и МГ-601. Размер 820x2250 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:91px;min-width:13ex;">
|
||||
<nobr>820×2250 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серии II-68 и МГ-601<br />
|
||||
<a href="/tsena-odnogo-okna/820x2250mm/tip19">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/128x132H225W-(G)(L).png" alt="Окно двустворчатое для серии МГ-601 и 1P-303. Размер 1280x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серии МГ-601 и 1P-303. Размер 1280x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:142px;min-width:13ex;">
|
||||
<nobr>1280×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серии МГ-601 и 1P-303<br />
|
||||
<a href="/tsena-odnogo-okna/1280x1320mm/tip52">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap4">
|
||||
<div><img src="/static/img/_flap.cfg/194x132H225W-(G)(L)(L).png" alt="Окно трёхстворчатое для серии МГ-601. Размер 1940x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии МГ-601. Размер 1940x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:215px;min-width:13ex;">
|
||||
<nobr>1940×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markE.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии МГ-601<br />
|
||||
<a href="/tsena-odnogo-okna/1940x1320mm/tip51">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap5">
|
||||
<div><img src="/static/img/_flap.cfg/258x132H225W-(G)(L)(G)(L).png" alt="Окно четырёхстворчатое для серии МГ-601. Размер 2580x1320 (Ш х В, мм.). Типовая схема открывания." title="Окно четырёхстворчатое для серии МГ-601. Размер 2580x1320 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:286px;min-width:13ex;">
|
||||
<nobr>2580×1320 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markF.svg');"></span></nobr><br />
|
||||
Окно четырёхстворчатое для серии МГ-601<br />
|
||||
<a href="/tsena-odnogo-okna/2580x1320mm/tip50">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии МГ-601</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия МГ-601: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1963",2,"color: #99a099"],
|
||||
["1964",1,"color: #999c99"],
|
||||
["1965",1,"color: #999c99"],
|
||||
["1966",4,"color: #99a799"],
|
||||
["1967",9,"color: #99b999"],
|
||||
["1968",7,"color: #99b299"],
|
||||
["1969",12,"color: #99c499"],
|
||||
["1970",10,"color: #99bd99"],
|
||||
["1971",13,"color: #99c899"],
|
||||
["1972",14,"color: #99cc99"],
|
||||
["1973",8,"color: #99b699"],
|
||||
["1974",3,"color: #99a399"],
|
||||
["1975",6,"color: #99ae99"],
|
||||
["1976",4,"color: #99a799"],
|
||||
["1977",1,"color: #999c99"],
|
||||
["1978",1,"color: #999c99"],
|
||||
["1979",3,"color: #99a399"],
|
||||
["1988",1,"color: #999c99"],
|
||||
["1993",1,"color: #999c99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии МГ-601 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии МГ-601 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.725919,37.465919],[55.725189,37.461885],[55.726644,37.469791],[55.746056,37.593542],[55.658830,37.497701],[55.659302,37.497153],[55.658820,37.496587],[55.659277,37.496057],[55.660815,37.487236],[55.657545,37.492994],[55.658865,37.490182],[55.660754,37.493021],[55.728327,37.520752],[55.749288,37.793894],[55.749623,37.793480],[55.750175,37.796490],[55.749841,37.796903],[55.748432,37.787004],[55.748098,37.787408],[55.681316,37.665857],[55.679138,37.665444],[55.674534,37.500576],[55.673854,37.499291],[55.673169,37.498016],[55.671727,37.495455],[55.668295,37.514607],[55.667213,37.513008],[55.666142,37.511356],[55.669366,37.516215],[55.753139,37.823772],[55.753022,37.824553],[55.775510,37.685988],[55.767681,37.666917],[55.749035,37.790318],[55.748706,37.790714],[55.709906,37.503846],[55.709429,37.502983],[55.708942,37.502148],[55.778669,37.476249],[55.680559,37.671399],[55.702495,37.669881],[55.675687,37.664824],[55.674306,37.665147],[55.675017,37.664985],[55.672422,37.496731],[55.670448,37.517761],[55.652415,37.598851],[55.651572,37.598878],[55.776391,37.687659],[55.710748,37.393542],[55.711072,37.394530],[55.711600,37.395697],[55.709186,37.475962],[55.630878,37.599552],[55.630583,37.598330],[55.709617,37.474695],[55.708668,37.474264],[55.703160,37.469719],[55.702652,37.467958],[55.703454,37.468021],[55.704681,37.460610],[55.705239,37.461499],[55.705767,37.460161],[55.704641,37.476717],[55.705138,37.475423],[55.704037,37.474794],[55.707537,37.467069],[55.706756,37.466027],[55.707755,37.465640],[55.857523,37.496345],[55.858710,37.494602],[55.855487,37.498276],[55.855775,37.497791],[55.856361,37.502444],[55.856790,37.502381],[55.857468,37.507574],[55.857705,37.506927],[55.658982,37.512559],[55.658413,37.513125],[55.658520,37.515039],[55.658048,37.514607],[55.656204,37.516144],[55.655742,37.515802],[55.859069,37.505651],[55.859281,37.504987],[55.859888,37.498716],[55.858347,37.500702],[55.860741,37.502992],[55.860524,37.503630],[55.653903,37.559541],[55.654295,37.559415],[55.637266,37.512793],[55.859413,37.498797],[55.797260,37.725217],[55.797776,37.728263],[55.796719,37.721993],[55.619411,37.592240],[55.691232,37.590874],[55.691775,37.590758],[59.829739,30.332676],[60.013344,30.260388]];
|
||||
let forURL = [1239,1241,1246,3593,6780,6781,6782,6783,10315,10329,10341,10344,4321,12895,12896,12899,12900,13783,13784,6001,6002,6151,6162,6169,6181,6727,6737,6752,6869,7715,7716,11833,11972,12890,12891,21132,21133,21134,21596,27608,28404,6005,6013,6008,6174,6864,10704,10706,11836,12123,12124,12125,13388,30064,30065,13390,13391,20280,20282,20283,20295,20296,20297,20304,20305,20307,21687,21688,21689,19472,19475,19480,19483,29155,29156,29160,29161,22667,22670,22671,22675,22680,22681,22984,22985,28966,28972,28981,28984,29498,29500,23149,28964,29820,29824,29892,29980,30228,30229,40658,41168];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии МГ-601</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии МГ-601 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии МГ-601</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>13 011</strong> квартир.</li>
|
||||
<li>Проживает <strong>13 342</strong> семей <small>(<strong>57 998</strong> человек)</small>.</li>
|
||||
<li><strong>654 281.7 м²</strong> жилых помещений.</li>
|
||||
<li><strong>89 075.3 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>22 511.2 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии МГ-601 — <strong>42.00 %</strong>. Минимальный — <strong>14.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от МГ-601, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,362 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:30:12.705452+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:30:12.705501+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:30:12.705527+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии ГМС-2001: детальная информация" />
|
||||
<meta name="keywords" content=" ГМС-2001, серия ГМС-2001, проект ГМС-2001, года постройки зданий серии ГМС-2001, размеры окон в домах серии ГМС-2001, оконные проемы зданий серии ГМС-2001, дома серии ГМС-2001 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии ГМС-2001 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия ГМС-2001</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ ГМС-2001</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии ГМС-2001: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/116x142H216WN(G)(L_).png" alt="Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ. Размер 1160x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:134px;min-width:13ex;">
|
||||
<nobr>1160×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, балкон для серий ГМС-1, П-44, ПД-4 и КОПЭ<br />
|
||||
<a href="/tsena-odnogo-okna/1160x1420mm/tip2">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/146x142H216WN(G)(L_).png" alt="Окно двустворчатое, балкон для серии КОПЭ и П-44T. Размер 1460x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, балкон для серии КОПЭ и П-44T. Размер 1460x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:168px;min-width:13ex;">
|
||||
<nobr>1460×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, балкон для серии КОПЭ и П-44T<br />
|
||||
<a href="/tsena-odnogo-okna/1460x1420mm/tip8">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/067x216H216D-(L).png" alt="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4. Размер 670x2160 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:77px;min-width:13ex;">
|
||||
<nobr>670×2160 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серии ГМС-1, П-3, П-42, П-43, П-55 и ПД-4<br />
|
||||
<a href="/tsena-odnogo-okna/670x2160mm/tip16">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/077x142H216W-(G).png" alt="Окно одностворчатое для серий ГМС-1. Размер 770x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно одностворчатое для серий ГМС-1. Размер 770x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:89px;min-width:13ex;">
|
||||
<nobr>770×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно одностворчатое для серий ГМС-1<br />
|
||||
<a href="/tsena-odnogo-okna/770x1420mm/tip46">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap4">
|
||||
<div><img src="/static/img/_flap.cfg/147x142H216W-(G)(L_).png" alt="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ. Размер 1470x1420 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:170px;min-width:13ex;">
|
||||
<nobr>1470×1420 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markE.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для ГМС-1, П-30/44/46/55, ПД-4, 1-504 и КОПЭ<br />
|
||||
<a href="/tsena-odnogo-okna/1470x1420mm/tip1">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии ГМС-2001</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия ГМС-2001: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["2003",5,"color: #99ae99"],
|
||||
["2004",7,"color: #99b699"],
|
||||
["2005",6,"color: #99b299"],
|
||||
["2006",5,"color: #99ae99"],
|
||||
["2007",5,"color: #99ae99"],
|
||||
["2008",8,"color: #99bb99"],
|
||||
["2009",12,"color: #99cc99"],
|
||||
["2010",8,"color: #99bb99"],
|
||||
["2011",10,"color: #99c399"],
|
||||
["2012",2,"color: #99a199"],
|
||||
["2013",3,"color: #99a599"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии ГМС-2001 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии ГМС-2001 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.820182,37.873143],[55.698203,37.914915],[55.698903,37.915831],[55.700735,37.917484],[55.658068,37.602067],[55.842302,37.550890],[55.843555,37.553073],[55.844667,37.556208],[55.845213,37.556235],[55.866031,37.472135],[55.866389,37.473168],[55.682468,37.928318],[55.713537,37.402794],[55.714090,37.401662],[55.713922,37.400719],[55.872097,37.558526],[55.876496,37.485969],[55.877157,37.485807],[55.544290,37.565380],[55.544036,37.566072],[55.844177,37.548896],[55.841807,37.549597],[55.670153,37.791145],[55.669650,37.790507],[55.505159,37.576492],[55.671153,37.791944],[55.672326,37.794379],[55.681128,37.924230],[55.681275,37.926862],[55.532029,37.502786],[55.701815,37.915382],[55.700826,37.914367],[55.712964,37.894020],[55.714247,37.887875],[55.922404,37.542599],[55.923392,37.543120],[55.927694,37.545276],[55.928718,37.544009],[55.926469,37.540138],[55.419136,37.495123],[55.417526,37.496758],[55.421987,37.483211],[55.421767,37.482178],[55.421118,37.481639],[55.415324,37.481001],[55.415027,37.483930],[55.414910,37.481819],[55.833461,37.286840],[55.833137,37.285295],[55.832586,37.288142],[55.878248,37.509478],[55.879571,37.511212],[55.826584,37.593650],[55.827530,37.593605],[55.827408,37.595330],[55.713755,37.889762],[55.668655,37.789914],[55.713136,37.891657],[55.745042,37.986313],[55.745068,37.983321],[55.744835,37.984884],[55.743603,37.985630],[55.742585,37.985073],[55.744110,37.982782],[55.416887,37.480939],[55.416346,37.480678],[55.415860,37.481208],[55.418252,37.499480],[55.419008,37.498959],[55.419861,37.498788],[55.420219,37.497683]];
|
||||
let forURL = [3325,6419,6425,6428,10726,11198,11201,11208,11209,12167,12171,13930,14103,14118,14119,15680,15777,15778,16681,16682,19168,19173,19733,19734,20017,20210,20211,21700,21701,23098,25893,25915,26433,26444,31497,31499,31503,31504,31509,77303,77304,77322,77324,77325,77340,77500,77501,92345,92346,92348,11723,11724,19721,19722,19723,26448,20206,26450,71418,71419,71420,71421,71422,71423,77333,77336,77338,78458,78459,78473,78474];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии ГМС-2001</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии ГМС-2001 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии ГМС-2001</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>12 585</strong> квартир.</li>
|
||||
<li>Проживает <strong>18 198</strong> семей <small>(<strong>64 618</strong> человек)</small>.</li>
|
||||
<li><strong>862 529.2 м²</strong> жилых помещений.</li>
|
||||
<li><strong>188 963.6 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>28 750.5 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии ГМС-2001 — <strong>8.10 %</strong>. Минимальный — <strong>1.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от ГМС-2001, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,357 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:30:08.002217+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:30:08.002293+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:30:08.002332+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии II-66: детальная информация" />
|
||||
<meta name="keywords" content=" II-66, серия II-66, проект II-66, года постройки зданий серии II-66, размеры окон в домах серии II-66, оконные проемы зданий серии II-66, дома серии II-66 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии II-66 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия II-66</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ II-66</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии II-66: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/137x154H222WN(G)(L_).png" alt="Окно двустворчатое, балкон, для серий II-66. Размер 1370x1540 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, балкон, для серий II-66. Размер 1370x1540 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:154px;min-width:13ex;">
|
||||
<nobr>1370×1540 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, балкон, для серий II-66<br />
|
||||
<a href="/tsena-odnogo-okna/1370x1540mm/tip56">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/068x222H222D-(L).png" alt="Дверь на балкон для серии 1-447, 1-464, 1-605 и II-66. Размер 680x2220 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон для серии 1-447, 1-464, 1-605 и II-66. Размер 680x2220 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:76px;min-width:13ex;">
|
||||
<nobr>680×2220 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Дверь на балкон для серии 1-447, 1-464, 1-605 и II-66<br />
|
||||
<a href="/tsena-odnogo-okna/680x2220mm/tip32">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/127x154H222W-(G_)(L).png" alt="Окно двустворчатое для серии II-66. Размер 1270x1540 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серии II-66. Размер 1270x1540 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:143px;min-width:13ex;">
|
||||
<nobr>1270×1540 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серии II-66<br />
|
||||
<a href="/tsena-odnogo-okna/1270x1540mm/tip55">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии II-66</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия II-66: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1971",1,"color: #999f99"],
|
||||
["1972",1,"color: #999f99"],
|
||||
["1973",1,"color: #999f99"],
|
||||
["1974",1,"color: #999f99"],
|
||||
["1975",3,"color: #99ac99"],
|
||||
["1976",2,"color: #99a599"],
|
||||
["1978",2,"color: #99a599"],
|
||||
["1979",3,"color: #99ac99"],
|
||||
["1980",3,"color: #99ac99"],
|
||||
["1981",8,"color: #99cc99"],
|
||||
["1982",6,"color: #99bf99"],
|
||||
["1983",8,"color: #99cc99"],
|
||||
["1984",6,"color: #99bf99"],
|
||||
["1985",3,"color: #99ac99"],
|
||||
["1986",2,"color: #99a599"],
|
||||
["1987",7,"color: #99c599"],
|
||||
["1988",1,"color: #999f99"],
|
||||
["1989",2,"color: #99a599"],
|
||||
["1990",2,"color: #99a599"],
|
||||
["1991",1,"color: #999f99"],
|
||||
["1994",2,"color: #99a599"],
|
||||
["1995",1,"color: #999f99"],
|
||||
["1998",1,"color: #999f99"],
|
||||
["2005",1,"color: #999f99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии II-66 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии II-66 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.895298,37.535026],[55.591986,37.669953],[55.771925,37.572369],[55.770071,37.572980],[55.770218,37.573546],[55.588415,37.669046],[55.588349,37.670034],[55.814113,37.967547],[55.814548,37.968355],[55.627768,37.864780],[55.627961,37.863504],[55.939807,37.497836],[55.431238,37.505876],[55.431856,37.506235],[55.432490,37.506415],[55.891042,37.410421],[55.890487,37.410879],[55.889876,37.411364],[55.890275,37.482358],[55.882444,37.417769],[55.883080,37.416844],[55.881172,37.419682],[55.881798,37.418721],[55.892642,37.365272],[55.815696,37.314526],[55.815362,37.314050],[55.814973,37.313618],[55.825679,37.314732],[55.826862,37.312819],[55.828061,37.310663],[55.824445,37.316825],[55.678352,37.880779],[55.675737,37.870376],[55.692064,37.888989],[55.905169,37.727724],[55.899239,37.716468],[55.899668,37.716333],[55.915251,37.773385],[55.915659,37.773340],[55.921365,37.784964],[55.925021,37.766747],[55.925354,37.766612],[55.923917,37.761330],[55.922399,37.789743],[55.923554,37.719459],[55.924159,37.720672],[55.917127,37.745349],[55.917647,37.744459],[55.905951,37.716459],[55.905003,37.715381],[55.903474,37.711707],[55.912783,37.750119],[55.914156,37.751376],[55.912748,37.718830],[55.912143,37.717752],[55.911568,37.716692],[55.913798,37.720807],[55.913338,37.719873],[55.677951,37.257680],[55.677605,37.258237],[55.676189,37.259297],[56.037503,37.245948],[56.037227,37.245867],[54.884239,38.060774],[54.884239,38.060774],[54.884514,38.090437],[54.879645,38.062876],[54.879422,38.066514],[54.879479,38.065275],[54.884327,38.062059],[55.907753,37.719019],[55.906920,37.717573],[55.903474,37.711707],[55.914862,37.752032]];
|
||||
let forURL = [564,12389,15033,15035,15036,18916,18917,69404,69410,70384,70385,70734,77137,77138,77140,80836,80837,80848,80997,81148,81149,81173,81180,81484,92491,92492,92493,92503,92507,92516,92537,94721,94725,95117,97275,97345,97346,97412,97413,97447,97564,97565,97570,97612,97648,97649,97660,97662,97763,97765,97770,98136,98139,98192,98197,98198,98236,98237,101184,101186,101187,110400,110401,110566,110567,110765,110772,110775,110777,110818,114847,114848,114849,114850];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии II-66</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии II-66 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии II-66</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>4 295</strong> квартир.</li>
|
||||
<li>Проживает <strong>5 432</strong> семей <small>(<strong>28 954</strong> человек)</small>.</li>
|
||||
<li><strong>239 948.6 м²</strong> жилых помещений.</li>
|
||||
<li><strong>19 670.9 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>0.0 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии II-66 — <strong>40.00 %</strong>. Минимальный — <strong>3.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от II-66, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,382 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru-RU">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="content-language" content="ru" />
|
||||
<meta http-equiv="Date" content="2023-01-18T00:29:30.132829+03:00" />
|
||||
<meta http-equiv="Last-Modified" content="2023-01-18T00:29:30.133023+03:00" />
|
||||
<meta http-equiv="Expires" content="2023-01-18T00:29:30.133044+03:00" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="description" content="Дома серии 1-515/9: детальная информация" />
|
||||
<meta name="keywords" content=" 1-515/9, серия 1-515/9, проект 1-515/9, года постройки зданий серии 1-515/9, размеры окон в домах серии 1-515/9, оконные проемы зданий серии 1-515/9, дома серии 1-515/9 на карте, установка окон, цены на пластиковые окна" />
|
||||
<meta name="author" content="OKNARDIA.RU" />
|
||||
<meta name="copyright" lang="ru" content="OKNARDIA.RU" />
|
||||
<meta name="robots" content="index,follow" />
|
||||
<meta name="document-state" content="Dynamic" />
|
||||
<meta name="generator" content="OKNARDIA 0.3β by Python/Django" />
|
||||
<title>Дома серии 1-515/9 — типовые проёмы, размеры окон, схемы открывания, планировки, здания на карте, история и статистика : ОКНАРДИЯ</title>
|
||||
<link rel="alternate" href="https://oknardia.ru" hreflang="ru-ru" />
|
||||
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="/static/css/oknardia1.css" rel="stylesheet" type="text/css" />
|
||||
<script src="/static/js/jquery-2.1.1.min.js" type="text/javascript"></script>
|
||||
<script src="/static/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(window).load(function () {
|
||||
let images = $('.half');
|
||||
images.each(function (i) {
|
||||
$(this).width($(this).width() / 2);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">$(document).ready(function(){ $('#login-logout').load('/login-logout' ); })</script>
|
||||
</head>
|
||||
|
||||
<body style="padding-top:70px;">
|
||||
<!--- Контент НАЧАЛО --->
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-11 col-xs-12">
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Главная</a></li>
|
||||
<li><a href="/catalog/">Каталог</a></li>
|
||||
<li><a href="/catalog/seria/">Типовые серии домов</a></li>
|
||||
<li>Серия 1-515/9</li>
|
||||
</ol>
|
||||
<h1>СЕРИЯ 1-515/9</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-10">
|
||||
<h2 class="header">Дома серии 1-515/9: типовые размеры и схемы открывания</h2>
|
||||
</div>
|
||||
<div class="col-lg-12" style="padding:1em 0 0 0;margin-left:-1em">
|
||||
|
||||
|
||||
<div class="win_discr pull-left" id="flap0">
|
||||
<div><img src="/static/img/_flap.cfg/073x153H225WN(G).png" alt="Окно на балкон/лоджию для серии 1-515/9Ш и И-209А. Размер 730x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно на балкон/лоджию для серии 1-515/9Ш и И-209А. Размер 730x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:81px;min-width:13ex;">
|
||||
<nobr>730×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markA.svg');"></span></nobr><br />
|
||||
Окно на балкон/лоджию для серии 1-515/9Ш и И-209А<br />
|
||||
<a href="/tsena-odnogo-okna/730x1530mm/tip36">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap1">
|
||||
<div><img src="/static/img/_flap.cfg/132x153H225WN(G)(L_).png" alt="Окно двустворчатое, балкон, для серий II-18, II-68 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, балкон, для серий II-18, II-68 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:146px;min-width:13ex;">
|
||||
<nobr>1320×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markB.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, балкон, для серий II-18, II-68 и 1-515/9<br />
|
||||
<a href="/tsena-odnogo-okna/1320x1530mm/tip22">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap2">
|
||||
<div><img src="/static/img/_flap.cfg/076x225H225D-(L).png" alt="Дверь на балкон/лоджию для серии II-18, II-57, И-209А и 1-515/9. Размер 760x2250 (Ш х В, мм.). Типовая схема открывания." title="Дверь на балкон/лоджию для серии II-18, II-57, И-209А и 1-515/9. Размер 760x2250 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:84px;min-width:13ex;">
|
||||
<nobr>760×2250 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markC.svg');"></span></nobr><br />
|
||||
Дверь на балкон/лоджию для серии II-18, II-57, И-209А и 1-515/9<br />
|
||||
<a href="/tsena-odnogo-okna/760x2250mm/tip37">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap3">
|
||||
<div><img src="/static/img/_flap.cfg/132x153H225W-(G)(L_).png" alt="Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9. Размер 1320x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:146px;min-width:13ex;">
|
||||
<nobr>1320×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markD.svg');"></span></nobr><br />
|
||||
Окно двустворчатое для серий II-18, II-68, II-49, К-7 и 1-515/9<br />
|
||||
<a href="/tsena-odnogo-okna/1320x1530mm/tip23">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap4">
|
||||
<div><img src="/static/img/_flap.cfg/149x113H225W-(G)(L).png" alt="Окно двустворчатое, кухня для серии 1-515/9. Размер 1490x1130 (Ш х В, мм.). Типовая схема открывания." title="Окно двустворчатое, кухня для серии 1-515/9. Размер 1490x1130 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:165px;min-width:13ex;">
|
||||
<nobr>1490×1130 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markE.svg');"></span></nobr><br />
|
||||
Окно двустворчатое, кухня для серии 1-515/9<br />
|
||||
<a href="/tsena-odnogo-okna/1490x1130mm/tip35">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="win_discr pull-left" id="flap5">
|
||||
<div><img src="/static/img/_flap.cfg/188x153H225W-(G_)(G_)(L).png" alt="Окно трёхстворчатое для серии К9 и 1-515/9Ш. Размер 1880x1530 (Ш х В, мм.). Типовая схема открывания." title="Окно трёхстворчатое для серии К9 и 1-515/9Ш. Размер 1880x1530 (Ш х В, мм.). Типовая схема открывания." itemprop="image" /></div>
|
||||
<div class="caption" style="width:208px;min-width:13ex;">
|
||||
<nobr>1880×1530 мм.</nobr><br />
|
||||
<nobr><b>1 шт.</b><span class="color-bullet" style="background-image:url('/static/img/svg/markF.svg');"></span></nobr><br />
|
||||
Окно трёхстворчатое для серии К9 и 1-515/9Ш<br />
|
||||
<a href="/tsena-odnogo-okna/1880x1530mm/tip38">цены только этого типового окна</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<h3 class="header">Оконные проёмы в типовых квартирах <nobr>серии 1-515/9</nobr></h3>
|
||||
</div>
|
||||
<div class="col-lg-8 col-xs-12 col-md-offset-1">
|
||||
<!--- прешаблон начало ---><table style="padding:2px;">{% for row in TABLE_OF_WINDOWS %}
|
||||
<tr class="tr2">
|
||||
<td>{{ row.APART_NAME|safe }}</td>{% for col in row.WIN_IN_APART %}
|
||||
<td class="cntr">{% if col.WIN_ID %}<nobr title="{{ col.WIN_Q }} × {{ col.WIN_DESCRIPTION }}: {{ col.WIN_WIDTH }}шт.: {{ col.WIN_HEIGHT }} (Ш×В, см.). Схема открывания: {{ col.WIN_FLAPCFG }}">{% for I_II in col.WIN_NUM %}<span style="background-image:url('/static/img/svg/mark{{ I_II }}.svg');"> </span>{% endfor %}</nobr>{% else %}—{% endif %}</td>{% endfor %}
|
||||
<td style="background:#f9f9f9;"><a href="#{{ row.APART_ID }}" class="badge" title="Оконных предложений для квартиры: {{ row.NUM_OFFERS }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ row.NUM_OFFERS }}</a></td>
|
||||
</tr>{% endfor %}
|
||||
<tr class="trZ">
|
||||
<td style="font-size: xx-small;vertical-align:text-top">© 2015-2023, данные: oknardia.ru</td>{% for i in WIN_OFFER_AND_MERCHANT %}
|
||||
<td class="cntr" style="background:#f9f9f9;"><a href="/tsena-odnogo-okna/{{ i.WIN_W|floatformat:0 }}0x{{ i.WIN_H|floatformat:0 }}0mm/tip{{ i.WIN_ID }}" class="badge" title="Ценовых предложений для окна: {{ i.WIN_OFFER }}"><small class="glyphicon glyphicon-tags" aria-hidden="true"></small> {{ i.WIN_OFFER }}</a></td>{% endfor %}
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--- прешаблон конец ---></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9"><a name="s_graph"></a>
|
||||
<h2 class="header">Здания серия 1-515/9: ввод в эксплуатацию по годам</h2>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1" style="height:300px;font-size:large;">
|
||||
|
||||
<script type="text/javascript" src="https://www.google.com/jsapi" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
// google.charts.load('current', {'packages':['bar']});
|
||||
// google.charts.setOnLoadCallback(drawChart);
|
||||
google.load("visualization", "1", {packages:["corechart"]});
|
||||
google.setOnLoadCallback(drawChart);
|
||||
function drawChart() {
|
||||
let data = google.visualization.arrayToDataTable([
|
||||
["Год", "Введено в эксплуатацию", {role:'style'}],
|
||||
["1968",4,"color: #99a799"],
|
||||
["1969",11,"color: #99c199"],
|
||||
["1970",8,"color: #99b699"],
|
||||
["1971",6,"color: #99ae99"],
|
||||
["1972",7,"color: #99b299"],
|
||||
["1973",14,"color: #99cc99"],
|
||||
["1974",11,"color: #99c199"],
|
||||
["1975",9,"color: #99b999"],
|
||||
["1976",5,"color: #99ab99"],
|
||||
["1977",4,"color: #99a799"],
|
||||
["1978",3,"color: #99a399"],
|
||||
["1979",7,"color: #99b299"],
|
||||
["1980",1,"color: #999c99"],
|
||||
["1981",7,"color: #99b299"],
|
||||
["1982",2,"color: #99a099"],
|
||||
["1984",1,"color: #999c99"],
|
||||
["1985",1,"color: #999c99"],
|
||||
["1986",1,"color: #999c99"],
|
||||
["1987",1,"color: #999c99"],
|
||||
["1989",1,"color: #999c99"],
|
||||
["1990",1,"color: #999c99"],
|
||||
["1993",1,"color: #999c99"]
|
||||
]);
|
||||
let view = new google.visualization.DataView(data);
|
||||
view.setColumns([0, 1,
|
||||
{ calc: "stringify",
|
||||
sourceColumn: 1,
|
||||
type: "string",
|
||||
role: "annotation" },
|
||||
2
|
||||
]);
|
||||
let options = {
|
||||
animation:{
|
||||
duration: 1500,
|
||||
easing: 'in',
|
||||
startup: true
|
||||
},
|
||||
backgroundColor: "#EEEEEE",
|
||||
bar: {groupWidth: "76.4%"},
|
||||
chartArea: {left: "2%", top: "5%", width: '96%', height: '85%'},
|
||||
dataOpacity: 0.76,
|
||||
explorer:{
|
||||
maxZoomIn: 0.20,
|
||||
maxZoomOut: 32 },
|
||||
vAxis: {
|
||||
baselineColor:'grey',
|
||||
gridlines:{color: 'silver', count: 7},
|
||||
minorGridlines:{color: '#dddddd', count: 3},
|
||||
textPosition: 'in',
|
||||
textStyle: {fontSize: 10}
|
||||
},
|
||||
hAxis: { textStyle: {fontSize: 10} },
|
||||
isStacked: true,
|
||||
tooltip: {
|
||||
textStyle:{color: 'grey', fontSize: 10 },
|
||||
trigger: 'selection'
|
||||
},
|
||||
annotations: {textStyle: { fontSize: 8, bold: true, color: 'black', opacity: 0.8 }},
|
||||
legend: { position: "none" }
|
||||
};
|
||||
let chart = new google.visualization.ColumnChart(document.getElementById("graph"));
|
||||
chart.draw(data, options);
|
||||
}
|
||||
</script>
|
||||
<div id="graph" style="width:100%;height:100%">
|
||||
<p>Для отображения гистограммы ввода в эксплуатацию зданий серии 1-515/9 нужна поддержка SVG.</p>
|
||||
<noscript>
|
||||
<p>Для визуализации отображения картографической информации с помощью Google.Charts нужно включить поддержку JavaScript.</p>
|
||||
</noscript></div>
|
||||
</div>
|
||||
<div class="col-md-9 col-md-offset-1">
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-7"><a name="s_map"></a>
|
||||
<h2 class="header">Строения серии 1-515/9 на карте</h2>
|
||||
</div>
|
||||
<div class="col-md-7 col-lg-offset-1">
|
||||
<p><small>Чтобы посмотреть цены на установку и замену окон от партнёров «Окнардия» в своей квартире: найдите дом на карте; кликните на него; перейдите по ссылке «Смотреть коммерческие предложения». При необходимости смените типовую планировку квартиры (на странице ценовой выдачи, справа от изображения типовых проёмов и схем открывания).</small></p>
|
||||
<div style="height:350px;">
|
||||
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
let points = [[55.706944,37.827266],[55.621470,37.597926],[56.121496,37.057958],[55.868299,37.618947],[55.935370,37.549444],[56.006507,37.792510],[55.676448,37.745322],[55.675418,37.745295],[55.839673,37.418128],[55.840674,37.419539],[55.755824,37.826422],[55.756158,37.828739],[55.586390,37.664348],[55.585911,37.664860],[55.579556,37.666126],[55.589376,37.642123],[55.869455,37.442428],[55.875935,37.646274],[55.873142,37.647100],[55.872784,37.612829],[55.874067,37.623196],[55.873461,37.626070],[55.670031,37.649741],[55.668701,37.649418],[55.580034,37.663530],[55.680098,37.646786],[55.608287,37.707063],[55.607595,37.707000],[55.705102,37.792016],[55.612263,37.702715],[55.679164,37.759380],[55.714729,37.734425],[55.902374,37.711374],[55.902318,37.707575],[56.395522,37.994892],[56.395307,37.993257],[56.395063,37.991793],[55.585438,37.665390],[55.584451,37.667267],[55.599524,37.654107],[55.579811,37.664833],[55.583749,37.666459],[55.663984,37.743768],[55.861767,37.427920],[55.718334,37.731946],[55.620886,37.601627],[55.621292,37.600495],[55.874309,37.557367],[55.591299,37.661823],[55.619335,37.604232],[55.676149,37.743813],[55.677732,37.757620],[55.678336,37.758150],[55.678595,37.767016],[55.675636,37.747756],[55.795256,37.686204],[55.744865,37.993607],[55.745787,38.006606],[56.015017,37.460762],[55.715256,37.729484],[55.715576,37.730697],[55.715890,37.731775],[55.716711,37.732027],[55.695225,37.742106],[55.580854,37.666126],[55.757207,37.834354],[55.753767,37.834174],[55.753757,37.835144],[55.753737,37.836106],[55.757197,37.835324],[55.757182,37.836276],[55.755601,37.834273],[55.755581,37.835234],[55.755566,37.836195],[55.751898,37.835099],[55.779580,37.477759],[55.679560,37.758626],[55.678930,37.758383],[55.678570,37.759147],[55.678174,37.759030],[55.680153,37.759704],[55.747692,38.004980],[55.715515,37.734156],[55.872410,37.467751],[55.680270,37.766729],[55.883929,37.535188],[55.876789,37.535448],[55.878839,37.534739],[55.750976,37.834300],[55.766400,37.714222],[55.678580,37.673268],[55.873577,37.652157],[55.704621,37.738054],[55.666924,37.571408],[55.667396,37.574435],[55.826215,37.751287],[55.678692,37.680616],[55.876688,37.556846],[55.824243,37.808006],[55.795393,37.973709],[55.704854,37.362819],[55.666381,37.290774],[55.666452,37.289418],[55.666457,37.287891],[55.705092,37.365361],[56.121496,37.057958],[56.121496,37.057958]];
|
||||
let forURL = [1058,15349,110408,1076,2725,3340,5957,5958,9077,9078,9183,9186,12400,12402,20810,9480,26428,9706,9752,9824,9854,9889,10984,10988,20808,21377,896,897,11095,15446,22449,26285,97772,98224,114886,114887,114888,12404,12409,17059,20809,12410,13444,13597,14855,15344,15345,15685,17057,17349,18206,18221,22427,18230,18262,23260,71398,71741,75466,19434,19436,19438,19439,19607,20811,21004,21021,21022,21023,21005,21006,21010,21011,21012,21032,21599,22423,22424,22425,22428,22445,71590,26286,26855,26917,27148,27161,27166,27293,27443,27607,27741,28186,29616,29641,32103,593,15687,16936,69952,102416,101316,101317,101318,102399,110409,110410];
|
||||
|
||||
|
||||
ymaps.ready(function () {
|
||||
let myMap = new ymaps.Map('SeriaMap', {
|
||||
center: [55.75, 37.57],
|
||||
zoom: 10,
|
||||
behaviors: ['default', 'scrollZoom'],
|
||||
controls: [ 'rulerControl', 'zoomControl', 'geolocationControl', 'fullscreenControl' ]
|
||||
});
|
||||
// Создадим кластеризатор, вызвав функцию-конструктор.
|
||||
clusterer = new ymaps.Clusterer({
|
||||
preset: 'islands#invertedGrayClusterIcons',
|
||||
groupByCoordinates: false,
|
||||
hasHint: false,
|
||||
viewportMargin: 0,
|
||||
zoomMargin: 16,
|
||||
clusterDisableClickZoom: false,
|
||||
gridSize: 80
|
||||
});
|
||||
geoObjects = [];
|
||||
add_str1 = '<a href="/';
|
||||
add_str2 = '/0/">Смотреть коммерческие предложения</a>';
|
||||
add_str3 = '<b>Здание серии 1-515/9</b>';
|
||||
// Данные передаются в конструктор метки.
|
||||
for(var i = 0, len = points.length; i < len; i++) {
|
||||
geoObjects[i] = new ymaps.Placemark( points[i],
|
||||
{ // Содержимое иконки, балуна и хинта.
|
||||
balloonContent: add_str1 + forURL[i] + add_str2,
|
||||
hintContent: add_str3
|
||||
},
|
||||
{ preset:'islands#circleIcon',iconColor: 'silver'} );
|
||||
geoObjects[i].events
|
||||
.add('mouseenter', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#yellowCircleIcon');
|
||||
})
|
||||
.add('mouseleave', function (e) {
|
||||
e.get('target').options.set('preset', 'islands#grayCircleIcon');
|
||||
});
|
||||
}
|
||||
// Добавляем метки в кластеризатор.
|
||||
clusterer.add(geoObjects);
|
||||
myMap.geoObjects.add(clusterer);
|
||||
// позиционирование карты так, чтобы на ней были видны все объекты кластера.
|
||||
myMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
|
||||
});
|
||||
</script>
|
||||
<div id="SeriaMap" style="height:100%;width:100%;">
|
||||
<noscript>
|
||||
<p>Для отображения картографических данных по серии 1-515/9 с помощью «Яндекс.Карт» нужно включить поддержку JavaScript.</p>
|
||||
</noscript>
|
||||
</div></div>
|
||||
<div style="font-size: xx-small;float: right">© 2015-2023, данные: oknardia.ru</div>
|
||||
</div>
|
||||
|
||||
<diV class="col-md-4">
|
||||
<h3 class="header">Статистика <nobr>серии 1-515/9</nobr></h3>
|
||||
<p>Совокупно во всех зданиях типового проекта:</p>
|
||||
<ul>
|
||||
<li><strong>9 781</strong> квартир.</li>
|
||||
<li>Проживает <strong>18 646</strong> семей <small>(<strong>85 972</strong> человек)</small>.</li>
|
||||
<li><strong>760 689.2 м²</strong> жилых помещений.</li>
|
||||
<li><strong>68 401.4 м²</strong> — муниципальное жильё.</li>
|
||||
<li><strong>43 667.6 м²</strong> занимают государственные и городские службы, учреждения бытового обслуживания, магазины, офисы и тому подобное.</li>
|
||||
<li>Максимальный износ жилого фонда серии 1-515/9 — <strong>46.00 %</strong>. Минимальный — <strong>10.00 %</strong>. </li>
|
||||
</ul>
|
||||
</diV>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-offset-8" style="margin-top: 1em;">
|
||||
<h5>Информация о других, отличных от 1-515/9, типовых сериях в базе «Окнардия», типовых планировках квартир и оконных проёмах в них, а также рекомендации по замене окон:</h5>
|
||||
<div class="href_d"><span><a href="/catalog/seria/1-335/all210/"><nobr>1-335</nobr></a></span><span><a href="/catalog/seria/1-447/all379/"><nobr>1-447</nobr></a></span><span><a href="/catalog/seria/1-510/all39/"><nobr>1-510</nobr></a></span><span><a href="/catalog/seria/1-511/all100/"><nobr>1-511</nobr></a></span><span><a href="/catalog/seria/1-5155/all41/"><nobr>1-515/5</nobr></a></span><span><a href="/catalog/seria/1-5159/all843/"><nobr>1-515/9</nobr></a></span><span><a href="/catalog/seria/1605/all375/"><nobr>1605</nobr></a></span><span><a href="/catalog/seria/1lg-502/all2420/"><nobr>1ЛГ-502</nobr></a></span><span><a href="/catalog/seria/1lg-504/all2100/"><nobr>1ЛГ-504</nobr></a></span><span><a href="/catalog/seria/1lg-507/all2105/"><nobr>1ЛГ-507</nobr></a></span><span><a href="/catalog/seria/1r-303/all3568/"><nobr>1Р-303</nobr></a></span><span><a href="/catalog/seria/1r-30316/all4080/"><nobr>1Р-303.16</nobr></a></span><span><a href="/catalog/seria/ii-18/all18/"><nobr>II-18</nobr></a></span><span><a href="/catalog/seria/ii-29/all72/"><nobr>II-29</nobr></a></span><span><a href="/catalog/seria/ii-49/all12/"><nobr>II-49</nobr></a></span><span><a href="/catalog/seria/ii-57/all68/"><nobr>II-57</nobr></a></span><span><a href="/catalog/seria/ii-66/all80/"><nobr>II-66</nobr></a></span><span><a href="/catalog/seria/ii-68/all24/"><nobr>II-68</nobr></a></span><span><a href="/catalog/seria/gms-2001/all522/"><nobr>ГМС-2001</nobr></a></span><span><a href="/catalog/seria/i-209a/all44/"><nobr>И-209А</nobr></a></span><span><a href="/catalog/seria/k-7/all19/"><nobr>К-7</nobr></a></span><span><a href="/catalog/seria/kope/all17/"><nobr>КОПЭ</nobr></a></span><span><a href="/catalog/seria/mg-601/all492/"><nobr>МГ-601</nobr></a></span><span><a href="/catalog/seria/p-3/all9/"><nobr>П-3</nobr></a></span><span><a href="/catalog/seria/p-30/all79/"><nobr>П-30</nobr></a></span><span><a href="/catalog/seria/p-43/all178/"><nobr>П-43</nobr></a></span><span><a href="/catalog/seria/p-44/all8/"><nobr>П-44</nobr></a></span><span><a href="/catalog/seria/p-44t/all22/"><nobr>П-44Т</nobr></a></span><span><a href="/catalog/seria/p-46/all29/"><nobr>П-46</nobr></a></span><span><a href="/catalog/seria/p-55/all255/"><nobr>П-55</nobr></a></span><span><a href="/catalog/seria/pd-4/all148/"><nobr>ПД-4</nobr></a></span></div>
|
||||
<p style="text-align:right;padding-top:1em;padding-bottom:1em;"><a href="/stat_all/">Агрегированная информация<br />по типовым сериям домов<br />в базе «Окнардия»</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
{%include "report/report_last_user_visit.html" %}
|
||||
{% include "report/report_log_user_visit.html" %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!---/ Контент КОНЕЦ --->
|
||||
|
||||
|
||||
|
||||
<nav class="navbar navbar-fixed-top navbar-default" role="navigation" id="header">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/"><nobr><img src="/static/img/oknardia_logo.svg" onerror="this.onerror=null;this.src='/static/img/oknardia_logo.gif';this.width=290;this.height=34" title="Перейти на гравную сраницу «Окнардия»" alt="Логотип «Окнардия — оконный агрегатор»" ></nobr></a>
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="/catalog">Каталог</a></li>
|
||||
<li><a href="/stat/rating/">Рейтинги</a></li>
|
||||
<li><a href="/blog">Блог</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" rel="nofollow">О проекте <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="/stat_all">Статистика</a></li>
|
||||
<li role="separator" class="divider"></li>
|
||||
<li><a href="/contact">Контакты</a></li>
|
||||
<li><a href="/blogpost/2/My_zhdem_vashi_prajs-listy!">Сотрудничество</a></li>
|
||||
<li><a href="/tariff">Услуги и тарифы</a></li>
|
||||
<!-- li class="divider"></li>
|
||||
<li><a href="#" rel="nofollow">Обратная связь</a></li -->
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown" id="login-logout"><!--- Сюда подгружают AJAX-ом блок login-logout ---><small><br />Авторизации.<noscript style="color:red;">Для авторизации необходимо включить JavaScript.</noscript></small></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row panel-footer">
|
||||
<div class="col-xs-12">
|
||||
<span style="top:-200px;left:-8000px;position: absolute;"><script type="text/javascript">
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-9116991-5', 'auto'); ga('send', 'pageview');
|
||||
var _tmr=_tmr||[];_tmr.push({id:"2018432",type:"pageView",start:(new Date()).getTime()});(function (d,w,id){if(d.getElementById(id))return;var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src=(d.location.protocol=="https:"?"https:":"http:")+"//top-fwz1.mail.ru/js/code.js";var f=function(){var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts, s);};if(w.opera=="[object Opera]"){ d.addEventListener("DOMContentLoaded",f,false);}else{f();}})(document,window,"topmailru-code");
|
||||
</script><noscript><div style="position:absolute;left:-10000px;">
|
||||
<img src="//top-fwz1.mail.ru/counter?id=2018432;js=na" style="border:0;height:1px;width:1px" alt="" />
|
||||
<img src="//mc.yandex.ru/watch/32997984" style="border:0;height:1px;width:1px" alt="" />
|
||||
</div></noscript>
|
||||
<a target="_blank" href="http://top.mail.ru/jump?from=2018432"><img src="//top-fwz1.mail.ru/counter?id=2018432;t=216;l=1" style="border:0;padding-top:8px;" rel="nofollow" alt="Рейтинг@Mail.ru"></a>
|
||||
<a href="https://metrika.yandex.ru/stat/?id=32997984&from=informer" target="_blank" rel="nofollow"><img src="https://informer.yandex.ru/informer/32997984/3_0_E0E0E0FF_C0C0C0FF_0_pageviews" style="width:88px; height:31px; border:0;" alt="Яндекс.Метрика" title="Яндекс.Метрика: данные за сегодня (просмотры, визиты и уникальные посетители)" onclick="try{Ya.Metrika.informer({i:this,id:32997984,lang:'ru'});return false}catch(e){}" /></a>
|
||||
<span id="rambler"><script id="top100Counter" type="text/javascript" src="//counter.rambler.ru/top100.jcn?3148853"></script><noscript><a href="http://top100.rambler.ru/navi/3148853/"><img src="http://counter.rambler.ru/top100.cnt?3148853" alt="Rambler's Top100" border="0"/></a></noscript></span>
|
||||
<script type="text/javascript"><!--
|
||||
document.write("<a href='//www.liveinternet.ru/click' target=_blank><img src='//counter.yadro.ru/hit?t50.2;r"+escape(document.referrer)+((typeof(screen)=="undefined")?"":";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";"+Math.random()+"' alt='' title='LiveInternet' style='border:0;padding-top:8px;'><\/a>");
|
||||
(function(d,w,c){(w[c]=w[c]||[]).push(function(){try{w.yaCounter32997984=new Ya.Metrika({id:32997984,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,trackHash:true});}catch(e){}});var n=d.getElementsByTagName("script")[0],s=d.createElement("script"),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.src="https://mc.yandex.ru/metrika/watch.js";if(w.opera=="[object Opera]"){d.addEventListener("DOMContentLoaded",f,false);}else{ f();}})(document,window,"yandex_metrika_callbacks");
|
||||
//--></script>
|
||||
</span>
|
||||
<small>© oknardia.ru, 2015-2023. <a href="/blogpost/18/Ob-avtorskih-pravah">Все права защищены</a>.<!--- Время отработки скрипта: сек---></small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
{# Выводит навигацию по сериям домов #}{% for CountSeria in SERIA_NAV_DIM %}{% if CountSeria.ID2URL == current_seria_id|default:0 %}<span style="background-color:cornsilk;"><nobr>{{ CountSeria.SERIA_R }}</nobr></span>{% else %}<span><a href="/catalog/seria/{{ CountSeria.SERIA_L }}/all{{ CountSeria.ID2URL }}/"><nobr>{{ CountSeria.SERIA_R }}</nobr></a></span>{% endif %}{% endfor %}
|
||||
{# Выводит навигацию по сериям домов #}{% for CountSeria in SERIA_NAV_DIM %}{% if CountSeria.SERIA_L == "" %}<span style="background-color:cornsilk;"><nobr>{{ CountSeria.SERIA_R }}</nobr></span>{% else %}<span><a href="/catalog/seria/{{ CountSeria.SERIA_L }}/all{{ CountSeria.ID2URL }}/"><nobr>{{ CountSeria.SERIA_R }}</nobr></a></span>{% endif %}{% endfor %}
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<title>ОКНАРДИЯ :: Служебное</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>Служебные ссылки</h1>
|
||||
|
||||
<ul>
|
||||
<li><b><a href="/service/tmp">Страница для тестирования верстки текста в блоге</a></b></li>
|
||||
</ul><ul>
|
||||
<li><b><a href="/service/make_sitemaps">Пересоздать файлы sitemaps.xml</a></b> (исполняется около 10 минут)</li>
|
||||
<li><a href="/service/make_JavaScripts4maps">Пересоздать JavaScript для карт на основе API Яндекс.Крат</a> (исполняется около 1 минуты)</li>
|
||||
<li><a href="/service/make_SeriaInfoRoot">Построить id корневых серий</a> (исполняется около 1 часа)</li>
|
||||
</ul><ul>
|
||||
<li><a href="/service/del_CachingTemplate">Удалить кеширующие шаблоны</a> (для страниц про серии домов)</li>
|
||||
</ul><ul>
|
||||
<li><a href="/service/make_FillGeoCode">Добавить GeoCode для адресов где его нет</a></li>
|
||||
</ul><ul>
|
||||
<li><a href="/service/make_Rating">Пересчитать рейтинги Профилей</a></li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user