from flask import url_for from sqlalchemy import text from logsite.view import View from shared import redis from .. import APP, db from ..data import match @APP.route('/people/') def people() -> str: view = People() return view.page() # pylint: disable=no-self-use class People(View): def __init__(self) -> None: people_query = db.User.query.order_by(db.User.name.asc()).paginate() self.people = people_query.items self.has_next = people_query.has_next self.has_prev = people_query.has_prev self.has_pagination = self.has_next or self.has_prev if people_query.has_next: self.next_url = url_for('.people', page=people_query.next_num) if people_query.has_prev: self.prev_url = url_for('.people', page=people_query.prev_num) def prepare(self) -> None: for p in self.people: key = f'logsite:people:{p.id}' data = redis.get_container(key, ex=3600) if data: p.fav_format = data.fav_format p.num_matches = data.num_matches else: p.num_matches = match.get_recent_matches_by_player(p.name).count() stmt = text(""" SELECT f.name, COUNT(*) AS num_matches FROM match_players AS mp INNER JOIN `match` AS m ON mp.match_id = m.id INNER JOIN format AS f ON m.format_id = f.id WHERE mp.user_id = :pid GROUP BY f.id; """) p.formats = db.DB.session.query('name', 'num_matches').from_statement(stmt).params(pid=p.id).all() if p.formats: p.fav_format = '{0} ({1} matches)'.format(p.formats[0][0], p.formats[0][1]) else: p.fav_format = '⸺' redis.store(key, {'fav_format': p.fav_format, 'num_matches': p.num_matches}, ex=3600)