Добавлена система фильтрации клиентов с универсальным поиском
- Реализован универсальный поиск по имени, email и телефону в одной строке - Добавлен счетчик общего количества клиентов - Поиск работает по нажатию Enter или кнопке 'Поиск' - Удалены неиспользуемые фильтры django-filter - Упрощен интерфейс списка клиентов - Добавлена кнопка 'Очистить' для сброса поиска
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user