From 4adbd80c45c3ff17e530ba3ce48c570e7097ec20 Mon Sep 17 00:00:00 2001 From: Eric Wohnlich Date: Wed, 20 Aug 2014 19:38:31 -0400 Subject: [PATCH] all the gears --- .gitignore | 1 + admin.py | 56 +++++++++++++++++- fetcher.py | 39 +++++++++++++ migrations/0001_initial.py | 64 +++++++++++++++++++++ migrations/__init__.py | 0 models.py | 37 ++++++++---- static/wowhead.png | Bin 0 -> 923 bytes templates/gearitem/details.html | 98 ++++++++++++++++++++------------ templates/gearitem/done.html | 10 ++++ templates/gearitem/index.html | 49 ++++++++++++---- tools.py | 37 ++++++++++++ urls.py | 6 +- views.py | 17 ++---- 13 files changed, 335 insertions(+), 79 deletions(-) create mode 100644 fetcher.py create mode 100644 migrations/0001_initial.py create mode 100644 migrations/__init__.py create mode 100644 static/wowhead.png create mode 100644 templates/gearitem/done.html create mode 100644 tools.py diff --git a/.gitignore b/.gitignore index b9d6bd9..bd5736a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*.pyc ################# ## Eclipse ################# diff --git a/admin.py b/admin.py index 57c0aaf..fc33e61 100644 --- a/admin.py +++ b/admin.py @@ -1,7 +1,57 @@ +from django.conf.urls import patterns, url from django.contrib import admin +from django.core.exceptions import ObjectDoesNotExist +from django.shortcuts import render + +import fetcher # Register your models here. -from gearitem.models import GearItem,Comment +from gearitem.models import GearItem + +class GearItemAdmin(admin.ModelAdmin): + def get_urls(self): + urls = super(GearItemAdmin, self).get_urls() + my_urls = patterns('', + (r'^populate_gear/$', self.populate_view), + (r'^update_gear/$', self.update_view), + ) + return my_urls + urls + + def update_view(self,request): + ids = [] + for obj in GearItem.objects.all(): + ids.append(obj.id) + for data in fetcher.fetch_items(ids): + self.update_gear(data) + return render(request, 'gearitem/done.html') + + def populate_view(self, request): + for data in fetcher.fetch_items(): + try: + GearItem.objects.get(id=data['id']) + except ObjectDoesNotExist: + GearItem.objects.create(id=data['id']) + self.update_gear(data) + return render(request, 'gearitem/done.html') + + def update_gear(self, gear): + obj = GearItem.objects.get(id=gear['id']) + obj.name = gear['name'] + obj.nameDescription = gear['desc'] + obj.agility = gear['stats'].get('agility',0) + obj.crit = gear['stats'].get('crit',0) + obj.haste = gear['stats'].get('haste',0) + obj.mastery = gear['stats'].get('mastery',0) + obj.versatility = gear['stats'].get('versatility',0) + obj.multistrike = gear['stats'].get('multistrike',0) + if gear.get('sockets'): + obj.socket1 = gear['sockets']['sockets'][0]['type'] + obj.socket2 = len(gear['sockets']['sockets']) > 1 and gear['sockets']['sockets'][1]['type'] + obj.socket3 = len(gear['sockets']['sockets']) > 2 and gear['sockets']['sockets'][2]['type'] + obj.socket_bonus = gear['sockets']['socketBonus'].replace('+','') + obj.icon = gear['icon'] + obj.slot = gear['slot'] + obj.quality = gear['quality'] + obj.save() -admin.site.register(GearItem) -admin.site.register(Comment) \ No newline at end of file +admin.site.register(GearItem, GearItemAdmin) \ No newline at end of file diff --git a/fetcher.py b/fetcher.py new file mode 100644 index 0000000..a7f78b1 --- /dev/null +++ b/fetcher.py @@ -0,0 +1,39 @@ +import urllib, json +from tools import * + +def stats(bonus): + _stats = {} + for bs in bonus: + if bs['stat'] in stats_used: + _stats[stats_used[bs['stat']]] = bs['amount'] + return _stats + +def do_item(data): + return {'id':data['id'], + 'name':data['name'], + 'desc':data['nameDescription'], + 'stats':data['bstats'], + 'slot':data['inventoryType'], + 'sockets':data['hasSockets'] and data['socketInfo'], + 'icon':data['icon'], + 'quality':data['quality']} + +def fetch_items(ids=[]): + gear = [] + if not ids: + ids = range(100000,111000) + for i in ids: + print i + data = json.load(urllib.urlopen('http://us.battle.net/api/wow/item/%d' % i)) + if 'status' in data: + continue + if data['inventoryType'] in good_inventory_slots and data['itemLevel'] >= 553: + bstats = stats(data['bonusStats']) + data['bstats'] = bstats + if data['itemClass'] == 4 and data['itemSubClass'] == 3 and 'agility' in bstats: # mail agi + gear.append(do_item(data)) + elif data['inventoryType'] in (11,2,16,15) and 'agility' in bstats: # ring, necklace, cloak, ranged + gear.append(do_item(data)) + elif data['inventoryType'] == 12: # trinket + gear.append(do_item(data)) + return gear \ No newline at end of file diff --git a/migrations/0001_initial.py b/migrations/0001_initial.py new file mode 100644 index 0000000..5bccd03 --- /dev/null +++ b/migrations/0001_initial.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'GearItem' + db.create_table(u'gearitem_gearitem', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=80)), + ('nameDescription', self.gf('django.db.models.fields.CharField')(max_length=80)), + ('zone', self.gf('django.db.models.fields.CharField')(max_length=80)), + ('source', self.gf('django.db.models.fields.CharField')(max_length=80)), + ('agility', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('crit', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('haste', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('mastery', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('multistrike', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('versatility', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('ilvl', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('icon', self.gf('django.db.models.fields.CharField')(max_length=80)), + ('slot', self.gf('django.db.models.fields.IntegerField')(default=0)), + ('socket1', self.gf('django.db.models.fields.CharField')(max_length=20)), + ('socket2', self.gf('django.db.models.fields.CharField')(max_length=20)), + ('socket3', self.gf('django.db.models.fields.CharField')(max_length=20)), + ('socket_bonus', self.gf('django.db.models.fields.CharField')(max_length=80)), + )) + db.send_create_signal(u'gearitem', ['GearItem']) + + + def backwards(self, orm): + # Deleting model 'GearItem' + db.delete_table(u'gearitem_gearitem') + + + models = { + u'gearitem.gearitem': { + 'Meta': {'object_name': 'GearItem'}, + 'agility': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'crit': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'haste': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'icon': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ilvl': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'mastery': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'multistrike': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + 'nameDescription': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + 'slot': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'socket1': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'socket2': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'socket3': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'socket_bonus': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '80'}), + 'versatility': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'zone': ('django.db.models.fields.CharField', [], {'max_length': '80'}) + } + } + + complete_apps = ['gearitem'] \ No newline at end of file diff --git a/migrations/__init__.py b/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models.py b/models.py index e159a51..b7c0580 100644 --- a/models.py +++ b/models.py @@ -1,25 +1,40 @@ from django.db import models +from tools import slots -class Comment(models.Model): - gearid = models.CharField(max_length=80) - user = models.CharField(max_length=80) - note = models.TextField() - - def __unicode__(self): - return self.user + ': ' + self.note[:20] +socket_choices=[('red','Red'), + ('yellow','Yellow'), + ('blue','Blue'), + ('meta','Meta'), + ('chromatic','Chromatic'), + ('none','(No socket)'), + ] # Create your models here. class GearItem(models.Model): name = models.CharField(max_length=80) + nameDescription = models.CharField(max_length=80) zone = models.CharField(max_length=80) source = models.CharField(max_length=80) - primary = models.IntegerField(default=0) + agility = models.IntegerField(default=0) crit = models.IntegerField(default=0) haste = models.IntegerField(default=0) mastery = models.IntegerField(default=0) + multistrike = models.IntegerField(default=0) + versatility = models.IntegerField(default=0) + ilvl = models.IntegerField(default=0) + icon = models.CharField(max_length=80) + slot = models.IntegerField(default=0) + quality = models.IntegerField(default=0) + socket1 = models.CharField(max_length=20, + choices=socket_choices,) + socket2 = models.CharField(max_length=20, + choices=socket_choices,) + socket3 = models.CharField(max_length=20, + choices=socket_choices,) + socket_bonus = models.CharField(max_length=80) - def comments(self): - return Comment.objects.filter(gearid=self.id) + def slotName(self): + return slots[self.slot] def __unicode__(self): - return self.name \ No newline at end of file + return self.name + ' (' + (self.nameDescription or 'normal') + ')' \ No newline at end of file diff --git a/static/wowhead.png b/static/wowhead.png new file mode 100644 index 0000000000000000000000000000000000000000..dda24b29e684bab03f8a44edbde551dcccb10aa6 GIT binary patch literal 923 zcmV;M17!S(P)(FgHGd{Fw}gYSD%L1D;zm1b&>x+HDahGuPV+M6^@?*DtdD2V9v2jAoO@%#6Ycq|4X1Q=r=TtJs0G(x}wAByWi zNC}H8-6|oyl(4=Sp(CO1b__;;^cgKHxE-P;lPf7lFuFamN z|6KM7$=~mKZ@+Br7LN4gz)y~&vtL7K)j=o&PiNt-R8d zSxJ>9(ZPS3K|I$7UouoHYuF$mT9eOUI+>^~Y;2tUgMkb~q+}>NiWnNR)JI1j$f?zt z5)!J4^jl|PZJRK68`yU(be)>O^0{-EUnnkc8LrYuH;GY-Ey_{@BJs+Z4)Ti1kvMS- zTbI6qvAT}7VZb6DjM*8~D;2aN*4xd-_a0!gB|Fc;+Sr3p!V*_LxL_B9;0-qjYcv)q=oZSE(?>Ed#D~)8a%?zl0`r|; zAddH9H|JyS{Cn6@1@>GU+skE?8T-@;!)taBK!H%jp!FaWDFZ2{Ld+{FL@002ovPDHLkV1gQ2uP^`r literal 0 HcmV?d00001 diff --git a/templates/gearitem/details.html b/templates/gearitem/details.html index fc9e58a..fb6c5fd 100644 --- a/templates/gearitem/details.html +++ b/templates/gearitem/details.html @@ -1,38 +1,62 @@ -

