/bower_components/pokeapi/pokemon/models.py
Python | 480 lines | 330 code | 150 blank | 0 comment | 23 complexity | 363fa6c32c379635c2061191349369ed MD5 | raw file
- from __future__ import unicode_literals
- from django.db import models
- from imagekit.models.fields import ProcessedImageField
- from imagekit.processors import ResizeToFill
- from .utils import unique_filename
- class DateTimeModel(models.Model):
- class Meta:
- abstract = True
- modified = models.DateTimeField(auto_now=True)
- created = models.DateTimeField(auto_now_add=True)
- class Ability(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- description = models.TextField(max_length=200)
- class Type(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- def _build_dict(self, items):
- lst = []
- for i in items:
- lst.append(dict(
- name=i.to.name,
- resource_uri='/api/v1/type/' + str(i.to.id) + '/'
- ))
- return lst
- def weakness_list(self):
- items = TypeChart.objects.filter(
- frm__name=self.name,
- ttype='weak')
- if items.exists():
- return self._build_dict(items)
- return []
- weaknesses = property(fget=weakness_list)
- def resistances_list(self):
- items = TypeChart.objects.filter(
- frm__name=self.name,
- ttype='resist')
- if items.exists():
- return self._build_dict(items)
- return []
- resistances = property(fget=resistances_list)
- def super_list(self):
- items = TypeChart.objects.filter(
- frm__name=self.name,
- ttype='super effective')
- if items.exists():
- return self._build_dict(items)
- return []
- supers = property(fget=super_list)
- def ineffective_list(self):
- items = TypeChart.objects.filter(
- frm__name=self.name,
- ttype='ineffective')
- if items.exists():
- return self._build_dict(items)
- return []
- ineffectives = property(fget=ineffective_list)
- def no_list(self):
- items = TypeChart.objects.filter(
- frm__name=self.name,
- ttype='noeffect')
- if items.exists():
- return self._build_dict(items)
- return []
- no_effects = property(fget=no_list)
- class TypeChart(DateTimeModel):
- def __unicode__(self):
- return ' '.join([self.frm.name, self.ttype, 'against', self.to.name])
- frm = models.ForeignKey(
- Type, blank=True, null=True, related_name='type_frm')
- to = models.ForeignKey(
- Type, blank=True, null=True, related_name='type_to')
- TYPES = (
- ('weak', 'weak'),
- ('super effective', 'super effective'),
- ('resistant', 'resistant'),
- ('ineffective', 'ineffective'),
- ('noeffect', 'noeffect'),
- ('resist', 'resist'),
- )
- ttype = models.CharField(
- max_length=15, choices=TYPES, blank=True, null=True)
- class EggGroup(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- def get_pokes(self):
- pokes = Pokemon.objects.filter(
- egg_group=self
- )
- lst = []
- if pokes.exists():
- for p in pokes:
- lst.append(dict(
- name=p.name.capitalize(),
- resource_uri='/api/v1/pokemon/' + str(p.pkdx_id) + '/'
- ))
- return lst
- pokemon = property(fget=get_pokes)
- class Game(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- generation = models.IntegerField(max_length=4)
- release_year = models.IntegerField(max_length=6)
- class Description(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- description = models.TextField(max_length=200)
- game = models.ManyToManyField(Game, blank=True, null=True)
- def get_game_details(self):
- lst = []
- for g in self.game.all():
- lst.append(dict(
- name=g.name,
- resource_uri='/api/v1/game/' + str(g.id) + '/')
- )
- return lst
- n_game = property(fget=get_game_details)
- def get_pokemon(self):
- nm = self.name.split('_')[0]
- pokes = Pokemon.objects.filter(
- name=nm.lower()
- )
- if pokes.exists():
- return dict(
- name=pokes[0].name,
- resource_uri='/api/v1/pokemon/' + str(pokes[0].pkdx_id) + '/')
- return []
- pokemon = property(fget=get_pokemon)
- class Move(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- description = models.TextField(max_length=200)
- etype = models.ManyToManyField(Type, null=True)
- pp = models.IntegerField(max_length=5)
- CATEGORY = (
- ('physical', 'physical'),
- ('special', 'special'),
- ('status', 'status'),
- )
- category = models.CharField(choices=CATEGORY, max_length=10)
- power = models.IntegerField(max_length=6)
- accuracy = models.IntegerField(max_length=6)
- class Sprite(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=50)
- image = ProcessedImageField(
- [ResizeToFill(96, 96)],
- upload_to=unique_filename,
- format='PNG',
- options={'quality': 80})
- def get_pokemon(self):
- nm = self.name.split('_')[0]
- pokes = Pokemon.objects.filter(
- name=nm.lower()
- )
- if pokes.exists():
- return dict(
- name=pokes[0].name,
- resource_uri='/api/v1/pokemon/' + str(pokes[0].pkdx_id) + '/')
- return []
- pokemon = property(fget=get_pokemon)
- class Pokemon(DateTimeModel):
- def __unicode__(self):
- return ' - '.join([str(self.pkdx_id), self.name])
- name = models.CharField(max_length=50)
- pkdx_id = models.IntegerField(max_length=4, blank=True)
- species = models.CharField(max_length=30)
- height = models.CharField(max_length=10)
- weight = models.CharField(max_length=10)
- ev_yield = models.CharField(max_length=20)
- catch_rate = models.IntegerField(max_length=4)
- happiness = models.IntegerField(max_length=4)
- exp = models.IntegerField(max_length=5)
- GROWTHS = (
- ('slow', 'slow'),
- ('medium slow', 'medium slow'),
- ('medium', 'medium'),
- ('medium fast', 'medium fast'),
- ('fast', 'fast'),
- )
- growth_rate = models.CharField(choices=GROWTHS, max_length=15)
- male_female_ratio = models.CharField(max_length=10)
- hp = models.IntegerField(max_length=4)
- attack = models.IntegerField(max_length=4)
- defense = models.IntegerField(max_length=4)
- sp_atk = models.IntegerField(max_length=4)
- sp_def = models.IntegerField(max_length=4)
- speed = models.IntegerField(max_length=4)
- total = models.IntegerField(max_length=6)
- egg_cycles = models.IntegerField(max_length=6)
- abilities = models.ManyToManyField(
- Ability, blank=True, null=True)
- def ability_names(self):
- lst = []
- for a in self.abilities.all():
- lst.append(dict(
- resource_uri='/api/v1/ability/' + str(a.id) + '/',
- name=a.name.lower())
- )
- return lst
- ability_list = property(fget=ability_names)
- def get_evolution_details(self):
- evols = Evolution.objects.filter(
- frm=self
- )
- if evols.exists():
- lst = []
- for e in evols:
- d = dict(
- to=e.to.name.capitalize(),
- resource_uri='/api/v1/pokemon/' + str(e.to.pkdx_id) + '/',
- method=e.method,
- )
- if e.level > 0:
- d['level'] = e.level
- if e.detail:
- d['detail'] = e.detail
- lst.append(d)
- return lst
- return []
- evolutions = property(fget=get_evolution_details)
- types = models.ManyToManyField(
- Type, blank=True, null=True)
- def type_list(self):
- lst = []
- for t in self.types.all():
- lst.append(dict(
- resource_uri='/api/v1/type/' + str(t.id) + '/',
- name=t.name.lower())
- )
- return lst
- type_list = property(fget=type_list)
- egg_group = models.ManyToManyField(
- EggGroup, blank=True, null=True)
- def get_eggs(self):
- lst = []
- for e in self.egg_group.all():
- lst.append(dict(
- name=e.name.capitalize(),
- resource_uri='/api/v1/egg/' + str(e.id) + '/'
- ))
- return lst
- eggs = property(fget=get_eggs)
- descriptions = models.ManyToManyField(
- Description, blank=True, null=True)
- def get_sprites(self):
- lst = []
- for s in self.sprites.all():
- lst.append(dict(
- name=self.name,
- resource_uri='/api/v1/sprite/' + str(s.id) + '/')
- )
- return lst
- my_sprites = property(fget=get_sprites)
- sprites = models.ManyToManyField(
- Sprite, blank=True, null=True)
- def get_moves(self):
- moves = MovePokemon.objects.filter(
- pokemon=self
- )
- lst = []
- if moves.exists():
- for m in moves:
- d = dict(
- name=m.move.name.capitalize(),
- resource_uri='/api/v1/move/' + str(m.move.id) + '/',
- learn_type=m.learn_type
- )
- if m.level > 0:
- d['level'] = m.level
- lst.append(d)
- return lst
- moves = property(fget=get_moves)
- class Evolution(DateTimeModel):
- def __unicode__(self):
- return self.frm.name + ' to ' + self.to.name
- frm = models.ForeignKey(
- Pokemon, null=True, blank=True,
- related_name='frm_evol_pokemon')
- to = models.ForeignKey(
- Pokemon, null=True, blank=True,
- related_name='to_evol_pokemon')
- EVOLV_METHODS = (
- ('level up', 'level_up'),
- ('stone', 'stone'),
- ('trade', 'trade'),
- ('other', 'other'),
- )
- level = models.IntegerField(max_length=3, default=0)
- method = models.CharField(
- choices=EVOLV_METHODS, max_length=10, default=0)
- detail = models.CharField(max_length=10, null=True, blank=True)
- class MovePokemon(DateTimeModel):
- def __unicode__(self):
- return self.pokemon.name + ' - ' + self.move.name
- pokemon = models.ForeignKey(
- Pokemon, related_name='move', null=True, blank=True)
- move = models.ForeignKey(
- Move, related_name='pokemon', null=True, blank=True)
- LEARN = (
- ('level up', 'level up'),
- ('machine', 'machine'),
- ('egg move', 'egg move'),
- ('tutor', 'tutor'),
- ('other', 'other'),
- )
- learn_type = models.CharField(
- choices=LEARN, max_length=15, default='level up')
- level = models.IntegerField(
- max_length=6, default=0, null=True, blank=True)
- class Pokedex(DateTimeModel):
- def __unicode__(self):
- return self.name
- name = models.CharField(max_length=60)
- def _all_pokes(self):
- lst = []
- for p in Pokemon.objects.all():
- lst.append(dict(
- name=p.name,
- resource_uri='api/v1/pokemon/' + str(p.pkdx_id) + '/'
- ))
- return lst
- pokemon = property(fget=_all_pokes)