# Encoding: UTF-8 """Fill the pokemon_form_generations table This is an unmaintained one-shot script, only included in the repo for reference. """ from sqlalchemy.sql import exists, func from sqlalchemy.orm import lazyload, eagerload, eagerload_all from sqlalchemy import and_, or_, not_ from pokedex.db import connect, tables, load session = connect() session.query(tables.PokemonFormGeneration).delete() generations = list(session.query(tables.Generation).order_by( tables.Generation.id)) q = session.query(tables.PokemonForm) q = q.options(eagerload_all('pokemon', 'species')) q = q.order_by(tables.PokemonForm.order) form_orders = dict( unown=list('abcdefghijklmnopqrstuvwxyz') + ['exclamation', 'question'], deoxys=['normal', 'attack', 'defense', 'speed'], burmy=['plant', 'sandy', 'trash'], wormadam=['plant', 'sandy', 'trash'], shellos=['west', 'east'], gastrodon=['west', 'east'], rotom=[None, 'heat', 'wash', 'frost', 'fan', 'mow'], giratina=['altered', 'origin'], shaymin=['land', 'sky'], castform=[None, 'sunny', 'rainy', 'snowy'], basculin=['red-striped', 'blue-striped'], darmanitan=['standard', 'zen'], deerling=['spring', 'summer', 'autumn', 'winter'], sawsbuck=['spring', 'summer', 'autumn', 'winter'], meloetta=['aria', 'pirouette'], genesect=[None, 'douse', 'shock', 'burn', 'chill'], cherrim=['overcast', 'sunshine'], ) arceus = {4: '''normal fighting flying poison ground rock bug ghost steel unknown fire water grass electric psychic ice dragon dark'''.split()} arceus[5] = list(arceus[4]) arceus[5].remove('unknown') for form in q: species_ident = form.species.identifier form_ident = form.form_identifier is_default = form.is_default and form.pokemon.is_default print form_ident, species_ident for gen in generations: game_index = None if gen.id >= form.version_group.generation_id: if gen.id < 4: # forms not really implemented yet if species_ident == 'pichu': if is_default: game_index = 0 else: continue elif species_ident in ('unown', 'castform'): lst = form_orders[species_ident] game_index = lst.index(form_ident) elif species_ident == 'deoxys': game_index = 0 elif is_default: game_index = 0 else: try: lst = form_orders[species_ident] except KeyError: if species_ident == 'pichu' and form_ident == 'spiky-eared': if gen.id == 4: game_index = 1 else: continue elif species_ident == 'cherrim': if gen.id < 5: if is_default: game_index = 0 else: continue else: lst = ['overcast', 'sunshine'] game_index = lst.index(form_ident) elif species_ident == 'castform': if gen.id < 5: if is_default: game_index = 0 else: continue else: lst = [None, 'sunny', 'rainy', 'snowy'] game_index = lst.index(form_ident) elif species_ident == 'arceus': if gen.id >= 5 and form_ident == 'unknown': continue else: lst = arceus[gen.id] game_index = lst.index(form_ident) elif form.is_default and form.pokemon.is_default: game_index = 0 else: raise AssertionError() else: game_index = lst.index(form_ident) obj = tables.PokemonFormGeneration(form=form, generation=gen, game_index=game_index) session.add(obj) q = session.query(tables.PokemonFormGeneration) for species in session.query(tables.PokemonSpecies).options( eagerload_all('forms', 'pokemon_form_generations')): if len(species.forms) > 1: print species.name for gen in generations: if len(species.forms) == 1: pfg = q.get((species.forms[0].id, gen.id)) assert pfg is None or pfg.game_index == 0 continue forms = [(q.get((f.id, gen.id)), f) for f in species.forms if q.get((f.id, gen.id))] forms = [(pfg.game_index, f) for pfg, f in forms if pfg] if forms: forms.sort() pl = ["%s=%s" % (gi, f.form_identifier) for gi, f in forms] print ' ', gen.id, ' '.join(pl) load.dump(session, tables=['pokemon_form_generations']) print "Dumped to CSV, rolling back transaction" session.rollback()