{{ gearitem.name }}

- - - - - - - - - - - - -
Zone
Boss/Source{{ gearitem.source }} -
Stats -
    -
  • Primary: {{ gearitem.primary }}
  • -
  • Crit: {{ gearitem.crit }}
  • -
  • Haste: {{ gearitem.haste }}
  • -
  • Mastery: {{ gearitem.mastery }}
  • -
-
+{% extends "base.html" %} +{% load staticfiles %} -{% if error_message %}

{{ error_message }}

{% endif %} - -
-{% csrf_token %} -
-
- -
- -
- {% for comment in gearitem.comments %} -
{{ comment.user }} posts:
-
{{ comment.note }}
- {% endfor %} -
\ No newline at end of file +{% block content %} +
+

+ + {{ gearitem.name }} + {% if gearitem.nameDescription %} - + {{ gearitem.nameDescription }} + {% endif %} +

+ ← Back to all items + + + + View on wowhead.com + + +

Zone

+ {{ gearitem.zone }} + +

Boss/Source

+ {{ gearitem.source }} + +

Slot

+ {{ gearitem.slotName }} + +

Stats

+ + + + + + + + + + + + + + + + + + + + + + + +
Agility{{ gearitem.agility }} +
Crit{{ gearitem.crit }}
Haste{{ gearitem.haste }} +
Mastery{{ gearitem.mastery }}
Multistrike{{ gearitem.multistrike }}
Versatility{{ gearitem.versatility }}
+ +

