Рефакторинг: отделение 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:
2025-12-23 23:52:59 +03:00
parent d29c736252
commit 94fe363cb1
61 changed files with 1342 additions and 2189 deletions

View File

@@ -17,58 +17,61 @@
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
{% if user.is_authenticated %}
<!-- 📦 Товары -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'products' %}active{% endif %}" href="#" id="productsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
📦 Товары
</a>
<ul class="dropdown-menu" aria-labelledby="productsDropdown">
<li><a class="dropdown-item" href="{% url 'products:all-products' %}">Все товары</a></li>
<li><a class="dropdown-item" href="{% url 'products:catalog' %}"><i class="bi bi-grid-3x3-gap"></i> Каталог</a></li>
<li><a class="dropdown-item" href="{% url 'products:configurablekit-list' %}">Вариативные товары</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{% url 'products:category-list' %}">Категории</a></li>
<li><a class="dropdown-item" href="{% url 'products:tag-list' %}">Теги</a></li>
<li><a class="dropdown-item" href="{% url 'products:variantgroup-list' %}">Варианты (группы)</a></li>
</ul>
</li>
{% comment %}Показываем меню tenant приложений только если мы не на странице setup-password (public схема){% endcomment %}
{% if 'setup-password' not in request.path %}
<!-- 📦 Товары -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'products' %}active{% endif %}" href="#" id="productsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
📦 Товары
</a>
<ul class="dropdown-menu" aria-labelledby="productsDropdown">
<li><a class="dropdown-item" href="{% url 'products:all-products' %}">Все товары</a></li>
<li><a class="dropdown-item" href="{% url 'products:catalog' %}"><i class="bi bi-grid-3x3-gap"></i> Каталог</a></li>
<li><a class="dropdown-item" href="{% url 'products:configurablekit-list' %}">Вариативные товары</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{% url 'products:category-list' %}">Категории</a></li>
<li><a class="dropdown-item" href="{% url 'products:tag-list' %}">Теги</a></li>
<li><a class="dropdown-item" href="{% url 'products:variantgroup-list' %}">Варианты (группы)</a></li>
</ul>
</li>
<!-- 📋 Заказы -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'orders' %}active{% endif %}" href="{% url 'orders:order-list' %}" id="ordersDropdown">
📋 Заказы
</a>
<ul class="dropdown-menu" aria-labelledby="ordersDropdown">
<li><a class="dropdown-item" href="{% url 'orders:order-list' %}">Список заказов</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{% url 'orders:status_list' %}">Статусы заказов</a></li>
</ul>
</li>
<!-- 📋 Заказы -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'orders' %}active{% endif %}" href="{% url 'orders:order-list' %}" id="ordersDropdown">
📋 Заказы
</a>
<ul class="dropdown-menu" aria-labelledby="ordersDropdown">
<li><a class="dropdown-item" href="{% url 'orders:order-list' %}">Список заказов</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="{% url 'orders:status_list' %}">Статусы заказов</a></li>
</ul>
</li>
<!-- 👥 Клиенты -->
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.namespace == 'customers' %}active{% endif %}" href="{% url 'customers:customer-list' %}">
👥 Клиенты
</a>
</li>
<!-- 👥 Клиенты -->
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.namespace == 'customers' %}active{% endif %}" href="{% url 'customers:customer-list' %}">
👥 Клиенты
</a>
</li>
<!-- 📦 Склад -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'inventory' %}active{% endif %}" href="#" id="inventoryDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
🏭 Склад
</a>
<ul class="dropdown-menu" aria-labelledby="inventoryDropdown">
<li><a class="dropdown-item" href="{% url 'inventory:inventory-home' %}">Управление складом</a></li>
<li><a class="dropdown-item" href="{% url 'inventory:showcase-list' %}">Витрины</a></li>
</ul>
</li>
<!-- 📦 Склад -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {% if request.resolver_match.namespace == 'inventory' %}active{% endif %}" href="#" id="inventoryDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
🏭 Склад
</a>
<ul class="dropdown-menu" aria-labelledby="inventoryDropdown">
<li><a class="dropdown-item" href="{% url 'inventory:inventory-home' %}">Управление складом</a></li>
<li><a class="dropdown-item" href="{% url 'inventory:showcase-list' %}">Витрины</a></li>
</ul>
</li>
<!-- 💰 Касса -->
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.namespace == 'pos' %}active{% endif %}" href="{% url 'pos:terminal' %}">
💰 Касса
</a>
</li>
<!-- 💰 Касса -->
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.namespace == 'pos' %}active{% endif %}" href="{% url 'pos:terminal' %}">
💰 Касса
</a>
</li>
{% endif %}
<!-- ⚙️ Настройки (только для owner/superuser) -->
{% if request.user.is_owner or request.user.is_superuser %}