def get_leaderboard(request): """ Get leaderboard entries - Used in ajax view on leaderboards page """ activity = request.GET.get('activity') timespan = request.GET.get('timespan') leaderboard_key = 'type_{0}:timespan_{1}'.format(activity, timespan) leaderboard_meta_key = '{0}:meta'.format(leaderboard_key) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) offset = 0 limit = 20 user_ids = leaderboard_db.zrevrange(leaderboard_key, offset, offset + limit) entries = leaderboard_db.hmget(leaderboard_meta_key, *user_ids) leaderboard_count = leaderboard_db.zcard(leaderboard_key) context = {'entries': [], 'total_count': leaderboard_count} for stringy_dict_entry in entries: entry = ast.literal_eval(stringy_dict_entry) entry['is_authd_user'] = entry['user_id'] == request.user.id context['entries'].append(entry) response = render_to_string('leaderboard.html', context) return HttpResponse(response, content_type='text/html')
def get_leaderboard_leader(activity_type, all_time=False, year=None, month=None): """ Return the user id in the top spot of a leaderboard """ leaderboard_key = build_leaderboard_key(activity_type, all_time, year, month) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) user_id = leaderboard_db.zrevrange(leaderboard_key, 0, 0)[0] return int(user_id)
def get_leaderboard_count(activity_type, all_time=False, year=None, month=None): """ Get the number of users on a leaderboard """ leaderboard_key = build_leaderboard_key(activity_type, all_time, year, month) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) count = leaderboard_db.zcard(leaderboard_key) return count
def get_user_rank(user_id, activity_type, all_time=False, year=None, month=None): """ Get a user's rank on a leaderboard """ leaderboard_key = build_leaderboard_key(activity_type, all_time, year, month) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) rank = leaderboard_db.zrevrank(leaderboard_key, user_id) return rank
def get_user_score(user_id, activity_type, all_time=False, year=None, month=None): """ Get a user's score on a leaderboard """ leaderboard_key = build_leaderboard_key(activity_type, all_time, year, month) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) score = leaderboard_db.zscore(leaderboard_key, user_id) if score is not None: score = int(score) return score
def create_or_update_entry(points, user, activity_type, all_time=False, year=None, month=None): """ Create or Update a leaderboard entry in Redis """ leaderboard_key = build_leaderboard_key(activity_type, all_time, year, month) leaderboard_meta_key = '{0}:meta'.format(leaderboard_key) leaderboard_db = keyval.get_db(keyval.TYPE_LEADERBOARD) name = '{0} {1}'.format(user.first_name, user.last_name).strip() meta = { 'name': name, 'user_id': user.id, 'points': points, } leaderboard_db.hset(leaderboard_meta_key, user.id, meta) leaderboard_db.zadd(leaderboard_key, points, user.id)