From 30c5d797391156b633d5077b8ea120ff61b9a1c4 Mon Sep 17 00:00:00 2001 From: emkael Date: Tue, 1 Aug 2017 00:49:55 +0200 Subject: Data operations factored out to separate class --- jfr_playoff/data.py | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++ playoff.py | 145 ++----------------------------------------- 2 files changed, 177 insertions(+), 140 deletions(-) create mode 100644 jfr_playoff/data.py diff --git a/jfr_playoff/data.py b/jfr_playoff/data.py new file mode 100644 index 0000000..370a5eb --- /dev/null +++ b/jfr_playoff/data.py @@ -0,0 +1,172 @@ +from urlparse import urljoin +from db import PlayoffDB +import sql as p_sql + +class Team: + name = '' + score = 0.0 + +class Match: + teams = None + running = 0 + link = None + winner = None + loser = None + winner_matches = None + loser_matches = None + +class PlayoffData(object): + def __init__(self, settings): + self.settings = settings + self.database = PlayoffDB(self.settings.get('database')) + self.phases = self.settings.get('phases') + self.teams = self.settings.get('teams') + self.match_info = {} + self.leaderboard = [] + + def generate_phases(self): + grid = [] + for phase in self.phases: + phase_count = len(phase['matches']) + if 'dummies' in phase: + phase_count += len(phase['dummies']) + phase_grid = [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_grid[phase_pos] = match['id'] + phase_pos += 1 + grid.append(phase_grid) + return 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) + self.match_info[match['id']].link = phase['link'] if self.match_info[match['id']].link is None else urljoin( + phase['link'], self.match_info[match['id']].link) + return self.match_info + + def get_match_info(self, match): + info = Match() + info.teams = [Team(), Team()] + 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)) + try: + row = self.database.fetch(match['database'], p_sql.PREFIX, ()) + info.link = '%srunda%d.html' % (row[0], match['round']) + except Exception as e: + pass + try: + row = self.database.fetch(match['database'], p_sql.MATCH_RESULTS, (match['table'], match['round'])) + info.teams[0].name = row[0] + info.teams[1].name = row[1] + info.teams[0].score = row[3] + row[5] + info.teams[1].score = row[4] + row[6] + if row[2] > 0: + info.teams[0].score += row[2] + else: + info.teams[1].score -= row[2] + except Exception as e: + for i in range(0, 2): + if isinstance(match['teams'][i], basestring): + info.teams[i].name = match['teams'][i] + elif isinstance(match['teams'][i], list): + info.teams[i].name = '
'.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'] + ] + info.teams[i].name = '
'.join([ + team if team is not None else '??' + for team in match_teams] + ) if len([team for team in match_teams if team is not None]) > 0 else '' + 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 + info.winner = info.teams[0].name if info.teams[0].score > info.teams[1].score else info.teams[1].name + info.loser = info.teams[1].name if info.teams[0].score > info.teams[1].score else info.teams[0].name + except Exception as e: + 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 diff --git a/playoff.py b/playoff.py index 08b2344..0043e03 100644 --- a/playoff.py +++ b/playoff.py @@ -1,8 +1,6 @@ from datetime import datetime from urlparse import urljoin -import jfr_playoff.sql as p_sql import jfr_playoff.template as p_temp -from jfr_playoff.db import PlayoffDB from jfr_playoff.settings import PlayoffSettings def get_shortname(fullname, teams): @@ -83,140 +81,6 @@ def get_leaderboard_table(leaderboard, teams): html = p_temp.LEADERBOARD.decode('utf8') % (rows) return html -class Team: - name = '' - score = 0.0 - -class Match: - teams = None - running = 0 - link = None - winner = None - loser = None - winner_matches = None - loser_matches = None - -def get_match_info(match, match_info, teams, db): - info = Match() - info.teams = [Team(), Team()] - 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)) - try: - row = db.fetch(match['database'], p_sql.PREFIX, ()) - info.link = '%srunda%d.html' % (row[0], match['round']) - except Exception as e: - pass - try: - row = db.fetch(match['database'], p_sql.MATCH_RESULTS, (match['table'], match['round'])) - info.teams[0].name = row[0] - info.teams[1].name = row[1] - info.teams[0].score = row[3] + row[5] - info.teams[1].score = row[4] + row[6] - if row[2] > 0: - info.teams[0].score += row[2] - else: - info.teams[1].score -= row[2] - except Exception as e: - for i in range(0, 2): - if isinstance(match['teams'][i], basestring): - info.teams[i].name = match['teams'][i] - elif isinstance(match['teams'][i], list): - info.teams[i].name = '
'.join(match['teams'][i]) - else: - match_teams = [] - if 'winner' in match['teams'][i]: - match_teams += [ - match_info[winner_match].winner - for winner_match in match['teams'][i]['winner'] - ] - if 'loser' in match['teams'][i]: - match_teams += [ - match_info[loser_match].loser - for loser_match in match['teams'][i]['loser'] - ] - if 'place' in match['teams'][i]: - match_teams += [ - teams[place-1][0] - for place in match['teams'][i]['place'] - ] - info.teams[i].name = '
'.join([ - team if team is not None else '??' - for team in match_teams] - ) if len([team for team in match_teams if team is not None]) > 0 else '' - - try: - towels = db.fetch(match['database'], p_sql.TOWEL_COUNT, (match['table'], match['round'])) - row = [0 if r is None else r for r in db.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 - info.winner = info.teams[0].name if info.teams[0].score > info.teams[1].score else info.teams[1].name - info.loser = info.teams[1].name if info.teams[0].score > info.teams[1].score else info.teams[0].name - except Exception as e: - pass - return info - -def generate_phases(phases): - grid = [] - for phase in phases: - phase_grid = [None] * (len(phase['dummies']) + len(phase['matches']) if 'dummies' in phase else len(phase['matches'])) - phase_pos = 0 - for match in phase['matches']: - if 'dummies' in phase: - while phase_pos in phase['dummies']: - phase_pos += 1 - phase_grid[phase_pos] = match['id'] - phase_pos += 1 - grid.append(phase_grid) - return grid - -def fill_match_info(phases, teams, db): - match_info = {} - for phase in phases: - for match in phase['matches']: - match_info[match['id']] = get_match_info(match, match_info, teams, db) - match_info[match['id']].link = phase['link'] if match_info[match['id']].link is None else urljoin(phase['link'], match_info[match['id']].link) - return match_info - -def prefill_leaderboard(teams): - leaderboard = [None] * len(teams) - for team in teams: - if len(team) > 3: - leaderboard[team[3]-1] = team[0] - return leaderboard - -def fill_leaderboard(phases, teams, match_info): - leaderboard_teams = {} - leaderboard = prefill_leaderboard(teams) - for phase in 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(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(match_info[match['id']].loser) - - for positions, teams in leaderboard_teams.iteritems(): - positions = list(positions) - if len(positions) == len([team for team in teams if team is not None]): - for table_team in teams: - if table_team[0] in teams: - position = positions.pop(0) - leaderboard[position-1] = table_team[0] - return leaderboard def generate_content(grid, phases, match_info, teams, grid_width, grid_height, page_settings, canvas_settings, leaderboard): return p_temp.PAGE % ( @@ -236,12 +100,13 @@ from jfr_playoff.filemanager import PlayoffFileManager def main(): s = PlayoffSettings() - db = PlayoffDB(s.get('database')) phase_settings = s.get('phases') - grid = generate_phases(phase_settings) - match_info = fill_match_info(phase_settings, s.get('teams'), db) - leaderboard = fill_leaderboard(phase_settings, s.get('teams'), match_info) + from jfr_playoff.data import PlayoffData + data = PlayoffData(s) + grid = data.generate_phases() + match_info = data.fill_match_info() + leaderboard = data.fill_leaderboard() page_settings = s.get('page') grid_columns = len(phase_settings) -- cgit v1.2.3