Sockets

+ nyi + + {% if error_message %}

{{ error_message }}

{% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/templates/gearitem/done.html b/templates/gearitem/done.html new file mode 100644 index 0000000..58ff769 --- /dev/null +++ b/templates/gearitem/done.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% load staticfiles %} +{% load i18n admin_urls %} + +{% block content %} +
+ Done.

+ ← Go to gearitems +
+{% endblock %} \ No newline at end of file diff --git a/templates/gearitem/index.html b/templates/gearitem/index.html index 80aa11d..918591b 100644 --- a/templates/gearitem/index.html +++ b/templates/gearitem/index.html @@ -1,13 +1,40 @@ +{% extends "base.html" %} {% load staticfiles %} - - -{% if name_gear_list %} - -{% else %} -

No gear items are available.

-{% endif %} \ No newline at end of file +{% block content %} +
+ {% if name_gear_list %} + + + + + + + + + + + {% for gearitem in name_gear_list %} + + + + + + + + {% endfor %} + +
NameZoneBoss/SourceSlot
+ + + {{ gearitem.name }} + {% if gearitem.nameDescription %} - + {{ gearitem.nameDescription }} + {% endif %} + + {{ gearitem.zone }}{{ gearitem.source }}{{ gearitem.slotName }}
+ {% else %} +

