Loading big tables now shows a progress indicator. #180
[zzz-pokedex.git] / pokedex / db / tables.py
index a5d8a84..c2cf297 100644 (file)
@@ -118,7 +118,8 @@ class EncounterSlot(TableBase):
     id = Column(Integer, primary_key=True, nullable=False)
     version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False, autoincrement=False)
     encounter_terrain_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=False, nullable=False, autoincrement=False)
-    rarity = Column(Integer, nullable=False, autoincrement=False)
+    slot = Column(Integer, nullable=True)
+    rarity = Column(Integer, nullable=False)
 
 class EncounterSlotCondition(TableBase):
     """Lists all conditions that affect each slot."""
@@ -144,6 +145,7 @@ class Generation(TableBase):
     __tablename__ = 'generations'
     id = Column(Integer, primary_key=True, nullable=False)
     main_region_id = Column(Integer, ForeignKey('regions.id'))
+    canonical_pokedex_id = Column(Integer, ForeignKey('pokedexes.id'))
     name = Column(Unicode(16), nullable=False)
 
 class GrowthRate(TableBase):
@@ -183,7 +185,8 @@ class LocationArea(TableBase):
 class LocationAreaEncounterRate(TableBase):
     __tablename__ = 'location_area_encounter_rates'
     location_area_id = Column(Integer, ForeignKey('location_areas.id'), primary_key=True, nullable=False, autoincrement=False)
-    encounter_type_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=True, nullable=False, autoincrement=False)
+    encounter_terrain_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=True, nullable=False, autoincrement=False)
+    version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, autoincrement=False)
     rate = Column(Integer, nullable=True)
 
 class Machine(TableBase):
@@ -266,6 +269,7 @@ class Move(TableBase):
 
 class Nature(TableBase):
     __tablename__ = 'natures'
+    __singlename__ = 'nature'
     id = Column(Integer, primary_key=True, nullable=False)
     name = Column(Unicode(8), nullable=False)
     decreased_stat_id = Column(Integer, ForeignKey('stats.id'), nullable=False)
@@ -274,6 +278,7 @@ class Nature(TableBase):
 class Pokedex(TableBase):
     __tablename__ = 'pokedexes'
     id = Column(Integer, primary_key=True, nullable=False)
+    region_id = Column(Integer, ForeignKey('regions.id'), nullable=True)
     name = Column(Unicode(16), nullable=False)
     description = Column(Unicode(512))
 
@@ -347,6 +352,22 @@ class Pokemon(TableBase):
 
         return self
 
+    ### Not forms!
+
+    def stat(self, stat_name):
+        """Returns a PokemonStat record for the given stat name (or Stat row
+        object).  Uses the normal has-many machinery, so all the stats are
+        effectively cached.
+        """
+        if isinstance(stat_name, Stat):
+            stat_name = stat_name.name
+
+        for pokemon_stat in self.stats:
+            if pokemon_stat.stat.name == stat_name:
+                return pokemon_stat
+
+        return None
+
 class PokemonAbility(TableBase):
     __tablename__ = 'pokemon_abilities'
     pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
@@ -522,6 +543,7 @@ EncounterSlotCondition.condition = relation(EncounterCondition,
 
 EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains')
 
+Generation.canonical_pokedex = relation(Pokedex, backref='canonical_for_generation')
 Generation.versions = relation(Version, secondary=VersionGroup.__table__)
 Generation.main_region = relation(Region)
 
@@ -567,7 +589,8 @@ Nature.decreased_stat = relation(Stat, primaryjoin=Nature.decreased_stat_id==Sta
 Nature.increased_stat = relation(Stat, primaryjoin=Nature.increased_stat_id==Stat.id,
                                        backref='increasing_natures')
 
-Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__)
+Pokedex.region = relation(Region, backref='pokedexes')
+Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__, backref='pokedexes')
 
 Pokemon.abilities = relation(Ability, secondary=PokemonAbility.__table__,
                                       order_by=PokemonAbility.slot,