Skip to content

Commit 7d0857e

Browse files
committed
reworked django helper class
... this needs to be refined though
1 parent 9da1349 commit 7d0857e

File tree

2 files changed

+64
-99
lines changed

2 files changed

+64
-99
lines changed

django_helpers.py

+63-98
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from sc2ranks import Sc2Ranks
22
from django.core.cache import cache
3-
import logging
43

4+
CACHE_TIME = 60 * 60 * 4
55

66
try:
77
from django.conf import settings
@@ -10,68 +10,74 @@
1010
print "Please configure 'SC2RANKS_API_KEY' in your settings.py"
1111

1212

13-
class Sc2RanksMixin(object):
14-
"""Add methods for fetching SC2Ranks-Data to a Django model"""
13+
class Sc2RanksManager(object):
14+
"""
15+
Descriptor for handling access to Sc2Ranks-API.
16+
"""
1517

16-
client = Sc2Ranks(SC2RANKS_API_KEY)
17-
# How to best enforce that a model that uses this mixin has these fields set?
18-
# TODO: evaluate abstract properties
19-
player_fieldname = None
20-
bnet_id_fieldname = None
21-
bnet_realm_fieldname = None
18+
def __init__(self, name, realm, bid):
19+
self.bnet = {}
20+
self.bnet['name'] = name
21+
self.bnet['realm'] = realm
22+
self.bnet['bid'] = bid
2223

23-
@property
24-
def bnet_name(self):
25-
try:
26-
assert bool(self.player_fieldname)
27-
player_field = getattr(self, 'player_fieldname')
28-
return getattr(self, player_field)
29-
except AssertionError:
30-
raise AssertionError('No field mapping for player_fieldname specified')
31-
except AttributeError:
32-
raise AttributeError('The fieldname specified for player_fieldname does not exist on this model')
24+
def __get__(self, instance, owner):
25+
# get instance values and pass data to api wrapper
26+
return Sc2RanksAPIWrapper(instance, **self.bnet)
3327

34-
@property
35-
def bnet_id(self):
36-
try:
37-
assert bool(self.bnet_id_fieldname)
38-
bnet_id_field = getattr(self, 'bnet_id_fieldname')
39-
return getattr(self, bnet_id_field)
40-
except AssertionError:
41-
raise AssertionError('No field mapping for bnet_id_fieldname specified')
42-
except AttributeError:
43-
raise AttributeError('The fieldname specified for bnet_id_fieldname does not exist on this model')
28+
29+
class Sc2RanksAPIWrapper(object):
30+
31+
def __init__(self, instance, name, realm, bid):
32+
self.bnet_name = instance.__dict__[name]
33+
self.bnet_realm = instance.__dict__[realm]
34+
self.bnet_id = instance.__dict__[bid]
35+
self.client = Sc2Ranks(SC2RANKS_API_KEY)
4436

4537
@property
46-
def bnet_realm(self):
47-
try:
48-
assert bool(self.bnet_realm_fieldname)
49-
bnet_realm_field = getattr(self, 'bnet_realm_fieldname')
50-
return getattr(self, bnet_realm_field)
51-
raise AssertionError('No field mapping for bnet_realm_fieldname specified')
52-
except AttributeError:
53-
raise AttributeError('The fieldname specified for bnet_realm does not exist on this model')
54-
55-
def assert_bnet_id(self):
56-
"""Updates the players battle.net id if it isn't set yet."""
57-
58-
if not self.bnet_id:
59-
try:
60-
bnet_id = self.get_sc2ranks_bnet_id()
61-
setattr(self, self.bnet_id_fieldname, bnet_id)
62-
self.save()
63-
except Exception, e:
64-
logging.debug('bnet_id could not be updated.\n %s' % e)
38+
def profile_page(self):
39+
return "http://www.sc2ranks.com/%s/%s/%s/" % (self.bnet_realm,
40+
self.bnet_id,
41+
self.bnet_name)
42+
43+
def get_team_stats(self, bracket=1, *partner):
44+
"""
45+
Fetch team stats from sc2ranks.
46+
47+
if no further parameter is given single player stats are returned
48+
further options:
49+
bracket = 1,2 etc.
50+
partner = HandJudas, MrChance etc ...
51+
"""
52+
data = None
53+
cache_key = '%s%s' % (self.bnet_name, bracket)
54+
cached_teams = cache.get(cache_key)
55+
56+
if cached_teams is not None:
57+
data = cached_teams
58+
else:
59+
data = self.client.fetch_character_teams(region=self.bnet_realm,
60+
name=self.bnet_name,
61+
bracket=bracket,
62+
bnet_id=self.bnet_id)
63+
cache.set(cache_key, data, CACHE_TIME)
6564

