Рефакторинг: отделение Delivery от Order, обязательные поля доставки, исправление доменов
- Отделена модель Delivery от Order (OneToOne связь) - Добавлены обязательные поля delivery_date, time_from, time_to в Delivery - Delivery обязательна при создании заказа (кроме черновиков) - Добавлены методы calculate_total() и reset_delivery_cost() в Order - Добавлена валидация полей доставки в OrderForm - Исправлено создание доменов - убран порт из домена в БД - Исправлен редирект после установки пароля (правильный формат URL) - Исправлена ошибка NoReverseMatch в navbar для public схемы - Удалены все старые миграции (база создается с нуля) - Обновлены views для работы с новой моделью Delivery
This commit is contained in:
@@ -289,10 +289,13 @@ class TenantRegistrationAdmin(admin.ModelAdmin):
|
||||
logger.info(f"Тенант создан: {client.id}")
|
||||
|
||||
# Создаем домен (динамически определяется из настроек)
|
||||
# Локально: schema_name.localhost:8000
|
||||
# Локально: schema_name.localhost (без порта!)
|
||||
# Продакшен: schema_name.mix.smaa.by
|
||||
from django.conf import settings
|
||||
domain_base = settings.TENANT_DOMAIN_BASE
|
||||
# Убираем порт из домена (django-tenants ищет по hostname без порта)
|
||||
if ':' in domain_base:
|
||||
domain_base = domain_base.split(':')[0]
|
||||
domain_name = f"{registration.schema_name}.{domain_base}"
|
||||
logger.info(f"Создание домена: {domain_name}")
|
||||
domain = Domain.objects.create(
|
||||
|
||||
@@ -98,6 +98,9 @@ class Command(BaseCommand):
|
||||
|
||||
# Создаем домен
|
||||
domain_base = getattr(settings, 'TENANT_DOMAIN_BASE', 'localhost')
|
||||
# Убираем порт из домена (django-tenants ищет по hostname без порта)
|
||||
if ':' in domain_base:
|
||||
domain_base = domain_base.split(':')[0]
|
||||
domain_name = f"{registration.schema_name}.{domain_base}"
|
||||
self.stdout.write(f'Создание домена: {domain_name}')
|
||||
domain = Domain.objects.create(
|
||||
|
||||
@@ -123,6 +123,9 @@ class Command(BaseCommand):
|
||||
"""Получить доменное имя"""
|
||||
while True:
|
||||
domain_base = getattr(settings, 'TENANT_DOMAIN_BASE', 'localhost')
|
||||
# Убираем порт из домена (django-tenants ищет по hostname без порта)
|
||||
if ':' in domain_base:
|
||||
domain_base = domain_base.split(':')[0]
|
||||
default_domain = f'{default_subdomain}.{domain_base}'
|
||||
domain = input(f'Доменное имя [{default_domain}]: ').strip().lower()
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Generated by Django 5.0.10 on 2025-11-15 11:57
|
||||
# Generated by Django 5.0.10 on 2025-12-23 20:38
|
||||
|
||||
import django.core.validators
|
||||
import django.db.models.deletion
|
||||
@@ -81,6 +81,9 @@ class Migration(migrations.Migration):
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата подачи заявки')),
|
||||
('processed_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата обработки')),
|
||||
('rejection_reason', models.TextField(blank=True, verbose_name='Причина отклонения')),
|
||||
('password_setup_token', models.UUIDField(blank=True, help_text='UUID токен для ссылки установки пароля владельцем', null=True, unique=True, verbose_name='Токен установки пароля')),
|
||||
('password_setup_token_created_at', models.DateTimeField(blank=True, help_text='Когда был создан токен установки пароля (действителен 7 дней)', null=True, verbose_name='Дата создания токена')),
|
||||
('owner_notified_at', models.DateTimeField(blank=True, help_text='Когда было отправлено письмо владельцу с ссылкой установки пароля', null=True, verbose_name='Дата уведомления владельца')),
|
||||
('processed_by', models.ForeignKey(blank=True, help_text='Администратор, который обработал заявку', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Обработал')),
|
||||
('tenant', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='tenants.client', verbose_name='Созданный тенант')),
|
||||
],
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
# Generated by Django 5.0.10 on 2025-12-01 18:56
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tenants', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='tenantregistration',
|
||||
name='owner_notified_at',
|
||||
field=models.DateTimeField(blank=True, help_text='Когда было отправлено письмо владельцу с ссылкой установки пароля', null=True, verbose_name='Дата уведомления владельца'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tenantregistration',
|
||||
name='password_setup_token',
|
||||
field=models.UUIDField(blank=True, help_text='UUID токен для ссылки установки пароля владельцем', null=True, unique=True, verbose_name='Токен установки пароля'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='tenantregistration',
|
||||
name='password_setup_token_created_at',
|
||||
field=models.DateTimeField(blank=True, help_text='Когда был создан токен установки пароля (действителен 7 дней)', null=True, verbose_name='Дата создания токена'),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user