Улучшение модели Recipient: PhoneNumberField и поле notes

- Заменено поле phone с CharField на PhoneNumberField для автоматической нормализации телефонов
- Убран регион BY, установлен region=None для универсальности (поддержка номеров разных стран)
- Добавлено поле notes для дополнительной информации о получателе (мессенджеры, соцсети и т.д.)
- Улучшена логика поиска существующих получателей:
  * Использование нормализованного телефона из PhoneNumberField
  * Регистронезависимый поиск по имени (name__iexact)
  * Обновление notes при нахождении существующего получателя
- Обновлена форма OrderForm для работы с PhoneNumberField и новым полем notes
- Обновлен шаблон order_form.html для отображения нового поля
- Созданы миграции для изменений модели
This commit is contained in:
2025-12-25 11:44:18 +03:00
parent 298d797286
commit 2f8a421e64
7 changed files with 121 additions and 10 deletions

View File

@@ -47,6 +47,7 @@ class AddressService:
form_data (dict): Словарь с данными из формы
- recipient_name
- recipient_phone
- recipient_notes (опционально)
Returns:
Recipient: Новый объект получателя (не сохраненный в БД)
@@ -54,6 +55,7 @@ class AddressService:
recipient = Recipient(
name=form_data.get('recipient_name', ''),
phone=form_data.get('recipient_phone', ''),
notes=form_data.get('recipient_notes', '') or None,
)
return recipient
@@ -90,7 +92,8 @@ class AddressService:
# Если режим "новый получатель"
if recipient_source == 'new':
name = form_data.get('recipient_name', '').strip()
phone = form_data.get('recipient_phone', '').strip()
phone = form_data.get('recipient_phone', '')
notes = form_data.get('recipient_notes', '').strip() or None
if not name or not phone:
return None
@@ -105,18 +108,23 @@ class AddressService:
# Обновляем существующего получателя
db_order.recipient.name = name
db_order.recipient.phone = phone
db_order.recipient.notes = notes
# Сохранять будем в views.py, здесь просто возвращаем объект
return db_order.recipient
except Order.DoesNotExist:
pass
# Проверяем, есть ли уже такой получатель в БД (по имени и телефону)
# Проверяем, есть ли уже такой получатель в БД (по имени и нормализованному телефону)
# PhoneNumberField автоматически нормализует телефон, поэтому можно искать напрямую
existing_recipient = Recipient.objects.filter(
name=name,
name__iexact=name.strip(),
phone=phone
).first()
if existing_recipient:
# Обновляем заметки, если они изменились
if existing_recipient.notes != notes:
existing_recipient.notes = notes
return existing_recipient
# Создаем нового получателя