From 9a3888244f9ad47973abaa9c625935e78cf6f751 Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 30 Oct 2022 00:39:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oknardia/oknardia/migrations/0001_initial.py | 428 +++++++++++++++++++ oknardia/oknardia/migrations/__init__.py | 0 2 files changed, 428 insertions(+) create mode 100644 oknardia/oknardia/migrations/0001_initial.py create mode 100644 oknardia/oknardia/migrations/__init__.py diff --git a/oknardia/oknardia/migrations/0001_initial.py b/oknardia/oknardia/migrations/0001_initial.py new file mode 100644 index 0000000..e0260a7 --- /dev/null +++ b/oknardia/oknardia/migrations/0001_initial.py @@ -0,0 +1,428 @@ +# Generated by Django 4.1.2 on 2022-10-27 20:58 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Apartment_Type', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sNameApartment', models.CharField(help_text='Название, наименование (отображается на кнопке в интерфейсе)', max_length=128, verbose_name='Обозначение')), + ('sURL2IMG_Apartment', models.ImageField(default='null.gif', help_text='URL на картинку с планировкой ', max_length=128, upload_to='img_apart/', verbose_name='Изображение')), + ('iSort', models.IntegerField(db_index=True, default=0, help_text='Число для сортировки и порядка вывода в списке', null=True, verbose_name='Сортировка')), + ('sAreaXY', models.CharField(blank=True, default='', help_text='строка AREA для описания MAP (для будущего использования)', max_length=256, null=True, verbose_name='MAP AREA')), + ('bApartmentCheck', models.BooleanField(default=False, help_text='Данные добавлены админом, или проверены и подтверждены из нескольких источников', verbose_name='Проверено')), + ('dApartmentCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dApartmentModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ], + options={ + 'verbose_name': 'Здание: тип квартиры', + 'verbose_name_plural': 'Здания: типы квартир', + 'ordering': ['-iSort', '-kSeria_id', 'id', 'sNameApartment'], + }, + ), + migrations.CreateModel( + name='BlogPosts', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sPostHeader', models.CharField(help_text='Заголовок поста или карточки каталога', max_length=256, verbose_name='Заголовок')), + ('sPostContent', models.TextField(help_text='Содержание (допустим HTML)', verbose_name='Содержание')), + ('sImgForBlogSocial', models.ImageField(blank=True, default='', help_text='Способ загрузить картинку через админку Картинка-тизер для публикаций в соц.сетях. URL к картинке будет «/media/img_for_blog/...» и этот URL можно использовать в HTML-тексте блога. Если нужно загрузить несколько картинок, то после сохранения промежуточной записи, откройте ее на редактирование еще раз и добавте новую картинку. Предыдущая картинка (и её URL) продолжат быть доступны.
ВАЖНО: ПРИ ПУБЛИКАЦИИ В СОЦ.СЕТЯХ БУДЕТ ОТОБРАЖАТЬЯ КАРТИНКА ЗАГРУЖЕННАЯ ПОСЛЕДНЕЙ.
ВАЖНО: ЕСЛИ ЗАГРУЖАЕМАЯ КАРТИНКА УЖЕ ИМЕЕТ ДУБЛИКАТ В СИСТЕМЕ, ЕЕ ИМЯ (И URL) БУДУТ ИЗМЕНЕНЫ. БУДЬТЕ ВНИМТЕЛЬНЫ!', max_length=128, upload_to='img_for_blog/', verbose_name='IMG')), + ('bPublished', models.BooleanField(db_index=True, default=True, help_text='Если отмечено, то пост доступен на сайте. Иначе ведет себя как удаленный и не «отзывается».', verbose_name='Паблик')), + ('bArchive', models.BooleanField(db_index=True, default=False, help_text='Если отмечено, в архиве. Он не будет повляться в списке, но доступен через URL, поиск и пр.', verbose_name='Архив')), + ('dPostDataBegin', models.DateTimeField(db_index=True, default=datetime.datetime(2022, 10, 27, 23, 58, 1, 898637), help_text='Если установить будущую дату, то в назначеное время пост появится автоматически.', verbose_name='Опубликован от')), + ('bCatalog', models.BooleanField(db_index=True, default=False, help_text='Это публикация для каталога (в блогах все равно будет доступно через URL, поиск и пр.)', verbose_name='Каталог')), + ('iCatalogSort', models.PositiveIntegerField(db_index=True, default=1, help_text='Число для сортировки и порядка вывода в каталогах (чем меьше, тем выше в списке)
Магические значения:
■ 5 — запись используется как рекламный тизер;
■ 1 — запись используется как обычный тизер.', null=True, verbose_name='Сортер')), + ('dPostDataModify', models.DateTimeField(auto_now=True, verbose_name='Отредактированно')), + ('dPostDataCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ], + options={ + 'verbose_name': 'Запись в блоге каталоге', + 'verbose_name_plural': 'Записи в блогах или каталогах', + 'ordering': ['-dPostDataCreate', 'iCatalogSort'], + }, + ), + migrations.CreateModel( + name='Building_Info', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sAddress', models.CharField(db_index=True, help_text='Адрес дома', max_length=128, unique=True, verbose_name='Адрес')), + ('fGeoCode_Latitude', models.DecimalField(decimal_places=8, default=0.0, help_text='Географическая щирота', max_digits=12, null=True, verbose_name='Широта')), + ('fGeoCode_Longitude', models.DecimalField(decimal_places=8, default=0.0, help_text='Географическая долгота', max_digits=12, null=True, verbose_name='Долготоа')), + ('sSerias_Project', models.CharField(default='N/A', help_text='Серия, типовой проект здания (то как это записано в базе reformagkh.ru).', max_length=128, null=True, verbose_name='Серия1')), + ('sType', models.CharField(default='N/A', help_text='Тип жилого дома.', max_length=32, null=True, verbose_name='Тип дома')), + ('iCommissioning_year', models.CharField(default='N/A', help_text='Год ввода в эксплуатацию.', max_length=10, null=True, verbose_name='Год')), + ('sWall', models.CharField(default='N/A', help_text='Материал стен.', max_length=32, null=True, verbose_name='Стены')), + ('sOverlap', models.CharField(default='N/A', help_text='Тип перекрытий.', max_length=32, null=True, verbose_name='Перекрытия')), + ('iStoreys', models.SmallIntegerField(default=-1, help_text='Число этажей.', null=True, verbose_name='Этажей')), + ('iEntrances_Porchs', models.SmallIntegerField(default=-1, help_text='Число подъездов.', null=True, verbose_name='Подъездов')), + ('iElevators', models.SmallIntegerField(default=-1, help_text='Число лифтов.', null=True, verbose_name='Лифтов')), + ('sEnergy_Efficiency', models.CharField(default='N/A', help_text='Класс энергоэффективности.', max_length=4, null=True, verbose_name='Энергоэффективность')), + ('dEnergy_Audit', models.DateField(default=datetime.date(2038, 1, 19), help_text='Дата проведения энергелического аудита.', null=True, verbose_name='Дата аудита')), + ('fTotal_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Общаяя площадь помещений, м².', max_digits=8, null=True, verbose_name='Площадь м²')), + ('fResidential_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь жилых помещений, м².', max_digits=8, null=True, verbose_name='Жилых м²')), + ('fUninhabited_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь нежилых помещений, м².', max_digits=8, null=True, verbose_name='Нежилых м²')), + ('fCommon_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь помещений общего пользования (лестничные пролеты, подсобки и пр.), м².', max_digits=8, null=True, verbose_name='Обществ. м²')), + ('fPrivate_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь частных помещений (приватизированных), м².', max_digits=8, null=True, verbose_name='Частные м²')), + ('fMunicipal_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь мунициальных помещений (магазины, офисы и пр.), м².', max_digits=8, null=True, verbose_name='Муницип. м²')), + ('fGovernment_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь государственных помещений(не приватизированных), м².', max_digits=8, null=True, verbose_name='Гос., м²')), + ('fLand_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь участка, м².', max_digits=8, null=True, verbose_name='Участок м²')), + ('fLocal_Area', models.DecimalField(decimal_places=2, default=-1.0, help_text='Площадь придомовой территории, м².', max_digits=8, null=True, verbose_name='Придомовые м²')), + ('iNum_Apartments', models.SmallIntegerField(default=-1, help_text='Число квартир.', null=True, verbose_name='Квартир')), + ('iNum_Residents', models.SmallIntegerField(default=-1, help_text='Число жителей.', null=True, verbose_name='Жителей')), + ('iNum_Accounts', models.SmallIntegerField(default=-1, help_text='Число счетов.', null=True, verbose_name='Счетов')), + ('fCondition_House', models.DecimalField(decimal_places=2, default=-1.0, help_text='Общая степень износа, %', max_digits=5, null=True, verbose_name='Износ')), + ('fCondition_Foundation', models.DecimalField(decimal_places=2, default=-1.0, help_text='Степень износа фундамента, %', max_digits=5, null=True, verbose_name='Износ_Ф')), + ('fCondition_Walls', models.DecimalField(decimal_places=2, default=-1.0, help_text='Степень износа несущих стен, %', max_digits=5, null=True, verbose_name='Износ_С')), + ('fCondition_Overlap', models.DecimalField(decimal_places=2, default=-1.0, help_text='Степень износа перекрытий, %', max_digits=5, null=True, verbose_name='Износ_П')), + ('sCadastre_Num', models.CharField(default='N/A', help_text='Кадастровый номер', max_length=16, null=True, verbose_name='№ кадастр')), + ('sCadastre_Num_Area', models.CharField(default='N/A', help_text='Кадастровый номер участка', max_length=16, null=True, verbose_name='№ участка')), + ('sInventory_Num', models.CharField(default='N/A', help_text='Инвентарный номер', max_length=16, null=True, verbose_name='№ инвентар')), + ('sManagement_Co', models.CharField(default='N/A', help_text='Управляющая компани(ЖКХ)', max_length=256, null=True, verbose_name='УК ЖКХ')), + ('dStart_Privatization', models.DateField(default=datetime.date(2038, 1, 19), editable=False, help_text='Дата начала приватизации.', null=True, verbose_name='Дата приватизации')), + ('sURL', models.CharField(editable=False, help_text='URL для проверки и парсинга информации на http://www.reformagkh.ru/', max_length=128, null=True, verbose_name='URL проверки')), + ('sAddressPostIndex', models.CharField(blank=True, default='XXXXXX', help_text='Почтовый индекс', max_length=8, null=True, verbose_name='Индекс')), + ('dBuildingInfoCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dBuildingInfoModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ], + options={ + 'verbose_name': 'Здание: адрес и описание дома', + 'verbose_name_plural': 'Здания: адреса и описания домов', + 'ordering': ['sAddress'], + }, + ), + migrations.CreateModel( + name='Glazing', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sGlazingName', models.CharField(help_text='Краткое название или фирменное обозначение стеклопакета.', max_length=128, unique=True, verbose_name='Название')), + ('iGlazingCamerasN', models.PositiveSmallIntegerField(default=1, help_text='Число камер', verbose_name='Камер')), + ('iGlazingThickness', models.PositiveSmallIntegerField(default=0, help_text='Толщина стеклопакета (мм).', verbose_name='Толщина')), + ('sGlazingBriefDescription', models.CharField(help_text='Краткая характеристика стеклопакета.', max_length=256, verbose_name='Краткая характеристика')), + ('sGlazingMark', models.CharField(blank=True, default='—', help_text='Схема, марка, маркировка, модель стеклопакета', max_length=128, null=True, verbose_name='Марка')), + ('sGlazingManufacturer', models.CharField(blank=True, default='—', help_text='Завод (компания) производитель', max_length=128, null=True, verbose_name='Производитель')), + ('fGlazingHeatTransfer', models.DecimalField(db_index=True, decimal_places=2, default=0, help_text='Сопротивление теплопередаче Ro (м²×°C/Вт)', max_digits=5, verbose_name='Тепл.Сопр.')), + ('fGlazingSoundproofing', models.DecimalField(db_index=True, decimal_places=2, default=0, help_text='Коэффициент звукоизоляции (дБ)', max_digits=5, verbose_name='Звукоизоляция')), + ('fGlazingLightTransmission', models.DecimalField(db_index=True, decimal_places=2, default=0, help_text='Коэффициент светопропускания (%)', max_digits=5, verbose_name='Светопропускание')), + ('sGlazingLightReflectance', models.CharField(db_index=True, default='—/—', help_text='Коэффициент светоотражения, внешний/внутренний (%)', max_length=7, verbose_name='Светоотражение')), + ('fGlazingPassingSun', models.DecimalField(db_index=True, decimal_places=2, default=0, help_text='Коэффициент солнцепропускания (%)', max_digits=5, verbose_name='Солнцепропускание')), + ('sGlazingReflectionAndAbsorptionOfHeat', models.CharField(db_index=True, default='—/—', help_text='Коэффициент теплоотражения/теплопоглощения (%)', max_length=7, verbose_name='Теплоотражение и теплопоглощение')), + ('fGlazingRating', models.FloatField(db_index=True, default=0.0, help_text='Рейтинг (-1 ... +1).', verbose_name='Рейтинг')), + ('sGlazingDescription', models.TextField(default='', help_text='Детальное описание стеклопакета (JSON)', null=True, verbose_name='Описание')), + ('sGlazingToning', models.CharField(blank=True, default='Нет', help_text='Тонирование стеклопакета (цвет)', max_length=32, null=True, verbose_name='Тонирование')), + ('dGlazingCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dGlazingModify', models.DateTimeField(auto_now=True, verbose_name='Отредактированно')), + ], + options={ + 'verbose_name': 'Окно: стеклопакет', + 'verbose_name_plural': 'Окна: стеклопакеты', + 'ordering': ['sGlazingName'], + }, + ), + migrations.CreateModel( + name='LogVisitPriceReport', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dLogVisitTime', models.DateTimeField(auto_now=True, db_index=True, help_text='Дата и время визита', verbose_name='Дата/время')), + ('sLogAddress', models.CharField(help_text='Адрес дома (на русском)', max_length=128, verbose_name='Адрес')), + ('sLogNameApartment', models.CharField(help_text='Название, наименование (отображается на кнопке в интерфейсе)', max_length=128, verbose_name='Обозначение')), + ('sLogURL', models.CharField(db_index=True, help_text='URL', max_length=250, verbose_name='URL')), + ], + options={ + 'verbose_name': 'ЛОГ: Просмотры ценовой выдачи', + 'verbose_name_plural': 'ЛОГ: Просмотры ценовой выдачи', + 'ordering': ['dLogVisitTime'], + }, + ), + migrations.CreateModel( + name='MerchantBrand', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sMerchantName', models.CharField(help_text='Название головной компании (бренд). Например: «МОЁ ОКНО»', max_length=128, unique=True, verbose_name='Название:')), + ('sMerchantDescription', models.TextField(blank=True, help_text='Введите описание компании. Допускается HTML-разметка.', null=True, verbose_name='Описание')), + ('pMerchantLogo', models.ImageField(blank=True, default='', help_text='Путь до картинки с логотипом', max_length=255, null=True, upload_to='logos_img/', verbose_name='Логотип')), + ('sMerchantMainURL', models.URLField(help_text='URL сайта компании', verbose_name='URL')), + ], + options={ + 'verbose_name': 'Поставщик: бренд', + 'verbose_name_plural': 'Поставщики: бренды', + 'ordering': ['sMerchantName'], + }, + ), + migrations.CreateModel( + name='MerchantOffice', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sOfficeName', models.CharField(db_index=True, help_text='Название компании и/или офиса. Например: «МОЁ ОКНО (головной оффис)»', max_length=128, unique=True, verbose_name='Название офиса')), + ('sOfficeStatus', models.SmallIntegerField(blank=True, choices=[(1, 'Головной офис'), (2, 'Региональный офис'), (3, 'Офис продаж'), (4, 'Представительство'), (5, 'Диллер'), (6, 'Франшиза'), (7, 'Агент')], default=None, help_text='Укажите статус офиса', null=True, verbose_name='Статаус офиса')), + ('sOfficePhones', models.CharField(blank=True, default='', help_text='Телефона офиса. Без пробелов, начинаются с +7. Например: «+7(495)123-12-34». Несколько телефонов записываются через запятую.', max_length=128, null=True, verbose_name='Тел.')), + ('sOfficeEmails', models.CharField(blank=True, default='', help_text='e-mail офиса. Несколько e-mail записываются через запятую.', max_length=128, null=True, verbose_name='e-mail')), + ('sOfficeAddress', models.CharField(default='', help_text='Адрес офиса', max_length=255, verbose_name='Адрес офиса')), + ('fOfficeGeoCode_Latitude', models.DecimalField(decimal_places=8, default=0.0, help_text='Географическая щирота', max_digits=12, null=True, verbose_name='Широта')), + ('fOfficeGeoCode_Longitude', models.DecimalField(decimal_places=8, default=0.0, help_text='Географическая долгота', max_digits=12, null=True, verbose_name='Долгота')), + ('sOfficeDescription', models.TextField(blank=True, default=None, help_text='Краткое описание компании (офиса, подразделения). Максимум 4096 символов включая пробелы. HTML запрещен.', max_length=4096, null=True, verbose_name='Описание')), + ('sOfficeDiscountMetaFormula', models.CharField(blank=True, default=None, help_text='Формула предоставления скидок на мета-языке формул.', max_length=255, null=True, verbose_name='Формула скидки')), + ('dOfficeDataCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dOfficeDataModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ('kMerchantName', models.ForeignKey(blank=True, default=None, help_text='Маркой, бенд или франшиза под которой рабоатет офис.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.merchantbrand', verbose_name='Бренд')), + ('kMerchantOfficeParent', models.ForeignKey(blank=True, default=None, help_text='Укажите офис у которого настоящий офис находится в подчинении.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.merchantoffice', verbose_name='Подчинен')), + ], + options={ + 'verbose_name': 'Поставщик: офис', + 'verbose_name_plural': 'Поставщики: офисы', + 'ordering': ['sOfficeName'], + }, + ), + migrations.CreateModel( + name='MountDim2Apartment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('iQuantity', models.PositiveSmallIntegerField(default=1, help_text='Количество окон/дверей данных габаритов в квартире', verbose_name='Количество')), + ('kApartment', models.ForeignKey(help_text='Квартира', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.apartment_type', verbose_name='Квартира')), + ], + options={ + 'verbose_name': 'Связка «проемы↔квартиры»', + 'verbose_name_plural': 'Связки «проемы↔квартиры»', + 'ordering': ['-kApartment_id', '-kMountDim_id'], + }, + ), + migrations.CreateModel( + name='OurUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sUserPhone', models.CharField(blank=True, default='', help_text='Номер телефона пользователя', max_length=32, null=True, verbose_name='Телефон')), + ('sUserStatus', models.SmallIntegerField(blank=True, choices=[(1, 'Клиент, заказчик'), (10, 'Представитель компании (офиса)'), (50, 'Администратор бренда'), (100, 'Администратор Окнардии')], default=9, help_text='Статус пользователя.', null=True, verbose_name='Статаус')), + ('sUserJobTitle', models.CharField(blank=True, default=None, help_text='Должность, в случае если данный логин является представителем компании.', max_length=64, null=True, verbose_name='Должность')), + ('sUserAvatarImg', models.ImageField(default='null.gif', help_text='URL на картинку с аватаркой ', max_length=128, upload_to='img_avatar/', verbose_name='Avatar')), + ('bUserSubscribe', models.BooleanField(default=True, help_text='Паользователь подписан на регулярную.', verbose_name='Подписка')), + ('bUserWaitOffers', models.BooleanField(default=True, help_text='Пользователь ждет коммерческих предложений.', verbose_name='Ждет предложений')), + ('sSocial', models.TextField(blank=True, default=None, help_text='Как это будет работать пока не ясно.', max_length=1024, null=True, verbose_name='Социальные ссылки')), + ('dUserDataModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ('kDjangoUser', models.ForeignKey(help_text='Базовый пользователь', on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL, verbose_name='User')), + ('kMerchantOffice', models.ForeignKey(blank=True, default=None, help_text='Сотрудника какого офиса предтавляет этот логин.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.merchantoffice', verbose_name='Представитель')), + ], + options={ + 'verbose_name': 'Наш Пользователь', + 'verbose_name_plural': 'Наши Пользователи', + 'ordering': ['kDjangoUser'], + }, + ), + migrations.CreateModel( + name='PVCprofiles', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sProfileName', models.CharField(db_index=True, help_text='Название профиля.', max_length=64, unique=True, verbose_name='Профиль')), + ('sProfileBriefDescription', models.CharField(db_index=True, help_text='Краткая характеристика профиля.', max_length=255, unique=True, verbose_name='Краткое описание')), + ('sProfileManufacturer', models.CharField(db_index=True, default='—//—', help_text='Завод (компания) производитель', max_length=128, verbose_name='Производитель')), + ('iProfileCameras', models.CharField(blank=True, default='—/—', help_text='Число камер рамка/створка.', max_length=5, null=True, verbose_name='Камер')), + ('iProfileThickness', models.PositiveSmallIntegerField(default=0, help_text='Монтажная ширина профиля (мм).', verbose_name='W')), + ('fProfileHeatTransf', models.DecimalField(decimal_places=2, default=0, help_text='Сопротивление теплопередаче Ro (м²×°C/Вт)', max_digits=5, verbose_name='Ro')), + ('fProfileSoundproofing', models.DecimalField(decimal_places=2, default=0, help_text='Коэффициент звукоизоляции (дБ). 1-й класс — 25-29дБ; 2-й класс — 30-24дБ; 3-й класс — 35-39дБ; 4-й класс — 40-44дБ; 5-й класс — 45-49дБ; 6-й класс — свыше 50 дБ; ', max_digits=5, verbose_name='дБ')), + ('iProfileGlazingThickness', models.PositiveSmallIntegerField(default=0, help_text='Максимальная толщина стеклопакета (мм).', verbose_name='W-cтеклопак')), + ('sProfileReinforcement', models.CharField(blank=True, help_text='Армирование профиля. Описание кратко.', max_length=255, verbose_name='Армирование')), + ('fProfileSeals', models.PositiveSmallIntegerField(blank=True, default=0, help_text='Число контуров уплотнения.', null=True, verbose_name='Контуров уплотнения')), + ('sProfileSealDescription', models.CharField(blank=True, default='', help_text='Характеристики или цвет уплотнителя.', max_length=128, null=True, verbose_name='Уплотнитель')), + ('sProfileFillet', models.CharField(blank=True, default='', help_text='Штапик. Описание кратко.', max_length=255, verbose_name='Штапик')), + ('iProfileHeight', models.PositiveSmallIntegerField(default=0, help_text='Высота в световом проеме (рама+створка), мм.', verbose_name='Высота')), + ('iProfileRabbet', models.PositiveSmallIntegerField(default=0, help_text='Размер зазора между рамой и створкой (высота фальца), мм.', verbose_name='Фальц')), + ('sProfileColor', models.CharField(blank=True, default='белый', help_text='Цвет профиля', max_length=128, verbose_name='Цвет')), + ('sProfileOther', models.CharField(blank=True, default='', help_text='Прочие характеристики в формате: Характеристика: Значение; Характеристика: Значение;', max_length=255, verbose_name='Прочее')), + ('fProfileRating', models.FloatField(db_index=True, default=0.0, help_text='Рейтинг (0... +5).', verbose_name='Рейтинг')), + ('sProfileDescription', models.TextField(default='', help_text='Описание профиля (JSON)', null=True, verbose_name='Описание')), + ('dProfileCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dProfileModify', models.DateTimeField(auto_now=True, verbose_name='Когда отредактировано')), + ('kProfile2User', models.ForeignKey(help_text='Данный профиль добавил пользователь.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='User')), + ], + options={ + 'verbose_name': 'Окно: профиль', + 'verbose_name_plural': 'Окна: профили', + 'ordering': ['sProfileName'], + }, + ), + migrations.CreateModel( + name='Win_MountDim', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('iWinWidth', models.DecimalField(decimal_places=1, help_text='Ширина, см.', max_digits=5, verbose_name='Ширина')), + ('iWinHight', models.DecimalField(decimal_places=1, help_text='Высота, см.', max_digits=5, verbose_name='Высота')), + ('iWinDepth', models.DecimalField(decimal_places=1, help_text='Глубина, см.', max_digits=3, verbose_name='Глубина')), + ('sFlapConfig', models.CharField(help_text='Рекомендуемая гор.архитектурой конфигурации открывания (МЕТАЯЗЫК)', max_length=32, verbose_name='Открывание')), + ('sDescripion', models.CharField(blank=True, help_text='Описание для простоты последующего поиска и SEO', max_length=64, null=True, verbose_name='Описание')), + ('bIsDoor', models.BooleanField(default=False, help_text='Это Дверь', verbose_name='Дверь')), + ('bIsNearDoor', models.BooleanField(default=False, help_text='Это окно рядом с дверью (может быть глухим)', verbose_name='Глухое')), + ('iWinLimit', models.DecimalField(decimal_places=1, default=5.0, help_text='Точность, допуск, предельные отклонения ширины и высоты, ±см.', max_digits=2, null=True, verbose_name='Допуск±')), + ('dMountXYZDataCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dMountXYZModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ('kApartment', models.ManyToManyField(help_text='Принадлежность проема к типовой квартире', through='oknardia.MountDim2Apartment', to='oknardia.apartment_type', verbose_name='Квартира')), + ], + options={ + 'verbose_name': 'Окно: проём и его конфигурация', + 'verbose_name_plural': 'Окна: проемы и их конфигурация', + 'ordering': ['id', 'iWinWidth', 'iWinHight'], + }, + ), + migrations.CreateModel( + name='SetKit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sSetName', models.CharField(help_text='Марка, краткое название или фирменное обозначение набора.', max_length=128, unique=True, verbose_name='Название')), + ('sSetDescription', models.TextField(blank=True, help_text='Детальное описание стеклопакета (допустим HTML)', verbose_name='Описание')), + ('sSetClimateControl', models.CharField(blank=True, default='', help_text='Система климат-контроля: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Климат-контроль')), + ('sSetSill', models.CharField(blank=True, help_text='Подоконник: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Подоконник')), + ('sSetImplementAll', models.CharField(help_text='Фурнитура: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Фурнитура')), + ('sSetImplementHandles', models.CharField(blank=True, help_text='Фурнитура ручки: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Ручки')), + ('sSetImplementHinges', models.CharField(blank=True, help_text='Фурнитура петли: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Петли')), + ('sSetImplementLatch', models.CharField(blank=True, help_text='Фурнитура механизма запирания: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Запоры')), + ('sSetImplementLimiter', models.CharField(blank=True, help_text='Фурнитура ограничителя: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Ограничитель')), + ('sSetImplementCatch', models.CharField(blank=True, help_text='Фурнитура фиксаторов открывания: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Фиксаторы открывания')), + ('sSetPanes', models.CharField(blank=True, help_text='Водоотлив: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Водоотлив')), + ('sSetSlope', models.CharField(blank=True, help_text='Откос: марка, краткое название или фирменное обозначение.', max_length=128, verbose_name='Откос')), + ('sSetDelivery', models.CharField(blank=True, default='Включена в стоимость', help_text='Доставка: опишите условия, регион, способ расчета стоимости и т.п.', max_length=64, verbose_name='Доставка')), + ('bSetDelivery', models.BooleanField(default=True, help_text='Отмечено, если доставка включена в стоимость', verbose_name='Доставка(б)')), + ('sSetUninstallInstall', models.CharField(blank=True, default='Включен в стоимость', help_text='Доставка: опишите условия, регион, способ расчета стоимости...', max_length=64, verbose_name='Монтаж')), + ('bSetUninstallInstall', models.BooleanField(default=True, help_text='Отмечено, если Демонтаж/Монтаж включен в стоимость', verbose_name='Монтаж(б)')), + ('sSetOtherConditions', models.CharField(blank=True, default='', help_text='Прочие условия: мотнаж, демонтаж, вывооз мусора, предоставление пленки для укрытия мебели и т.п.', max_length=512, verbose_name='Прочие условия')), + ('fSetRating', models.FloatField(db_index=True, default=0.0, help_text='Рейтинг (0.0 ... 5.0). Если рейтинг 0.1 то выводится полупрозрвчным и с меткой что поставщик бяка', verbose_name='Рейтинг')), + ('iSetNumEval', models.PositiveIntegerField(default=0, help_text='Количество оценок.', verbose_name='N оценок')), + ('iSetImpressions', models.PositiveIntegerField(default=0, help_text='Число показов.', verbose_name='Показы')), + ('iSetViews', models.PositiveIntegerField(default=0, help_text='Число просмотров.', verbose_name='Просмотры')), + ('sSetActive', models.BooleanField(default=True, help_text='Отображать предложение (если "вкл") или нет (если "выкл").', verbose_name='Активно')), + ('dSetCommercialUntil', models.DateTimeField(blank=True, default=datetime.datetime(2018, 3, 25, 12, 0), help_text='Дата до которой набор считается размещеным на комметческой основе', verbose_name='Коммерческий до')), + ('dSetCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dSetModify', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Отредактировано')), + ('kSet2Glazing', models.ForeignKey(help_text='Стеклопакет используемый в данном наборе.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.glazing', verbose_name='Стеклопакет')), + ('kSet2PVCprofiles', models.ForeignKey(help_text='Профиль используемый в данном наборе.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.pvcprofiles', verbose_name='Профиль')), + ('kSet2User', models.ForeignKey(help_text='Пользователь, который определил данный набор.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='User')), + ], + options={ + 'verbose_name': 'Окно: набор', + 'verbose_name_plural': 'Окна: наборы', + 'ordering': ['id', 'sSetName'], + }, + ), + migrations.CreateModel( + name='Seria_Info', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sName', models.CharField(help_text='Наименование серии дома.', max_length=128, unique=True, verbose_name='Серия дома')), + ('sURL2IMG', models.ImageField(default='null.gif', help_text='Способ загрузить картинку через адмрн6ку Картинка-тизер для публикаций в соц.сетях. URL к картинке будет «/media/img_seria/...» и этот URL можно использовать в HTML-тексте блога. Если нужно загрузить несколько картинок, то после сохранения промежуточной записи, откройте ее на редактирование еще раз и добавте новую картинку. Предыдущая картинка (и её URL) продолжат быть доступны.
ВАЖНО: ПРИ ПУБЛИКАЦИИ В СОЦ.СЕТЯХ БУДЕТ ОТОБРАЖАТЬЯ КАРТИНКА ЗАГРУЖЕННАЯ ПОСЛЕДНЕЙ.
ВАЖНО: ЕСЛИ ЗАГРУЖАЕМАЯ КАРТИНКА УЖЕ ИМЕЕТ ДУБЛИКАТ В СИСТЕМЕ, ЕЕ ИМЯ (И URL) БУДУТ ИЗМЕНЕНЫ. БУДЬТЕ ВНИМТЕЛЬНЫ!', max_length=128, upload_to='img_seria/', verbose_name='Изображение')), + ('sSeriaDescription', models.TextField(blank=True, default='', help_text='Тематическая статья, о настоящей серии дома', null=True, verbose_name='Текст')), + ('dSeriaInfoCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dSeriaInfoModify', models.DateTimeField(auto_now=True, verbose_name='Отредактировано')), + ('kParent', models.ForeignKey(blank=True, default=None, help_text='Серия дома, которая является родительской для текущей.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.seria_info', verbose_name='Родительская серия')), + ('kRoot', models.ForeignKey(blank=True, default=None, help_text='Серия дома, которая является корневой для текущей.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='kRootID', to='oknardia.seria_info', verbose_name='Корневая серия')), + ], + options={ + 'verbose_name': 'Здание: серия дома', + 'verbose_name_plural': 'Здания: серии домов', + 'ordering': ['id', 'kParent_id', 'sName'], + }, + ), + migrations.CreateModel( + name='PriceOffer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sOfferFlapConfig', models.CharField(help_text='Предлагаемая схема открывания (МЕТАЯЗЫК)', max_length=32, verbose_name='Открывание')), + ('fOfferPrice', models.DecimalField(decimal_places=2, default=0.0, help_text='Цена установки окна, руб.', max_digits=10, verbose_name='Цена, ₽')), + ('fOfferRating', models.FloatField(db_index=True, default=0.0, help_text='Поправка для рейтинга (-0.5 ... 0.5). Вычисляется исходя из соответсвтвия предлагаемой схемы открывания', verbose_name='Рейтинг')), + ('iOfferImpressions', models.PositiveIntegerField(default=0, help_text='Число показов.', verbose_name='Показы')), + ('iOfferViews', models.PositiveIntegerField(default=0, help_text='Число просмотров.', verbose_name='Просмотры')), + ('sOfferActive', models.BooleanField(default=True, help_text='Отображать предложение (если "вкл") или нет (если "выкл").', verbose_name='Активно')), + ('dOfferCreate', models.DateTimeField(auto_now_add=True, verbose_name='Создано')), + ('dOfferModify', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Отредактировано')), + ('kOffer2MountDim', models.ForeignKey(help_text='Проем для которого установлена цена.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.win_mountdim', verbose_name='Проем')), + ('kOffer2SetKit', models.ForeignKey(default=1, help_text='Набор', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.setkit', verbose_name='Набор')), + ('kOfferFromUser', models.ForeignKey(help_text='Пользователь, который установил эту цену.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='User')), + ], + options={ + 'verbose_name': 'Окно: цена', + 'verbose_name_plural': 'Окна: цены', + 'ordering': ['id', 'fOfferPrice', 'kOffer2SetKit'], + }, + ), + migrations.AddField( + model_name='mountdim2apartment', + name='kMountDim', + field=models.ForeignKey(help_text='Параметры оконного/верного проема', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.win_mountdim', verbose_name='Оконный проём'), + ), + migrations.CreateModel( + name='LogMeasure', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dMeasureCreate', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Обращение')), + ('kMeasureApartment', models.ForeignKey(default=0, help_text='Для какой типовой квартиры сделали замер.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.apartment_type', verbose_name='Квартира')), + ('kMeasureBuilding', models.ForeignKey(db_index=False, default=0, help_text='По какому адресу был произведен замер.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.building_info', verbose_name='Адрес')), + ('kMeasureByUser', models.ForeignKey(default=0, help_text='Кто произвел замер и прислал данные', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='От кого')), + ], + options={ + 'verbose_name': 'Лог: замеры пользователей', + 'verbose_name_plural': 'Лог: замеры пользователей', + 'ordering': ['dMeasureCreate'], + }, + ), + migrations.CreateModel( + name='LogDemand', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dDemandCreate', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Обращение')), + ('kDemandApartment', models.ForeignKey(default=0, help_text='Цены на окна в какую типовую квартиру запросили.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.apartment_type', verbose_name='Квартира')), + ('kDemandBuilding', models.ForeignKey(db_index=False, default=0, help_text='Какой адрес был запрошен.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.building_info', verbose_name='Адрес')), + ('kDemandByUser', models.ForeignKey(default=0, help_text='Кто сделал запрос в систему', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='Кто спросил')), + ], + options={ + 'verbose_name': 'Лог: запрос в систему с главной', + 'verbose_name_plural': 'Лог: запросы в систему с главной', + 'ordering': ['dDemandCreate'], + }, + ), + migrations.AddField( + model_name='glazing', + name='kGlazing2User', + field=models.ForeignKey(help_text='Описание стекопакета добавлено пользователем.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='User'), + ), + migrations.CreateModel( + name='Catalog2Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sCatalogCardType', models.SmallIntegerField(choices=[(1, 'Профиль (карточка каталога)'), (100, 'Бренд (описание производителя профиля)')], db_index=True, default=1, help_text='Тип карточки каталога: описание для профиля или для бренда.', verbose_name='Тип')), + ('kBlogCatalog', models.ForeignKey(blank=True, db_constraint=False, default=None, help_text='Запись в каталог-блоге относящаяся к данному профилю.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.blogposts', verbose_name='Каталог-блог')), + ('kProfile', models.ForeignKey(blank=True, db_constraint=False, default=None, help_text='Профиль, к которому относится карточка каталога.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.pvcprofiles', verbose_name='Профиль')), + ], + options={ + 'verbose_name': 'Связка-каталог «профили↔блог»', + 'verbose_name_plural': 'Связки-каталог «профили↔блог»', + }, + ), + migrations.AddField( + model_name='building_info', + name='kSeria_Link', + field=models.ForeignKey(blank=True, default=None, help_text='Серия, типовой проект здания в нашей базе', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.seria_info', verbose_name='Серия2'), + ), + migrations.AddField( + model_name='blogposts', + name='kBlogAuthorUser', + field=models.ForeignKey(default=1, help_text='Автора поста в блог или записи в каталог.', on_delete=django.db.models.deletion.DO_NOTHING, to='oknardia.ouruser', verbose_name='Автор'), + ), + migrations.AddField( + model_name='apartment_type', + name='kBuild', + field=models.ForeignKey(blank=True, default=None, editable=False, help_text='Данный тип квартириы находится непоследственно к адресу (для индивидуальных проектов)', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.building_info', verbose_name='Адрес'), + ), + migrations.AddField( + model_name='apartment_type', + name='kSeria', + field=models.ForeignKey(blank=True, default=None, help_text='Данный тип квартиры принадлежит к серии дома', null=True, on_delete=django.db.models.deletion.SET_NULL, to='oknardia.seria_info', verbose_name='В доме серии'), + ), + ] diff --git a/oknardia/oknardia/migrations/__init__.py b/oknardia/oknardia/migrations/__init__.py new file mode 100644 index 0000000..e69de29