07e816f2e0e7b0bcb96bc1c072be3b23ef84e9c1
[zzz-pokedex.git] / pokedex / db / tables.py
1 # encoding: utf8
2
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, relation
7 from sqlalchemy.sql import and_
8 from sqlalchemy.types import *
9 from sqlalchemy.databases.mysql import *
10
11 from pokedex.db import rst
12
13 metadata = MetaData()
14 TableBase = declarative_base(metadata=metadata)
15
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 flavor_text = Column(Unicode(64), nullable=False)
22 effect = Column(Unicode(255), nullable=False)
23
24 class ContestCombo(TableBase):
25 __tablename__ = 'contest_combos'
26 first_move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
27 second_move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
28
29 class ContestEffect(TableBase):
30 __tablename__ = 'contest_effects'
31 id = Column(Integer, primary_key=True, nullable=False)
32 appeal = Column(SmallInteger, nullable=False)
33 jam = Column(SmallInteger, nullable=False)
34 flavor_text = Column(Unicode(64), nullable=False)
35 effect = Column(Unicode(255), nullable=False)
36
37 class EggGroup(TableBase):
38 __tablename__ = 'egg_groups'
39 id = Column(Integer, primary_key=True, nullable=False)
40 name = Column(Unicode(16), nullable=False)
41
42 class Encounter(TableBase):
43 """Rows in this table represent encounters with wild Pokémon. Bear with
44 me, here.
45
46 Within a given area in a given game, encounters are differentiated by the
47 "slot" they are in and the state of the game world.
48
49 What the player is doing to get an encounter, such as surfing or walking
50 through tall grass, is called terrain. Each terrain has its own set of
51 encounter slots.
52
53 Within a terrain, slots are defined primarily by rarity. Each slot can
54 also be affected by world conditions; for example, the 20% slot for walking
55 in tall grass is affected by whether a swarm is in effect in that area.
56 "Is there a swarm?" is a condition; "there is a swarm" and "there is not a
57 swarm" are the possible values of this condition.
58
59 A slot (20% walking in grass) and any appropriate world conditions (no
60 swarm) are thus enough to define a specific encounter.
61
62 Well, okay, almost: each slot actually appears twice.
63 """
64
65 __tablename__ = 'encounters'
66 id = Column(Integer, primary_key=True, nullable=False)
67 version_id = Column(Integer, ForeignKey('versions.id'), nullable=False, autoincrement=False)
68 location_area_id = Column(Integer, ForeignKey('location_areas.id'), nullable=False, autoincrement=False)
69 encounter_slot_id = Column(Integer, ForeignKey('encounter_slots.id'), nullable=False, autoincrement=False)
70 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False)
71 min_level = Column(Integer, nullable=False, autoincrement=False)
72 max_level = Column(Integer, nullable=False, autoincrement=False)
73
74 class EncounterCondition(TableBase):
75 """Rows in this table represent varying conditions in the game world, such
76 as time of day.
77 """
78
79 __tablename__ = 'encounter_conditions'
80 id = Column(Integer, primary_key=True, nullable=False)
81 name = Column(Unicode(64), nullable=False)
82
83 class EncounterConditionValue(TableBase):
84 """Rows in this table represent possible states for a condition; for
85 example, the state of 'swarm' could be 'swarm' or 'no swarm'.
86 """
87
88 __tablename__ = 'encounter_condition_values'
89 id = Column(Integer, primary_key=True, nullable=False)
90 encounter_condition_id = Column(Integer, ForeignKey('encounter_conditions.id'), primary_key=False, nullable=False, autoincrement=False)
91 name = Column(Unicode(64), nullable=False)
92 is_default = Column(Boolean, nullable=False)
93
94 class EncounterConditionValueMap(TableBase):
95 """Maps encounters to the specific conditions under which they occur."""
96
97 __tablename__ = 'encounter_condition_value_map'
98 encounter_id = Column(Integer, ForeignKey('encounters.id'), primary_key=True, nullable=False, autoincrement=False)
99 encounter_condition_value_id = Column(Integer, ForeignKey('encounter_condition_values.id'), primary_key=True, nullable=False, autoincrement=False)
100
101 class EncounterTerrain(TableBase):
102 """Rows in this table represent ways the player can enter a wild encounter,
103 e.g., surfing, fishing, or walking through tall grass.
104 """
105
106 __tablename__ = 'encounter_terrain'
107 id = Column(Integer, primary_key=True, nullable=False)
108 name = Column(Unicode(64), nullable=False)
109
110 class EncounterSlot(TableBase):
111 """Rows in this table represent an abstract "slot" within a terrain,
112 associated with both some set of conditions and a rarity.
113
114 Note that there are two encounters per slot, so the rarities will only add
115 up to 50.
116 """
117
118 __tablename__ = 'encounter_slots'
119 id = Column(Integer, primary_key=True, nullable=False)
120 version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False, autoincrement=False)
121 encounter_terrain_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=False, nullable=False, autoincrement=False)
122 rarity = Column(Integer, nullable=False, autoincrement=False)
123
124 class EncounterSlotCondition(TableBase):
125 """Lists all conditions that affect each slot."""
126
127 __tablename__ = 'encounter_slot_conditions'
128 encounter_slot_id = Column(Integer, ForeignKey('encounter_slots.id'), primary_key=True, nullable=False, autoincrement=False)
129 encounter_condition_id = Column(Integer, ForeignKey('encounter_conditions.id'), primary_key=True, nullable=False, autoincrement=False)
130
131 class EvolutionChain(TableBase):
132 __tablename__ = 'evolution_chains'
133 id = Column(Integer, primary_key=True, nullable=False)
134 growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False)
135 steps_to_hatch = Column(Integer, nullable=False)
136 baby_trigger_item = Column(Unicode(12))
137
138 class EvolutionMethod(TableBase):
139 __tablename__ = 'evolution_methods'
140 id = Column(Integer, primary_key=True, nullable=False)
141 name = Column(Unicode(64), nullable=False)
142 description = Column(Unicode(255), nullable=False)
143
144 class Generation(TableBase):
145 __tablename__ = 'generations'
146 id = Column(Integer, primary_key=True, nullable=False)
147 main_region_id = Column(Integer, ForeignKey('regions.id'))
148 name = Column(Unicode(16), nullable=False)
149
150 class GrowthRate(TableBase):
151 """`formula` is written in LaTeX math notation."""
152 __tablename__ = 'growth_rates'
153 id = Column(Integer, primary_key=True, nullable=False)
154 name = Column(Unicode(20), nullable=False)
155 formula = Column(Unicode(500), nullable=False)
156
157 class Item(TableBase):
158 __tablename__ = 'items'
159 __singlename__ = 'item'
160 id = Column(Integer, primary_key=True, nullable=False)
161 name = Column(Unicode(16), nullable=False)
162
163 class Language(TableBase):
164 __tablename__ = 'languages'
165 id = Column(Integer, primary_key=True, nullable=False)
166 iso3166 = Column(Unicode(2), nullable=False)
167 name = Column(Unicode(16), nullable=False)
168
169 class Location(TableBase):
170 __tablename__ = 'locations'
171 __singlename__ = 'location'
172 id = Column(Integer, primary_key=True, nullable=False)
173 region_id = Column(Integer, ForeignKey('regions.id'))
174 name = Column(Unicode(64), nullable=False)
175
176 class LocationArea(TableBase):
177 __tablename__ = 'location_areas'
178 id = Column(Integer, primary_key=True, nullable=False)
179 location_id = Column(Integer, ForeignKey('locations.id'), nullable=False)
180 internal_id = Column(Integer, nullable=False)
181 name = Column(Unicode(64), nullable=True)
182
183 class LocationAreaEncounterRate(TableBase):
184 __tablename__ = 'location_area_encounter_rates'
185 location_area_id = Column(Integer, ForeignKey('location_areas.id'), primary_key=True, nullable=False, autoincrement=False)
186 encounter_type_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=True, nullable=False, autoincrement=False)
187 rate = Column(Integer, nullable=True)
188
189 class Machine(TableBase):
190 __tablename__ = 'machines'
191 machine_number = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
192 version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
193 move_id = Column(Integer, ForeignKey('moves.id'), nullable=False)
194
195 class MoveEffectCategory(TableBase):
196 __tablename__ = 'move_effect_categories'
197 id = Column(Integer, primary_key=True, nullable=False)
198 name = Column(Unicode(64), nullable=False)
199 can_affect_user = Column(Boolean, nullable=False)
200
201 class MoveEffectCategoryMap(TableBase):
202 __tablename__ = 'move_effect_category_map'
203 move_effect_id = Column(Integer, ForeignKey('move_effects.id'), primary_key=True, nullable=False)
204 move_effect_category_id = Column(Integer, ForeignKey('move_effect_categories.id'), primary_key=True, nullable=False)
205 affects_user = Column(Boolean, primary_key=True, nullable=False)
206
207 class MoveDamageClass(TableBase):
208 __tablename__ = 'move_damage_classes'
209 id = Column(Integer, primary_key=True, nullable=False)
210 name = Column(Unicode(8), nullable=False)
211 description = Column(Unicode(64), nullable=False)
212
213 class MoveEffect(TableBase):
214 __tablename__ = 'move_effects'
215 id = Column(Integer, primary_key=True, nullable=False)
216 priority = Column(SmallInteger, nullable=False)
217 short_effect = Column(Unicode(256), nullable=False)
218 effect = Column(Unicode(5120), nullable=False)
219
220 class MoveFlag(TableBase):
221 __tablename__ = 'move_flags'
222 move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
223 move_flag_type_id = Column(Integer, ForeignKey('move_flag_types.id'), primary_key=True, nullable=False, autoincrement=False)
224
225 class MoveFlagType(TableBase):
226 __tablename__ = 'move_flag_types'
227 id = Column(Integer, primary_key=True, nullable=False)
228 name = Column(Unicode(32), nullable=False)
229 description = Column(rst.RstTextColumn(128), nullable=False)
230
231 class MoveFlavorText(TableBase):
232 __tablename__ = 'move_flavor_text'
233 move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
234 generation_id = Column(Integer, ForeignKey('generations.id'), primary_key=True, nullable=False, autoincrement=False)
235 flavor_text = Column(Unicode(255), nullable=False)
236
237 class MoveName(TableBase):
238 __tablename__ = 'move_names'
239 move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
240 language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False, autoincrement=False)
241 name = Column(Unicode(16), nullable=False)
242
243 class MoveTarget(TableBase):
244 __tablename__ = 'move_targets'
245 id = Column(Integer, primary_key=True, nullable=False)
246 name = Column(Unicode(32), nullable=False)
247 description = Column(Unicode(128), nullable=False)
248
249 class Move(TableBase):
250 __tablename__ = 'moves'
251 __singlename__ = 'move'
252 id = Column(Integer, primary_key=True, nullable=False)
253 name = Column(Unicode(12), nullable=False)
254 generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
255 type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
256 power = Column(SmallInteger)
257 pp = Column(SmallInteger, nullable=False)
258 accuracy = Column(SmallInteger)
259 target_id = Column(Integer, ForeignKey('move_targets.id'), nullable=False)
260 damage_class_id = Column(Integer, ForeignKey('move_damage_classes.id'), nullable=False)
261 effect_id = Column(Integer, ForeignKey('move_effects.id'), nullable=False)
262 effect_chance = Column(Integer)
263 contest_type = Column(Unicode(8), nullable=False)
264 contest_effect_id = Column(Integer, ForeignKey('contest_effects.id'), nullable=True)
265 super_contest_effect_id = Column(Integer, ForeignKey('super_contest_effects.id'), nullable=False)
266
267 class Pokedex(TableBase):
268 __tablename__ = 'pokedexes'
269 id = Column(Integer, primary_key=True, nullable=False)
270 name = Column(Unicode(16), nullable=False)
271 description = Column(Unicode(512))
272
273 class PokedexVersionGroup(TableBase):
274 __tablename__ = 'pokedex_version_groups'
275 pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False)
276 version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
277
278 class Pokemon(TableBase):
279 """The core to this whole mess.
280
281 Note that I use both 'forme' and 'form' in both code and the database. I
282 only use 'forme' when specifically referring to Pokémon that have multiple
283 distinct species as forms—i.e., different stats or movesets. 'Form' is a
284 more general term referring to any variation within a species, including
285 purely cosmetic forms like Unown.
286 """
287 __tablename__ = 'pokemon'
288 __singlename__ = 'pokemon'
289 id = Column(Integer, primary_key=True, nullable=False)
290 name = Column(Unicode(20), nullable=False)
291 forme_name = Column(Unicode(16))
292 forme_base_pokemon_id = Column(Integer, ForeignKey('pokemon.id'))
293 generation_id = Column(Integer, ForeignKey('generations.id'))
294 evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'))
295 evolution_parent_pokemon_id = Column(Integer, ForeignKey('pokemon.id'))
296 evolution_method_id = Column(Integer, ForeignKey('evolution_methods.id'))
297 evolution_parameter = Column(Unicode(32))
298 height = Column(Integer, nullable=False)
299 weight = Column(Integer, nullable=False)
300 species = Column(Unicode(16), nullable=False)
301 color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False)
302 pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False)
303 habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True)
304 gender_rate = Column(Integer, nullable=False)
305 capture_rate = Column(Integer, nullable=False)
306 base_experience = Column(Integer, nullable=False)
307 base_happiness = Column(Integer, nullable=False)
308 is_baby = Column(Boolean, nullable=False)
309 has_gen4_fem_sprite = Column(Boolean, nullable=False)
310 has_gen4_fem_back_sprite = Column(Boolean, nullable=False)
311
312 ### Stuff to handle alternate Pokémon forms
313
314 @property
315 def national_id(self):
316 """Returns the National Pokédex number for this Pokémon. Use this
317 instead of the id directly; alternate formes may make the id incorrect.
318 """
319
320 if self.forme_base_pokemon_id:
321 return self.forme_base_pokemon_id
322 return self.id
323
324 @property
325 def full_name(self):
326 """Returns the name of this Pokémon, including its Forme, if any."""
327
328 if self.forme_name:
329 return "%s %s" % (self.forme_name.title(), self.name)
330 return self.name
331
332 @property
333 def normal_form(self):
334 """Returns the normal form for this Pokémon; i.e., this will return
335 regular Deoxys when called on any Deoxys form.
336 """
337
338 if self.forme_base_pokemon:
339 return self.forme_base_pokemon
340
341 return self
342
343 class PokemonAbility(TableBase):
344 __tablename__ = 'pokemon_abilities'
345 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
346 ability_id = Column(Integer, ForeignKey('abilities.id'), nullable=False)
347 slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
348
349 class PokemonColor(TableBase):
350 __tablename__ = 'pokemon_colors'
351 id = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
352 name = Column(Unicode(6), nullable=False)
353
354 class PokemonDexNumber(TableBase):
355 __tablename__ = 'pokemon_dex_numbers'
356 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
357 pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False)
358 pokedex_number = Column(Integer, nullable=False)
359
360 class PokemonEggGroup(TableBase):
361 __tablename__ = 'pokemon_egg_groups'
362 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
363 egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False)
364
365 class PokemonFlavorText(TableBase):
366 __tablename__ = 'pokemon_flavor_text'
367 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
368 version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False)
369 flavor_text = Column(Unicode(255), nullable=False)
370
371 class PokemonFormGroup(TableBase):
372 __tablename__ = 'pokemon_form_groups'
373 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
374 is_battle_only = Column(Boolean, nullable=False)
375 description = Column(Unicode(512), nullable=False)
376
377 class PokemonFormSprite(TableBase):
378 __tablename__ = 'pokemon_form_sprites'
379 id = Column(Integer, primary_key=True, nullable=False)
380 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
381 introduced_in_version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
382 name = Column(Unicode(16), nullable=True)
383 is_default = Column(Boolean, nullable=True)
384
385 class PokemonHabitat(TableBase):
386 __tablename__ = 'pokemon_habitats'
387 id = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
388 name = Column(Unicode(16), nullable=False)
389
390 class PokemonItem(TableBase):
391 __tablename__ = 'pokemon_items'
392 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
393 version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False)
394 item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, nullable=False, autoincrement=False)
395 rarity = Column(Integer, nullable=False)
396
397 class PokemonMove(TableBase):
398 __tablename__ = 'pokemon_moves'
399 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
400 version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
401 move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False, index=True)
402 pokemon_move_method_id = Column(Integer, ForeignKey('pokemon_move_methods.id'), primary_key=True, nullable=False, autoincrement=False)
403 level = Column(Integer, primary_key=True, nullable=True, autoincrement=False)
404 order = Column(Integer, nullable=True)
405
406 class PokemonMoveMethod(TableBase):
407 __tablename__ = 'pokemon_move_methods'
408 id = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
409 name = Column(Unicode(64), nullable=False)
410 description = Column(Unicode(255), nullable=False)
411
412 class PokemonName(TableBase):
413 __tablename__ = 'pokemon_names'
414 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
415 language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False, autoincrement=False)
416 name = Column(Unicode(16), nullable=False)
417
418 class PokemonShape(TableBase):
419 __tablename__ = 'pokemon_shapes'
420 id = Column(Integer, primary_key=True, nullable=False)
421 name = Column(Unicode(24), nullable=False)
422 awesome_name = Column(Unicode(16), nullable=False)
423
424 class PokemonStat(TableBase):
425 __tablename__ = 'pokemon_stats'
426 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
427 stat_id = Column(Integer, ForeignKey('stats.id'), primary_key=True, nullable=False, autoincrement=False)
428 base_stat = Column(Integer, nullable=False)
429 effort = Column(Integer, nullable=False)
430
431 class PokemonType(TableBase):
432 __tablename__ = 'pokemon_types'
433 pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
434 type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
435 slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
436
437 class Region(TableBase):
438 """Major areas of the world: Kanto, Johto, etc."""
439 __tablename__ = 'regions'
440 id = Column(Integer, primary_key=True, nullable=False)
441 name = Column(Unicode(16), nullable=False)
442
443 class Stat(TableBase):
444 __tablename__ = 'stats'
445 id = Column(Integer, primary_key=True, nullable=False)
446 name = Column(Unicode(16), nullable=False)
447
448 class SuperContestCombo(TableBase):
449 __tablename__ = 'super_contest_combos'
450 first_move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
451 second_move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False)
452
453 class SuperContestEffect(TableBase):
454 __tablename__ = 'super_contest_effects'
455 id = Column(Integer, primary_key=True, nullable=False)
456 appeal = Column(SmallInteger, nullable=False)
457 flavor_text = Column(Unicode(64), nullable=False)
458
459 class TypeEfficacy(TableBase):
460 __tablename__ = 'type_efficacy'
461 damage_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
462 target_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
463 damage_factor = Column(Integer, nullable=False)
464
465 class Type(TableBase):
466 __tablename__ = 'types'
467 __singlename__ = 'type'
468 id = Column(Integer, primary_key=True, nullable=False)
469 name = Column(Unicode(8), nullable=False)
470 abbreviation = Column(Unicode(3), nullable=False)
471 generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
472 damage_class_id = Column(Integer, ForeignKey('move_damage_classes.id'), nullable=False) ## ??? is none; everything else is physical or special
473
474 class VersionGroup(TableBase):
475 __tablename__ = 'version_groups'
476 id = Column(Integer, primary_key=True, nullable=False)
477 generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
478
479 class VersionGroupRegion(TableBase):
480 __tablename__ = 'version_group_regions'
481 version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False)
482 region_id = Column(Integer, ForeignKey('regions.id'), primary_key=True, nullable=False)
483
484 class Version(TableBase):
485 __tablename__ = 'versions'
486 id = Column(Integer, primary_key=True, nullable=False)
487 version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False)
488 name = Column(Unicode(32), nullable=False)
489
490
491 ### Relations down here, to avoid ordering problems
492 ContestCombo.first = relation(Move, primaryjoin=ContestCombo.first_move_id==Move.id,
493 backref='contest_combo_first')
494 ContestCombo.second = relation(Move, primaryjoin=ContestCombo.second_move_id==Move.id,
495 backref='contest_combo_second')
496
497 Encounter.location_area = relation(LocationArea, backref='encounters')
498 Encounter.pokemon = relation(Pokemon, backref='encounters')
499 Encounter.version = relation(Version, backref='encounters')
500 Encounter.slot = relation(EncounterSlot, backref='encounters')
501
502 EncounterConditionValue.condition = relation(EncounterCondition, backref='values')
503
504 Encounter.condition_value_map = relation(EncounterConditionValueMap, backref='encounter')
505 Encounter.condition_values = association_proxy('condition_value_map', 'condition_value')
506 EncounterConditionValueMap.condition_value = relation(EncounterConditionValue,
507 backref='encounter_map')
508
509 EncounterSlot.terrain = relation(EncounterTerrain, backref='slots')
510
511 EncounterSlot.condition_map = relation(EncounterSlotCondition, backref='slot')
512 EncounterSlot.conditions = association_proxy('condition_map', 'condition')
513 EncounterSlotCondition.condition = relation(EncounterCondition,
514 backref='slot_map')
515
516 EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains')
517
518 Generation.versions = relation(Version, secondary=VersionGroup.__table__)
519 Generation.main_region = relation(Region)
520
521 Location.region = relation(Region, backref='locations')
522
523 LocationArea.location = relation(Location, backref='areas')
524
525 Machine.version_group = relation(VersionGroup)
526
527 Move.contest_effect = relation(ContestEffect, backref='moves')
528 Move.contest_combo_next = association_proxy('contest_combo_first', 'second')
529 Move.contest_combo_prev = association_proxy('contest_combo_second', 'first')
530 Move.damage_class = relation(MoveDamageClass, backref='moves')
531 Move.flags = association_proxy('move_flags', 'flag')
532 Move.flavor_text = relation(MoveFlavorText, order_by=MoveFlavorText.generation_id, backref='move')
533 Move.foreign_names = relation(MoveName, backref='pokemon')
534 Move.generation = relation(Generation, backref='moves')
535 Move.machines = relation(Machine, backref='move')
536 Move.move_effect = relation(MoveEffect, backref='moves')
537 Move.move_flags = relation(MoveFlag, backref='move')
538 Move.super_contest_effect = relation(SuperContestEffect, backref='moves')
539 Move.super_contest_combo_next = association_proxy('super_contest_combo_first', 'second')
540 Move.super_contest_combo_prev = association_proxy('super_contest_combo_second', 'first')
541 Move.target = relation(MoveTarget, backref='moves')
542 Move.type = relation(Type, backref='moves')
543
544 Move.effect = rst.MoveEffectProperty('effect')
545 Move.priority = association_proxy('move_effect', 'priority')
546 Move.short_effect = rst.MoveEffectProperty('short_effect')
547
548 MoveEffect.category_map = relation(MoveEffectCategoryMap)
549 MoveEffect.categories = association_proxy('category_map', 'category')
550 MoveEffectCategoryMap.category = relation(MoveEffectCategory)
551
552 MoveFlag.flag = relation(MoveFlagType)
553
554 MoveFlavorText.generation = relation(Generation)
555
556 MoveName.language = relation(Language)
557
558 Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__)
559
560 Pokemon.abilities = relation(Ability, secondary=PokemonAbility.__table__,
561 order_by=PokemonAbility.slot,
562 backref='pokemon')
563 Pokemon.formes = relation(Pokemon, primaryjoin=Pokemon.id==Pokemon.forme_base_pokemon_id,
564 backref=backref('forme_base_pokemon',
565 remote_side=[Pokemon.id]))
566 Pokemon.pokemon_color = relation(PokemonColor, backref='pokemon')
567 Pokemon.color = association_proxy('pokemon_color', 'name')
568 Pokemon.dex_numbers = relation(PokemonDexNumber, backref='pokemon')
569 Pokemon.default_form_sprite = relation(PokemonFormSprite,
570 primaryjoin=and_(
571 Pokemon.id==PokemonFormSprite.pokemon_id,
572 PokemonFormSprite.is_default==True,
573 ),
574 uselist=False)
575 Pokemon.egg_groups = relation(EggGroup, secondary=PokemonEggGroup.__table__,
576 order_by=PokemonEggGroup.egg_group_id,
577 backref='pokemon')
578 Pokemon.evolution_chain = relation(EvolutionChain, backref='pokemon')
579 Pokemon.evolution_method = relation(EvolutionMethod)
580 Pokemon.evolution_children = relation(Pokemon, primaryjoin=Pokemon.id==Pokemon.evolution_parent_pokemon_id,
581 backref=backref('evolution_parent',
582 remote_side=[Pokemon.id]))
583 Pokemon.flavor_text = relation(PokemonFlavorText, order_by=PokemonFlavorText.pokemon_id, backref='pokemon')
584 Pokemon.foreign_names = relation(PokemonName, backref='pokemon')
585 Pokemon.pokemon_habitat = relation(PokemonHabitat, backref='pokemon')
586 Pokemon.habitat = association_proxy('pokemon_habitat', 'name')
587 Pokemon.items = relation(PokemonItem)
588 Pokemon.generation = relation(Generation, backref='pokemon')
589 Pokemon.shape = relation(PokemonShape, backref='pokemon')
590 Pokemon.stats = relation(PokemonStat, backref='pokemon')
591 Pokemon.types = relation(Type, secondary=PokemonType.__table__)
592
593 PokemonDexNumber.pokedex = relation(Pokedex)
594
595 PokemonFlavorText.version = relation(Version)
596
597 PokemonItem.item = relation(Item, backref='pokemon')
598 PokemonItem.version = relation(Version)
599
600 PokemonFormGroup.pokemon = relation(Pokemon, backref=backref('form_group',
601 uselist=False))
602 PokemonFormSprite.pokemon = relation(Pokemon, backref='form_sprites')
603 PokemonFormSprite.introduced_in = relation(VersionGroup)
604
605 PokemonMove.pokemon = relation(Pokemon, backref='pokemon_moves')
606 PokemonMove.version_group = relation(VersionGroup)
607 PokemonMove.machine = relation(Machine, backref='pokemon_moves',
608 primaryjoin=and_(Machine.version_group_id==PokemonMove.version_group_id,
609 Machine.move_id==PokemonMove.move_id),
610 foreign_keys=[Machine.version_group_id, Machine.move_id],
611 uselist=False)
612 PokemonMove.move = relation(Move, backref='pokemon_moves')
613 PokemonMove.method = relation(PokemonMoveMethod)
614
615 PokemonName.language = relation(Language)
616
617 PokemonStat.stat = relation(Stat)
618
619 # This is technically a has-many; Generation.main_region_id -> Region.id
620 Region.generation = relation(Generation, uselist=False)
621 Region.version_group_regions = relation(VersionGroupRegion, backref='region',
622 order_by='VersionGroupRegion.version_group_id')
623 Region.version_groups = association_proxy('version_group_regions', 'version_group')
624
625 SuperContestCombo.first = relation(Move, primaryjoin=SuperContestCombo.first_move_id==Move.id,
626 backref='super_contest_combo_first')
627 SuperContestCombo.second = relation(Move, primaryjoin=SuperContestCombo.second_move_id==Move.id,
628 backref='super_contest_combo_second')
629
630 Type.damage_efficacies = relation(TypeEfficacy,
631 primaryjoin=Type.id
632 ==TypeEfficacy.damage_type_id,
633 backref='damage_type')
634 Type.target_efficacies = relation(TypeEfficacy,
635 primaryjoin=Type.id
636 ==TypeEfficacy.target_type_id,
637 backref='target_type')
638
639 Type.generation = relation(Generation, backref='types')
640 Type.damage_class = relation(MoveDamageClass, backref='types')
641
642 Version.version_group = relation(VersionGroup, backref='versions')
643 Version.generation = association_proxy('version_group', 'generation')
644
645 VersionGroup.generation = relation(Generation, backref='version_groups')
646 VersionGroup.version_group_regions = relation(VersionGroupRegion, backref='version_group')
647 VersionGroup.regions = association_proxy('version_group_regions', 'region')