def available_combos(self, player):
    return self.available_moves + self.get_squares(player)

@property
def complete(self):
    for player in ('X', 'O'):
        for combo in self.winning_combos:
            combo_available = True
for pos in combo:
    if not pos in self.available_combos(player):
        combo_available = False
if combo_available:
    return self.winner is not None
return True
Minimax explained for an idiot