Пример #1
0
    def load_player_menu(self):
        view.show_load_player_menu()

        while True:
            resp = view.ask_user_input("Choix : ")
            if resp == "1":
                self.get_file_list()
                break
            elif resp == "2":
                db_file = view.ask_user_input("Nom du fichier : ")
                self.get_player_list_from_db(db_file)
                break
            elif resp == "3":
                db_file = view.ask_user_input("Nom du fichier : ")
                player_id = view.ask_user_input(
                    "Entrer l'identifiant du joueur à ajouter (1000_ABCDEF) : "
                )
                self.add_player_from_db(db_file, player_id)
                break
            elif resp == "q":
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])

        if resp in ("1", "2", "3", "4"):
            self.load_player_menu()
Пример #2
0
    def create_tournament(self):
        """Ask the user for the informations needed to make an instance
        of a class Tournament.
        """
        view.show_create_tournament()
        name = view.ask_user_input("Nom du tournoi : ")
        localization = view.ask_user_input("Lieu du tournoi : ")

        while True:
            time_control = view.ask_user_input(
                "Type de contrôle du temps (Bullet, Blitz ou Coup rapide) : ")
            if time_control.lower() in ("bullet", "blitz", "coup rapide"):
                break
            else:
                view.show_warning(self.error_messages["INVALIDE_FORMAT"])

        description = view.ask_user_input(
            "Description du tournoi (optionnel) : ")

        while True:
            beg_date = view.ask_user_input(
                "Date de début du tournoi (JJ/MM/AAAA HH:MM): ")
            try:
                dt.strptime(beg_date, "%d/%m/%Y %H:%M")
                break
            except ValueError:
                view.show_warning(self.error_messages["INVALID_DATE"])

        chess_tournament = trn.Tournament(name, localization, time_control,
                                          description, beg_date)
        self.tournament_list.append(chess_tournament)
        self.current_tournament = chess_tournament
Пример #3
0
 def get_player_list_from_db(self, file_name):
     if file_name in self.get_file_list():
         load = lpdb.LoadPlayer(file_name)
         players = load.list_player_from_db()
         for player in players:
             view.show_key_val_data(player)
     else:
         view.show_warning(self.error_messages["MISSING_FILE"])
Пример #4
0
 def list_tournaments_in_db(self):
     """Send the tournaments data of a database file to be displayed
     by view.
     """
     view.show_message("Fichiers disponibles :\n")
     self.get_file_list()
     file_name = view.ask_user_input("Nom du fichier : ")
     if file_name in self.get_file_list():
         loader = trdb.TournamentDB(file_name)
         all_tournaments = loader.list_tournaments_in_db()
         for one_tournament in all_tournaments:
             view.show_key_val_data(
                 one_tournament["tournament_data"]["tournament_info"])
     else:
         view.show_warning(self.error_messages["MISSING_FILE"])
Пример #5
0
    def set_tournament_end_date(self):
        while True:
            date = view.ask_user_input(
                "Choisir une date de fin (JJ/MM/AAAA) : ")
            try:
                self.current_tournament.end_tournament(date)
                view.show_message(f"Date de fin du tournoi : {date}")
                break
            except Warning:
                view.show_warning(self.error_messages["INVALID_DATE"])
            except Exception:
                view.show_warning(self.error_messages["ONGOING_TOURNAMENT"])
                break

        self.tournament_menu()
Пример #6
0
    def add_player_to_tournament(self):
        """Ask the user for the required arguments needed to make a new Player instance
        and add it to the current tournament.
        """
        if len(self.current_tournament.get_player_list
               ) < self.current_tournament.MAX_PLAYER_LIMIT:
            view.show_message(
                "Adding a new player. Please enter the following informations."
            )
            l_name = view.ask_user_input("Last name: ")
            f_name = view.ask_user_input("First name: ")

            while True:
                date_birth = view.ask_user_input(
                    "Date of birth (JJ/MM/AAAA): ")
                # check date validity. Numbers validity and calendar validity
                try:
                    dt.strptime(date_birth, "%d/%m/%Y")
                    break
                except ValueError:
                    view.show_warning(self.error_messages["INVALID_DATE"])

            while True:
                gender = view.ask_user_input("Gender (M/F): ")
                if gender.upper() in ("M", "F"):
                    break
                else:
                    view.show_warning(self.error_messages["INVALIDE_FORMAT"])

            while True:
                try:
                    rank = int(
                        view.ask_user_input(
                            "Rank (must be a positive integer): "))
                    if isinstance(rank, int) and rank > 0:
                        break
                    else:
                        view.show_warning(self.error_messages["INVALID_INT"])
                except ValueError:
                    view.show_warning(self.error_messages["INVALID_INT"])

            self.current_tournament.add_new_player(l_name, f_name, date_birth,
                                                   gender, rank)
            view.show_done_action("Création terminée",
                                  len(self.current_tournament.get_player_list),
                                  self.current_tournament.MAX_PLAYER_LIMIT)
        else:
            view.show_warning(self.error_messages["MAX_PLAYER"])
