Pokemon.types should order by slot. #220
[zzz-pokedex.git] / pokedex / db / tables.py
index bb68407..b9a5fea 100644 (file)
@@ -17,8 +17,15 @@ class Ability(TableBase):
     __singlename__ = 'ability'
     id = Column(Integer, primary_key=True, nullable=False)
     name = Column(Unicode(24), nullable=False)
     __singlename__ = 'ability'
     id = Column(Integer, primary_key=True, nullable=False)
     name = Column(Unicode(24), nullable=False)
+    generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
+    effect = Column(rst.RstTextColumn(5120), nullable=False)
+    short_effect = Column(rst.RstTextColumn(255), nullable=False)
+
+class AbilityFlavorText(TableBase):
+    __tablename__ = 'ability_flavor_text'
+    ability_id = Column(Integer, ForeignKey('abilities.id'), primary_key=True, nullable=False, autoincrement=False)
+    version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
     flavor_text = Column(Unicode(64), nullable=False)
     flavor_text = Column(Unicode(64), nullable=False)
-    effect = Column(Unicode(255), nullable=False)
 
 class Berry(TableBase):
     __tablename__ = 'berries'
 
 class Berry(TableBase):
     __tablename__ = 'berries'
@@ -201,12 +208,11 @@ class Item(TableBase):
     cost = Column(Integer, nullable=False)
     fling_power = Column(Integer, nullable=True)
     fling_effect_id = Column(Integer, ForeignKey('item_fling_effects.id'), nullable=True)
     cost = Column(Integer, nullable=False)
     fling_power = Column(Integer, nullable=True)
     fling_effect_id = Column(Integer, ForeignKey('item_fling_effects.id'), nullable=True)
-    effect = Column(Unicode(5120), nullable=False)
-    is_underground = Column(Boolean, nullable=False)
-    can_hold = Column(Boolean, nullable=False)
-    is_battle_item = Column(Boolean, nullable=False)
-    can_use_automatically = Column(Boolean, nullable=False)
-    can_reuse = Column(Boolean, nullable=False)
+    effect = Column(rst.RstTextColumn(5120), nullable=False)
+
+    @property
+    def appears_underground(self):
+        return any(flag.identifier == u'underground' for flag in self.flags)
 
 class ItemCategory(TableBase):
     __tablename__ = 'item_categories'
 
 class ItemCategory(TableBase):
     __tablename__ = 'item_categories'
@@ -214,6 +220,17 @@ class ItemCategory(TableBase):
     pocket_id = Column(Integer, ForeignKey('item_pockets.id'), nullable=False)
     name = Column(Unicode(16), nullable=False)
 
     pocket_id = Column(Integer, ForeignKey('item_pockets.id'), nullable=False)
     name = Column(Unicode(16), nullable=False)
 
+class ItemFlag(TableBase):
+    __tablename__ = 'item_flags'
+    id = Column(Integer, primary_key=True, nullable=False)
+    identifier = Column(Unicode(24), nullable=False)
+    name = Column(Unicode(64), nullable=False)
+
+class ItemFlagMap(TableBase):
+    __tablename__ = 'item_flag_map'
+    item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
+    item_flag_id = Column(Integer, ForeignKey('item_flags.id'), primary_key=True, autoincrement=False, nullable=False)
+
 class ItemFlavorText(TableBase):
     __tablename__ = 'item_flavor_text'
     item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
 class ItemFlavorText(TableBase):
     __tablename__ = 'item_flavor_text'
     item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
@@ -618,6 +635,11 @@ class Version(TableBase):
 
 
 ### Relations down here, to avoid ordering problems
 
 
 ### Relations down here, to avoid ordering problems
+Ability.flavor_text = relation(AbilityFlavorText, order_by=AbilityFlavorText.version_group_id, backref='abilities')
+Ability.generation = relation(Generation, backref='abilities')
+
+AbilityFlavorText.version_group = relation(VersionGroup)
+
 Berry.berry_firmness = relation(BerryFirmness, backref='berries')
 Berry.firmness = association_proxy('berry_firmness', 'name')
 Berry.flavors = relation(BerryFlavor, order_by=BerryFlavor.contest_type_id, backref='berry')
 Berry.berry_firmness = relation(BerryFirmness, backref='berries')
 Berry.firmness = association_proxy('berry_firmness', 'name')
 Berry.flavors = relation(BerryFlavor, order_by=BerryFlavor.contest_type_id, backref='berry')
@@ -657,7 +679,11 @@ Generation.canonical_pokedex = relation(Pokedex, backref='canonical_for_generati
 Generation.versions = relation(Version, secondary=VersionGroup.__table__)
 Generation.main_region = relation(Region)
 
 Generation.versions = relation(Version, secondary=VersionGroup.__table__)
 Generation.main_region = relation(Region)
 
+GrowthRate.max_experience_obj = relation(Experience, primaryjoin=and_(Experience.growth_rate_id == GrowthRate.id, Experience.level == 100), uselist=False)
+GrowthRate.max_experience = association_proxy('max_experience_obj', 'experience')
+
 Item.berry = relation(Berry, uselist=False, backref='item')
 Item.berry = relation(Berry, uselist=False, backref='item')
+Item.flags = relation(ItemFlag, secondary=ItemFlagMap.__table__)
 Item.flavor_text = relation(ItemFlavorText, order_by=ItemFlavorText.version_group_id.asc(), backref='item')
 Item.fling_effect = relation(ItemFlingEffect, backref='items')
 Item.category = relation(ItemCategory)
 Item.flavor_text = relation(ItemFlavorText, order_by=ItemFlavorText.version_group_id.asc(), backref='item')
 Item.fling_effect = relation(ItemFlingEffect, backref='items')
 Item.category = relation(ItemCategory)
@@ -759,7 +785,7 @@ Pokemon.items = relation(PokemonItem, backref='pokemon')
 Pokemon.generation = relation(Generation, backref='pokemon')
 Pokemon.shape = relation(PokemonShape, backref='pokemon')
 Pokemon.stats = relation(PokemonStat, backref='pokemon')
 Pokemon.generation = relation(Generation, backref='pokemon')
 Pokemon.shape = relation(PokemonShape, backref='pokemon')
 Pokemon.stats = relation(PokemonStat, backref='pokemon')
-Pokemon.types = relation(Type, secondary=PokemonType.__table__)
+Pokemon.types = relation(Type, secondary=PokemonType.__table__, order_by=PokemonType.slot.asc())
 
 PokemonDexNumber.pokedex = relation(Pokedex)
 
 
 PokemonDexNumber.pokedex = relation(Pokedex)