From b5db5af1857cdd86ca032100b56d3531eea9d925 Mon Sep 17 00:00:00 2001 From: badbl0cks <4161747+badbl0cks@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:15:24 -0700 Subject: [PATCH] restore quantity display on expanded card_badges and add limits to all trade offer creation (currently 20 unique cards per side, 20 max quantity per card), fixes #3 and fixes #17 --- .../trades/trade_offer_confirm_create.html | 2 +- theme/templatetags/card_badge.html | 14 +++++++++--- trades/forms.py | 21 ++++++++++++++++++ trades/views.py | 22 ++++++++++++++----- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/theme/templates/trades/trade_offer_confirm_create.html b/theme/templates/trades/trade_offer_confirm_create.html index 1a6827d..5ab5fc4 100644 --- a/theme/templates/trades/trade_offer_confirm_create.html +++ b/theme/templates/trades/trade_offer_confirm_create.html @@ -17,7 +17,7 @@ {% endfor %} {% endfor %} - {% render_trade_offer dummy_trade_offer True %} + {% render_trade_offer dummy_trade_offer %}
diff --git a/theme/templatetags/card_badge.html b/theme/templatetags/card_badge.html index 2be9372..9f94e3c 100644 --- a/theme/templatetags/card_badge.html +++ b/theme/templatetags/card_badge.html @@ -3,14 +3,22 @@
{{ name }}
{{ cardset }}
- {% if quantity != None %}
-
{{ quantity }}
{% endif %} + {% if quantity != None %} +
+
{{ quantity }}
+
+ {% endif %}
{% else %}
-
{{ name }}
+
{{ name }}
+ {% if quantity != None %} +
+
{{ quantity }}
+
+ {% endif %}
{{ rarity }}
{{ cardset }}
diff --git a/trades/forms.py b/trades/forms.py index 02f7e62..e875b2f 100644 --- a/trades/forms.py +++ b/trades/forms.py @@ -141,6 +141,16 @@ class TradeOfferCreateForm(ModelForm): except ValueError: raise forms.ValidationError(f"Invalid quantity provided in {item}") parsed[card_id] = parsed.get(card_id, 0) + quantity + # Validate that each have card does not exceed the max quantity of 20. + for card_id, quantity in parsed.items(): + if quantity > 20: + card = Card.objects.get(pk=card_id) + raise forms.ValidationError( + f"Maximum allowed quantity for each have card is 20. Card {card} has {quantity}." + ) + # Ensure no more than 20 unique have cards are selected. + if len(parsed) > 20: + raise forms.ValidationError("You can only select a maximum of 20 unique have cards.") return parsed def clean_want_cards(self): @@ -156,6 +166,17 @@ class TradeOfferCreateForm(ModelForm): except ValueError: raise forms.ValidationError(f"Invalid quantity provided in {item}") parsed[card_id] = parsed.get(card_id, 0) + quantity + # Validate that each want card does not exceed the max quantity of 20. + for card_id, quantity in parsed.items(): + if quantity > 20: + # look up card name + card = Card.objects.get(pk=card_id) + raise forms.ValidationError( + f"Maximum allowed quantity for each want card is 20. Card {card} has {quantity}." + ) + # Ensure no more than 20 unique want cards are selected. + if len(parsed) > 20: + raise forms.ValidationError("You can only select a maximum of 20 unique want cards.") return parsed def save(self, commit=True): diff --git a/trades/views.py b/trades/views.py index f3cf7df..472e576 100644 --- a/trades/views.py +++ b/trades/views.py @@ -610,7 +610,7 @@ class TradeOfferCreateConfirmView(LoginRequiredMixin, View): } return render(request, "trades/trade_offer_create.html", context) messages.success(request, "Trade offer created successfully!") - return HttpResponseRedirect(reverse_lazy("trade_offer_list")) + return HttpResponseRedirect(reverse_lazy("trade_offer_detail", kwargs={"pk": trade_offer.pk})) else: # When the form is not valid, update its initial data as well: form.initial = { @@ -641,14 +641,24 @@ class TradeOfferCreateConfirmView(LoginRequiredMixin, View): return HttpResponseRedirect(url_with_params) def _preview_offer(self, request): - """ - Processes the preview action (existing logic remains unchanged). - """ form = TradeOfferCreateForm(request.POST) form.fields["initiated_by"].queryset = request.user.friend_codes.all() if not form.is_valid(): - # Re-render the creation template with errors. - return render(request, "trades/trade_offer_create.html", {"form": form}) + # Set initial values required by the template. + form.initial = { + "have_cards": request.POST.getlist("have_cards"), + "want_cards": request.POST.getlist("want_cards"), + "initiated_by": request.POST.get("initiated_by"), + } + from cards.models import Card + context = { + "form": form, + "friend_codes": request.user.friend_codes.all(), + "selected_friend_code": request.user.default_friend_code or request.user.friend_codes.first(), + "cards": Card.objects.all().order_by("name", "rarity_level"), + } + return render(request, "trades/trade_offer_create.html", context) + # Parse the card selections for "have" and "want" cards. have_selections = self._parse_card_selections("have_cards")