44 lines
No EOL
1.9 KiB
Python
44 lines
No EOL
1.9 KiB
Python
from django.core.exceptions import ValidationError
|
|
from django.db.models.signals import m2m_changed, post_save, post_delete
|
|
from django.dispatch import receiver
|
|
from .models import TradeOffer
|
|
from cards.models import Card
|
|
from trades.models import TradeOfferHaveCard, TradeOfferWantCard, TradeAcceptance
|
|
|
|
def check_trade_offer_rarity(instance):
|
|
combined_cards = list(instance.have_cards.all()) + list(instance.want_cards.all())
|
|
# Use the normalized rarity from each card
|
|
rarities = {card.normalized_rarity for card in combined_cards}
|
|
if len(rarities) > 1:
|
|
raise ValidationError("All cards in a trade offer must have the same rarity.")
|
|
|
|
@receiver(m2m_changed, sender=TradeOffer.have_cards.through)
|
|
def validate_have_cards_rarity(sender, instance, action, **kwargs):
|
|
if action == "post_add":
|
|
check_trade_offer_rarity(instance)
|
|
|
|
@receiver(m2m_changed, sender=TradeOffer.want_cards.through)
|
|
def validate_want_cards_rarity(sender, instance, action, **kwargs):
|
|
if action == "post_add":
|
|
check_trade_offer_rarity(instance)
|
|
|
|
@receiver(post_save, sender=TradeOfferHaveCard)
|
|
@receiver(post_delete, sender=TradeOfferHaveCard)
|
|
def update_aggregates_from_have_card(sender, instance, **kwargs):
|
|
trade_offer = instance.trade_offer
|
|
if trade_offer and hasattr(trade_offer, 'update_aggregates'):
|
|
trade_offer.update_aggregates()
|
|
|
|
@receiver(post_save, sender=TradeOfferWantCard)
|
|
@receiver(post_delete, sender=TradeOfferWantCard)
|
|
def update_aggregates_from_want_card(sender, instance, **kwargs):
|
|
trade_offer = instance.trade_offer
|
|
if trade_offer and hasattr(trade_offer, 'update_aggregates'):
|
|
trade_offer.update_aggregates()
|
|
|
|
@receiver(post_save, sender=TradeAcceptance)
|
|
@receiver(post_delete, sender=TradeAcceptance)
|
|
def update_aggregates_from_acceptance(sender, instance, **kwargs):
|
|
trade_offer = instance.trade_offer
|
|
if trade_offer and hasattr(trade_offer, 'update_aggregates'):
|
|
trade_offer.update_aggregates() |