class Card(db.Model): """Model representing an Eternal card.""" __tablename__ = "cards" set_num = db.Column("SetNumber", db.Integer, primary_key=True) card_num = db.Column("EternalID", db.Integer, primary_key=True) name = db.Column("Name", db.String(length=40), unique=True, nullable=False) rarity = db.Column("Rarity", db.String(length=9), db.ForeignKey("rarities.Name"), nullable=False) image_url = db.Column("ImageUrl", db.String(length=100), unique=True, nullable=False) details_url = db.Column("DetailsUrl", db.String(length=100), unique=True, nullable=False) is_in_draft_pack = db.Column("IsInDraftPack", db.Boolean, nullable=False) is_in_expedition = db.Column("IsInExpedition", db.Boolean, nullable=False) @property def id(self): """Returns the CardId for the Card.""" try: card_id = CardId(set_num=self.set_num, card_num=self.card_num) except sqlalchemy.orm.exc.DetachedInstanceError as e: logging.error("Detached Instance Error!", self, self.__dict__) raise e return card_id
class User(db.Model, UserMixin): """Model representing a user.""" __tablename__ = "users" id = db.Column("id", db.Integer(), primary_key=True, autoincrement=True) email = db.Column("email", db.String(), unique=True) name = db.Column("name", db.String(length=40)) ew_key = db.Column( "ew_key", sqlalchemy_utils.EncryptedType(db.String(50), application.config["SECRET_KEY"], FernetEngine), ) password = db.Column("password", db.String())
class Deck(db.Model): """Model representing an Eternal Deck from Warcry""" __tablename__ = "decks" id = db.Column("id", db.String(length=100), primary_key=True) archetype = db.Column("archetype", db.Enum(Archetype), nullable=True) date_added = db.Column("date_added", db.DateTime) date_updated = db.Column("date_updated", db.DateTime) deck_type = db.Column("deck_type", db.Enum(DeckType)) description = db.Column("description", db.Text, nullable=True) patch = db.Column("patch", db.String(length=10)) username = db.Column("username", db.String(length=30)) views = db.Column("views", db.Integer) rating = db.Column("rating", db.Integer) cards = db.relationship("DeckHasCard") @classmethod def get_from_id(cls, deck_id: str): """Gets the deck matching the deck id.""" return Deck.query.filter_by(id=deck_id).first()
class WeightedDeckSearch(db.Model): """A DeckSearch with a user given weight for its relative importance. Allows users to personalize their recommendations.""" deck_search_id = db.Column(db.Integer, db.ForeignKey("deck_searches.id"), primary_key=True) profile_id = db.Column(db.Integer()) name = db.Column("name", db.String(length=20), primary_key=True) weight = db.Column("weight", db.Float) deck_search: DeckSearch = db.relationship("DeckSearch", uselist=False, cascade_backrefs=False)
class DeckHasCard(db.Model): """A table showing how many copies of a card a deck has.""" deck_id = db.Column( "deck_id", db.String(length=100), db.ForeignKey("decks.id"), primary_key=True ) set_num = db.Column("set_num", db.Integer, primary_key=True) card_num = db.Column("card_num", db.Integer, primary_key=True) num_played = db.Column("num_played", db.Integer, nullable=False) __table_args__ = ( db.ForeignKeyConstraint( [set_num, card_num], [card.Card.set_num, card.Card.card_num] ), {}, ) def to_card_id(self) -> card.CardId: return card.CardId(set_num=self.set_num, card_num=self.card_num)
class Rarity(db.Model): """A table representing rarities in Eternal. Drop rates and crafting costs correspond to rarity.""" __tablename__ = "rarities" name = db.Column("Name", db.String(length=9), primary_key=True) num_in_pack = db.Column("NumInPack", db.Float, nullable=False) enchant = db.Column("Enchant", db.Integer, nullable=False) disenchant = db.Column("Disenchant", db.Integer, nullable=False) foil_enchant = db.Column("FoilEnchant", db.Integer, nullable=False) foil_disenchant = db.Column("FoilDisenchant", db.Integer, nullable=False) @property def drop_chance(self): """The number of cards of a given rarity that will drop in a pack. Integers are assured numbers. A float is a chance that the drop will appear. All numbers are correct for long term average.""" return self.num_in_pack / sum([r.num_in_pack for r in RARITIES]) def __repr__(self): return f"<Rarity {self.name}>"