def get(self, uid=None):
     username = self.get_current_user()
     
     if username is None:
         self.validate_user()
         return
         
     user = User.get_user(username)
             
     if user.permission_level < constants.PERMISSION_LEVEL_USER:
         self.render("denied.html", user=user)
         return
     
     if uid is None:
         self.render("leaderboard.html", user=user)
         
     else:
         target_user = User.by_id(int(uid))
         
         self.render("user-details.html", user=user, target_user=target_user)
    def get(self, user1, user2, summary=False):
        username = self.get_current_user()

        if username is None:
            self.validate_user()
            return

        user = User.get_user(username)

        if user.permission_level < constants.PERMISSION_LEVEL_USER:
            self.render("denied.html", user=user)
            return


        if not (user1 and user2):
            raise ValueError("Two users are required")

        user1 = User.by_id(user1)
        user2 = User.by_id(user2)
        # query items

        raw_range = self.request.headers.get('Range', '')
        m = range_expression.match(raw_range)

        if m is not None:
            start = int(m.group('lower'))
            stop = int(m.group('upper')) + 1
        else:
            start = 0
            stop = -1

        raw_query = self.request.query
        m = sorting_expression.match(raw_query)

        if m is not None:
                direction = m.group('direction')
                column = m.group('column')
        else:
                direction = '-'
                column = "date"

        if column not in ["id", "date", "winner_id", "winner_score", "winner_displayname", "opponent_id", "opponent_score", "opponent_displayname"]:
            column = "date"

        if direction == '-':
                direction = desc
        else:
                direction = asc

        session = SessionFactory()
        try:
            query = get_match_history_query(session, [user1.id, user2.id])

            total = query.count()

            query = query.order_by(direction(column))
            if not summary:
                query = query.slice(start, stop)

            result = query.all()

            if summary:
                score_dict = {'won': 0, 'lost': 0, 'points_scored': 0, 'difference': 0, 'form': ''}
                sum_dict = { user1.id: score_dict.copy(), user2.id: score_dict.copy() }

                for res in result:
                    sum_dict[res.winner_id]['won'] += 1
                    sum_dict[res.winner_id]['points_scored'] += res.winner_score
                    sum_dict[res.winner_id]['difference'] += res.winner_score-res.opponent_score
                    sum_dict[res.winner_id]['form'] = 'W' + sum_dict[res.winner_id]['form']
                    sum_dict[res.opponent_id]['lost'] += 1
                    sum_dict[res.opponent_id]['points_scored'] += res.opponent_score
                    sum_dict[res.opponent_id]['difference'] += res.opponent_score-res.winner_score
                    sum_dict[res.opponent_id]['form'] = 'L' + sum_dict[res.opponent_id]['form']

                result = []
                for player in sum_dict:
                    user = user1 if player==user1.id else user2
                    player_dict = sum_dict[player]
                    player_dict['form'] = player_dict['form'][-5:]
                    player_dict.update({'id': player, 'displayname': user.displayname})
                    result.append(player_dict)
                start = 0
                stop = 1
                total = 2
            else:
                result = resultdict(result)

            data = "{}&& "+json.dumps(result)
            self.set_header('Content-range', 'items {}-{}/{}'.format(start, stop, total))
            self.set_header('Content-length', len(data))
            self.set_header('Content-type', 'application/json')
            self.write(data)

        finally:
            session.close()