=== modified file 'players/views.py'
--- players/views.py 2007-08-22 14:30:26 +0000
+++ players/views.py 2008-07-30 12:19:56 +0000
@@ -9,6 +9,9 @@
from models import *
+from itertools import imap
+from operator import itemgetter
+
CACHE_TIME = 60 * 60 * 24
def search(request):
@@ -37,6 +40,60 @@
damage = InfoTeam.objects.order_by('-tdmg')[:25]
return render_to_response('players/boards/teamplay.html', locals(), RequestContext(request))
+
+def get_keys(model, key):
+ cache_key = "%s-%s-list" % (model._meta.module_name, key)
+ result = cache.get(cache_key+'foo')
+ if not result:
+ result = frozenset(int(row[0]) for row in model.objects.distinct().values_list(key))
+ cache.set(cache_key, result)
+ return result
+
+def get_records(model, list_key, sort_key, record_fields):
+ def factory(record, fields=record_fields.items()):
+ return dict( ( field_name, getattr(record, field[:-2])() if field.endswith('()') \
+ else getattr(record, field) )
+ for field_name, field in fields )
+
+ rows = ( model.objects.filter(**{list_key: row_group}).select_related(depth=1).order_by('-%s' % sort_key)[0]
+ for row_group in get_keys(model, list_key) )
+
+ return sorted(imap(factory, rows), key=itemgetter(sort_key), reverse=True)
+
+def make_top(model, name, list_key, sort_key='kills', **record_fields):
+ ctx = {}
+ cache_key = "%s-top-%s" % (model._meta.module_name, name)
+ result = cache.get(cache_key+'foo')
+ if not result:
+ ctx[name] = result = get_records(model, list_key, sort_key, record_fields)
+ cache.set(cache_key, result, CACHE_TIME)
+ return ctx
+
+def weapon_top(request, weapon_id=None):
+ ctx = {}
+ if not weapon_id:
+ ctx.update(make_top( InfoWeapon, 'weapons', 'weapon_id',
+ id='weapon_id', weapon='get_name()', kills='kills', player='player'))
+ else:
+ ctx['players'] = players = InfoWeapon.objects\
+ .filter(weapon_id=weapon_id).order_by('-kills').select_related(depth=1)[:50]
+ ctx['name'] = players[0].get_name()
+
+ return render_to_response('players/boards/weapon_list.html', ctx, RequestContext(request))
+
+def vehicle_top(request, vehicle_id=None):
+ ctx = {}
+ if not vehicle_id:
+ ctx.update(make_top( InfoVehicle, 'vehicles', 'vehicle_id',
+ id='vehicle_id', vehicle='get_name()',
+ kills='kills', player='player' ))
+ else:
+ ctx['players'] = players = InfoVehicle.objects\
+ .filter(vehicle_id=vehicle_id).order_by('-kills').select_related(depth=1)[:50]
+ ctx['name'] = players[0].get_name()
+
+ return render_to_response('players/boards/vehicles.html', ctx, RequestContext(request))
+
def resort(raw, key):
return sorted([ (row[1][key], row[1]) for row in raw.items() ], reverse=True )
@@ -61,35 +118,6 @@
name = conquest[0].get_name()
return render_to_response('players/boards/maps.html', locals(), RequestContext(request))
-def weapon_top(request, weapon_id=None):
- if not weapon_id:
- weapons = cache.get('top-weapon-list')
- if not weapons:
- raw = dict(
- [(record.weapon_id, {'id':record.weapon_id, 'weapon':record.get_name(), 'kills':record.kills, 'player': record.player})
- for record in InfoWeapon.objects.select_related().order_by('kills')]
- )
- weapons = resort(raw, 'kills')
- cache.set('top-weapon-list', weapons, CACHE_TIME)
- else:
- players = InfoWeapon.objects.filter(weapon_id=weapon_id).order_by('-kills').select_related()[:100]
- name = players[0].get_name()
- return render_to_response('players/boards/weapon_list.html', locals(), RequestContext(request))
-
-def vehicle_top(request, vehicle_id=None):
- if not vehicle_id:
- vehicles = cache.get('top-vehicle-list')
- if not vehicles:
- raw = dict(
- [(record.vehicle_id, {'id': record.vehicle_id, 'vehicle':record.get_name(), 'kills':record.kills, 'player': record.player})
- for record in InfoVehicle.objects.all().order_by('kills').select_related()])
- vehicles = resort(raw, 'kills')
- cache.set('top-vehicle-list', vehicles, CACHE_TIME)
- else:
- players = InfoVehicle.objects.filter(vehicle_id=vehicle_id).order_by('-kills').select_related()[:100]
- name = players[0].get_name()
- return render_to_response('players/boards/vehicles.html', locals(), RequestContext(request))
-
def award_top(request, award_id=None):
def prepare(dataset, key):
data = cache.get('top-awards-%s' % key)
палево