No gear items are available.

+ {% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/tools.py b/tools.py new file mode 100644 index 0000000..067ada6 --- /dev/null +++ b/tools.py @@ -0,0 +1,37 @@ +slots = ["None", + "Head", + "Neck", + "Shoulder", + "Shirt", + "Chest", + "Waist", + "Legs", + "Feet", + "Wrist", + "Hands", + "Finger", + "Trinket", + "One-Hand", + "Shield", + "Ranged", + "Cloak", + "Two-Hand", + "Bag", + "Tabard", + "Chest", + "Main Hand", + "Off Hand", + "Held In Off-hand", + "Ammo", + "Thrown", + "Ranged Right", + "Relic"] +good_inventory_slots = [1,2,3,5,6,7,8,9,10,11,12,15,16,20] + +stats_used = {3:'agility', + 32:'crit', + 36:'haste', + 49:'mastery', + 51:'multistrike', + 52:'versatility', + } \ No newline at end of file diff --git a/urls.py b/urls.py index 234aab7..4ed10e9 100644 --- a/urls.py +++ b/urls.py @@ -3,11 +3,7 @@ from gearitem import views urlpatterns = patterns('', - url(r'^$', views.IndexView.as_view(), name='index'), + url(r'^$', views.IndexView.as_view(), name='listing'), # ex: /gearitem/5/ url(r'^(?P\d+)/$', views.DetailsView.as_view(), name='details'), - # ex: /gearitem/5/results/ - url(r'^(?P\d+)/results/$', views.ResultsView.as_view(), name='results'), - # ex: /gearitem/5/comment/ - url(r'^(?P\d+)/comment/$', views.comment, name='comment'), ) \ No newline at end of file diff --git a/views.py b/views.py index 70bc68f..c12da65 100644 --- a/views.py +++ b/views.py @@ -3,8 +3,9 @@ from django.shortcuts import render, get_object_or_404 from django.template import RequestContext, loader from django.views import generic +from tools import slots -from models import GearItem, Comment +from models import GearItem class IndexView(generic.ListView): template_name = 'gearitem/index.html' @@ -17,14 +18,6 @@ def get_queryset(self): class DetailsView(generic.DetailView): model = GearItem template_name = 'gearitem/details.html' - -class ResultsView(generic.DetailView): - model = GearItem - template_name = 'gearitem/results.html' - -def comment(request, gear_id): - ob = Comment() - ob.note = request.POST['note'] - ob.gearid = gear_id - ob.save() - return HttpResponseRedirect(reverse('gearitem:results', args=(gear_id,))) \ No newline at end of file + + def slotName(self): + return slots[self.slot] \ No newline at end of file