summaryrefslogtreecommitdiff
path: root/playoff.py
diff options
context:
space:
mode:
Diffstat (limited to 'playoff.py')
-rw-r--r--playoff.py227
1 files changed, 127 insertions, 100 deletions
diff --git a/playoff.py b/playoff.py
index ee15319..2f93ad8 100644
--- a/playoff.py
+++ b/playoff.py
@@ -3,30 +3,23 @@ from datetime import datetime
from urlparse import urljoin
from playoff import sql as p_sql
from playoff import template as p_temp
-
-from playoff.settings import PlayoffSettings
-s = PlayoffSettings()
-settings = s.get()
-teams = settings['teams']
-leaderboard = [None] * len(teams)
-
from playoff.db import PlayoffDB
-db = PlayoffDB(settings['database'])
+from playoff.settings import PlayoffSettings
-def get_shortname(fullname):
- for team in settings['teams']:
+def get_shortname(fullname, teams):
+ for team in teams:
if team[0] == fullname:
return team[1]
return fullname
-def get_team_image(fullname):
- for team in settings['teams']:
+def get_team_image(fullname, teams):
+ for team in teams:
if team[0] == fullname and len(team) > 2:
if team[2] is not None:
return p_temp.LEADERBOARD_ROW_FLAG % (team[2])
return ''
-def get_match_table(match):
+def get_match_table(match, teams, page_settings):
rows = ''
for team in match.teams:
rows += p_temp.MATCH_TEAM_ROW % (
@@ -34,60 +27,59 @@ def get_match_table(match):
'loser' if team.name == match.loser else '']).strip(),
match.link,
team.name,
- ' / '.join([get_shortname(name) for name in team.name.split('<br />')]),
+ ' / '.join([get_shortname(name, teams) for name in team.name.split('<br />')]),
match.link,
team.score
)
html = p_temp.MATCH_TABLE.decode('utf8') % (
- int(settings['page']['width'] * 0.75),
- int(settings['page']['width'] * 0.25),
+ int(page_settings['width'] * 0.75),
+ int(page_settings['width'] * 0.25),
rows
)
if match.running > 0:
html += p_temp.MATCH_RUNNING % (match.link, match.running)
return html
-def get_match_grid(grid, matches, width, height):
+def get_match_grid(grid, phases, matches, page_settings, width, height, teams, canvas_settings):
grid_boxes = ''
col_no = 0
for column in grid:
- grid_x = col_no * (settings['page']['width'] + settings['page']['margin'])
+ grid_x = col_no * (page_settings['width'] + page_settings['margin'])
grid_header = p_temp.MATCH_GRID_PHASE_RUNNING if len([match for match in column if match is not None and matches[match].running > 0]) > 0 else p_temp.MATCH_GRID_PHASE
grid_boxes += grid_header % (
- settings['phases'][col_no]['link'],
- settings['page']['width'],
+ phases[col_no]['link'],
+ page_settings['width'],
grid_x,
- settings['phases'][col_no]['title']
+ phases[col_no]['title']
)
row_no = 0
column_height = height / len(column)
for match in column:
- grid_y = int(row_no * column_height + 0.5 * (column_height - settings['page']['height']))
+ grid_y = int(row_no * column_height + 0.5 * (column_height - page_settings['height']))
if match is not None:
grid_boxes += p_temp.MATCH_BOX % (
grid_x, grid_y,
match,
' '.join([str(m) for m in matches[match].winner_matches]) if matches[match].winner_matches is not None else '',
' '.join([str(m) for m in matches[match].loser_matches]) if matches[match].loser_matches is not None else '',
- get_match_table(matches[match])
+ get_match_table(matches[match], teams, page_settings)
)
row_no += 1
col_no += 1
- canvas_settings = []
- if 'canvas' in settings:
- for setting, value in settings['canvas'].iteritems():
- canvas_settings.append(
- 'data-%s="%s"' % (setting.replace('_', '-'), str(value))
- )
- return p_temp.MATCH_GRID % (width, height, width, height, ' '.join(canvas_settings), grid_boxes)
+ canvas_attrs = []
+ for setting, value in canvas_settings.iteritems():
+ canvas_attrs.append(
+ 'data-%s="%s"' % (setting.replace('_', '-'), str(value))
+ )
+ return p_temp.MATCH_GRID % (width, height, width, height, ' '.join(canvas_attrs), grid_boxes)
-def get_leaderboard_table(leaderboard):
+def get_leaderboard_table(leaderboard, teams):
if len([t for t in leaderboard if t is not None]) == 0:
return ''
position = 1
rows = ''
for team in leaderboard:
- rows += p_temp.LEADERBOARD_ROW % (position, get_team_image(team), team or '')
+ rows += p_temp.LEADERBOARD_ROW % (position, get_team_image(team, teams), team or '')
position +=1
html = p_temp.LEADERBOARD.decode('utf8') % (rows)
return html
@@ -105,9 +97,7 @@ class Match:
winner_matches = None
loser_matches = None
-match_info = {}
-
-def get_match_info(match):
+def get_match_info(match, match_info, teams, db):
info = Match()
info.teams = [Team(), Team()]
info.winner_matches = []
@@ -175,82 +165,119 @@ def get_match_info(match):
pass
return info
-grid = []
-for phase in settings['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
- match_info[match['id']] = get_match_info(match)
- match_info[match['id']].link = phase['link'] if match_info[match['id']].link is None else urljoin(phase['link'], match_info[match['id']].link)
- phase_grid[phase_pos] = match['id']
- phase_pos += 1
- grid.append(phase_grid)
+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
-for team in settings['teams']:
- if len(team) > 3:
- leaderboard[team[3]-1] = team[0]
+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
-leaderboard_teams = {}
-for phase in settings['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)
+def prefill_leaderboard(teams):
+ leaderboard = [None] * len(teams)
+ for team in teams:
+ if len(team) > 3:
+ leaderboard[team[3]-1] = team[0]
+ return leaderboard
-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 settings['teams']:
- if table_team[0] in teams:
- position = positions.pop(0)
- leaderboard[position-1] = table_team[0]
+def fill_leaderboard(phases, teams):
+ 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)
-grid_columns = len(settings['phases'])
-grid_rows = max([len(phase['matches']) + len(phase['dummies']) if 'dummies' in phase else len(phase['matches']) for phase in settings['phases']])
-grid_height = grid_rows * (settings['page']['height'] + settings['page']['margin']) - settings['page']['margin']
-grid_width = grid_columns * (settings['page']['width'] + settings['page']['margin']) - settings['page']['margin']
+ 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
-content = (
- p_temp.PAGE % (
+def generate_content(grid, phases, match_info, teams, grid_width, grid_height, page_settings, canvas_settings):
+ return p_temp.PAGE % (
p_temp.PAGE_HEAD % (
- p_temp.PAGE_HEAD_REFRESH % (settings['page']['refresh']) if settings['page']['refresh'] > 0 else '',
- settings['page']['title']
+ p_temp.PAGE_HEAD_REFRESH % (page_settings['refresh']) if page_settings['refresh'] > 0 else '',
+ page_settings['title']
),
p_temp.PAGE_BODY % (
- settings['page']['logoh'],
- get_match_grid(grid, match_info, grid_width, grid_height),
- get_leaderboard_table(leaderboard),
+ page_settings['logoh'],
+ get_match_grid(grid, phases, match_info, page_settings, grid_width, grid_height, teams, canvas_settings),
+ get_leaderboard_table(leaderboard, teams),
p_temp.PAGE_BODY_FOOTER.decode('utf8') % (datetime.now().strftime('%Y-%m-%d o %H:%M'))
)
- )).encode('utf8')
+ )
-output = open(settings['output'], 'w')
-output.write(content)
-output.close()
+def write_content(content, output_file):
+ output = open(output_file, 'w')
+ output.write(content.encode('utf8'))
+ output.close()
+ return os.path.dirname(output_file)
-output_path = os.path.dirname(settings['output'])
-script_output_path = os.path.join(output_path, 'sklady/playoff.js')
+def copy_scripts(output_path):
+ script_path = 'sklady/playoff.js'
+ script_output_path = os.path.join(output_path, script_path)
+ shutil.copy(unicode(os.path.join(os.path.dirname(__file__), 'playoff.js')),
+ unicode(script_output_path))
+ return script_output_path
-shutil.copy(unicode(os.path.join(os.path.dirname(__file__), 'playoff.js')),
- unicode(script_output_path))
+def send_files(goniec_settings, path, files):
+ if goniec_settings['enabled']:
+ try:
+ base_path = path.strip(os.sep) + os.sep
+ content_files = [filename.replace(base_path, '') for filename in files if filename.startswith(base_path)]
+ content_lines = [base_path] + content_files + ['bye', '']
+ print '\n'.join(content_lines)
+ goniec = socket.socket()
+ goniec.connect((goniec_settings['host'], goniec_settings['port']))
+ goniec.sendall('\n'.join(content_lines))
+ goniec.close()
+ except socket.error:
+ pass
+
+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'))
+
+page_settings = s.get('page')
+grid_columns = len(phase_settings)
+grid_rows = max([len(phase['matches']) + len(phase['dummies']) if 'dummies' in phase else len(phase['matches']) for phase in phase_settings])
+grid_height = grid_rows * (page_settings['height'] + page_settings['margin']) - page_settings['margin']
+grid_width = grid_columns * (page_settings['width'] + page_settings['margin']) - page_settings['margin']
+
+content = generate_content(grid, phase_settings, match_info, s.get('teams'), grid_width, grid_height, page_settings, s.get('canvas') if s.has_section('canvas') else {})
+
+output_file = s.get('output')
+output_path = write_content(content, output_file)
+script_path = copy_scripts(output_path)
+send_files(s.get('goniec'), output_path, [output_file, script_path])
-if settings['goniec']['enabled']:
- try:
- content_lines = [(output_path.strip('/') + '/').replace('/', '\\')] + [os.path.basename(settings['output']), 'sklady/playoff.js'] + ['bye', '']
- print '\n'.join(content_lines)
- goniec = socket.socket()
- goniec.connect((settings['goniec']['host'], settings['goniec']['port']))
- goniec.sendall('\n'.join(content_lines))
- goniec.close()
- except socket.error:
- pass