+ Telegram bot: sign up, sign in, notifications + Anonymous users can't see yuan_rate_commission * Only logged in customers can create/update orders * Customer info migrated to separate User model * Renamed legacy fields in serializers * Cleanup in API classes
163 lines
13 KiB
Python
163 lines
13 KiB
Python
# Generated by Django 4.2.2 on 2024-03-28 22:05
|
||
|
||
import datetime
|
||
from django.conf import settings
|
||
import django.core.validators
|
||
from django.db import migrations, models
|
||
import django.db.models.deletion
|
||
import mptt.fields
|
||
import store.models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
initial = True
|
||
|
||
dependencies = [
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='Category',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('name', models.CharField(max_length=20, verbose_name='Название')),
|
||
('delivery_price_CN_RU', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Цена доставки Китай-РФ')),
|
||
('commission', models.DecimalField(decimal_places=2, default=0, max_digits=10, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Дополнительная комиссия, %')),
|
||
('lft', models.PositiveIntegerField(editable=False)),
|
||
('rght', models.PositiveIntegerField(editable=False)),
|
||
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
|
||
('level', models.PositiveIntegerField(editable=False)),
|
||
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='store.category', verbose_name='Родительская категория')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Категория',
|
||
'verbose_name_plural': 'Категории',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='Gift',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('name', models.CharField(max_length=100, verbose_name='Название')),
|
||
('image', models.ImageField(blank=True, null=True, upload_to='gifts/', verbose_name='Фото')),
|
||
('min_price', models.DecimalField(decimal_places=2, default=0, help_text='от какой суммы доступен подарок', max_digits=10, verbose_name='Минимальная цена в юанях')),
|
||
('available_count', models.PositiveSmallIntegerField(default=0, verbose_name='Доступное количество')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Подарок',
|
||
'verbose_name_plural': 'Подарки',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='GlobalSettings',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('yuan_rate', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Курс CNY/RUB')),
|
||
('yuan_rate_last_updated', models.DateTimeField(default=None, null=True, verbose_name='Дата обновления курса CNY/RUB')),
|
||
('yuan_rate_commission', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Наценка на курс юаня, руб')),
|
||
('delivery_price_CN', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Цена доставки по Китаю')),
|
||
('commission_rub', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Комиссия, руб')),
|
||
('pickup_address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Адрес пункта самовывоза')),
|
||
('time_to_buy', models.DurationField(default=datetime.timedelta(seconds=10800), help_text="Через N времени заказ переходит из статуса 'Новый' в 'Черновик'", verbose_name='Время на покупку')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Глобальные настройки',
|
||
'verbose_name_plural': 'Глобальные настройки',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='Image',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('image', models.ImageField(upload_to=store.models.image_upload_path, verbose_name='Файл изображения')),
|
||
('type', models.PositiveSmallIntegerField(choices=[(0, 'Изображение'), (1, 'Превью'), (2, 'Документ'), (3, 'Подарок')], default=0, verbose_name='Тип')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Изображение',
|
||
'verbose_name_plural': 'Изображения',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='PaymentMethod',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('name', models.CharField(max_length=30, verbose_name='Название')),
|
||
('slug', models.SlugField(unique=True, verbose_name='Идентификатор')),
|
||
('cardnumber', models.CharField(blank=True, max_length=30, null=True, verbose_name='Номер карты')),
|
||
('requisites', models.CharField(blank=True, max_length=200, null=True, verbose_name='Реквизиты')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Метод оплаты',
|
||
'verbose_name_plural': 'Методы оплаты',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='PriceSnapshot',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('yuan_rate', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Курс CNY/RUB')),
|
||
('delivery_price_CN', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Цена доставки по Китаю')),
|
||
('delivery_price_CN_RU', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Цена доставки Китай-РФ')),
|
||
('commission_rub', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Комиссия, руб')),
|
||
],
|
||
),
|
||
migrations.CreateModel(
|
||
name='Promocode',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('name', models.CharField(max_length=100, unique=True, verbose_name='Название')),
|
||
('discount', models.PositiveIntegerField(verbose_name='Скидка в рублях')),
|
||
('free_delivery', models.BooleanField(default=False, verbose_name='Бесплатная доставка')),
|
||
('no_comission', models.BooleanField(default=False, verbose_name='Без комиссии')),
|
||
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Промокод',
|
||
'verbose_name_plural': 'Промокоды',
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='Checklist',
|
||
fields=[
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('status_updated_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата обновления статуса заказа')),
|
||
('id', models.CharField(default=store.models.generate_checklist_id, editable=False, max_length=10, primary_key=True, serialize=False)),
|
||
('status', models.CharField(choices=[('draft', 'Черновик'), ('neworder', 'Новый заказ'), ('payment', 'Проверка оплаты'), ('buying', 'На закупке'), ('bought', 'Закуплен'), ('china', 'На складе в Китае'), ('chinarush', 'Доставка на склад РФ'), ('rush', 'На складе в РФ'), ('split_waiting', 'Сплит: ожидание оплаты 2й части'), ('split_paid', 'Сплит: полностью оплачено'), ('cdek', 'Доставляется СДЭК'), ('completed', 'Завершен')], default='neworder', max_length=15, verbose_name='Статус заказа')),
|
||
('product_link', models.URLField(blank=True, null=True, verbose_name='Ссылка на товар')),
|
||
('brand', models.CharField(blank=True, max_length=100, null=True, verbose_name='Бренд')),
|
||
('model', models.CharField(blank=True, max_length=100, null=True, verbose_name='Модель')),
|
||
('size', models.CharField(blank=True, max_length=30, null=True, verbose_name='Размер')),
|
||
('price_yuan', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Цена в юанях')),
|
||
('real_price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Реальная цена')),
|
||
('comment', models.CharField(blank=True, max_length=200, null=True, verbose_name='Комментарий')),
|
||
('buyer_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Имя покупателя')),
|
||
('buyer_phone', models.CharField(blank=True, max_length=100, null=True, verbose_name='Телефон покупателя')),
|
||
('buyer_telegram', models.CharField(blank=True, max_length=100, null=True, verbose_name='Telegram покупателя')),
|
||
('receiver_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Имя получателя')),
|
||
('receiver_phone', models.CharField(blank=True, max_length=100, null=True, verbose_name='Телефон получателя')),
|
||
('is_split_payment', models.BooleanField(default=False, verbose_name='Оплата частями')),
|
||
('payment_proof', models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Подтверждение оплаты')),
|
||
('split_payment_proof', models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Подтверждение оплаты сплита')),
|
||
('split_accepted', models.BooleanField(default=False, verbose_name='Сплит принят')),
|
||
('receipt', models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Фото чека')),
|
||
('delivery', models.CharField(blank=True, choices=[('pickup', 'Самовывоз из шоурума'), ('cdek', 'Пункт выдачи заказов CDEK'), ('cdek_courier', 'Курьерская доставка CDEK')], max_length=15, null=True, verbose_name='Тип доставки')),
|
||
('poizon_tracking', models.CharField(blank=True, max_length=100, null=True, verbose_name='Трек-номер Poizon')),
|
||
('cdek_tracking', models.CharField(blank=True, max_length=100, null=True, verbose_name='Трек-номер СДЭК')),
|
||
('cdek_barcode_pdf', models.FileField(blank=True, null=True, upload_to='docs', verbose_name='Штрих-код СДЭК в PDF')),
|
||
('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='store.category', verbose_name='Категория')),
|
||
('gift', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='store.gift', verbose_name='Подарок')),
|
||
('images', models.ManyToManyField(blank=True, related_name='+', to='store.image', verbose_name='Изображения')),
|
||
('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Менеджер')),
|
||
('payment_method', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='store.paymentmethod', verbose_name='Метод оплаты')),
|
||
('price_snapshot', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checklist', to='store.pricesnapshot', verbose_name='Сохраненные цены')),
|
||
('promocode', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='store.promocode', verbose_name='Промокод')),
|
||
],
|
||
options={
|
||
'verbose_name': 'Заказ',
|
||
'verbose_name_plural': 'Заказы',
|
||
},
|
||
),
|
||
]
|