Пример #7
0
 def describe_players(self, index=None, by_name=False, by_rank=False):
     players = self.current_tournament.get_player_list
     if index is None:
         if by_name:
             players = sorted(players,
                              key=attrgetter("last_name", "first_name"))
             view.show_listed_data(players)
         elif by_rank:
             players = sorted(players, key=attrgetter("rank"))
             view.show_listed_data(players)
     else:
         try:
             print(players[index - 1])
         except IndexError:
             view.show_warning(self.error_messages["MISSING_INDEX"])
         except TypeError:
             view.show_warning(self.error_messages["INVALIDE_FORMAT"])
Пример #8
0
 def describe_rounds(self, index=None):
     """Show the rounds report. If index argument is given, a unique round
     is displayed.
     """
     if index is None:
         for rd in self.current_tournament.get_round_list:
             start_date = dt.strftime(rd.start_date, "%d/%m/%Y - %H:%M")
             view.show_rounds_report(rd.name, rd.match_list, start_date,
                                     rd.end_date)
     else:
         try:
             rd = self.current_tournament.get_round_list[index]
             start_date = dt.strftime(rd.start_date, "%d/%m/%Y - %H:%M")
             view.show_rounds_report(rd.name, rd.match_list, start_date,
                                     rd.end_date)
         except IndexError:
             view.show_warning(self.error_messages["MISSING_INDEX"])
         except TypeError:
             view.show_warning(self.error_messages["INVALIDE_FORMAT"])
Пример #9
0
    def tournament_menu(self):
        """Ask the user to chooses between the various options availables
        in the tournament_menu, as displayed by view.
        """
        view.show_tournament_menu(self.current_tournament.name,
                                  self.current_tournament.localization,
                                  self.current_tournament.beg_date)
        while True:
            resp = view.ask_user_input("Choix : ")
            if resp == "1":
                self.add_player_to_tournament()
                break
            elif resp == "2":
                self.add_round()
                break
            elif resp == "3":
                self.rounds_menu()
                break
            elif resp == "4":
                self.set_tournament_end_date()
                break
            elif resp == "5":
                self.describe_players_menu()
                break
            elif resp == "6":
                self.save_player_menu()
                break
            elif resp == "7":
                self.load_player_menu()
                break
            elif resp == "8":
                self.save_tournament_in_db()
                break
            elif resp == "q":
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])

        if resp in ("1", "2", "3", "4", "5", "6", "7", "8"):
            self.tournament_menu()
        elif resp == "q":
            self.start_menu()
Пример #10
0
    def play_round(self):
        """Play the last round added to the tournament by calling the play_round
        method of the current tournament instance.
        """
        try:
            nb_rd = len(self.current_tournament.get_round_list) - 1
            rd = self.current_tournament.get_round_list[nb_rd]

            if not rd.end_date:
                view.show_play_menu(rd.name)
                self.describe_rounds(nb_rd)

                for nb, game in enumerate(rd.get_match_list):
                    while True:
                        result = view.ask_user_input(
                            f"Résultat match {nb+1} (J1, J2 ou nul) : ")
                        if result.upper() in ("J1", "J2", "NUL"):
                            self.current_tournament.play_round(
                                rd, game, result)
                            break
                        else:
                            view.show_warning(
                                self.error_messages["UNKNOWN_COMMAND"])
                while True:
                    date = view.ask_user_input(
                        "Date de fin de la ronde (JJ/MM/AAAA HH:MM) : ")
                    try:
                        dt.strptime(date, "%d/%m/%Y %H:%M")
                        rd.end_date = date
                        break
                    except ValueError:
                        view.show_warning(
                            self.error_messages["INVALIDE_FORMAT"])

            else:
                view.show_warning(self.error_messages["DONE_ROUND"])
        except IndexError:
            view.show_warning(self.error_messages["MISSING_ROUND"])
        except Warning:
            view.show_warning(self.error_messages["ONGOING_ROUND"])
