Рефакторинг: вынесена логика импорта/экспорта клиентов в отдельный сервис
- Создан модуль customers/services/import_export.py согласно best practices - Класс CustomerExporter: содержит логику экспорта в CSV (ранее была в views) - Класс CustomerImporter: заглушка для будущей реализации импорта - Views стали тонкими: customer_export и customer_import делегируют работу сервисам - Улучшена организация кода: соблюдён принцип Single Responsibility - Уменьшен размер views.py на 30 строк - Добавлена подробная документация в docstrings классов и методов - Логику теперь легко тестировать и переиспользовать (например, в Celery tasks) Преимущества: - Чистое разделение ответственности - Упрощённое тестирование - Возможность переиспользования в асинхронных задачах - Соответствие Django best practices
This commit is contained in:
@@ -598,9 +598,11 @@ def wallet_withdraw(request, pk):
|
||||
def customer_import(request):
|
||||
"""
|
||||
Импорт клиентов из CSV/Excel файла.
|
||||
TODO: Реализовать логику импорта
|
||||
"""
|
||||
from .services.import_export import CustomerImporter
|
||||
|
||||
if request.method == 'POST':
|
||||
importer = CustomerImporter()
|
||||
# TODO: Обработка загруженного файла
|
||||
messages.info(request, 'Функция импорта в разработке')
|
||||
return redirect('customers:customer-list')
|
||||
@@ -615,41 +617,9 @@ def customer_import(request):
|
||||
@manager_or_owner_required
|
||||
def customer_export(request):
|
||||
"""
|
||||
Экспорт клиентов в CSV/Excel файл.
|
||||
TODO: Реализовать логику экспорта
|
||||
Экспорт клиентов в CSV файл.
|
||||
"""
|
||||
import csv
|
||||
from django.http import HttpResponse
|
||||
from django.utils import timezone
|
||||
from .services.import_export import CustomerExporter
|
||||
|
||||
# Создаём HTTP ответ с CSV файлом
|
||||
response = HttpResponse(content_type='text/csv; charset=utf-8')
|
||||
response['Content-Disposition'] = f'attachment; filename="customers_export_{timezone.now().strftime("%Y%m%d_%H%M%S")}.csv"'
|
||||
|
||||
# Добавляем BOM для корректного открытия в Excel
|
||||
response.write('\ufeff')
|
||||
|
||||
writer = csv.writer(response)
|
||||
|
||||
# Заголовки
|
||||
writer.writerow([
|
||||
'ID',
|
||||
'Имя',
|
||||
'Email',
|
||||
'Телефон',
|
||||
'Дата создания',
|
||||
])
|
||||
|
||||
# Данные (исключаем системного клиента)
|
||||
customers = Customer.objects.filter(is_system_customer=False).order_by('-created_at')
|
||||
|
||||
for customer in customers:
|
||||
writer.writerow([
|
||||
customer.id,
|
||||
customer.name or '',
|
||||
customer.email or '',
|
||||
str(customer.phone) if customer.phone else '',
|
||||
customer.created_at.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
])
|
||||
|
||||
return response
|
||||
exporter = CustomerExporter()
|
||||
return exporter.export_to_csv()
|
||||
|
||||
Reference in New Issue
Block a user