diff --git a/lottery/draw/admin.py b/lottery/draw/admin.py index 26ebe3d..679eb8a 100644 --- a/lottery/draw/admin.py +++ b/lottery/draw/admin.py @@ -13,6 +13,9 @@ from webapp.models import Invoice, Client, BindingRequest from bot.notifications import NotificationService from bot.utils import create_bot_instance from .views import view_draw_results +from django import forms +from django.utils.dateparse import parse_datetime, parse_date +from datetime import datetime # Настройка логгера logger = logging.getLogger(__name__) @@ -37,11 +40,30 @@ def add_participants_view(request): deposit_min = request.GET.get("deposit_min") deposit_max = request.GET.get("deposit_max") + created_after = request.GET.get("created_after") + created_before = request.GET.get("created_before") + if deposit_min: qs = qs.filter(deposit_sum__gte=deposit_min) if deposit_max: qs = qs.filter(deposit_sum__lte=deposit_max) + if created_after: + try: + dt = parse_date(created_after) + if dt: + qs = qs.filter(created_at__gte=dt) + except ValueError: + pass + + if created_before: + try: + dt = parse_date(created_before) + if dt: + qs = qs.filter(created_at__lte=dt) + except ValueError: + pass + if request.method == "POST": form = AddParticipantsForm(request.POST) form.fields["invoices"].queryset = qs @@ -77,7 +99,6 @@ def start_draw(request, lottery_id): lottery = get_object_or_404(Lottery, id=lottery_id) logger.info("Запуск розыгрыша для лотереи: %s", lottery.name) - # Если лотерея уже завершена, кнопку запускать не показываем if lottery.finished: messages.warning(request, "Розыгрыш уже завершён.") return redirect("..") @@ -85,10 +106,19 @@ def start_draw(request, lottery_id): notifier = NotificationService(bot=create_bot_instance()) async_to_sync(notifier.notify_draw_start)(lottery) + # Собираем ID счетов вручную назначенных победителей + manually_assigned_invoice_ids = set() + for prize in lottery.prizes.all(): + if prize.winner and prize.winner.invoice: + manually_assigned_invoice_ids.add(prize.winner.invoice_id) + # Помечаем вручную выбранного участника как использованного + prize.winner.used = True + prize.winner.save() + for prize in lottery.prizes.all(): logger.info("Обработка приза: %s", prize.prize_place) - # Если для приза уже назначен победитель вручную, сохраняем его в таблице результатов + # Если у приза уже установлен победитель вручную — сохраняем его в таблицу результатов if prize.winner: logger.info("Приз '%s' имеет установленного вручную победителя. Сохраняем в таблице результатов.", prize.prize_place) try: @@ -115,7 +145,10 @@ def start_draw(request, lottery_id): except DrawResult.DoesNotExist: draw_result = None - participants = list(lottery.participants.filter(used=False)) + # Получаем всех неиспользованных участников, исключая вручную выбранных + participants = list( + lottery.participants.filter(used=False).exclude(invoice_id__in=manually_assigned_invoice_ids) + ) logger.info("Найдено свободных участников для приза '%s': %d", prize.prize_place, len(participants)) if not participants: logger.warning("Нет свободных участников для приза '%s'.", prize.prize_place) @@ -145,7 +178,6 @@ def start_draw(request, lottery_id): draw_results = lottery.draw_results.all() async_to_sync(notifier.notify_draw_results)(lottery, draw_results) - # Если все призы розыгрыша подтверждены, устанавливаем флаг завершения лотереи if not lottery.prizes.filter(winner__isnull=True).exists(): lottery.finished = True lottery.save() diff --git a/lottery/templates/admin/add_participants.html b/lottery/templates/admin/add_participants.html index c6fc7d1..d693b28 100644 --- a/lottery/templates/admin/add_participants.html +++ b/lottery/templates/admin/add_participants.html @@ -14,7 +14,7 @@ const selectAllCheckbox = document.getElementById("select-all"); if (selectAllCheckbox) { selectAllCheckbox.addEventListener("click", function(){ - const checkboxes = document.querySelectorAll("input[name='invoices']"); + const checkboxes = document.querySelectorAll("input[name='invoices[]']"); checkboxes.forEach(chk => chk.checked = selectAllCheckbox.checked); }); } @@ -23,64 +23,92 @@ {% endblock extrahead %} {% block content %} -
{{ lottery.description }}
- + -