3 from sqlalchemy
import Column
, ForeignKey
, MetaData
, Table
4 from sqlalchemy
.ext
.declarative
import declarative_base
5 from sqlalchemy
.ext
.associationproxy
import association_proxy
6 from sqlalchemy
.orm
import backref
, eagerload_all
, relation
7 from sqlalchemy
.orm
.session
import Session
8 from sqlalchemy
.sql
import and_
9 from sqlalchemy
.types
import *
11 from pokedex
.db
import markdown
14 TableBase
= declarative_base(metadata
=metadata
)
16 class Ability(TableBase
):
17 __tablename__
= 'abilities'
18 __singlename__
= 'ability'
19 id = Column(Integer
, primary_key
=True, nullable
=False)
20 name
= Column(Unicode(24), nullable
=False)
21 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
22 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=False)
23 short_effect
= Column(markdown
.MarkdownColumn(255), nullable
=False)
25 class AbilityFlavorText(TableBase
):
26 __tablename__
= 'ability_flavor_text'
27 ability_id
= Column(Integer
, ForeignKey('abilities.id'), primary_key
=True, nullable
=False, autoincrement
=False)
28 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
29 flavor_text
= Column(Unicode(64), nullable
=False)
31 class AbilityName(TableBase
):
32 __tablename__
= 'ability_names'
33 ability_id
= Column(Integer
, ForeignKey('abilities.id'), primary_key
=True, nullable
=False, autoincrement
=False)
34 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
35 name
= Column(Unicode(16), nullable
=False)
37 class Berry(TableBase
):
38 __tablename__
= 'berries'
39 id = Column(Integer
, primary_key
=True, nullable
=False)
40 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False)
41 firmness_id
= Column(Integer
, ForeignKey('berry_firmness.id'), nullable
=False)
42 natural_gift_power
= Column(Integer
, nullable
=True)
43 natural_gift_type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=True)
44 size
= Column(Integer
, nullable
=False)
45 max_harvest
= Column(Integer
, nullable
=False)
46 growth_time
= Column(Integer
, nullable
=False)
47 soil_dryness
= Column(Integer
, nullable
=False)
48 smoothness
= Column(Integer
, nullable
=False)
50 class BerryFirmness(TableBase
):
51 __tablename__
= 'berry_firmness'
52 id = Column(Integer
, primary_key
=True, nullable
=False)
53 name
= Column(Unicode(10), nullable
=False)
55 class BerryFlavor(TableBase
):
56 __tablename__
= 'berry_flavors'
57 berry_id
= Column(Integer
, ForeignKey('berries.id'), primary_key
=True, nullable
=False, autoincrement
=False)
58 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
59 flavor
= Column(Integer
, nullable
=False)
61 class ContestCombo(TableBase
):
62 __tablename__
= 'contest_combos'
63 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
64 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
66 class ContestEffect(TableBase
):
67 __tablename__
= 'contest_effects'
68 id = Column(Integer
, primary_key
=True, nullable
=False)
69 appeal
= Column(SmallInteger
, nullable
=False)
70 jam
= Column(SmallInteger
, nullable
=False)
71 flavor_text
= Column(Unicode(64), nullable
=False)
72 effect
= Column(Unicode(255), nullable
=False)
74 class ContestType(TableBase
):
75 __tablename__
= 'contest_types'
76 id = Column(Integer
, primary_key
=True, nullable
=False)
77 name
= Column(Unicode(6), nullable
=False)
78 flavor
= Column(Unicode(6), nullable
=False)
79 color
= Column(Unicode(6), nullable
=False)
81 class EggGroup(TableBase
):
82 __tablename__
= 'egg_groups'
83 id = Column(Integer
, primary_key
=True, nullable
=False)
84 name
= Column(Unicode(16), nullable
=False)
86 class Encounter(TableBase
):
87 """Rows in this table represent encounters with wild Pokémon. Bear with
90 Within a given area in a given game, encounters are differentiated by the
91 "slot" they are in and the state of the game world.
93 What the player is doing to get an encounter, such as surfing or walking
94 through tall grass, is called terrain. Each terrain has its own set of
97 Within a terrain, slots are defined primarily by rarity. Each slot can
98 also be affected by world conditions; for example, the 20% slot for walking
99 in tall grass is affected by whether a swarm is in effect in that area.
100 "Is there a swarm?" is a condition; "there is a swarm" and "there is not a
101 swarm" are the possible values of this condition.
103 A slot (20% walking in grass) and any appropriate world conditions (no
104 swarm) are thus enough to define a specific encounter.
106 Well, okay, almost: each slot actually appears twice.
109 __tablename__
= 'encounters'
110 id = Column(Integer
, primary_key
=True, nullable
=False)
111 version_id
= Column(Integer
, ForeignKey('versions.id'), nullable
=False, autoincrement
=False)
112 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), nullable
=False, autoincrement
=False)
113 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), nullable
=False, autoincrement
=False)
114 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, autoincrement
=False)
115 min_level
= Column(Integer
, nullable
=False, autoincrement
=False)
116 max_level
= Column(Integer
, nullable
=False, autoincrement
=False)
118 class EncounterCondition(TableBase
):
119 """Rows in this table represent varying conditions in the game world, such
123 __tablename__
= 'encounter_conditions'
124 id = Column(Integer
, primary_key
=True, nullable
=False)
125 name
= Column(Unicode(64), nullable
=False)
127 class EncounterConditionValue(TableBase
):
128 """Rows in this table represent possible states for a condition; for
129 example, the state of 'swarm' could be 'swarm' or 'no swarm'.
132 __tablename__
= 'encounter_condition_values'
133 id = Column(Integer
, primary_key
=True, nullable
=False)
134 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=False, nullable
=False, autoincrement
=False)
135 name
= Column(Unicode(64), nullable
=False)
136 is_default
= Column(Boolean
, nullable
=False)
138 class EncounterConditionValueMap(TableBase
):
139 """Maps encounters to the specific conditions under which they occur."""
141 __tablename__
= 'encounter_condition_value_map'
142 encounter_id
= Column(Integer
, ForeignKey('encounters.id'), primary_key
=True, nullable
=False, autoincrement
=False)
143 encounter_condition_value_id
= Column(Integer
, ForeignKey('encounter_condition_values.id'), primary_key
=True, nullable
=False, autoincrement
=False)
145 class EncounterTerrain(TableBase
):
146 """Rows in this table represent ways the player can enter a wild encounter,
147 e.g., surfing, fishing, or walking through tall grass.
150 __tablename__
= 'encounter_terrain'
151 id = Column(Integer
, primary_key
=True, nullable
=False)
152 name
= Column(Unicode(64), nullable
=False)
154 class EncounterSlot(TableBase
):
155 """Rows in this table represent an abstract "slot" within a terrain,
156 associated with both some set of conditions and a rarity.
158 Note that there are two encounters per slot, so the rarities will only add
162 __tablename__
= 'encounter_slots'
163 id = Column(Integer
, primary_key
=True, nullable
=False)
164 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, autoincrement
=False)
165 encounter_terrain_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=False, nullable
=False, autoincrement
=False)
166 slot
= Column(Integer
, nullable
=True)
167 rarity
= Column(Integer
, nullable
=False)
169 class EncounterSlotCondition(TableBase
):
170 """Lists all conditions that affect each slot."""
172 __tablename__
= 'encounter_slot_conditions'
173 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), primary_key
=True, nullable
=False, autoincrement
=False)
174 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
176 class EvolutionChain(TableBase
):
177 __tablename__
= 'evolution_chains'
178 id = Column(Integer
, primary_key
=True, nullable
=False)
179 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), nullable
=False)
180 baby_trigger_item
= Column(Unicode(12))
182 class EvolutionTrigger(TableBase
):
183 __tablename__
= 'evolution_triggers'
184 id = Column(Integer
, primary_key
=True, nullable
=False)
185 identifier
= Column(Unicode(16), nullable
=False)
187 class Experience(TableBase
):
188 __tablename__
= 'experience'
189 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), primary_key
=True, nullable
=False)
190 level
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
191 experience
= Column(Integer
, nullable
=False)
193 class Generation(TableBase
):
194 __tablename__
= 'generations'
195 id = Column(Integer
, primary_key
=True, nullable
=False)
196 main_region_id
= Column(Integer
, ForeignKey('regions.id'))
197 canonical_pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'))
198 name
= Column(Unicode(16), nullable
=False)
200 class GrowthRate(TableBase
):
201 """`formula` is written in LaTeX math notation."""
202 __tablename__
= 'growth_rates'
203 id = Column(Integer
, primary_key
=True, nullable
=False)
204 name
= Column(Unicode(20), nullable
=False)
205 formula
= Column(Unicode(500), nullable
=False)
207 class Item(TableBase
):
208 __tablename__
= 'items'
209 __singlename__
= 'item'
210 id = Column(Integer
, primary_key
=True, nullable
=False)
211 name
= Column(Unicode(16), nullable
=False)
212 category_id
= Column(Integer
, ForeignKey('item_categories.id'), nullable
=False)
213 cost
= Column(Integer
, nullable
=False)
214 fling_power
= Column(Integer
, nullable
=True)
215 fling_effect_id
= Column(Integer
, ForeignKey('item_fling_effects.id'), nullable
=True)
216 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=False)
219 def appears_underground(self
):
220 return any(flag
.identifier
== u
'underground' for flag
in self
.flags
)
222 class ItemCategory(TableBase
):
223 __tablename__
= 'item_categories'
224 id = Column(Integer
, primary_key
=True, nullable
=False)
225 pocket_id
= Column(Integer
, ForeignKey('item_pockets.id'), nullable
=False)
226 name
= Column(Unicode(16), nullable
=False)
228 class ItemFlag(TableBase
):
229 __tablename__
= 'item_flags'
230 id = Column(Integer
, primary_key
=True, nullable
=False)
231 identifier
= Column(Unicode(24), nullable
=False)
232 name
= Column(Unicode(64), nullable
=False)
234 class ItemFlagMap(TableBase
):
235 __tablename__
= 'item_flag_map'
236 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
237 item_flag_id
= Column(Integer
, ForeignKey('item_flags.id'), primary_key
=True, autoincrement
=False, nullable
=False)
239 class ItemFlavorText(TableBase
):
240 __tablename__
= 'item_flavor_text'
241 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
242 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, autoincrement
=False, nullable
=False)
243 flavor_text
= Column(Unicode(255), nullable
=False)
245 class ItemFlingEffect(TableBase
):
246 __tablename__
= 'item_fling_effects'
247 id = Column(Integer
, primary_key
=True, nullable
=False)
248 effect
= Column(Unicode(255), nullable
=False)
250 class ItemInternalID(TableBase
):
251 __tablename__
= 'item_internal_ids'
252 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False)
253 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False)
254 internal_id
= Column(Integer
, nullable
=False)
256 class ItemName(TableBase
):
257 __tablename__
= 'item_names'
258 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False)
259 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
260 name
= Column(Unicode(16), nullable
=False)
262 class ItemPocket(TableBase
):
263 __tablename__
= 'item_pockets'
264 id = Column(Integer
, primary_key
=True, nullable
=False)
265 identifier
= Column(Unicode(16), nullable
=False)
266 name
= Column(Unicode(16), nullable
=False)
268 class Language(TableBase
):
269 __tablename__
= 'languages'
270 id = Column(Integer
, primary_key
=True, nullable
=False)
271 iso639
= Column(Unicode(2), nullable
=False)
272 iso3166
= Column(Unicode(2), nullable
=False)
273 name
= Column(Unicode(16), nullable
=False)
275 class Location(TableBase
):
276 __tablename__
= 'locations'
277 __singlename__
= 'location'
278 id = Column(Integer
, primary_key
=True, nullable
=False)
279 region_id
= Column(Integer
, ForeignKey('regions.id'))
280 name
= Column(Unicode(64), nullable
=False)
282 class LocationArea(TableBase
):
283 __tablename__
= 'location_areas'
284 id = Column(Integer
, primary_key
=True, nullable
=False)
285 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False)
286 internal_id
= Column(Integer
, nullable
=False)
287 name
= Column(Unicode(64), nullable
=True)
289 class LocationAreaEncounterRate(TableBase
):
290 __tablename__
= 'location_area_encounter_rates'
291 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), primary_key
=True, nullable
=False, autoincrement
=False)
292 encounter_terrain_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=True, nullable
=False, autoincrement
=False)
293 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, autoincrement
=False)
294 rate
= Column(Integer
, nullable
=True)
296 class Machine(TableBase
):
297 __tablename__
= 'machines'
298 machine_number
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
299 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
300 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False)
301 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False)
305 return self
.machine_number
>= 100
307 class MoveBattleStyle(TableBase
):
308 __tablename__
= 'move_battle_styles'
309 id = Column(Integer
, primary_key
=True, nullable
=False)
310 name
= Column(Unicode(8), nullable
=False)
312 class MoveEffectCategory(TableBase
):
313 __tablename__
= 'move_effect_categories'
314 id = Column(Integer
, primary_key
=True, nullable
=False)
315 name
= Column(Unicode(64), nullable
=False)
316 can_affect_user
= Column(Boolean
, nullable
=False)
318 class MoveEffectCategoryMap(TableBase
):
319 __tablename__
= 'move_effect_category_map'
320 move_effect_id
= Column(Integer
, ForeignKey('move_effects.id'), primary_key
=True, nullable
=False)
321 move_effect_category_id
= Column(Integer
, ForeignKey('move_effect_categories.id'), primary_key
=True, nullable
=False)
322 affects_user
= Column(Boolean
, primary_key
=True, nullable
=False)
324 class MoveDamageClass(TableBase
):
325 __tablename__
= 'move_damage_classes'
326 id = Column(Integer
, primary_key
=True, nullable
=False)
327 name
= Column(Unicode(8), nullable
=False)
328 description
= Column(Unicode(64), nullable
=False)
330 class MoveEffect(TableBase
):
331 __tablename__
= 'move_effects'
332 id = Column(Integer
, primary_key
=True, nullable
=False)
333 priority
= Column(SmallInteger
, nullable
=False)
334 short_effect
= Column(Unicode(256), nullable
=False)
335 effect
= Column(Unicode(5120), nullable
=False)
337 class MoveFlag(TableBase
):
338 __tablename__
= 'move_flags'
339 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
340 move_flag_type_id
= Column(Integer
, ForeignKey('move_flag_types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
342 class MoveFlagType(TableBase
):
343 __tablename__
= 'move_flag_types'
344 id = Column(Integer
, primary_key
=True, nullable
=False)
345 identifier
= Column(Unicode(16), nullable
=False)
346 name
= Column(Unicode(32), nullable
=False)
347 description
= Column(markdown
.MarkdownColumn(128), nullable
=False)
349 class MoveFlavorText(TableBase
):
350 __tablename__
= 'move_flavor_text'
351 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
352 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
353 flavor_text
= Column(Unicode(255), nullable
=False)
355 class MoveName(TableBase
):
356 __tablename__
= 'move_names'
357 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
358 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
359 name
= Column(Unicode(16), nullable
=False)
361 class MoveTarget(TableBase
):
362 __tablename__
= 'move_targets'
363 id = Column(Integer
, primary_key
=True, nullable
=False)
364 name
= Column(Unicode(32), nullable
=False)
365 description
= Column(Unicode(128), nullable
=False)
367 class Move(TableBase
):
368 __tablename__
= 'moves'
369 __singlename__
= 'move'
370 id = Column(Integer
, primary_key
=True, nullable
=False)
371 name
= Column(Unicode(12), nullable
=False)
372 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
373 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
374 power
= Column(SmallInteger
)
375 pp
= Column(SmallInteger
, nullable
=False)
376 accuracy
= Column(SmallInteger
)
377 target_id
= Column(Integer
, ForeignKey('move_targets.id'), nullable
=False)
378 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False)
379 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=False)
380 effect_chance
= Column(Integer
)
381 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=True)
382 contest_effect_id
= Column(Integer
, ForeignKey('contest_effects.id'), nullable
=True)
383 super_contest_effect_id
= Column(Integer
, ForeignKey('super_contest_effects.id'), nullable
=False)
385 class Nature(TableBase
):
386 __tablename__
= 'natures'
387 __singlename__
= 'nature'
388 id = Column(Integer
, primary_key
=True, nullable
=False)
389 name
= Column(Unicode(8), nullable
=False)
390 decreased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False)
391 increased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False)
392 hates_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False)
393 likes_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False)
395 class NatureBattleStylePreference(TableBase
):
396 __tablename__
= 'nature_battle_style_preferences'
397 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False)
398 move_battle_style_id
= Column(Integer
, ForeignKey('move_battle_styles.id'), primary_key
=True, nullable
=False)
399 low_hp_preference
= Column(Integer
, nullable
=False)
400 high_hp_preference
= Column(Integer
, nullable
=False)
402 class NatureName(TableBase
):
403 __tablename__
= 'nature_names'
404 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False, autoincrement
=False)
405 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
406 name
= Column(Unicode(8), nullable
=False)
408 class NaturePokeathlonStat(TableBase
):
409 __tablename__
= 'nature_pokeathlon_stats'
410 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False)
411 pokeathlon_stat_id
= Column(Integer
, ForeignKey('pokeathlon_stats.id'), primary_key
=True, nullable
=False)
412 max_change
= Column(Integer
, nullable
=False)
414 class PokeathlonStat(TableBase
):
415 __tablename__
= 'pokeathlon_stats'
416 id = Column(Integer
, primary_key
=True, nullable
=False)
417 name
= Column(Unicode(8), nullable
=False)
419 class Pokedex(TableBase
):
420 __tablename__
= 'pokedexes'
421 id = Column(Integer
, primary_key
=True, nullable
=False)
422 region_id
= Column(Integer
, ForeignKey('regions.id'), nullable
=True)
423 name
= Column(Unicode(16), nullable
=False)
424 description
= Column(Unicode(512))
426 class PokedexVersionGroup(TableBase
):
427 __tablename__
= 'pokedex_version_groups'
428 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), primary_key
=True, nullable
=False, autoincrement
=False)
429 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
431 class Pokemon(TableBase
):
432 """The core to this whole mess.
434 Note that I use both 'forme' and 'form' in both code and the database. I
435 only use 'forme' when specifically referring to Pokémon that have multiple
436 distinct species as forms—i.e., different stats or movesets. 'Form' is a
437 more general term referring to any variation within a species, including
438 purely cosmetic forms like Unown.
440 __tablename__
= 'pokemon'
441 __singlename__
= 'pokemon'
442 id = Column(Integer
, primary_key
=True, nullable
=False)
443 name
= Column(Unicode(20), nullable
=False)
444 forme_name
= Column(Unicode(16))
445 forme_base_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'))
446 generation_id
= Column(Integer
, ForeignKey('generations.id'))
447 evolution_chain_id
= Column(Integer
, ForeignKey('evolution_chains.id'))
448 height
= Column(Integer
, nullable
=False)
449 weight
= Column(Integer
, nullable
=False)
450 species
= Column(Unicode(16), nullable
=False)
451 color_id
= Column(Integer
, ForeignKey('pokemon_colors.id'), nullable
=False)
452 pokemon_shape_id
= Column(Integer
, ForeignKey('pokemon_shapes.id'), nullable
=False)
453 habitat_id
= Column(Integer
, ForeignKey('pokemon_habitats.id'), nullable
=True)
454 gender_rate
= Column(Integer
, nullable
=False)
455 capture_rate
= Column(Integer
, nullable
=False)
456 base_experience
= Column(Integer
, nullable
=False)
457 base_happiness
= Column(Integer
, nullable
=False)
458 is_baby
= Column(Boolean
, nullable
=False)
459 hatch_counter
= Column(Integer
, nullable
=False)
460 has_gen4_fem_sprite
= Column(Boolean
, nullable
=False)
461 has_gen4_fem_back_sprite
= Column(Boolean
, nullable
=False)
463 ### Stuff to handle alternate Pokémon forms
466 def national_id(self
):
467 """Returns the National Pokédex number for this Pokémon. Use this
468 instead of the id directly; alternate formes may make the id incorrect.
471 if self
.forme_base_pokemon_id
:
472 return self
.forme_base_pokemon_id
477 """Returns the name of this Pokémon, including its Forme, if any."""
480 return "%s %s" %
(self
.forme_name
.title(), self
.name
)
484 def normal_form(self
):
485 """Returns the normal form for this Pokémon; i.e., this will return
486 regular Deoxys when called on any Deoxys form.
489 if self
.forme_base_pokemon
:
490 return self
.forme_base_pokemon
496 def stat(self
, stat_name
):
497 """Returns a PokemonStat record for the given stat name (or Stat row
498 object). Uses the normal has-many machinery, so all the stats are
501 if isinstance(stat_name
, Stat
):
502 stat_name
= stat_name
.name
504 for pokemon_stat
in self
.stats
:
505 if pokemon_stat
.stat
.name
== stat_name
:
508 raise KeyError(u
'No stat named %s' % stat_name
)
511 def better_damage_class(self
):
512 u
"""Returns the MoveDamageClass that this Pokémon is best suited for,
513 based on its attack stats.
515 If the attack stats are about equal (within 5), returns None. The
516 value None, not the damage class called 'None'.
518 phys
= self
.stat(u
'Attack')
519 spec
= self
.stat(u
'Special Attack')
521 diff
= phys
.base_stat
- spec
.base_stat
524 return phys
.stat
.damage_class
526 return spec
.stat
.damage_class
530 class PokemonAbility(TableBase
):
531 __tablename__
= 'pokemon_abilities'
532 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
533 ability_id
= Column(Integer
, ForeignKey('abilities.id'), nullable
=False)
534 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
536 class PokemonColor(TableBase
):
537 __tablename__
= 'pokemon_colors'
538 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
539 name
= Column(Unicode(6), nullable
=False)
541 class PokemonDexNumber(TableBase
):
542 __tablename__
= 'pokemon_dex_numbers'
543 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
544 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), primary_key
=True, nullable
=False, autoincrement
=False)
545 pokedex_number
= Column(Integer
, nullable
=False)
547 class PokemonEggGroup(TableBase
):
548 __tablename__
= 'pokemon_egg_groups'
549 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
550 egg_group_id
= Column(Integer
, ForeignKey('egg_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
552 class PokemonEvolution(TableBase
):
553 __tablename__
= 'pokemon_evolution'
554 from_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False)
555 to_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
556 evolution_trigger_id
= Column(Integer
, ForeignKey('evolution_triggers.id'), nullable
=False)
557 trigger_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True)
558 minimum_level
= Column(Integer
, nullable
=True)
559 gender
= Column(Enum('male', 'female', name
='pokemon_evolution_gender'), nullable
=True)
560 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=True)
561 held_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True)
562 time_of_day
= Column(Enum('morning', 'day', 'night', name
='pokemon_evolution_time_of_day'), nullable
=True)
563 known_move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=True)
564 minimum_happiness
= Column(Integer
, nullable
=True)
565 minimum_beauty
= Column(Integer
, nullable
=True)
566 relative_physical_stats
= Column(Integer
, nullable
=True)
567 party_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=True)
569 class PokemonFlavorText(TableBase
):
570 __tablename__
= 'pokemon_flavor_text'
571 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
572 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
573 flavor_text
= Column(Unicode(255), nullable
=False)
575 class PokemonFormGroup(TableBase
):
576 __tablename__
= 'pokemon_form_groups'
577 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
578 is_battle_only
= Column(Boolean
, nullable
=False)
579 description
= Column(markdown
.MarkdownColumn(1024), nullable
=False)
581 class PokemonFormSprite(TableBase
):
582 __tablename__
= 'pokemon_form_sprites'
583 id = Column(Integer
, primary_key
=True, nullable
=False)
584 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
585 introduced_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
586 name
= Column(Unicode(16), nullable
=True)
587 is_default
= Column(Boolean
, nullable
=True)
589 class PokemonHabitat(TableBase
):
590 __tablename__
= 'pokemon_habitats'
591 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
592 name
= Column(Unicode(16), nullable
=False)
594 class PokemonInternalID(TableBase
):
595 __tablename__
= 'pokemon_internal_ids'
596 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, autoincrement
=False, nullable
=False)
597 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False)
598 internal_id
= Column(Integer
, nullable
=False)
600 class PokemonItem(TableBase
):
601 __tablename__
= 'pokemon_items'
602 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
603 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
604 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False)
605 rarity
= Column(Integer
, nullable
=False)
607 class PokemonMove(TableBase
):
608 __tablename__
= 'pokemon_moves'
609 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
610 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
611 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False, index
=True)
612 pokemon_move_method_id
= Column(Integer
, ForeignKey('pokemon_move_methods.id'), primary_key
=True, nullable
=False, autoincrement
=False)
613 level
= Column(Integer
, primary_key
=True, nullable
=True, autoincrement
=False, index
=True)
614 order
= Column(Integer
, nullable
=True, index
=True)
616 class PokemonMoveMethod(TableBase
):
617 __tablename__
= 'pokemon_move_methods'
618 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
619 name
= Column(Unicode(64), nullable
=False)
620 description
= Column(Unicode(255), nullable
=False)
622 class PokemonName(TableBase
):
623 __tablename__
= 'pokemon_names'
624 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
625 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
626 name
= Column(Unicode(16), nullable
=False)
628 class PokemonShape(TableBase
):
629 __tablename__
= 'pokemon_shapes'
630 id = Column(Integer
, primary_key
=True, nullable
=False)
631 name
= Column(Unicode(24), nullable
=False)
632 awesome_name
= Column(Unicode(16), nullable
=False)
634 class PokemonStat(TableBase
):
635 __tablename__
= 'pokemon_stats'
636 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
637 stat_id
= Column(Integer
, ForeignKey('stats.id'), primary_key
=True, nullable
=False, autoincrement
=False)
638 base_stat
= Column(Integer
, nullable
=False)
639 effort
= Column(Integer
, nullable
=False)
641 class PokemonType(TableBase
):
642 __tablename__
= 'pokemon_types'
643 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
644 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
645 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
647 class Region(TableBase
):
648 """Major areas of the world: Kanto, Johto, etc."""
649 __tablename__
= 'regions'
650 id = Column(Integer
, primary_key
=True, nullable
=False)
651 name
= Column(Unicode(16), nullable
=False)
653 class Stat(TableBase
):
654 __tablename__
= 'stats'
655 id = Column(Integer
, primary_key
=True, nullable
=False)
656 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=True)
657 name
= Column(Unicode(16), nullable
=False)
659 class SuperContestCombo(TableBase
):
660 __tablename__
= 'super_contest_combos'
661 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
662 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
664 class SuperContestEffect(TableBase
):
665 __tablename__
= 'super_contest_effects'
666 id = Column(Integer
, primary_key
=True, nullable
=False)
667 appeal
= Column(SmallInteger
, nullable
=False)
668 flavor_text
= Column(Unicode(64), nullable
=False)
670 class TypeEfficacy(TableBase
):
671 __tablename__
= 'type_efficacy'
672 damage_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
673 target_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
674 damage_factor
= Column(Integer
, nullable
=False)
676 class Type(TableBase
):
677 __tablename__
= 'types'
678 __singlename__
= 'type'
679 id = Column(Integer
, primary_key
=True, nullable
=False)
680 name
= Column(Unicode(8), nullable
=False)
681 abbreviation
= Column(Unicode(3), nullable
=False)
682 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
683 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False) ## ??? is none; everything else is physical or special
685 class VersionGroup(TableBase
):
686 __tablename__
= 'version_groups'
687 id = Column(Integer
, primary_key
=True, nullable
=False)
688 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
690 class VersionGroupRegion(TableBase
):
691 __tablename__
= 'version_group_regions'
692 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False)
693 region_id
= Column(Integer
, ForeignKey('regions.id'), primary_key
=True, nullable
=False)
695 class Version(TableBase
):
696 __tablename__
= 'versions'
697 id = Column(Integer
, primary_key
=True, nullable
=False)
698 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False)
699 name
= Column(Unicode(32), nullable
=False)
702 ### Relations down here, to avoid ordering problems
703 Ability
.flavor_text
= relation(AbilityFlavorText
, order_by
=AbilityFlavorText
.version_group_id
, backref
='ability')
704 Ability
.foreign_names
= relation(AbilityName
, backref
='ability')
705 Ability
.generation
= relation(Generation
, backref
='abilities')
707 AbilityFlavorText
.version_group
= relation(VersionGroup
)
709 AbilityName
.language
= relation(Language
)
711 Berry
.berry_firmness
= relation(BerryFirmness
, backref
='berries')
712 Berry
.firmness
= association_proxy('berry_firmness', 'name')
713 Berry
.flavors
= relation(BerryFlavor
, order_by
=BerryFlavor
.contest_type_id
, backref
='berry')
714 Berry
.natural_gift_type
= relation(Type
)
716 BerryFlavor
.contest_type
= relation(ContestType
)
718 ContestCombo
.first
= relation(Move
, primaryjoin
=ContestCombo
.first_move_id
==Move
.id,
719 backref
='contest_combo_first')
720 ContestCombo
.second
= relation(Move
, primaryjoin
=ContestCombo
.second_move_id
==Move
.id,
721 backref
='contest_combo_second')
723 Encounter
.location_area
= relation(LocationArea
, backref
='encounters')
724 Encounter
.pokemon
= relation(Pokemon
, backref
='encounters')
725 Encounter
.version
= relation(Version
, backref
='encounters')
726 Encounter
.slot
= relation(EncounterSlot
, backref
='encounters')
728 EncounterConditionValue
.condition
= relation(EncounterCondition
, backref
='values')
730 Encounter
.condition_value_map
= relation(EncounterConditionValueMap
, backref
='encounter')
731 Encounter
.condition_values
= association_proxy('condition_value_map', 'condition_value')
732 EncounterConditionValueMap
.condition_value
= relation(EncounterConditionValue
,
733 backref
='encounter_map')
735 EncounterSlot
.terrain
= relation(EncounterTerrain
, backref
='slots')
737 EncounterSlot
.condition_map
= relation(EncounterSlotCondition
, backref
='slot')
738 EncounterSlot
.conditions
= association_proxy('condition_map', 'condition')
739 EncounterSlotCondition
.condition
= relation(EncounterCondition
,
742 EvolutionChain
.growth_rate
= relation(GrowthRate
, backref
='evolution_chains')
744 Experience
.growth_rate
= relation(GrowthRate
, backref
='experience_table')
746 Generation
.canonical_pokedex
= relation(Pokedex
, backref
='canonical_for_generation')
747 Generation
.versions
= relation(Version
, secondary
=VersionGroup
.__table__
)
748 Generation
.main_region
= relation(Region
)
750 GrowthRate
.max_experience_obj
= relation(Experience
, primaryjoin
=and_(Experience
.growth_rate_id
== GrowthRate
.id, Experience
.level
== 100), uselist
=False)
751 GrowthRate
.max_experience
= association_proxy('max_experience_obj', 'experience')
753 Item
.berry
= relation(Berry
, uselist
=False, backref
='item')
754 Item
.flags
= relation(ItemFlag
, secondary
=ItemFlagMap
.__table__
)
755 Item
.flavor_text
= relation(ItemFlavorText
, order_by
=ItemFlavorText
.version_group_id
.asc(), backref
='item')
756 Item
.fling_effect
= relation(ItemFlingEffect
, backref
='items')
757 Item
.foreign_names
= relation(ItemName
, backref
='item')
758 Item
.machines
= relation(Machine
, order_by
=Machine
.version_group_id
.asc())
759 Item
.category
= relation(ItemCategory
)
760 Item
.pocket
= association_proxy('category', 'pocket')
762 ItemCategory
.items
= relation(Item
, order_by
=Item
.name
)
763 ItemCategory
.pocket
= relation(ItemPocket
)
765 ItemFlavorText
.version_group
= relation(VersionGroup
)
767 ItemName
.language
= relation(Language
)
769 ItemPocket
.categories
= relation(ItemCategory
, order_by
=ItemCategory
.name
)
771 Location
.region
= relation(Region
, backref
='locations')
773 LocationArea
.location
= relation(Location
, backref
='areas')
775 Machine
.item
= relation(Item
)
776 Machine
.version_group
= relation(VersionGroup
)
778 Move
.contest_effect
= relation(ContestEffect
, backref
='moves')
779 Move
.contest_combo_next
= association_proxy('contest_combo_first', 'second')
780 Move
.contest_combo_prev
= association_proxy('contest_combo_second', 'first')
781 Move
.contest_type
= relation(ContestType
, backref
='moves')
782 Move
.damage_class
= relation(MoveDamageClass
, backref
='moves')
783 Move
.flags
= association_proxy('move_flags', 'flag')
784 Move
.flavor_text
= relation(MoveFlavorText
, order_by
=MoveFlavorText
.version_group_id
, backref
='move')
785 Move
.foreign_names
= relation(MoveName
, backref
='move')
786 Move
.generation
= relation(Generation
, backref
='moves')
787 Move
.machines
= relation(Machine
, backref
='move')
788 Move
.move_effect
= relation(MoveEffect
, backref
='moves')
789 Move
.move_flags
= relation(MoveFlag
, backref
='move')
790 Move
.super_contest_effect
= relation(SuperContestEffect
, backref
='moves')
791 Move
.super_contest_combo_next
= association_proxy('super_contest_combo_first', 'second')
792 Move
.super_contest_combo_prev
= association_proxy('super_contest_combo_second', 'first')
793 Move
.target
= relation(MoveTarget
, backref
='moves')
794 Move
.type = relation(Type
, backref
='moves')
796 Move
.effect
= markdown
.MoveEffectProperty('effect')
797 Move
.priority
= association_proxy('move_effect', 'priority')
798 Move
.short_effect
= markdown
.MoveEffectProperty('short_effect')
800 MoveEffect
.category_map
= relation(MoveEffectCategoryMap
)
801 MoveEffect
.categories
= association_proxy('category_map', 'category')
802 MoveEffectCategoryMap
.category
= relation(MoveEffectCategory
)
804 MoveFlag
.flag
= relation(MoveFlagType
)
806 MoveFlavorText
.version_group
= relation(VersionGroup
)
808 MoveName
.language
= relation(Language
)
810 Nature
.foreign_names
= relation(NatureName
, backref
='nature')
811 Nature
.decreased_stat
= relation(Stat
, primaryjoin
=Nature
.decreased_stat_id
==Stat
.id,
812 backref
='decreasing_natures')
813 Nature
.increased_stat
= relation(Stat
, primaryjoin
=Nature
.increased_stat_id
==Stat
.id,
814 backref
='increasing_natures')
815 Nature
.hates_flavor
= relation(ContestType
, primaryjoin
=Nature
.hates_flavor_id
==ContestType
.id,
816 backref
='hating_natures')
817 Nature
.likes_flavor
= relation(ContestType
, primaryjoin
=Nature
.likes_flavor_id
==ContestType
.id,
818 backref
='liking_natures')
819 Nature
.battle_style_preferences
= relation(NatureBattleStylePreference
,
820 order_by
=NatureBattleStylePreference
.move_battle_style_id
,
822 Nature
.pokeathlon_effects
= relation(NaturePokeathlonStat
, order_by
=NaturePokeathlonStat
.pokeathlon_stat_id
)
824 NatureBattleStylePreference
.battle_style
= relation(MoveBattleStyle
, backref
='nature_preferences')
826 NatureName
.language
= relation(Language
)
828 NaturePokeathlonStat
.pokeathlon_stat
= relation(PokeathlonStat
, backref
='nature_effects')
830 Pokedex
.region
= relation(Region
, backref
='pokedexes')
831 Pokedex
.version_groups
= relation(VersionGroup
, secondary
=PokedexVersionGroup
.__table__
, backref
='pokedexes')
833 Pokemon
.abilities
= relation(Ability
, secondary
=PokemonAbility
.__table__
,
834 order_by
=PokemonAbility
.slot
,
836 Pokemon
.formes
= relation(Pokemon
, primaryjoin
=Pokemon
.id==Pokemon
.forme_base_pokemon_id
,
837 backref
=backref('forme_base_pokemon',
838 remote_side
=[Pokemon
.id]))
839 Pokemon
.pokemon_color
= relation(PokemonColor
, backref
='pokemon')
840 Pokemon
.color
= association_proxy('pokemon_color', 'name')
841 Pokemon
.dex_numbers
= relation(PokemonDexNumber
, order_by
=PokemonDexNumber
.pokedex_id
.asc(), backref
='pokemon')
842 Pokemon
.default_form_sprite
= relation(PokemonFormSprite
,
844 Pokemon
.id==PokemonFormSprite
.pokemon_id
,
845 PokemonFormSprite
.is_default
==True,
848 Pokemon
.egg_groups
= relation(EggGroup
, secondary
=PokemonEggGroup
.__table__
,
849 order_by
=PokemonEggGroup
.egg_group_id
,
851 Pokemon
.evolution_chain
= relation(EvolutionChain
, backref
='pokemon')
852 Pokemon
.child_pokemon
= relation(Pokemon
,
853 primaryjoin
=Pokemon
.id==PokemonEvolution
.from_pokemon_id
,
854 secondary
=PokemonEvolution
.__table__
,
855 secondaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
856 backref
=backref('parent_pokemon', uselist
=False),
858 Pokemon
.flavor_text
= relation(PokemonFlavorText
, order_by
=PokemonFlavorText
.version_id
.asc(), backref
='pokemon')
859 Pokemon
.foreign_names
= relation(PokemonName
, backref
='pokemon')
860 Pokemon
.pokemon_habitat
= relation(PokemonHabitat
, backref
='pokemon')
861 Pokemon
.habitat
= association_proxy('pokemon_habitat', 'name')
862 Pokemon
.items
= relation(PokemonItem
, backref
='pokemon')
863 Pokemon
.generation
= relation(Generation
, backref
='pokemon')
864 Pokemon
.shape
= relation(PokemonShape
, backref
='pokemon')
865 Pokemon
.stats
= relation(PokemonStat
, backref
='pokemon')
866 Pokemon
.types
= relation(Type
, secondary
=PokemonType
.__table__
, order_by
=PokemonType
.slot
.asc())
868 PokemonDexNumber
.pokedex
= relation(Pokedex
)
870 PokemonEvolution
.from_pokemon
= relation(Pokemon
,
871 primaryjoin
=PokemonEvolution
.from_pokemon_id
==Pokemon
.id,
872 backref
='child_evolutions',
874 PokemonEvolution
.to_pokemon
= relation(Pokemon
,
875 primaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
876 backref
=backref('parent_evolution', uselist
=False),
878 PokemonEvolution
.child_evolutions
= relation(PokemonEvolution
,
879 primaryjoin
=PokemonEvolution
.from_pokemon_id
==PokemonEvolution
.to_pokemon_id
,
880 foreign_keys
=[PokemonEvolution
.to_pokemon_id
],
881 backref
=backref('parent_evolution',
882 remote_side
=[PokemonEvolution
.from_pokemon_id
],
886 PokemonEvolution
.trigger
= relation(EvolutionTrigger
, backref
='evolutions')
887 PokemonEvolution
.trigger_item
= relation(Item
,
888 primaryjoin
=PokemonEvolution
.trigger_item_id
==Item
.id,
889 backref
='triggered_evolutions',
891 PokemonEvolution
.held_item
= relation(Item
,
892 primaryjoin
=PokemonEvolution
.held_item_id
==Item
.id,
893 backref
='required_for_evolutions',
895 PokemonEvolution
.location
= relation(Location
, backref
='triggered_evolutions')
896 PokemonEvolution
.known_move
= relation(Move
, backref
='triggered_evolutions')
897 PokemonEvolution
.party_pokemon
= relation(Pokemon
,
898 primaryjoin
=PokemonEvolution
.party_pokemon_id
==Pokemon
.id,
899 backref
='triggered_evolutions',
902 PokemonFlavorText
.version
= relation(Version
)
904 PokemonItem
.item
= relation(Item
, backref
='pokemon')
905 PokemonItem
.version
= relation(Version
)
907 PokemonFormGroup
.pokemon
= relation(Pokemon
, backref
=backref('form_group',
909 PokemonFormSprite
.pokemon
= relation(Pokemon
, backref
='form_sprites')
910 PokemonFormSprite
.introduced_in
= relation(VersionGroup
)
912 PokemonMove
.pokemon
= relation(Pokemon
, backref
='pokemon_moves')
913 PokemonMove
.version_group
= relation(VersionGroup
)
914 PokemonMove
.machine
= relation(Machine
, backref
='pokemon_moves',
915 primaryjoin
=and_(Machine
.version_group_id
==PokemonMove
.version_group_id
,
916 Machine
.move_id
==PokemonMove
.move_id
),
917 foreign_keys
=[Machine
.version_group_id
, Machine
.move_id
],
919 PokemonMove
.move
= relation(Move
, backref
='pokemon_moves')
920 PokemonMove
.method
= relation(PokemonMoveMethod
)
922 PokemonName
.language
= relation(Language
)
924 PokemonStat
.stat
= relation(Stat
)
926 # This is technically a has-many; Generation.main_region_id -> Region.id
927 Region
.generation
= relation(Generation
, uselist
=False)
928 Region
.version_group_regions
= relation(VersionGroupRegion
, backref
='region',
929 order_by
='VersionGroupRegion.version_group_id')
930 Region
.version_groups
= association_proxy('version_group_regions', 'version_group')
932 Stat
.damage_class
= relation(MoveDamageClass
, backref
='stats')
934 SuperContestCombo
.first
= relation(Move
, primaryjoin
=SuperContestCombo
.first_move_id
==Move
.id,
935 backref
='super_contest_combo_first')
936 SuperContestCombo
.second
= relation(Move
, primaryjoin
=SuperContestCombo
.second_move_id
==Move
.id,
937 backref
='super_contest_combo_second')
939 Type
.damage_efficacies
= relation(TypeEfficacy
,
941 ==TypeEfficacy
.damage_type_id
,
942 backref
='damage_type')
943 Type
.target_efficacies
= relation(TypeEfficacy
,
945 ==TypeEfficacy
.target_type_id
,
946 backref
='target_type')
948 Type
.generation
= relation(Generation
, backref
='types')
949 Type
.damage_class
= relation(MoveDamageClass
, backref
='types')
951 Version
.version_group
= relation(VersionGroup
, backref
='versions')
952 Version
.generation
= association_proxy('version_group', 'generation')
954 VersionGroup
.generation
= relation(Generation
, backref
='version_groups')
955 VersionGroup
.version_group_regions
= relation(VersionGroupRegion
, backref
='version_group')
956 VersionGroup
.regions
= association_proxy('version_group_regions', 'region')