diff --git a/lottery/draw/admin.py b/lottery/draw/admin.py index 9c6ebc3..4c07040 100644 --- a/lottery/draw/admin.py +++ b/lottery/draw/admin.py @@ -38,11 +38,9 @@ def add_participants_view(request): return HttpResponse("Не указан параметр lottery_id", status=400) lottery = get_object_or_404(Lottery, id=lottery_id) - # Все доступные счета, не участвующие в этой лотерее used_invoice_ids = LotteryParticipant.objects.filter(lottery=lottery).values_list("invoice_id", flat=True) qs = Invoice.objects.filter(used=False).exclude(id__in=used_invoice_ids) - # Фильтрация deposit_min = request.GET.get("deposit_min") deposit_max = request.GET.get("deposit_max") created_after = request.GET.get("created_after") @@ -52,7 +50,6 @@ def add_participants_view(request): 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) @@ -60,7 +57,6 @@ def add_participants_view(request): qs = qs.filter(created_at__date__gte=dt) except ValueError: pass - if created_before: try: dt = parse_date(created_before) @@ -68,121 +64,39 @@ def add_participants_view(request): qs = qs.filter(created_at__date__lte=dt) except ValueError: pass - if request.GET.get("without_bonus"): qs = qs.filter(Q(bonus__isnull=True) | Q(bonus=0)) - if request.GET.get("without_fd"): qs = qs.filter(Q(start_bonus__isnull=True) | Q(start_bonus=0)) - # Обработка формы if request.method == "POST": - form = AddParticipantsForm(request.POST) - form.fields["invoices"].queryset = qs - if form.is_valid(): - selected_invoices = form.cleaned_data["invoices"] - for invoice in selected_invoices: + selected_ids = request.POST.getlist("invoices") + selected_invoices = qs.filter(id__in=selected_ids) + added_count = 0 + for invoice in selected_invoices: + if not LotteryParticipant.objects.filter(lottery=lottery, invoice=invoice).exists(): invoice.used = True invoice.save() LotteryParticipant.objects.create(lottery=lottery, invoice=invoice) - messages.success(request, "Участники успешно добавлены.") - return redirect("admin:draw_lotteryparticipant_changelist") - else: - form = AddParticipantsForm() - form.fields["invoices"].queryset = qs + added_count += 1 + messages.success(request, f"Добавлено {added_count} участников.") + return redirect("admin:draw_lotteryparticipant_changelist") context = { - "form": form, "lottery": lottery, - "invoice_count": qs.count(), # Для отображения числа найденных + "invoices": qs.order_by("-created_at"), + "invoice_count": qs.count(), + "request": request, } return render(request, "admin/add_participants.html", context) + def get_client_by_invoice(invoice): try: return Client.objects.get(club_card_number=invoice.client_club_card_number) except Client.DoesNotExist: return None - -# 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("..") - -# notifier = NotificationService(bot=create_bot_instance()) -# async_to_sync(notifier.notify_draw_start)(lottery) - -# 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: -# try: -# draw_result = lottery.draw_results.get(prize=prize) -# draw_result.participant = prize.winner -# draw_result.drawn_at = timezone.now() -# draw_result.confirmed = False -# draw_result.save() -# except DrawResult.DoesNotExist: -# DrawResult.objects.create( -# lottery=lottery, -# prize=prize, -# participant=prize.winner, -# confirmed=False, -# drawn_at=timezone.now() -# ) -# continue - -# try: -# draw_result = lottery.draw_results.get(prize=prize) -# if draw_result.confirmed: -# continue -# except DrawResult.DoesNotExist: -# draw_result = None - -# participants = list( -# lottery.participants.filter(used=False).exclude(invoice_id__in=manually_assigned_invoice_ids) -# ) -# if not participants: -# continue - -# winner_participant = random.choice(participants) -# winner_participant.used = True -# winner_participant.save() - -# if draw_result: -# draw_result.participant = winner_participant -# draw_result.drawn_at = timezone.now() -# draw_result.confirmed = False -# draw_result.save() -# else: -# DrawResult.objects.create( -# lottery=lottery, -# prize=prize, -# participant=winner_participant, -# confirmed=False, -# drawn_at=timezone.now() -# ) - -# 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() - -# return render(request, "admin/draw_result.html", {"lottery": lottery, "draw_results": draw_results}) - def start_draw(request, lottery_id): lottery = get_object_or_404(Lottery, id=lottery_id) logger.info("Запуск розыгрыша для лотереи: %s", lottery.name) diff --git a/lottery/templates/admin/add_participants.html b/lottery/templates/admin/add_participants.html index 4c91ae5..11fa746 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); }); } @@ -27,7 +27,6 @@

Добавление участников лотереи: {{ lottery.name }}

{{ lottery.description }}

-
@@ -67,7 +66,6 @@

Найдено подходящих счетов: {{ invoice_count }}

- {% csrf_token %}
@@ -88,29 +86,27 @@ - {% for invoice in form.fields.invoices.queryset %} + {% for invoice in invoices %} - - {{ invoice.created_at|date:"d.m.Y H:i" }} - {% if invoice.closed_at %}{{ invoice.closed_at|date:"d.m.Y H:i"}}{% else %}—{% endif %} + + {{ invoice.created_at|date:"Y-m-d H:i" }} + {% if invoice.closed_at %}{{ invoice.closed_at|date:"Y-m-d H:i" }}{% else %}—{% endif %} {{ invoice.ext_id|default:"—" }} {{ invoice.client.name|default:"Не указан" }} {{ invoice.client.club_card_number|default:"—" }} - {{ invoice.sum|default:"—" }} - {{ invoice.bonus|default:"—" }} - {{ invoice.start_bonus|default:"—" }} - {{ invoice.deposit_sum|default:"—" }} + {{ invoice.sum|floatformat:2|default:"—" }} + {{ invoice.bonus|floatformat:2|default:"—" }} + {{ invoice.start_bonus|floatformat:2|default:"—" }} + {{ invoice.deposit_sum|floatformat:2|default:"—" }} {{ invoice.notes|default:"—" }} {% empty %} - - Нет доступных счетов - + Нет доступных счетов {% endfor %}
- + Вернуться к списку участников