summaryrefslogtreecommitdiff
path: root/jfr_playoff/data.py
diff options
context:
space:
mode:
Diffstat (limited to 'jfr_playoff/data.py')
-rw-r--r--jfr_playoff/data.py203
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