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 0000000..dda24b2 Binary files /dev/null and b/static/wowhead.png differ 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 @@ -
Zone | -- |
---|---|
Boss/Source | -{{ gearitem.source }} - |
Stats | -
-
|
-
{{ error_message }}
{% endif %} - - - -Agility | +{{ gearitem.agility }} + |
---|---|
Crit | +{{ gearitem.crit }} | +
Haste | +{{ gearitem.haste }} + |
Mastery | +{{ gearitem.mastery }} | +
Multistrike | +{{ gearitem.multistrike }} | +
Versatility | +{{ gearitem.versatility }} | +
{{ error_message }}
{% endif %} +No gear items are available.
-{% endif %} \ No newline at end of file +{% block content %} +Name | +Zone | +Boss/Source | +Slot | +|
---|---|---|---|---|
+
+ ![]() |
+ {{ gearitem.zone }} | +{{ gearitem.source }} | +{{ gearitem.slotName }} | +
No gear items are available.
+ {% endif %} +