Skip to content

Commit

Permalink
all the gears
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Wohnlich committed Aug 20, 2014
1 parent e35e226 commit 4adbd80
Show file tree
Hide file tree
Showing 13 changed files with 335 additions and 79 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.pyc
#################
## Eclipse
#################
Expand Down
56 changes: 53 additions & 3 deletions admin.py
Original file line number Diff line number Diff line change
@@ -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)
admin.site.register(GearItem, GearItemAdmin)
39 changes: 39 additions & 0 deletions fetcher.py
Original file line number Diff line number Diff line change
@@ -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
64 changes: 64 additions & 0 deletions migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -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']
Empty file added migrations/__init__.py
Empty file.
37 changes: 26 additions & 11 deletions models.py
Original file line number Diff line number Diff line change
@@ -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
return self.name + ' (' + (self.nameDescription or 'normal') + ')'
Binary file added static/wowhead.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
98 changes: 61 additions & 37 deletions templates/gearitem/details.html
Original file line number Diff line number Diff line change
@@ -1,38 +1,62 @@
<h1>{{ gearitem.name }}</h1>
<table class="listing">
<tr>
<th>Zone</th>
<td{{ gearitem.zone }}</th>
</tr>
<tr>
<th>Boss/Source</th>
<td>{{ gearitem.source }}</th>
</tr>
<tr>
<th>Stats</th>
<td>
<ul>
<li>Primary: {{ gearitem.primary }}</li>
<li>Crit: {{ gearitem.crit }}</li>
<li>Haste: {{ gearitem.haste }}</li>
<li>Mastery: {{ gearitem.mastery }}</li>
</ul>
</td>
</tr>
</table>
{% extends "base.html" %}
{% load staticfiles %}

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'gearitem:comment' gearitem.id %}" method="post">
{% csrf_token %}
<label for="note">Comment</label><br/>
<textarea name="note" id="comment" value=""></textarea><br/>
<input type="submit" value="Submit" />
</form>

<dl>
{% for comment in gearitem.comments %}
<dt>{{ comment.user }} posts:</dt>
<dd>{{ comment.note }}</dd>
{% endfor %}
</dl>
{% block content %}
<div class="container">
<h1 id="item-banner">
<img src="http://us.media.blizzard.com/wow/icons/36/{{ gearitem.icon }}.jpg" />
<span class="item-quality{{ gearitem.quality }}">{{ gearitem.name }}</span>
{% if gearitem.nameDescription %} -
<span class="nameDescription">{{ gearitem.nameDescription }}</span>
{% endif %}
</h1>
<a href="{% url 'gearitem:listing' %}">&larr; Back to all items</a>

<a class="navbar-right" href="http://www.wowhead.com/item={{ gearitem.id }}">
<img src="{% static "wowhead.png" %}" />
View on wowhead.com
</a>

<h4>Zone</h4>
{{ gearitem.zone }}

<h4>Boss/Source</h4>
{{ gearitem.source }}

<h4>Slot</h4>
{{ gearitem.slotName }}

<h4>Stats</h4>
<table class="table table-striped">
<tr>
<th>Agility</th>
<td>{{ gearitem.agility }}</th>
</tr>
<tr>
<th>Crit</th>
<td>{{ gearitem.crit }}</td>
</tr>
<tr>
<th>Haste</th>
<td>{{ gearitem.haste }}</th>
</tr>
<tr>
<th>Mastery</th>
<td>{{ gearitem.mastery }}</td>
</tr>
<tr>
<th>Multistrike</th>
<td>{{ gearitem.multistrike }}</td>
</tr>
<tr>
<th>Versatility</th>
<td>{{ gearitem.versatility }}</td>
</tr>
</table>

<h4>Sockets</h4>
nyi

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
</div>
{% endblock %}
10 changes: 10 additions & 0 deletions templates/gearitem/done.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% extends "base.html" %}
{% load staticfiles %}
{% load i18n admin_urls %}

{% block content %}
<div class="container">
Done.<br/><br/>
<a href="{% url 'admin:gearitem_gearitem_changelist' %}">&larr; Go to gearitems</a>
</div>
{% endblock %}
49 changes: 38 additions & 11 deletions templates/gearitem/index.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
{% extends "base.html" %}
{% load staticfiles %}

<link rel="stylesheet" type="text/css" href="{% static 'huntertools/bootstrap/css/bootstrap.min.css' %}" />

{% if name_gear_list %}
<ul>
{% for gearitem in name_gear_list %}
<li><a href="{% url 'gearitem:details' gearitem.id %}">{{ gearitem.name }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No gear items are available.</p>
{% endif %}
{% block content %}
<div class="container">
{% if name_gear_list %}
<table class="table" id="items-table">
<thead>
<tr>
<th colspan="2">Name</th>
<th>Zone</th>
<th>Boss/Source</th>
<th>Slot</th>
</tr>
</thead>
<tbody>
{% for gearitem in name_gear_list %}
<tr>
<td>
<a href="{% url 'gearitem:details' gearitem.id %}">
<img src="http://us.media.blizzard.com/wow/icons/18/{{ gearitem.icon }}.jpg" />
<span class="item-quality{{ gearitem.quality }}">{{ gearitem.name }}</span>
{% if gearitem.nameDescription %} -
<span class="nameDescription">{{ gearitem.nameDescription }}</span>
{% endif %}
</a>
</td>
<td><a href="http://wod.wowhead.com/item={{ gearitem.id }}"><img src="{% static "wowhead.png" %}"/></a></td>
<td>{{ gearitem.zone }}</td>
<td>{{ gearitem.source }}</td>
<td>{{ gearitem.slotName }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>No gear items are available.</p>
{% endif %}
</div>
{% endblock %}
Loading

0 comments on commit 4adbd80

Please sign in to comment.