diff options
Diffstat (limited to 'jfr_playoff/data.py')
-rw-r--r-- | jfr_playoff/data.py | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/jfr_playoff/data.py b/jfr_playoff/data.py new file mode 100644 index 0000000..6fc3c4b --- /dev/null +++ b/jfr_playoff/data.py @@ -0,0 +1,203 @@ +from urlparse import urljoin + +import mysql + +import jfr_playoff.sql as p_sql +from jfr_playoff.db import PlayoffDB +from jfr_playoff.dto import Match, Phase, Team + + +class PlayoffData(object): + def __init__(self, settings): + self.database = PlayoffDB(settings.get('database')) + self.phases = settings.get('phases') + self.teams = settings.get('teams') + self.grid = [] + self.match_info = {} + self.leaderboard = [] + + def generate_phases(self): + self.grid = [] + for phase in self.phases: + phase_count = len(phase['matches']) + if 'dummies' in phase: + phase_count += len(phase['dummies']) + phase_object = Phase() + phase_object.title = phase['title'] + phase_object.link = phase['link'] + phase_object.matches = [None] * phase_count + phase_pos = 0 + for match in phase['matches']: + if 'dummies' in phase: + while phase_pos in phase['dummies']: + phase_pos += 1 + phase_object.matches[phase_pos] = match['id'] + phase_pos += 1 + self.grid.append(phase_object) + return self.grid + + def fill_match_info(self): + self.match_info = {} + for phase in self.phases: + for match in phase['matches']: + self.match_info[match['id']] = self.get_match_info(match) + if self.match_info[match['id']].running > 0: + for phase_obj in self.grid: + if match['id'] in phase_obj.matches: + phase_obj.running = True + if self.match_info[match['id']].link is None: + self.match_info[match['id']].link = phase['link'] + else: + self.match_info[match['id']].link = urljoin( + phase['link'], self.match_info[match['id']].link) + return self.match_info + + def get_match_link(self, match): + try: + row = self.database.fetch(match['database'], p_sql.PREFIX, ()) + if row is not None: + if len(row) > 0: + return '%srunda%d.html' % (row[0], match['round']) + except mysql.connector.Error: + return None + return None + + def get_db_match_teams(self, match): + teams = [Team(), Team()] + row = self.database.fetch( + match['database'], p_sql.MATCH_RESULTS, + (match['table'], match['round'])) + teams[0].name = row[0] + teams[1].name = row[1] + teams[0].score = row[3] + row[5] + teams[1].score = row[4] + row[6] + if row[2] > 0: + teams[0].score += row[2] + else: + teams[1].score -= row[2] + return teams + + def get_config_match_teams(self, match): + teams = [Team(), Team()] + for i in range(0, 2): + if isinstance(match['teams'][i], basestring): + teams[i].name = match['teams'][i] + elif isinstance(match['teams'][i], list): + teams[i].name = '<br />'.join(match['teams'][i]) + else: + match_teams = [] + if 'winner' in match['teams'][i]: + match_teams += [ + self.match_info[winner_match].winner + for winner_match in match['teams'][i]['winner']] + if 'loser' in match['teams'][i]: + match_teams += [ + self.match_info[loser_match].loser + for loser_match in match['teams'][i]['loser']] + if 'place' in match['teams'][i]: + match_teams += [ + self.teams[place-1][0] + for place in match['teams'][i]['place']] + known_teams = [team for team in match_teams if team is not None] + if len(known_teams) > 0: + teams[i].name = '<br />'.join([ + team if team is not None + else '??' for team in match_teams]) + else: + teams[i].name = '' + return teams + + def get_match_info(self, match): + info = Match() + info.id = match['id'] + info.winner_matches = [] + info.loser_matches = [] + for i in range(0, 2): + if 'winner' in match['teams'][i]: + info.winner_matches += match['teams'][i]['winner'] + if 'loser' in match['teams'][i]: + info.loser_matches += match['teams'][i]['loser'] + info.winner_matches = list(set(info.winner_matches)) + info.loser_matches = list(set(info.loser_matches)) + info.link = self.get_match_link(match) + try: + info.teams = self.get_db_match_teams(match) + except (mysql.connector.Error, TypeError, IndexError): + info.teams = self.get_config_match_teams(match) + try: + towels = self.database.fetch( + match['database'], p_sql.TOWEL_COUNT, + (match['table'], match['round'])) + row = [0 if r is None + else r for r in + self.database.fetch( + match['database'], p_sql.BOARD_COUNT, + (match['table'], match['round']))] + if row[1] > 0: + info.running = int(row[1]) + if row[1] >= row[0] - towels[0]: + info.running = 0 + if info.teams[0].score > info.teams[1].score: + info.winner = info.teams[0].name + info.loser = info.teams[1].name + else: + info.loser = info.teams[0].name + info.winner = info.teams[1].name + except (mysql.connector.Error, TypeError, KeyError): + pass + return info + + def prefill_leaderboard(self, teams): + self.leaderboard = [None] * len(teams) + for team in teams: + if len(team) > 3: + self.leaderboard[team[3]-1] = team[0] + return self.leaderboard + + def fill_leaderboard(self): + self.prefill_leaderboard(self.teams) + leaderboard_teams = {} + for phase in self.phases: + for match in phase['matches']: + if 'winner' in match: + winner_key = tuple(match['winner']) + if winner_key not in leaderboard_teams: + leaderboard_teams[winner_key] = [] + leaderboard_teams[winner_key].append( + self.match_info[match['id']].winner) + if 'loser' in match: + loser_key = tuple(match['loser']) + if loser_key not in leaderboard_teams: + leaderboard_teams[loser_key] = [] + leaderboard_teams[loser_key].append( + self.match_info[match['id']].loser) + for positions, position_teams in leaderboard_teams.iteritems(): + positions = list(positions) + if len(positions) == len([ + team for team in position_teams if team is not None]): + for table_team in self.teams: + if table_team[0] in position_teams: + position = positions.pop(0) + self.leaderboard[position-1] = table_team[0] + return self.leaderboard + + def get_dimensions(self): + return ( + len(self.phases), + max([ + len(phase['matches']) + len(phase['dummies']) + if 'dummies' in phase + else len(phase['matches']) + for phase in self.phases])) + + def get_shortname(self, fullname): + for team in self.teams: + if team[0] == fullname: + return team[1] + return fullname + + def get_team_image(self, fullname): + for team in self.teams: + if team[0] == fullname and len(team) > 2: + return team[2] + return None |