pkmntrade.club/cards/models.py

113 lines
3.7 KiB
Python

from django.db import models
from django.db.models import Prefetch
from django.apps import apps
class DeckNameTranslation(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
deck = models.ForeignKey("Deck", on_delete=models.PROTECT, related_name='name_translations')
language = models.CharField(max_length=64)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class CardNameTranslation(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
card = models.ForeignKey("Card", on_delete=models.PROTECT, related_name='name_translations')
language = models.CharField(max_length=64)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class RarityNameTranslation(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
rarity = models.ForeignKey("Rarity", on_delete=models.PROTECT, related_name='name_translations')
language = models.CharField(max_length=64)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class CardSet(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Deck(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
hex_color = models.CharField(max_length=9)
cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='decks')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Rarity(models.Model):
id = models.AutoField(primary_key=True)
normalized_id = models.IntegerField(null=False)
name = models.CharField(max_length=64)
icons = models.CharField(max_length=64)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
# Custom Manager for Card model
class CardPrefetchManager(models.Manager):
def get_queryset(self):
return (
super()
.get_queryset()
.select_related("cardset", "rarity")
.prefetch_related(
"decks",
"decks__cardset",
)
)
class CardManager(models.Manager):
def get_queryset(self):
return (
super()
.get_queryset()
.select_related("cardset", "rarity")
)
class Card(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64)
decks = models.ManyToManyField("Deck")
cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='cards')
cardnum = models.IntegerField()
rarity = models.ForeignKey(Rarity, on_delete=models.PROTECT, related_name='cards')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Use the custom manager to ensure optimized querysets everywhere.
objects = CardPrefetchManager()
objects_no_prefetch = CardManager()
def __str__(self):
# For display, we show the original rarity icons.
return f"{self.name} {self.rarity.icons} {self.cardset.name}"
@property
def normalized_rarity(self):
"""
Returns the canonical rarity id for trade logic.
"""
return self.rarity.normalized_id