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")