Упрощена модель Shop и реализован полный CRUD для магазинов
- Упрощена модель Shop: только name обязательное поле - Удалены поля: district, режим работы, координаты, инструкции - Description перенесено после name - Все поля кроме name теперь опциональные - Создан полный CRUD для магазинов: * ShopListView - список магазинов с пагинацией * ShopCreateView - создание нового магазина * ShopUpdateView - редактирование магазина * ShopDeleteView - удаление с подтверждением - Создана форма ShopForm с Bootstrap стилями - Поле "Название магазина" помечено как обязательное (*) - Настроена обработка PhoneNumberField - Созданы шаблоны: * shop_list.html - таблица со списком магазинов * shop_form.html - форма создания/редактирования * shop_confirm_delete.html - подтверждение удаления - Настроены URLs для приложения shops - Добавлена ссылка "Магазины" в главную навигацию - Обновлена админ-панель shops 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4,34 +4,39 @@ from phonenumber_field.modelfields import PhoneNumberField
|
||||
|
||||
class Shop(models.Model):
|
||||
"""
|
||||
Модель магазина/пункта самовывоза для цветочного магазина в Минске.
|
||||
Модель магазина/пункта самовывоза для цветочного магазина.
|
||||
"""
|
||||
name = models.CharField(
|
||||
max_length=200,
|
||||
verbose_name="Название магазина"
|
||||
)
|
||||
|
||||
description = models.TextField(
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Описание",
|
||||
help_text="Дополнительная информация о магазине"
|
||||
)
|
||||
|
||||
# Адрес магазина
|
||||
street = models.CharField(
|
||||
max_length=255,
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Улица"
|
||||
)
|
||||
|
||||
building_number = models.CharField(
|
||||
max_length=20,
|
||||
verbose_name="Номер здания"
|
||||
)
|
||||
|
||||
district = models.CharField(
|
||||
max_length=100,
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Район",
|
||||
help_text="Район в Минске"
|
||||
verbose_name="Номер здания"
|
||||
)
|
||||
|
||||
# Контактная информация
|
||||
phone = PhoneNumberField(
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Телефон",
|
||||
help_text="Контактный телефон магазина"
|
||||
)
|
||||
@@ -42,24 +47,6 @@ class Shop(models.Model):
|
||||
verbose_name="Email"
|
||||
)
|
||||
|
||||
# Режим работы
|
||||
opening_time = models.TimeField(
|
||||
verbose_name="Время открытия",
|
||||
help_text="Время начала работы магазина"
|
||||
)
|
||||
|
||||
closing_time = models.TimeField(
|
||||
verbose_name="Время закрытия",
|
||||
help_text="Время окончания работы магазина"
|
||||
)
|
||||
|
||||
working_days = models.CharField(
|
||||
max_length=100,
|
||||
default="Пн-Вс",
|
||||
verbose_name="Рабочие дни",
|
||||
help_text="Например: Пн-Пт, Пн-Вс, Пн-Сб"
|
||||
)
|
||||
|
||||
# Статусы и настройки
|
||||
is_active = models.BooleanField(
|
||||
default=True,
|
||||
@@ -73,40 +60,6 @@ class Shop(models.Model):
|
||||
help_text="Доступен ли магазин для самовывоза заказов"
|
||||
)
|
||||
|
||||
# Дополнительная информация
|
||||
description = models.TextField(
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Описание",
|
||||
help_text="Дополнительная информация о магазине"
|
||||
)
|
||||
|
||||
delivery_instructions = models.TextField(
|
||||
blank=True,
|
||||
null=True,
|
||||
verbose_name="Инструкции для клиентов",
|
||||
help_text="Как найти магазин, где припарковаться и т.д."
|
||||
)
|
||||
|
||||
# Координаты для карты (опционально)
|
||||
latitude = models.DecimalField(
|
||||
max_digits=9,
|
||||
decimal_places=6,
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name="Широта",
|
||||
help_text="Координаты для отображения на карте"
|
||||
)
|
||||
|
||||
longitude = models.DecimalField(
|
||||
max_digits=9,
|
||||
decimal_places=6,
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name="Долгота",
|
||||
help_text="Координаты для отображения на карте"
|
||||
)
|
||||
|
||||
# Временные метки
|
||||
created_at = models.DateTimeField(
|
||||
auto_now_add=True,
|
||||
@@ -124,19 +77,17 @@ class Shop(models.Model):
|
||||
indexes = [
|
||||
models.Index(fields=['is_active']),
|
||||
models.Index(fields=['is_pickup_point']),
|
||||
models.Index(fields=['district']),
|
||||
]
|
||||
ordering = ['name']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name} ({self.full_address})"
|
||||
if self.street and self.building_number:
|
||||
return f"{self.name} ({self.full_address})"
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def full_address(self):
|
||||
"""Полный адрес магазина"""
|
||||
return f"{self.street}, {self.building_number}"
|
||||
|
||||
@property
|
||||
def working_hours(self):
|
||||
"""Форматированный режим работы"""
|
||||
return f"{self.working_days}: {self.opening_time.strftime('%H:%M')} - {self.closing_time.strftime('%H:%M')}"
|
||||
if self.street and self.building_number:
|
||||
return f"{self.street}, {self.building_number}"
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user