Добавлена система фильтрации клиентов с универсальным поиском

- Реализован универсальный поиск по имени, email и телефону в одной строке
- Добавлен счетчик общего количества клиентов
- Поиск работает по нажатию Enter или кнопке 'Поиск'
- Удалены неиспользуемые фильтры django-filter
- Упрощен интерфейс списка клиентов
- Добавлена кнопка 'Очистить' для сброса поиска
This commit is contained in:
2025-12-14 22:39:32 +03:00
parent 089ccfa8ae
commit 56725e8092
9 changed files with 716 additions and 131 deletions

View File

@@ -28,54 +28,53 @@ def normalize_query_phone(q):
def customer_list(request):
"""Список всех клиентов"""
query = request.GET.get('q')
query = request.GET.get('q', '').strip()
# Исключаем системного клиента из списка
customers = Customer.objects.filter(is_system_customer=False)
# Общее количество клиентов
total_customers = customers.count()
if query:
# Используем ту же логику поиска, что и в AJAX API (api_search_customers)
# Это обеспечивает согласованность между веб-интерфейсом и API
# Нормализуем номер телефона
phone_normalized = normalize_query_phone(query)
# Определяем стратегию поиска
strategy, search_value = determine_search_strategy(query)
# Строим Q-объект для поиска (единая функция)
# Строим Q-объект для поиска
q_objects = build_customer_search_query(query, strategy, search_value)
# Добавляем поиск по телефону (умная логика)
# Добавляем поиск по телефону
if phone_normalized:
q_objects |= Q(phone__icontains=phone_normalized)
# Проверяем, похож ли query на номер телефона (только цифры и минимум 3 цифры)
# Поиск по цифрам телефона
query_digits = ''.join(c for c in query if c.isdigit())
should_search_by_phone_digits = is_query_phone_only(query) and len(query_digits) >= 3
if should_search_by_phone_digits:
# Ищем клиентов, чьи телефоны содержат введенные цифры
# Используем LIKE запрос вместо Python loop для оптимизации при большом количестве клиентов
customers_by_phone = Customer.objects.filter(
phone__isnull=False,
phone__icontains=query_digits # Простой поиск по цифрам в phone строке
phone__icontains=query_digits
)
if customers_by_phone.exists():
q_objects |= Q(pk__in=customers_by_phone.values_list('pk', flat=True))
customers = customers.filter(q_objects)
customers = customers.order_by('-created_at')
# Пагинация
paginator = Paginator(customers, 25) # 25 клиентов на страницу
paginator = Paginator(customers, 25)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {
'page_obj': page_obj,
'query': query,
'total_customers': total_customers,
}
return render(request, 'customers/customer_list.html', context)