X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/d1de1fabf36847fcc75fe42d21abe4b42ca0fef0..ee6df6ce9cf56afa4fe5fe24a7cb6fa2c474ce99:/pokedex/db/tables.py diff --git a/pokedex/db/tables.py b/pokedex/db/tables.py index 01a070d..491bfd2 100644 --- a/pokedex/db/tables.py +++ b/pokedex/db/tables.py @@ -6,7 +6,6 @@ from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.orm import backref, relation from sqlalchemy.sql import and_ from sqlalchemy.types import * -from sqlalchemy.databases.mysql import * from pokedex.db import rst @@ -58,7 +57,7 @@ class Encounter(TableBase): A slot (20% walking in grass) and any appropriate world conditions (no swarm) are thus enough to define a specific encounter. - + Well, okay, almost: each slot actually appears twice. """ @@ -119,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.""" @@ -145,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): @@ -267,6 +268,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) @@ -275,6 +277,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)) @@ -348,6 +351,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) @@ -523,6 +542,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) @@ -568,7 +588,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,