65+
teams = []
66+
for team in data.teams:
67+
# get the actual team from the list of all player's team in bracket
68+
if hasattr(team, 'members'):
69+
if all([member.name in partner for member in team.members]):
70+
teams.append(team)
71+
else:
72+
# as there are no members we can assume it's a single player team
73+
teams = data.teams
74+
75+
return list(set(teams))
6676

67-
########################
68-
# Sc2Ranks-Api methods #
69-
########################
7077
def search_character(self):
7178
"""Search a character by name."""
7279

73-
data = self.client.search_for_character(self.bnet_realm, self.bnet_name)
74-
return data
80+
return self.client.search_for_character(self.bnet_realm, self.bnet_name)
7581

7682
@property
7783
def bnet_url(self):
@@ -80,18 +86,12 @@ def bnet_url(self):
8086
self.bnet_id,
8187
self.bnet_name)
8288

83-
@property
84-
def sc2ranks_profile_page(self):
85-
return "http://www.sc2ranks.com/%s/%s/%s/" % (self.bnet_realm,
86-
self.bnet_id,
87-
self.bnet_name)
8889

8990
@property
90-
def get_sc2ranks_base_character(self, cache_seconds=1800):
91+
def base_character(self, cache_seconds=CACHE_TIME):
9192
character = None
9293
cache_key = self.bnet_name
9394
character = cache.get(cache_key)
94-
self.assert_bnet_id()
9595

9696
if character is not None:
9797
return character
@@ -104,48 +104,13 @@ def get_sc2ranks_base_character(self, cache_seconds=1800):
104104
cache.set(cache_key, character, cache_seconds)
105105
return character
106106

107-
def get_sc2ranks_stats(self, bracket=1, *partner):
108-
"""
109-
Get team stats from sc2ranks.com
110-
111-
if no further parameter is given single player stats are returned
112-
further options:
113-
bracket = 1,2 etc.
114-
partner = HandJudas, MrChance etc ...
115-
"""
116-
teams = None
117-
cache_key = '%s%s' % (self.bnet_name, bracket)
118-
cached_teams = cache.get(cache_key)
119-
120-
if cached_teams is not None:
121-
teams = cached_teams
122-
else:
123-
teams = self.client.fetch_character_teams(region=self.bnet_realm,
124-
name=self.bnet_name,
125-
bracket=bracket,
126-
bnet_id=self.bnet_id)
127-
cache.set(cache_key, teams, 1800)
128-
129-
teams_partner = []
130-
if partner:
131-
for team in teams.teams:
132-
for member in team.members:
133-
if member.name in partner:
134-
teams_partner.append(team)
135-
teams = list(set(teams_partner))
136-
return teams
137-
138-
def get_sc2ranks_bnet_id(self):
139-
"""Get the battle.net id for a player name."""
140-
141-
return self.search_character().characters[0]['bnet_id']
142107

143-
def get_sc2ranks_portrait(self, size=75):
108+
def get_portrait(self, size=75):
144109
"""Returns the data needed to render the starcraft profile image."""
145110

146-
if self.get_sc2ranks_base_character:
111+
if self.base_character:
147112
try:
148-
portrait = self.get_sc2ranks_base_character.portrait
113+
portrait = self.base_character.portrait
149114
x = -(portrait.column * size)
150115
y = -(portrait.row * size)
151116
image = 'portraits-%d-%d.jpg' % (portrait.icon_id, size)

sc2ranks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22
import urllib
33
import json
4+
import logging
45

56
MAX_CHARS = 98
67

@@ -10,7 +11,6 @@ def __init__(self, app_key):
1011

1112
def api_fetch(self, path, params=''):
1213
"""Fetch some JSON from the API."""
13-
1414
url = "http://sc2ranks.com/api/%s.json?appKey=%s" % (path, self.app_key)
1515
return fetch_json(url, params)
1616

0 commit comments

Comments
 (0)