Add tradeOffer image field, tweak image generation to only fire once per tradeOffer, even with simultaneous requests

This commit is contained in:
badblocks 2025-03-29 15:13:57 -07:00
parent 138a929da6
commit 2d826734a0
9 changed files with 127 additions and 80 deletions

View file

@ -6,6 +6,21 @@ from cards.models import Card
from accounts.models import FriendCode
from datetime import timedelta
from django.utils import timezone
import uuid
def generate_tradeoffer_hash():
"""
Generates a unique 9-character hash for a TradeOffer.
The last character 'z' indicates its type.
"""
return hashlib.md5(uuid.uuid4().hex.encode("utf-8")).hexdigest()[:8] + "z"
def generate_tradeacceptance_hash():
"""
Generates a unique 9-character hash for a TradeAcceptance.
The last character 'y' indicates its type.
"""
return hashlib.md5(uuid.uuid4().hex.encode("utf-8")).hexdigest()[:8] + "y"
class TradeOfferManager(models.Manager):
@ -32,7 +47,7 @@ class TradeOfferAllManager(models.Manager):
class TradeOffer(models.Model):
objects = TradeOfferManager()
all_offers = TradeOfferAllManager() # New unfiltered manager
all_offers = TradeOfferAllManager()
id = models.AutoField(primary_key=True)
is_closed = models.BooleanField(default=False, db_index=True)
@ -44,6 +59,7 @@ class TradeOffer(models.Model):
)
rarity_icon = models.CharField(max_length=8, null=True)
rarity_level = models.IntegerField(null=True)
image = models.ImageField(upload_to='trade_offers/', null=True, blank=True)
want_cards = models.ManyToManyField(
"cards.Card",
related_name='trade_offers_want',
@ -63,11 +79,9 @@ class TradeOffer(models.Model):
return f"Want: {want_names} -> Have: {have_names}"
def save(self, *args, **kwargs):
is_new = self.pk is None
if not self.hash:
self.hash = generate_tradeoffer_hash()
super().save(*args, **kwargs)
if is_new and not self.hash:
self.hash = hashlib.md5((str(self.id) + "z").encode("utf-8")).hexdigest()[:8] + "z"
super().save(update_fields=["hash"])
def update_rarity_fields(self):
"""
@ -324,11 +338,9 @@ class TradeAcceptance(models.Model):
self.save(update_fields=["state"])
def save(self, *args, **kwargs):
is_new = self.pk is None
if not self.hash:
self.hash = generate_tradeacceptance_hash()
super().save(*args, **kwargs)
if is_new and not self.hash:
self.hash = hashlib.md5((str(self.id) + "y").encode("utf-8")).hexdigest()[:8] + "y"
super().save(update_fields=["hash"])
def __str__(self):
return (f"TradeAcceptance(offer_hash={self.trade_offer.hash}, "