Пример #11
0
    def rounds_menu(self):
        """Ask the user to choose between the various options available
        in the rounds menu, as displayed by view.
        """
        view.show_rounds_menu()

        while True:
            choice = view.ask_user_input("Choix : ")
            print()
            if choice == "1":
                try:
                    index = int(
                        view.ask_user_input(
                            "Numéro de la ronde à afficher (1, 2, 3 ou 4) : "))
                except ValueError:
                    view.show_warning(self.error_messages["INVALIDE_FORMAT"])
                    break
                try:
                    self.describe_rounds(index - 1)
                    break
                except IndexError:
                    view.show_warning(self.error_messages["MISSING_INDEX"])
                    break
            elif choice == "2":
                self.describe_rounds()
                break
            elif choice == "3":
                self.play_round()
                break
            elif choice == "q":
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])
        if choice in ("1", "2", "3", "4"):
            self.rounds_menu()
Пример #12
0
    def load_tournament_menu(self):
        view.show_load_tournament_menu()
        while True:
            resp = view.ask_user_input("Choix : ")
            if resp == "1":
                self.get_file_list()
                break
            elif resp == "2":
                self.list_tournaments_in_db()
                break
            elif resp == "3":
                self.load_tournament_from_db()
                break
            elif resp == "q":
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])

        if resp in ("1", "2", "3"):
            self.load_tournament_menu()
        elif resp == "q":
            self.start_menu()
Пример #13
0
    def describe_players_menu(self):
        """Send the information needed by view to display the list of players
        can be displayed by :
        - Alphabetical order ;
        - Rank order ;
        - A unique player if index argument is given.
        """
        view.show_players_report()

        while True:
            resp = view.ask_user_input("Choix : ")
            if resp == "1":
                self.describe_players(by_name=True)
                break
            elif resp == "2":
                self.describe_players(by_rank=True)
                break
            elif resp == "3":
                index = int(
                    view.ask_user_input(
                        "Joueur à afficher (choisir entre 1 et 8) : "))
                self.describe_players(index=index)
                break
            elif resp == "4":
                while True:
                    index = int(view.ask_user_input("Numéro du joueur : "))
                    new_rank = int(view.ask_user_input("Nouveau rang : "))
                    if new_rank > 0:
                        try:
                            self.current_tournament.get_player_list[
                                index - 1].set_player_rank = new_rank
                            break
                        except IndexError:
                            view.show_warning(
                                self.error_messages["MISSING_INDEX"])
                        except ValueError:
                            view.show_warning(
                                self.error_messages["INVALIDE_FORMAT"])
                    else:
                        view.show_warning(self.error_messages["INVALID_INT"])
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])
Пример #14
0
    def add_round(self):
        """Add a round to the current tournament by calling the add_round_to_list
        method of the current tournament instance. Display a warning if :
        - Not enough players added to the tournament ;
        - Last round hasn't been played yet ;
        - MAX_ROUND_LIST has been reached.
        """
        last_round_nb = len(self.current_tournament.get_round_list)

        if len(self.current_tournament.get_player_list
               ) != self.current_tournament.MAX_PLAYER_LIMIT:
            view.show_warning(self.error_messages["ADD_PLAYER"])

        elif len(self.current_tournament.get_round_list
                 ) < self.current_tournament.MAX_ROUND_LIST:

            if not self.current_tournament.get_round_list:
                round_nb = 1
                round_name = f"Round {round_nb}"
                self.current_tournament.add_round_to_list(round_name)
                view.show_done_action(f"Creation : {round_name}", round_nb,
                                      self.current_tournament.MAX_ROUND_LIST)

            elif not self.current_tournament.get_round_list[last_round_nb -
                                                            1].end_date:
                view.show_warning(self.error_messages["ONGOING_ROUND"])

            else:
                round_nb = len(self.current_tournament.get_round_list) + 1
                round_name = f"Round {round_nb}"
                self.current_tournament.add_round_to_list(round_name)
                view.show_done_action(f"Creation : {round_name}", round_nb,
                                      self.current_tournament.MAX_ROUND_LIST)

        else:
            view.show_warning(self.error_messages["MAX_ROUND"])
