From 79c281bb47d08f1fd1be04b1d7d58dfd8c672bc5 Mon Sep 17 00:00:00 2001 From: emkael Date: Tue, 2 Oct 2018 13:31:02 +0200 Subject: New team label rendering method, including outcome preditctions --- jfr_playoff/generator.py | 73 +++++++++++++++++++++++++++++++++++++++++------- 1 file 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 = '
'.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 = '
' + name_prefix = '  ' # 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( -- cgit v1.2.3