예제 #1
0
 def add_player_to_lineup(self, player: Player):
     """
     Force add specified player to lineup.
     Return true if player successfully added to lineup.
     """
     if player.max_exposure == 0:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! Player has max exposure set to 0.'
         )
     if player in self._lineup:
         raise LineupOptimizerException(
             'This player already in your line up!')
     if self.remaining_budget and player.salary > self.remaining_budget:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! Your team is over budget!')
     if self.remaining_players < 1:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! You already select all %s players!'
             % len(self.locked_players))
     if self.max_from_one_team:
         from_same_team = len(
             [p for p in self.locked_players if p.team == player.team])
         if from_same_team + 1 > self.max_from_one_team:
             raise LineupOptimizerException(
                 'You can\'t set more than %s players from one team.' %
                 self.max_from_one_team)
     try:
         link_players_with_positions(self.locked_players + [player],
                                     self._settings.positions)
     except LineupOptimizerException:
         raise LineupOptimizerException('You\'re already select all %s\'s' %
                                        '/'.join(player.positions))
     self._lineup.append(player)
예제 #2
0
 def lock_player(self, player: DirtyPlayer, position: Optional[str] = None):
     player = self._clean_player(player)
     if player.max_exposure == 0:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! Player has max exposure set to 0.'
         )
     if player in self._locked_players:
         raise LineupOptimizerException(
             'This player already in your line up!')
     if self.remaining_budget and player.salary > self.remaining_budget:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! Your team is over budget!')
     if self.remaining_players < 1:
         raise LineupOptimizerException(
             'Can\'t add this player to line up! You already select all %s players!'
             % len(self.locked_players))
     max_from_one_team = self._settings.max_from_one_team
     if max_from_one_team:
         from_same_team = len(
             [p for p in self.locked_players if p.team == player.team])
         if from_same_team + 1 > max_from_one_team:
             raise LineupOptimizerException(
                 'You can\'t set more than %s players from one team.' %
                 max_from_one_team)
     position_for_player = None
     if position:
         if position not in self.available_positions:
             raise LineupOptimizerException(
                 'Position %s doesn\'t exist. Available positions are %s' %
                 (position, ','.join(self.available_positions)))
         for remaining_position in self._remaining_positions:
             if position:
                 if position == remaining_position.name:
                     position_for_player = remaining_position
                     break
         else:
             raise LineupOptimizerException('Position %s is filled.' %
                                            position)
         if not list_intersection(player.positions,
                                  position_for_player.positions):
             raise LineupOptimizerException(
                 'Player can\'t be set to position %s' % position)
     try:
         link_players_with_positions({player, *self._locked_players},
                                     self._settings.positions)
     except LineupOptimizerException:
         raise LineupOptimizerException('You\'re already select all %s\'s' %
                                        '/'.join(player.positions))
     if position_for_player:
         self._remaining_positions.remove(position_for_player)
     self._locked_players[player] = position_for_player
예제 #3
0
 def _build_lineup(
     self,
     players: List[Player],
     context: OptimizationContext,
     unswappable_players: Optional[List[LineupPlayer]] = None,
 ) -> Lineup:
     lineup = []
     positions = self._settings.positions[:]
     if not positions:
         for player in sorted(players, key=lambda p: p.positions[0]):
             lineup.append(
                 LineupPlayer(
                     player,
                     player.positions[0],
                     used_fppg=context.players_used_fppg.get(player)))
         return Lineup(lineup, self._settings.lineup_printer)
     if unswappable_players:
         players = [
             player for player in players
             if player not in unswappable_players
         ]
         positions = get_remaining_positions(positions, unswappable_players)
         lineup.extend(unswappable_players)
     players_with_positions = link_players_with_positions(
         players, positions)
     for player, position in players_with_positions.items():
         lineup.append(
             LineupPlayer(player,
                          position.name,
                          used_fppg=context.players_used_fppg.get(player)))
     positions_order = [pos.name for pos in self._settings.positions]
     lineup.sort(key=lambda p: positions_order.index(p.lineup_position))
     return Lineup(lineup, self._settings.lineup_printer)
예제 #4
0
 def _build_lineup(self, players, unswappable_players=None):
     # type: (List[Player], Optional[List[LineupPlayer]]) -> Lineup
     lineup = []
     positions = self._settings.positions[:]
     if unswappable_players:
         players = [player for player in players if player not in unswappable_players]
         positions = get_remaining_positions(positions, unswappable_players)
         lineup.extend(unswappable_players)
     players_with_positions = link_players_with_positions(players, positions)
     for player, position in players_with_positions.items():
         lineup.append(LineupPlayer(player, position.name))
     positions_order = [pos.name for pos in self._settings.positions]
     lineup.sort(key=lambda p: positions_order.index(p.lineup_position))
     return Lineup(lineup, self._settings.lineup_printer)