Пример #15
0
    def start_menu(self):
        """Ask the user to choose between the various start menu
        options displayed by view.
        """
        view.show_start_menu(self.today, self.current_time)

        while True:
            resp = view.ask_user_input("Choix : ")
            if resp == "1":
                self.create_tournament()
                break
            elif resp == "2":
                if self.tournament_list:
                    self.tournament_menu()
                else:
                    view.show_warning(self.error_messages["NO_TOURNAMENT"])
                    break
            elif resp == "3":
                self.load_tournament_menu()
                break
            elif resp == "4":
                if self.tournament_list:
                    view.show_listed_data(self.tournament_list)
                    break
                else:
                    view.show_warning(self.error_messages["NO_TOURNAMENT"])
                    break
            elif resp == "5":
                index = int(
                    view.ask_user_input("N° du tournoi à selectionner : "))
                if self.tournament_list:
                    try:
                        self.current_tournament = self.tournament_list[index -
                                                                       1]
                        view.show_message(
                            f"Tournoi selectionné : {self.tournament_list[index - 1]}"
                        )
                        break
                    except IndexError:
                        view.show_warning(self.error_messages["MISSING_INDEX"])
                        break
                    except ValueError:
                        view.show_warning(
                            self.error_messages["INVALIDE_FORMAT"])
                        break
                else:
                    view.show_warning(self.error_messages["NO_TOURNAMENT"])
                    break
            elif resp == "q":
                break
            else:
                view.show_warning(self.error_messages["UNKNOWN_COMMAND"])

        if resp == "1":
            self.tournament_menu()
        elif resp in ("2", "3", "4", "5"):
            self.start_menu()
        elif resp == "q":
            confirmation = view.ask_user_input(
                "êtes-vous sûr de vouloir quitter l'application ? (O/N)")
            if confirmation.lower() == "n":
                self.start_menu()
            elif confirmation.lower() == "o":
                quit()
Пример #16
0
    def load_tournament_from_db(self):
        """Load a saved tournament avalable in the database.
        """
        view.show_message("Fichiers existants : ")
        file_list = self.get_file_list()
        file_name = view.ask_user_input("Nom du fichier de chargement : ")

        if file_name in file_list:
            loader = trdb.TournamentDB(file_name)
            name = view.ask_user_input("Nom du tournoi à charger : ")
            try:
                tournament_data = loader.load_tournament_from_db(name)
                tournament_info = tournament_data[0]
                players_info = tournament_data[1]
                rounds_info = tournament_data[2]

                loaded_tournament = trn.Tournament(
                    tournament_info["name"], tournament_info["localization"],
                    tournament_info["time_control"],
                    tournament_info["description"],
                    tournament_info["beg_date"], tournament_info["end_date"])

                if players_info:
                    for e, players in enumerate(players_info):
                        player = players[f"player{e}"]
                        loaded_tournament.add_new_player(
                            player["last_name"], player["first_name"],
                            player["date_birth"], player["gender"],
                            player["rank"])

                # Saved rounds data only contains scores. The rounds are build
                # through the application internal logic. Scores are added only
                # if the saved rounds data has an end_date
                if rounds_info:
                    for e, rnd in enumerate(rounds_info):
                        if rnd[f"Round {e+1}"]["end_date"] is None:
                            pass
                        else:
                            loaded_tournament.add_round_to_list(f"Round {e+1}")
                            currrent_round = loaded_tournament.get_round_list[
                                e]
                            for nb, game in enumerate(
                                    currrent_round.get_match_list):
                                score1 = rnd[f"Round {e+1}"][f"game {nb + 1}"][
                                    0]
                                score2 = rnd[f"Round {e+1}"][f"game {nb + 1}"][
                                    1]
                                P1 = game[0][0]
                                P2 = game[0][1]
                                game[1][0] = score1
                                game[1][1] = score2
                                P1.set_player_score = score1
                                P2.set_player_score = score2
                                currrent_round.end_date = rnd[f"Round {e+1}"][
                                    "end_date"]

                self.tournament_list.append(loaded_tournament)
                self.current_tournament = loaded_tournament

            except Warning:
                view.show_warning(self.error_messages["MISSING_TOURNAMENT"])
                self.start_menu()
        else:
            view.show_warning(self.error_messages["MISSING_FILE"])