bugfix
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user