summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremkael <emkael@tlen.pl>2018-10-02 13:31:02 +0200
committeremkael <emkael@tlen.pl>2018-10-02 13:31:02 +0200
commit79c281bb47d08f1fd1be04b1d7d58dfd8c672bc5 (patch)
tree9973939753935b1fc240c1f2b1b5c8ba8677a4e3
parent6119175f65c6bc12771a968cd72e6c8179848f78 (diff)
New team label rendering method, including outcome preditctions
-rw-r--r--jfr_playoff/generator.py73
1 files changed, 63 insertions, 10 deletions
diff --git a/jfr_playoff/generator.py b/jfr_playoff/generator.py
index fab6d0e..7895a73 100644
--- a/jfr_playoff/generator.py
+++ b/jfr_playoff/generator.py
@@ -60,15 +60,68 @@ class PlayoffGenerator(object):
def get_match_table(self, match):
rows = ''
for team in match.teams:
+ # the easy part: team score cell
score_html = self.p_temp.get('MATCH_SCORE', team.score)
- teams = [coalesce(name, '??') for name in team.name]
- team_label = ' / '.join([
- self.data.get_shortname(name) if name is not None else '??' for name in team.name]) \
- if team.known_teams > 0 else ''
- team_name = '<br />'.join(teams)
- label_max_length = self.page.get('label_length_limit', 0)
- if label_max_length:
- team_label = team_label[:label_max_length] + (team_label[label_max_length:] and '(...)')
+ # the hard part begins here.
+ team_label = [] # label is what's shown in the table cell
+ label_separator = ' / '
+ team_name = [] # name is what's shown in the tooltip
+ name_separator = '<br />'
+ name_prefix = '&nbsp;&nbsp;' # prefix (indent) for team names in the tooltip
+ if (team.known_teams == 0) and not self.page.get('predict_teams', False):
+ # we've got no teams eligible for the match and the prediction option is disabled
+ team_label = ''
+ team_name = ''
+ else:
+ # predicted teams are not in team.name, they're in tem.possible_name so corresponding spots in team.name are empty
+ is_label_predicted = [name is None for name in team.name]
+ # fetch labels (shortnames) for teams in both lists
+ labels = [self.data.get_shortname(name) if name else None for name in team.name]
+ predicted_labels = [self.data.get_shortname(name) if name else None for name in team.possible_name]
+ for l in range(0, len(labels)):
+ if labels[l] is None:
+ if self.page.get('predict_teams', False) and (len(predicted_labels) > l):
+ # fill team labels with either predictions...
+ labels[l] = predicted_labels[l]
+ else:
+ # ...or empty placeholders
+ labels[l] = '??'
+ # count how many teams are eligible (how many non-predicted teams are there)
+ known_teams = len(is_label_predicted) - sum(is_label_predicted)
+ # sort labels to move eligible teams in front of predicted teams
+ # TODO: should this be optional?
+ labels = [label for i, label in enumerate(labels) if not is_label_predicted[i]] \
+ + [label for i, label in enumerate(labels) if is_label_predicted[i]]
+ if len([label for label in labels if label is not None]):
+ # we have at least one known/predicted team
+ for l in range(0, len(labels)):
+ # fill any remaining empty labels (i.e. these which had empty predictions available) with placeholders
+ labels[l] = coalesce(labels[l], '??')
+ # concatenate labels, assigning appropriate classes to predicted teams
+ team_label.append(self.__get_team_label(
+ labels[l],
+ 'MATCH_PREDICTED_TEAM_LABEL' if l >= known_teams else 'MATCH_TEAM_LABEL'))
+ # team names for tooltip
+ for name in team.name:
+ if name:
+ # every non-empty name gets some indentation
+ team_name.append(name_prefix + name)
+ if self.page.get('predict_teams', False):
+ # remember where the list of eligible teams ends
+ known_teams = len(team_name)
+ for name in team.possible_name:
+ # append predicted team names, with indentation as well
+ if name:
+ team_name.append(name_prefix + name)
+ if len(team_name) != known_teams:
+ # we've added some predicted team names, so we add a header
+ team_name.insert(known_teams, self.p_temp.get('MATCH_POSSIBLE_TEAM_LIST_HEADER'))
+ if (len(team_label) > 1) and (match.running == 0):
+ # and we add a header for matches that haven't started yet and have multiple options for teams
+ team_name.insert(0, self.p_temp.get('MATCH_TEAM_LIST_HEADER'))
+ # glue it all together
+ team_label = label_separator.join(team_label)
+ team_name = name_separator.join(team_name)
team_html = self.p_temp.get(
'MATCH_TEAM_LINK',
match.link, team_name, team_label) \
@@ -79,8 +132,8 @@ class PlayoffGenerator(object):
rows += self.p_temp.get(
'MATCH_TEAM_ROW',
' '.join([
- 'winner' if match.winner in teams else '',
- 'loser' if match.loser in teams else ''
+ 'winner' if (match.winner is not None) and (match.winner in team.name) else '',
+ 'loser' if (match.loser is not None) and (match.loser in team.name) else ''
]).strip(),
team_html,
self.p_temp.get(