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
Beispiel #2
0
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()
Beispiel #4
0
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}>"