PageRenderTime 26ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/bower_components/pokeapi/pokemon/models.py

https://gitlab.com/thomasphillips3/pokemonapp
Python | 480 lines | 330 code | 150 blank | 0 comment | 23 complexity | 363fa6c32c379635c2061191349369ed MD5 | raw file
  1. from __future__ import unicode_literals
  2. from django.db import models
  3. from imagekit.models.fields import ProcessedImageField
  4. from imagekit.processors import ResizeToFill
  5. from .utils import unique_filename
  6. class DateTimeModel(models.Model):
  7. class Meta:
  8. abstract = True
  9. modified = models.DateTimeField(auto_now=True)
  10. created = models.DateTimeField(auto_now_add=True)
  11. class Ability(DateTimeModel):
  12. def __unicode__(self):
  13. return self.name
  14. name = models.CharField(max_length=50)
  15. description = models.TextField(max_length=200)
  16. class Type(DateTimeModel):
  17. def __unicode__(self):
  18. return self.name
  19. name = models.CharField(max_length=50)
  20. def _build_dict(self, items):
  21. lst = []
  22. for i in items:
  23. lst.append(dict(
  24. name=i.to.name,
  25. resource_uri='/api/v1/type/' + str(i.to.id) + '/'
  26. ))
  27. return lst
  28. def weakness_list(self):
  29. items = TypeChart.objects.filter(
  30. frm__name=self.name,
  31. ttype='weak')
  32. if items.exists():
  33. return self._build_dict(items)
  34. return []
  35. weaknesses = property(fget=weakness_list)
  36. def resistances_list(self):
  37. items = TypeChart.objects.filter(
  38. frm__name=self.name,
  39. ttype='resist')
  40. if items.exists():
  41. return self._build_dict(items)
  42. return []
  43. resistances = property(fget=resistances_list)
  44. def super_list(self):
  45. items = TypeChart.objects.filter(
  46. frm__name=self.name,
  47. ttype='super effective')
  48. if items.exists():
  49. return self._build_dict(items)
  50. return []
  51. supers = property(fget=super_list)
  52. def ineffective_list(self):
  53. items = TypeChart.objects.filter(
  54. frm__name=self.name,
  55. ttype='ineffective')
  56. if items.exists():
  57. return self._build_dict(items)
  58. return []
  59. ineffectives = property(fget=ineffective_list)
  60. def no_list(self):
  61. items = TypeChart.objects.filter(
  62. frm__name=self.name,
  63. ttype='noeffect')
  64. if items.exists():
  65. return self._build_dict(items)
  66. return []
  67. no_effects = property(fget=no_list)
  68. class TypeChart(DateTimeModel):
  69. def __unicode__(self):
  70. return ' '.join([self.frm.name, self.ttype, 'against', self.to.name])
  71. frm = models.ForeignKey(
  72. Type, blank=True, null=True, related_name='type_frm')
  73. to = models.ForeignKey(
  74. Type, blank=True, null=True, related_name='type_to')
  75. TYPES = (
  76. ('weak', 'weak'),
  77. ('super effective', 'super effective'),
  78. ('resistant', 'resistant'),
  79. ('ineffective', 'ineffective'),
  80. ('noeffect', 'noeffect'),
  81. ('resist', 'resist'),
  82. )
  83. ttype = models.CharField(
  84. max_length=15, choices=TYPES, blank=True, null=True)
  85. class EggGroup(DateTimeModel):
  86. def __unicode__(self):
  87. return self.name
  88. name = models.CharField(max_length=50)
  89. def get_pokes(self):
  90. pokes = Pokemon.objects.filter(
  91. egg_group=self
  92. )
  93. lst = []
  94. if pokes.exists():
  95. for p in pokes:
  96. lst.append(dict(
  97. name=p.name.capitalize(),
  98. resource_uri='/api/v1/pokemon/' + str(p.pkdx_id) + '/'
  99. ))
  100. return lst
  101. pokemon = property(fget=get_pokes)
  102. class Game(DateTimeModel):
  103. def __unicode__(self):
  104. return self.name
  105. name = models.CharField(max_length=50)
  106. generation = models.IntegerField(max_length=4)
  107. release_year = models.IntegerField(max_length=6)
  108. class Description(DateTimeModel):
  109. def __unicode__(self):
  110. return self.name
  111. name = models.CharField(max_length=50)
  112. description = models.TextField(max_length=200)
  113. game = models.ManyToManyField(Game, blank=True, null=True)
  114. def get_game_details(self):
  115. lst = []
  116. for g in self.game.all():
  117. lst.append(dict(
  118. name=g.name,
  119. resource_uri='/api/v1/game/' + str(g.id) + '/')
  120. )
  121. return lst
  122. n_game = property(fget=get_game_details)
  123. def get_pokemon(self):
  124. nm = self.name.split('_')[0]
  125. pokes = Pokemon.objects.filter(
  126. name=nm.lower()
  127. )
  128. if pokes.exists():
  129. return dict(
  130. name=pokes[0].name,
  131. resource_uri='/api/v1/pokemon/' + str(pokes[0].pkdx_id) + '/')
  132. return []
  133. pokemon = property(fget=get_pokemon)
  134. class Move(DateTimeModel):
  135. def __unicode__(self):
  136. return self.name
  137. name = models.CharField(max_length=50)
  138. description = models.TextField(max_length=200)
  139. etype = models.ManyToManyField(Type, null=True)
  140. pp = models.IntegerField(max_length=5)
  141. CATEGORY = (
  142. ('physical', 'physical'),
  143. ('special', 'special'),
  144. ('status', 'status'),
  145. )
  146. category = models.CharField(choices=CATEGORY, max_length=10)
  147. power = models.IntegerField(max_length=6)
  148. accuracy = models.IntegerField(max_length=6)
  149. class Sprite(DateTimeModel):
  150. def __unicode__(self):
  151. return self.name
  152. name = models.CharField(max_length=50)
  153. image = ProcessedImageField(
  154. [ResizeToFill(96, 96)],
  155. upload_to=unique_filename,
  156. format='PNG',
  157. options={'quality': 80})
  158. def get_pokemon(self):
  159. nm = self.name.split('_')[0]
  160. pokes = Pokemon.objects.filter(
  161. name=nm.lower()
  162. )
  163. if pokes.exists():
  164. return dict(
  165. name=pokes[0].name,
  166. resource_uri='/api/v1/pokemon/' + str(pokes[0].pkdx_id) + '/')
  167. return []
  168. pokemon = property(fget=get_pokemon)
  169. class Pokemon(DateTimeModel):
  170. def __unicode__(self):
  171. return ' - '.join([str(self.pkdx_id), self.name])
  172. name = models.CharField(max_length=50)
  173. pkdx_id = models.IntegerField(max_length=4, blank=True)
  174. species = models.CharField(max_length=30)
  175. height = models.CharField(max_length=10)
  176. weight = models.CharField(max_length=10)
  177. ev_yield = models.CharField(max_length=20)
  178. catch_rate = models.IntegerField(max_length=4)
  179. happiness = models.IntegerField(max_length=4)
  180. exp = models.IntegerField(max_length=5)
  181. GROWTHS = (
  182. ('slow', 'slow'),
  183. ('medium slow', 'medium slow'),
  184. ('medium', 'medium'),
  185. ('medium fast', 'medium fast'),
  186. ('fast', 'fast'),
  187. )
  188. growth_rate = models.CharField(choices=GROWTHS, max_length=15)
  189. male_female_ratio = models.CharField(max_length=10)
  190. hp = models.IntegerField(max_length=4)
  191. attack = models.IntegerField(max_length=4)
  192. defense = models.IntegerField(max_length=4)
  193. sp_atk = models.IntegerField(max_length=4)
  194. sp_def = models.IntegerField(max_length=4)
  195. speed = models.IntegerField(max_length=4)
  196. total = models.IntegerField(max_length=6)
  197. egg_cycles = models.IntegerField(max_length=6)
  198. abilities = models.ManyToManyField(
  199. Ability, blank=True, null=True)
  200. def ability_names(self):
  201. lst = []
  202. for a in self.abilities.all():
  203. lst.append(dict(
  204. resource_uri='/api/v1/ability/' + str(a.id) + '/',
  205. name=a.name.lower())
  206. )
  207. return lst
  208. ability_list = property(fget=ability_names)
  209. def get_evolution_details(self):
  210. evols = Evolution.objects.filter(
  211. frm=self
  212. )
  213. if evols.exists():
  214. lst = []
  215. for e in evols:
  216. d = dict(
  217. to=e.to.name.capitalize(),
  218. resource_uri='/api/v1/pokemon/' + str(e.to.pkdx_id) + '/',
  219. method=e.method,
  220. )
  221. if e.level > 0:
  222. d['level'] = e.level
  223. if e.detail:
  224. d['detail'] = e.detail
  225. lst.append(d)
  226. return lst
  227. return []
  228. evolutions = property(fget=get_evolution_details)
  229. types = models.ManyToManyField(
  230. Type, blank=True, null=True)
  231. def type_list(self):
  232. lst = []
  233. for t in self.types.all():
  234. lst.append(dict(
  235. resource_uri='/api/v1/type/' + str(t.id) + '/',
  236. name=t.name.lower())
  237. )
  238. return lst
  239. type_list = property(fget=type_list)
  240. egg_group = models.ManyToManyField(
  241. EggGroup, blank=True, null=True)
  242. def get_eggs(self):
  243. lst = []
  244. for e in self.egg_group.all():
  245. lst.append(dict(
  246. name=e.name.capitalize(),
  247. resource_uri='/api/v1/egg/' + str(e.id) + '/'
  248. ))
  249. return lst
  250. eggs = property(fget=get_eggs)
  251. descriptions = models.ManyToManyField(
  252. Description, blank=True, null=True)
  253. def get_sprites(self):
  254. lst = []
  255. for s in self.sprites.all():
  256. lst.append(dict(
  257. name=self.name,
  258. resource_uri='/api/v1/sprite/' + str(s.id) + '/')
  259. )
  260. return lst
  261. my_sprites = property(fget=get_sprites)
  262. sprites = models.ManyToManyField(
  263. Sprite, blank=True, null=True)
  264. def get_moves(self):
  265. moves = MovePokemon.objects.filter(
  266. pokemon=self
  267. )
  268. lst = []
  269. if moves.exists():
  270. for m in moves:
  271. d = dict(
  272. name=m.move.name.capitalize(),
  273. resource_uri='/api/v1/move/' + str(m.move.id) + '/',
  274. learn_type=m.learn_type
  275. )
  276. if m.level > 0:
  277. d['level'] = m.level
  278. lst.append(d)
  279. return lst
  280. moves = property(fget=get_moves)
  281. class Evolution(DateTimeModel):
  282. def __unicode__(self):
  283. return self.frm.name + ' to ' + self.to.name
  284. frm = models.ForeignKey(
  285. Pokemon, null=True, blank=True,
  286. related_name='frm_evol_pokemon')
  287. to = models.ForeignKey(
  288. Pokemon, null=True, blank=True,
  289. related_name='to_evol_pokemon')
  290. EVOLV_METHODS = (
  291. ('level up', 'level_up'),
  292. ('stone', 'stone'),
  293. ('trade', 'trade'),
  294. ('other', 'other'),
  295. )
  296. level = models.IntegerField(max_length=3, default=0)
  297. method = models.CharField(
  298. choices=EVOLV_METHODS, max_length=10, default=0)
  299. detail = models.CharField(max_length=10, null=True, blank=True)
  300. class MovePokemon(DateTimeModel):
  301. def __unicode__(self):
  302. return self.pokemon.name + ' - ' + self.move.name
  303. pokemon = models.ForeignKey(
  304. Pokemon, related_name='move', null=True, blank=True)
  305. move = models.ForeignKey(
  306. Move, related_name='pokemon', null=True, blank=True)
  307. LEARN = (
  308. ('level up', 'level up'),
  309. ('machine', 'machine'),
  310. ('egg move', 'egg move'),
  311. ('tutor', 'tutor'),
  312. ('other', 'other'),
  313. )
  314. learn_type = models.CharField(
  315. choices=LEARN, max_length=15, default='level up')
  316. level = models.IntegerField(
  317. max_length=6, default=0, null=True, blank=True)
  318. class Pokedex(DateTimeModel):
  319. def __unicode__(self):
  320. return self.name
  321. name = models.CharField(max_length=60)
  322. def _all_pokes(self):
  323. lst = []
  324. for p in Pokemon.objects.all():
  325. lst.append(dict(
  326. name=p.name,
  327. resource_uri='api/v1/pokemon/' + str(p.pkdx_id) + '/'
  328. ))
  329. return lst
  330. pokemon = property(fget=_all_pokes)