143 lines
4.7 KiB
Python
143 lines
4.7 KiB
Python
from django.db import models
|
||
|
||
|
||
class Address(models.Model):
|
||
"""
|
||
Модель адреса доставки для заказа цветочного магазина в Минске.
|
||
Адрес принадлежит конкретному заказу доставки.
|
||
"""
|
||
# Информация о получателе
|
||
recipient_name = models.CharField(
|
||
max_length=200,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Имя получателя",
|
||
help_text="Имя человека, которому будет доставлен заказ"
|
||
)
|
||
|
||
recipient_phone = models.CharField(
|
||
max_length=20,
|
||
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,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Номер здания"
|
||
)
|
||
|
||
apartment_number = models.CharField(
|
||
max_length=20,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Номер квартиры/офиса"
|
||
)
|
||
|
||
entrance = models.CharField(
|
||
max_length=20,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Подъезд",
|
||
help_text="Номер подъезда/входа"
|
||
)
|
||
|
||
floor = models.CharField(
|
||
max_length=20,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Этаж"
|
||
)
|
||
|
||
intercom_code = models.CharField(
|
||
max_length=100,
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Код домофона",
|
||
help_text="Код домофона для входа в здание"
|
||
)
|
||
|
||
# Дополнительная информация для доставки
|
||
delivery_instructions = models.TextField(
|
||
blank=True,
|
||
null=True,
|
||
verbose_name="Инструкции для доставки",
|
||
help_text="Дополнительные инструкции для курьера"
|
||
)
|
||
|
||
confirm_address_with_recipient = models.BooleanField(
|
||
default=False,
|
||
verbose_name="Уточнить адрес у получателя",
|
||
help_text="Курьер должен уточнить адрес у получателя перед доставкой"
|
||
)
|
||
|
||
# Временные метки
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
|
||
updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")
|
||
|
||
class Meta:
|
||
verbose_name = "Адрес доставки"
|
||
verbose_name_plural = "Адреса доставки"
|
||
indexes = [
|
||
models.Index(fields=['created_at']),
|
||
]
|
||
ordering = ['-created_at']
|
||
|
||
def __str__(self):
|
||
# Собираем компоненты адреса
|
||
address_parts = []
|
||
if self.street:
|
||
address_parts.append(self.street)
|
||
if self.building_number:
|
||
address_parts.append(self.building_number)
|
||
if self.apartment_number:
|
||
address_parts.append(f"кв/офис {self.apartment_number}")
|
||
|
||
address_line = ", ".join(address_parts) if address_parts else "Адрес не указан"
|
||
|
||
# Формируем строку с именем получателя
|
||
if self.recipient_name:
|
||
return f"{self.recipient_name} - {address_line}"
|
||
return address_line
|
||
|
||
@property
|
||
def full_address(self):
|
||
"""Полный адрес для доставки"""
|
||
# Собираем основные компоненты адреса
|
||
address_parts = []
|
||
if self.street:
|
||
address_parts.append(self.street)
|
||
if self.building_number:
|
||
address_parts.append(self.building_number)
|
||
|
||
# Если нет основных данных, возвращаем сообщение
|
||
if not address_parts:
|
||
return "Адрес не указан"
|
||
|
||
address = ", ".join(address_parts)
|
||
|
||
# Добавляем квартиру/офис
|
||
if self.apartment_number:
|
||
address += f", кв/офис {self.apartment_number}"
|
||
|
||
# Собираем дополнительные детали
|
||
details = []
|
||
if self.entrance:
|
||
details.append(f"подъезд {self.entrance}")
|
||
if self.floor:
|
||
details.append(f"этаж {self.floor}")
|
||
if details:
|
||
address += f" ({', '.join(details)})"
|
||
|
||
return address
|