import logging from django.http import JsonResponse from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import ImportedHotel, SyncLog from hotels.models import Hotel from django.contrib.admin.views.decorators import staff_member_required from django.utils import timezone from .forms import SyncLogForm # Создаем логгер logger = logging.getLogger('antifroud') @staff_member_required def import_selected_hotels(request): if request.method != 'POST': logger.error("Invalid request method. Only POST is allowed.") return JsonResponse({'success': False, 'error': 'Invalid request method'}) selected_hotels = request.POST.getlist('hotels') if not selected_hotels: logger.warning("No hotels selected for import.") return JsonResponse({'success': False, 'error': 'No hotels selected'}) try: logger.info("Fetching selected hotels from ImportedHotel model.") # Получаем отели, которые были выбраны для импорта imported_hotels = ImportedHotel.objects.filter(id__in=selected_hotels) logger.info(f"Found {imported_hotels.count()} selected hotels for import.") # Список для хранения новых объектов отелей hotels_to_import = [] for imported_hotel in imported_hotels: logger.debug(f"Preparing hotel data for import: {imported_hotel.name}, {imported_hotel.city}") # Получаем APIConfiguration (если имеется) api_configuration = None if imported_hotel.api: api_configuration = imported_hotel.api # Получаем PMSConfiguration (если имеется) pms_configuration = None if imported_hotel.pms: pms_configuration = imported_hotel.pms # Проверяем, импортирован ли отель из другого отеля (imported_from) imported_from = None if imported_hotel.imported_from: imported_from = imported_hotel.imported_from # Подготовим данные для нового отеля hotel_data = { 'name': imported_hotel.name, 'api': api_configuration, 'pms': pms_configuration, 'imported_from': imported_from, 'imported_at': timezone.now(), # Устанавливаем дату импорта 'import_status': 'completed', # Устанавливаем статус импорта } # Создаем новый объект Hotel hotel = Hotel(**hotel_data) hotels_to_import.append(hotel) # Массово сохраняем новые отели в таблице Hotels logger.info(f"Importing {len(hotels_to_import)} hotels into Hotel model.") Hotel.objects.bulk_create(hotels_to_import) logger.info("Hotels imported successfully.") # Обновляем статус импортированных отелей imported_hotels.update(imported=True) logger.info(f"Updated {imported_hotels.count()} imported hotels' status.") return JsonResponse({'success': True}) except Exception as e: logger.error(f"Error during hotel import: {str(e)}", exc_info=True) return JsonResponse({'success': False, 'error': str(e)}) from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import Hotel from .forms import HotelImportForm @csrf_exempt # Или используйте @login_required, если нужно ограничить доступ def import_hotels(request): if request.method == 'POST': form = HotelImportForm(request.POST) if form.is_valid(): # Получаем выбранные отели selected_hotels = form.cleaned_data['hotels'] # Логика импорта отелей (например, можно их обновить или импортировать в другую базу) # Для примера, просто устанавливаем флаг "imported" в True for hotel in selected_hotels: hotel.imported_to_main_db = True hotel.save() # Возвращаем успешный ответ return JsonResponse({"message": "Отели успешно импортированы!"}, status=200) else: # Если форма невалидна return JsonResponse({"message": "Ошибка при импорте отелей."}, status=400) else: # GET-запрос, просто показываем форму form = HotelImportForm() return render(request, 'antifroud/admin/import_hotels.html', {'form': form}) def sync_log_create(request): if request.method == 'POST': form = SyncLogForm(request.POST) if form.is_valid(): form.save() # Сохраняем новый SyncLog return redirect('admin:antifroud_synclog_changelist') # Перенаправляем обратно в список else: form = SyncLogForm() return render(request, 'antifroud/admin/sync_log_create.html', {'form': form})