Fix: Enable autosave for delivery address fields with partial data

Исправлена проблема с автосохранением полей адреса доставки. Теперь адрес
сохраняется при заполнении любого поля, а не только при наличии улицы и
номера дома.

Изменения в Backend (address_service.py):
- Изменена логика валидации в process_address_from_form()
- Теперь адрес сохраняется если заполнено хотя бы одно поле
- Удалено жёсткое требование заполнения street и building_number
- Проверяем наличие данных во всех полях адреса

Изменения в Frontend (autosave.js):
- Переработана логика сбора данных адреса
- address_mode='new' устанавливается при заполнении любого поля адреса
- Все непустые поля адреса отправляются на сервер
- Используется более элегантный подход с Object.values() и .some()

Теперь автосохранение работает корректно:
- Заполнение поля "Улица" → автосохранение срабатывает
- Заполнение "Номер дома" → автосохранение срабатывает
- Заполнение любого другого поля адреса → автосохранение срабатывает
- После перезагрузки страницы все данные восстанавливаются

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-25 19:49:58 +03:00
parent fbc9d86a62
commit a3f5ac4c08
2 changed files with 40 additions and 31 deletions

View File

@@ -74,11 +74,23 @@ class AddressService:
street = form_data.get('address_street', '').strip() street = form_data.get('address_street', '').strip()
building_number = form_data.get('address_building_number', '').strip() building_number = form_data.get('address_building_number', '').strip()
if not street or not building_number: # Для автосохранения разрешаем сохранять адрес даже если не все поля заполнены
# Если обязательные поля не заполнены, возвращаем None # Проверяем только что хотя бы одно поле адреса заполнено
has_any_address_data = any([
street,
building_number,
form_data.get('address_apartment_number', '').strip(),
form_data.get('address_entrance', '').strip(),
form_data.get('address_floor', '').strip(),
form_data.get('address_intercom_code', '').strip(),
form_data.get('address_delivery_instructions', '').strip(),
])
if not has_any_address_data:
# Если все поля адреса пустые, возвращаем None
return None return None
# Создаем новый адрес # Создаем новый адрес (даже если не все обязательные поля заполнены)
address = AddressService.create_address_from_form_data(form_data) address = AddressService.create_address_from_form_data(form_data)
return address return address

View File

@@ -371,40 +371,37 @@
// Поля адреса доставки (новая логика с прямым вводом) // Поля адреса доставки (новая логика с прямым вводом)
const addressStreetField = form.querySelector('input[name="address_street"]'); const addressStreetField = form.querySelector('input[name="address_street"]');
if (addressStreetField && addressStreetField.value) {
data.address_street = addressStreetField.value;
// Указываем режим "новый адрес" если есть улица
data.address_mode = 'new';
}
const addressBuildingField = form.querySelector('input[name="address_building_number"]'); const addressBuildingField = form.querySelector('input[name="address_building_number"]');
if (addressBuildingField && addressBuildingField.value) {
data.address_building_number = addressBuildingField.value;
}
const addressApartmentField = form.querySelector('input[name="address_apartment_number"]'); const addressApartmentField = form.querySelector('input[name="address_apartment_number"]');
if (addressApartmentField && addressApartmentField.value) {
data.address_apartment_number = addressApartmentField.value;
}
const addressEntranceField = form.querySelector('input[name="address_entrance"]'); const addressEntranceField = form.querySelector('input[name="address_entrance"]');
if (addressEntranceField && addressEntranceField.value) {
data.address_entrance = addressEntranceField.value;
}
const addressFloorField = form.querySelector('input[name="address_floor"]'); const addressFloorField = form.querySelector('input[name="address_floor"]');
if (addressFloorField && addressFloorField.value) {
data.address_floor = addressFloorField.value;
}
const addressIntercomField = form.querySelector('input[name="address_intercom_code"]'); const addressIntercomField = form.querySelector('input[name="address_intercom_code"]');
if (addressIntercomField && addressIntercomField.value) {
data.address_intercom_code = addressIntercomField.value;
}
const addressInstructionsField = form.querySelector('textarea[name="address_delivery_instructions"]'); const addressInstructionsField = form.querySelector('textarea[name="address_delivery_instructions"]');
if (addressInstructionsField && addressInstructionsField.value) {
data.address_delivery_instructions = addressInstructionsField.value; // Собираем все поля адреса
const addressFields = {
address_street: addressStreetField?.value || '',
address_building_number: addressBuildingField?.value || '',
address_apartment_number: addressApartmentField?.value || '',
address_entrance: addressEntranceField?.value || '',
address_floor: addressFloorField?.value || '',
address_intercom_code: addressIntercomField?.value || '',
address_delivery_instructions: addressInstructionsField?.value || '',
};
// Проверяем, заполнено ли хотя бы одно поле адреса
const hasAnyAddressData = Object.values(addressFields).some(value => value.trim() !== '');
if (hasAnyAddressData) {
// Указываем режим "новый адрес" если заполнено хотя бы одно поле
data.address_mode = 'new';
// Добавляем все непустые поля в данные
Object.entries(addressFields).forEach(([key, value]) => {
if (value.trim() !== '') {
data[key] = value;
}
});
} }
const addressConfirmField = form.querySelector('input[name="address_confirm_with_recipient"]'); const addressConfirmField = form.querySelector('input[name="address_confirm_with_recipient"]');