From 4a4bd437b97842507e801f69544e7666ff8760e5 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Fri, 14 Nov 2025 23:50:30 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=97=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20=D0=9C=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD=20(Shop)=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=A1=D0=BA=D0=BB=D0=B0=D0=B4=20(Warehouse)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Упрощена логика системы путём замены отдельной сущности "Магазин" на универсальную сущность "Склад", которая может использоваться как точка самовывоза. Изменения: - Расширена модель Warehouse: добавлены адрес, контакты, флаг is_pickup_point - Модель Order: поле pickup_shop заменено на pickup_warehouse - Обновлены все формы, сервисы, views, admin для работы со складами - Обновлены шаблоны HTML и JavaScript код - Удалено приложение shops полностью - Пересозданы миграции БД - Обновлён навбар (удалена ссылка на магазины) Преимущества: - Упрощена архитектура системы - Единая точка управления складами и точками самовывоза - Интеграция с системой инвентаризации 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/accounts/migrations/0001_initial.py | 2 +- .../customers/migrations/0001_initial.py | 2 +- .../inventory/migrations/0001_initial.py | 8 +- .../inventory/migrations/0002_initial.py | 6 +- myproject/inventory/models.py | 31 ++++ myproject/myproject/settings.py | 1 - myproject/myproject/urls.py | 1 - myproject/orders/admin.py | 2 +- myproject/orders/forms.py | 10 +- .../management/commands/create_demo_orders.py | 12 +- myproject/orders/migrations/0001_initial.py | 12 +- myproject/orders/migrations/0002_initial.py | 2 +- .../0003_update_status_names_to_russian.py | 64 --------- ...er_orderstatus_is_negative_end_and_more.py | 23 --- myproject/orders/models.py | 22 +-- myproject/orders/services/draft_service.py | 6 +- myproject/orders/static/orders/js/autosave.js | 8 +- .../orders/static/orders/js/draft-creator.js | 6 +- .../orders/templates/orders/order_detail.html | 10 +- .../orders/templates/orders/order_form.html | 10 +- myproject/orders/views.py | 4 +- myproject/products/migrations/0001_initial.py | 2 +- myproject/shops/__init__.py | 0 myproject/shops/admin.py | 58 -------- myproject/shops/apps.py | 6 - myproject/shops/forms.py | 56 -------- myproject/shops/migrations/0001_initial.py | 37 ----- myproject/shops/migrations/__init__.py | 0 myproject/shops/models.py | 93 ------------ .../templates/shops/shop_confirm_delete.html | 36 ----- .../shops/templates/shops/shop_form.html | 134 ------------------ .../shops/templates/shops/shop_list.html | 104 -------------- myproject/shops/tests.py | 3 - myproject/shops/urls.py | 11 -- myproject/shops/views.py | 52 ------- myproject/templates/navbar.html | 3 - myproject/tenants/migrations/0001_initial.py | 2 +- 37 files changed, 99 insertions(+), 740 deletions(-) delete mode 100644 myproject/orders/migrations/0003_update_status_names_to_russian.py delete mode 100644 myproject/orders/migrations/0004_alter_orderstatus_is_negative_end_and_more.py delete mode 100644 myproject/shops/__init__.py delete mode 100644 myproject/shops/admin.py delete mode 100644 myproject/shops/apps.py delete mode 100644 myproject/shops/forms.py delete mode 100644 myproject/shops/migrations/0001_initial.py delete mode 100644 myproject/shops/migrations/__init__.py delete mode 100644 myproject/shops/models.py delete mode 100644 myproject/shops/templates/shops/shop_confirm_delete.html delete mode 100644 myproject/shops/templates/shops/shop_form.html delete mode 100644 myproject/shops/templates/shops/shop_list.html delete mode 100644 myproject/shops/tests.py delete mode 100644 myproject/shops/urls.py delete mode 100644 myproject/shops/views.py diff --git a/myproject/accounts/migrations/0001_initial.py b/myproject/accounts/migrations/0001_initial.py index 41e786a..f1a6275 100644 --- a/myproject/accounts/migrations/0001_initial.py +++ b/myproject/accounts/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 import django.contrib.auth.validators import django.utils.timezone diff --git a/myproject/customers/migrations/0001_initial.py b/myproject/customers/migrations/0001_initial.py index 53e8edb..2ceea6a 100644 --- a/myproject/customers/migrations/0001_initial.py +++ b/myproject/customers/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 import phonenumber_field.modelfields from django.db import migrations, models diff --git a/myproject/inventory/migrations/0001_initial.py b/myproject/inventory/migrations/0001_initial.py index e054955..882b8d3 100644 --- a/myproject/inventory/migrations/0001_initial.py +++ b/myproject/inventory/migrations/0001_initial.py @@ -1,5 +1,6 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 +import phonenumber_field.modelfields from django.db import migrations, models @@ -216,8 +217,13 @@ class Migration(migrations.Migration): ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=200, verbose_name='Название')), ('description', models.TextField(blank=True, null=True, verbose_name='Описание')), + ('street', models.CharField(blank=True, max_length=255, null=True, verbose_name='Улица')), + ('building_number', models.CharField(blank=True, max_length=20, null=True, verbose_name='Номер здания')), + ('phone', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region='BY', verbose_name='Телефон')), + ('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email')), ('is_active', models.BooleanField(default=True, verbose_name='Активен')), ('is_default', models.BooleanField(default=False, help_text='Автоматически выбирается при создании новых документов', verbose_name='Склад по умолчанию')), + ('is_pickup_point', models.BooleanField(default=True, help_text='Можно ли выбрать этот склад как точку самовывоза заказа', verbose_name='Доступен для самовывоза')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Дата обновления')), ], diff --git a/myproject/inventory/migrations/0002_initial.py b/myproject/inventory/migrations/0002_initial.py index 0998eae..ccace40 100644 --- a/myproject/inventory/migrations/0002_initial.py +++ b/myproject/inventory/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 import django.db.models.deletion from django.db import migrations, models @@ -128,6 +128,10 @@ class Migration(migrations.Migration): model_name='warehouse', index=models.Index(fields=['is_default'], name='inventory_w_is_defa_4b7615_idx'), ), + migrations.AddIndex( + model_name='warehouse', + index=models.Index(fields=['is_pickup_point'], name='inventory_w_is_pick_e86268_idx'), + ), migrations.AddField( model_name='transferbatch', name='from_warehouse', diff --git a/myproject/inventory/models.py b/myproject/inventory/models.py index 1e1655c..5ef1d0b 100644 --- a/myproject/inventory/models.py +++ b/myproject/inventory/models.py @@ -3,20 +3,38 @@ from django.utils import timezone from django.core.exceptions import ValidationError from decimal import Decimal from products.models import Product +from phonenumber_field.modelfields import PhoneNumberField class Warehouse(models.Model): """ Склад (физическое или логическое место хранения). + Может использоваться как точка самовывоза для заказов. """ name = models.CharField(max_length=200, verbose_name="Название") description = models.TextField(blank=True, null=True, verbose_name="Описание") + + # Адрес + street = models.CharField(max_length=255, blank=True, null=True, verbose_name="Улица") + building_number = models.CharField(max_length=20, blank=True, null=True, verbose_name="Номер здания") + + # Контакты + phone = PhoneNumberField(region='BY', blank=True, null=True, verbose_name="Телефон") + email = models.EmailField(blank=True, null=True, verbose_name="Email") + + # Настройки is_active = models.BooleanField(default=True, verbose_name="Активен") is_default = models.BooleanField( default=False, verbose_name="Склад по умолчанию", help_text="Автоматически выбирается при создании новых документов" ) + is_pickup_point = models.BooleanField( + default=True, + verbose_name="Доступен для самовывоза", + help_text="Можно ли выбрать этот склад как точку самовывоза заказа" + ) + created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления") @@ -26,11 +44,24 @@ class Warehouse(models.Model): indexes = [ models.Index(fields=['is_active']), models.Index(fields=['is_default']), + models.Index(fields=['is_pickup_point']), ] def __str__(self): + if self.street and self.building_number: + return f"{self.name} ({self.street}, {self.building_number})" return self.name + @property + def full_address(self): + """Полный адрес склада""" + parts = [] + if self.street: + parts.append(self.street) + if self.building_number: + parts.append(self.building_number) + return ', '.join(parts) if parts else "Адрес не указан" + def save(self, *args, **kwargs): """Обеспечиваем что только один склад может быть по умолчанию в рамках одного тенанта""" if self.is_default: diff --git a/myproject/myproject/settings.py b/myproject/myproject/settings.py index 99d4ade..08aba96 100644 --- a/myproject/myproject/settings.py +++ b/myproject/myproject/settings.py @@ -68,7 +68,6 @@ TENANT_APPS = [ 'nested_admin', 'django_filters', # Фильтрация данных 'customers', # Клиенты магазина - 'shops', # Точки магазина/самовывоза 'products', # Товары и категории 'orders', # Заказы 'inventory', # Складской учет diff --git a/myproject/myproject/urls.py b/myproject/myproject/urls.py index 73b0f29..6f9f273 100644 --- a/myproject/myproject/urls.py +++ b/myproject/myproject/urls.py @@ -21,7 +21,6 @@ urlpatterns = [ path('customers/', include('customers.urls')), # Управление клиентами path('inventory/', include('inventory.urls')), # Управление складом path('orders/', include('orders.urls')), # Управление заказами - path('shops/', include('shops.urls')), # Управление магазинами ] # Serve media files during development diff --git a/myproject/orders/admin.py b/myproject/orders/admin.py index ddef171..d4d6720 100644 --- a/myproject/orders/admin.py +++ b/myproject/orders/admin.py @@ -83,7 +83,7 @@ class OrderAdmin(admin.ModelAdmin): 'is_delivery', 'customer_is_recipient', 'delivery_address', - 'pickup_shop', + 'pickup_warehouse', 'delivery_date', 'delivery_time_start', 'delivery_time_end', diff --git a/myproject/orders/forms.py b/myproject/orders/forms.py index a7a6a51..226f16e 100644 --- a/myproject/orders/forms.py +++ b/myproject/orders/forms.py @@ -3,7 +3,7 @@ from django import forms from django.forms import inlineformset_factory from .models import Order, OrderItem, Address, OrderStatus from customers.models import Customer -from shops.models import Shop +from inventory.models import Warehouse from products.models import Product, ProductKit @@ -92,7 +92,7 @@ class OrderForm(forms.ModelForm): 'customer', 'is_delivery', 'delivery_address', - 'pickup_shop', + 'pickup_warehouse', 'delivery_date', 'delivery_time_start', 'delivery_time_end', @@ -145,11 +145,11 @@ class OrderForm(forms.ModelForm): }) self.fields['delivery_address'].required = False - self.fields['pickup_shop'].widget.attrs.update({ + self.fields['pickup_warehouse'].widget.attrs.update({ 'class': 'form-select select2', - 'data-placeholder': 'Выберите точку самовывоза' + 'data-placeholder': 'Выберите склад для самовывоза' }) - self.fields['pickup_shop'].required = False + self.fields['pickup_warehouse'].required = False # Опциональные поля даты/времени self.fields['delivery_date'].required = False diff --git a/myproject/orders/management/commands/create_demo_orders.py b/myproject/orders/management/commands/create_demo_orders.py index fcbbdba..01020a8 100644 --- a/myproject/orders/management/commands/create_demo_orders.py +++ b/myproject/orders/management/commands/create_demo_orders.py @@ -12,7 +12,7 @@ from decimal import Decimal from orders.models import Order, OrderItem, Address from customers.models import Customer -from shops.models import Shop +from inventory.models import Warehouse from products.models import Product @@ -56,10 +56,10 @@ class Command(BaseCommand): return addresses = list(Address.objects.all()) - shops = list(Shop.objects.all()) + warehouses = list(Warehouse.objects.filter(is_pickup_point=True)) - if not addresses and not shops: - self.stdout.write(self.style.ERROR('Нет ни адресов, ни магазинов! Создайте хотя бы что-то одно.')) + if not addresses and not warehouses: + self.stdout.write(self.style.ERROR('Нет ни адресов, ни складов для самовывоза! Создайте хотя бы что-то одно.')) return # Статусы и их вероятности @@ -111,8 +111,8 @@ class Command(BaseCommand): # Для доставки выбираем случайный адрес (адреса теперь привязаны к заказам) order.delivery_address = random.choice(addresses) order.delivery_cost = Decimal(random.randint(200, 500)) - elif shops: - order.pickup_shop = random.choice(shops) + elif warehouses: + order.pickup_warehouse = random.choice(warehouses) order.delivery_cost = Decimal(0) # Дата и время diff --git a/myproject/orders/migrations/0001_initial.py b/myproject/orders/migrations/0001_initial.py index 913e999..1147fef 100644 --- a/myproject/orders/migrations/0001_initial.py +++ b/myproject/orders/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 import django.db.models.deletion import simple_history.models @@ -12,7 +12,7 @@ class Migration(migrations.Migration): dependencies = [ ('customers', '0001_initial'), - ('shops', '0001_initial'), + ('inventory', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] @@ -25,8 +25,8 @@ class Migration(migrations.Migration): ('code', models.SlugField(help_text="Уникальный идентификатор (например: 'completed', 'cancelled')", unique=True, verbose_name='Код статуса')), ('label', models.CharField(blank=True, max_length=100, verbose_name='Метка для отображения')), ('is_system', models.BooleanField(default=False, help_text='True для встроенных статусов (draft, completed, cancelled)', verbose_name='Системный статус')), - ('is_positive_end', models.BooleanField(default=False, help_text='True если это финальный успешный статус (Выполнен)', verbose_name='Положительный конец')), - ('is_negative_end', models.BooleanField(default=False, help_text='True если это финальный отрицательный статус (Отменен)', verbose_name='Отрицательный конец')), + ('is_positive_end', models.BooleanField(default=False, help_text='True если это финальный успешный статус (Выполнен)', verbose_name='Положительный исход сделки')), + ('is_negative_end', models.BooleanField(default=False, help_text='True если это финальный отрицательный статус (Отменен)', verbose_name='Отрицательный исход сделки')), ('order', models.PositiveIntegerField(default=0, verbose_name='Порядок отображения')), ('color', models.CharField(blank=True, default='#808080', help_text='Например: #FF5733', max_length=7, verbose_name='Цвет (hex)')), ('description', models.TextField(blank=True, verbose_name='Описание')), @@ -112,7 +112,7 @@ class Migration(migrations.Migration): ('delivery_address', models.ForeignKey(blank=True, db_constraint=False, help_text='Обязательно для курьерской доставки', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='orders.address', verbose_name='Адрес доставки')), ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), ('modified_by', models.ForeignKey(blank=True, db_constraint=False, help_text='Последний пользователь, изменивший заказ', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Изменен пользователем')), - ('pickup_shop', models.ForeignKey(blank=True, db_constraint=False, help_text='Обязательно для самовывоза', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='shops.shop', verbose_name='Точка самовывоза')), + ('pickup_warehouse', models.ForeignKey(blank=True, db_constraint=False, help_text='Обязательно для самовывоза', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='inventory.warehouse', verbose_name='Склад для самовывоза')), ], options={ 'verbose_name': 'historical Заказ', @@ -151,7 +151,7 @@ class Migration(migrations.Migration): ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='orders', to='customers.customer', verbose_name='Клиент')), ('delivery_address', models.OneToOneField(blank=True, help_text='Обязательно для курьерской доставки', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order', to='orders.address', verbose_name='Адрес доставки')), ('modified_by', models.ForeignKey(blank=True, help_text='Последний пользователь, изменивший заказ', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_orders', to=settings.AUTH_USER_MODEL, verbose_name='Изменен пользователем')), - ('pickup_shop', models.ForeignKey(blank=True, help_text='Обязательно для самовывоза', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='pickup_orders', to='shops.shop', verbose_name='Точка самовывоза')), + ('pickup_warehouse', models.ForeignKey(blank=True, help_text='Обязательно для самовывоза', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='pickup_orders', to='inventory.warehouse', verbose_name='Склад для самовывоза')), ], options={ 'verbose_name': 'Заказ', diff --git a/myproject/orders/migrations/0002_initial.py b/myproject/orders/migrations/0002_initial.py index bb42ea6..cd4564d 100644 --- a/myproject/orders/migrations/0002_initial.py +++ b/myproject/orders/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.10 on 2025-11-13 13:12 +# Generated by Django 5.0.10 on 2025-11-14 20:45 import django.db.models.deletion from django.conf import settings diff --git a/myproject/orders/migrations/0003_update_status_names_to_russian.py b/myproject/orders/migrations/0003_update_status_names_to_russian.py deleted file mode 100644 index 2f80b02..0000000 --- a/myproject/orders/migrations/0003_update_status_names_to_russian.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 5.0.10 on 2025-11-13 14:19 - -from django.db import migrations - - -def update_status_names_to_russian(apps, schema_editor): - """Обновляем названия статусов на русский язык""" - OrderStatus = apps.get_model('orders', 'OrderStatus') - - status_translations = { - 'draft': 'Черновик', - 'new': 'Новый', - 'confirmed': 'Подтвережден', - 'in_assembly': 'В сборке', - 'in_delivery': 'В доставке', - 'completed': 'Выполнен', - 'return': 'Возврат', - 'cancelled': 'Отменен', - } - - for code, russian_name in status_translations.items(): - try: - status = OrderStatus.objects.get(code=code) - status.name = russian_name - status.label = russian_name - status.save() - except OrderStatus.DoesNotExist: - pass - - -def reverse_status_names(apps, schema_editor): - """Откатываем названия статусов обратно на английский (для отката миграции)""" - OrderStatus = apps.get_model('orders', 'OrderStatus') - - status_translations = { - 'draft': 'Draft', - 'new': 'New', - 'confirmed': 'Confirmed', - 'in_assembly': 'In Assembly', - 'in_delivery': 'In Delivery', - 'completed': 'Completed', - 'return': 'Return', - 'cancelled': 'Cancelled', - } - - for code, english_name in status_translations.items(): - try: - status = OrderStatus.objects.get(code=code) - status.name = english_name - status.label = english_name - status.save() - except OrderStatus.DoesNotExist: - pass - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0002_initial'), - ] - - operations = [ - migrations.RunPython(update_status_names_to_russian, reverse_status_names), - ] diff --git a/myproject/orders/migrations/0004_alter_orderstatus_is_negative_end_and_more.py b/myproject/orders/migrations/0004_alter_orderstatus_is_negative_end_and_more.py deleted file mode 100644 index 803e752..0000000 --- a/myproject/orders/migrations/0004_alter_orderstatus_is_negative_end_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.0.10 on 2025-11-13 18:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0003_update_status_names_to_russian'), - ] - - operations = [ - migrations.AlterField( - model_name='orderstatus', - name='is_negative_end', - field=models.BooleanField(default=False, help_text='True если это финальный отрицательный статус (Отменен)', verbose_name='Отрицательный исход сделки'), - ), - migrations.AlterField( - model_name='orderstatus', - name='is_positive_end', - field=models.BooleanField(default=False, help_text='True если это финальный успешный статус (Выполнен)', verbose_name='Положительный исход сделки'), - ), - ] diff --git a/myproject/orders/models.py b/myproject/orders/models.py index d0c87d6..459de59 100644 --- a/myproject/orders/models.py +++ b/myproject/orders/models.py @@ -3,7 +3,7 @@ from django.core.exceptions import ValidationError from accounts.models import CustomUser from customers.models import Customer from products.models import Product, ProductKit -from shops.models import Shop +from inventory.models import Warehouse from simple_history.models import HistoricalRecords @@ -283,14 +283,14 @@ class Order(models.Model): help_text="Обязательно для курьерской доставки" ) - # Пункт самовывоза (для самовывоза) - pickup_shop = models.ForeignKey( - Shop, + # Склад для самовывоза + pickup_warehouse = models.ForeignKey( + Warehouse, on_delete=models.PROTECT, null=True, blank=True, related_name='pickup_orders', - verbose_name="Точка самовывоза", + verbose_name="Склад для самовывоза", help_text="Обязательно для самовывоза" ) @@ -511,10 +511,10 @@ class Order(models.Model): 'delivery_address': 'Для доставки необходимо указать адрес доставки' }) - # Проверка: для самовывоза обязателен пункт самовывоза - if not self.is_delivery and not self.pickup_shop: + # Проверка: для самовывоза обязателен склад + if not self.is_delivery and not self.pickup_warehouse: raise ValidationError({ - 'pickup_shop': 'Для самовывоза необходимо выбрать точку самовывоза' + 'pickup_warehouse': 'Для самовывоза необходимо выбрать склад' }) # Проверка: время окончания должно быть позже времени начала @@ -618,9 +618,9 @@ class Order(models.Model): return f"Доставка по адресу: {self.delivery_address.full_address}" return "Доставка (адрес не указан)" else: - if self.pickup_shop: - return f"Самовывоз из: {self.pickup_shop.name}" - return "Самовывоз (точка не указана)" + if self.pickup_warehouse: + return f"Самовывоз со склада: {self.pickup_warehouse.name}" + return "Самовывоз (склад не указан)" @property def delivery_time_window(self): diff --git a/myproject/orders/services/draft_service.py b/myproject/orders/services/draft_service.py index 696b21b..81266d3 100644 --- a/myproject/orders/services/draft_service.py +++ b/myproject/orders/services/draft_service.py @@ -57,7 +57,7 @@ class DraftOrderService: modified_by=user, is_delivery=data.get('is_delivery', True), delivery_address=data.get('delivery_address'), - pickup_shop=data.get('pickup_shop'), + pickup_warehouse=data.get('pickup_warehouse'), delivery_date=data.get('delivery_date'), delivery_time_start=data.get('delivery_time_start'), delivery_time_end=data.get('delivery_time_end'), @@ -97,7 +97,7 @@ class DraftOrderService: # ForeignKey поля требуют специальной обработки fk_fields = { 'customer': 'customers.Customer', - 'pickup_shop': 'shops.Shop', + 'pickup_warehouse': 'inventory.Warehouse', 'status': 'orders.OrderStatus', } @@ -362,7 +362,7 @@ class DraftOrderService: drafts = Order.objects.filter( status__code='draft', modified_by=user - ).select_related('customer', 'delivery_address', 'pickup_shop') + ).select_related('customer', 'delivery_address', 'pickup_warehouse') if customer: drafts = drafts.filter(customer=customer) diff --git a/myproject/orders/static/orders/js/autosave.js b/myproject/orders/static/orders/js/autosave.js index c7066e2..033195a 100644 --- a/myproject/orders/static/orders/js/autosave.js +++ b/myproject/orders/static/orders/js/autosave.js @@ -147,7 +147,7 @@ 'input[type="checkbox"]', 'input[type="radio"]', 'select[name="delivery_address"]', - 'select[name="pickup_shop"]', + 'select[name="pickup_warehouse"]', // Поля адреса доставки 'input[name="address_street"]', 'input[name="address_building_number"]', @@ -364,9 +364,9 @@ data.delivery_address = parseInt(deliveryAddressField.value); } - const pickupShopField = form.querySelector('select[name="pickup_shop"]'); - if (pickupShopField && pickupShopField.value) { - data.pickup_shop = parseInt(pickupShopField.value); + const pickupWarehouseField = form.querySelector('select[name="pickup_warehouse"]'); + if (pickupWarehouseField && pickupWarehouseField.value) { + data.pickup_warehouse = parseInt(pickupWarehouseField.value); } // Поля адреса доставки (новая логика с прямым вводом) diff --git a/myproject/orders/static/orders/js/draft-creator.js b/myproject/orders/static/orders/js/draft-creator.js index 2d3d261..7e125fb 100644 --- a/myproject/orders/static/orders/js/draft-creator.js +++ b/myproject/orders/static/orders/js/draft-creator.js @@ -236,9 +236,9 @@ data.delivery_address = parseInt(deliveryAddressField.value); } - const pickupShopField = form.querySelector('select[name="pickup_shop"]'); - if (pickupShopField && pickupShopField.value) { - data.pickup_shop = parseInt(pickupShopField.value); + const pickupWarehouseField = form.querySelector('select[name="pickup_warehouse"]'); + if (pickupWarehouseField && pickupWarehouseField.value) { + data.pickup_warehouse = parseInt(pickupWarehouseField.value); } // Новая логика выбора адреса diff --git a/myproject/orders/templates/orders/order_detail.html b/myproject/orders/templates/orders/order_detail.html index 6ed42d4..0c833c0 100644 --- a/myproject/orders/templates/orders/order_detail.html +++ b/myproject/orders/templates/orders/order_detail.html @@ -130,13 +130,13 @@ {% else %}
-
Точка самовывоза:
+
Склад для самовывоза:
- {% if order.pickup_shop %} - {{ order.pickup_shop.name }}
- {{ order.pickup_shop.address }} + {% if order.pickup_warehouse %} + {{ order.pickup_warehouse.name }}
+ {{ order.pickup_warehouse.full_address }} {% else %} - Не указана + Не указан {% endif %}
diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index 3363462..f1e6fec 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -522,12 +522,12 @@