def ajouter_client(clients): """ Methode qui permet de creer un nouveau client :param clients: liste des clients existants :return: nouveau client """ new_id = 1 if len(clients) != 0: new_id = clients[-1].id + 1 nom = ihm.demander("Saisissez votre nom :") prenom = ihm.demander("Saisissez votre prénom :") date_naiss = None while True: try: date_naiss = ihm.demander( "Saisissez votre date de naissance (AAAA-MM-JJ) :") date_naiss = datetime.strptime(date_naiss, '%Y-%m-%d') except ValueError: ihm.afficher("Ceci n'est pas une date valide.") pass else: date_naiss = date_naiss.date() break client = Client(new_id, nom, prenom, date_naiss) return client
def saisie_date(message, date_seuil, duree_limite=1): """ Methode qui permet de saisir la date du vol :param message: :param date_seuil: :param duree_limite: :return: la date saisie """ date_saisie = None dans1an = date_seuil.replace(year=date_seuil.year + duree_limite) while True: try: date_saisie = ihm.demander( "Saisissez la {} (AAAA-MM-JJ) :".format(message)) date_saisie = datetime.strptime(date_saisie, '%Y-%m-%d') if date_saisie <= date_seuil or date_saisie > dans1an: raise ValueError except ValueError: ihm.afficher("Ceci n'est pas une date valide.") pass else: break ihm.afficher("Vous avez choisi le {:%d/%m/%Y}".format(date_saisie)) return date_saisie
def modifier_place(self): """ Methode qui permet de modifier la place du passager en lui demandant la nouvelle place voulue et de changer la place sur le billet :return: """ # on stocke l'ancien rang et l'ancienne colonne old_rangee = int(self._place[0:-1]) old_colonne = int(self._place[-1]) # on demande le nouveau rang et la nouvelle colonne new_rang = ihm.demander("Saisissez le rang :") new_rangee = int(new_rang) new_colonne = ihm.demander("Saisissez la colonne :") self.vol.liberer_place(old_rangee, old_colonne) self.vol.reserver_place(new_rangee, new_colonne) new_place = (new_rang, new_colonne) self._place = "".join(new_place)
def creer_vols(self, debut=None, nb_jours=None): """ Methode qui permet de creer des vols correspondants a l'horaire entre deux dates donnees :param debut: date de debut :param nb_jours: nombres de jours pour lesquels on veut creer des vols apres la date de debut :return: """ if debut is None: debut = saisie_date("date de début", datetime.today()) if nb_jours is None: nb_jours = int(ihm.demander("Saisissez un nombre de jours :")) for day in range(nb_jours): td = timedelta(days=day) jour = debut + td vol_deb = jour.replace(hour=self.heure_depart.hour, minute=self.heure_depart.minute) deb_tz = self.route.aeroport_depart.fuseau # On ajoute la timezone de depart vol_deb = deb_tz.localize(vol_deb) # On calcule la datetime d'arrivee dans la timezone de depart vol_fin = deb_tz.normalize(vol_deb + self.duree) # On transforme dans la timezone d'arrivee vol_fin = vol_fin.astimezone(self.route.aeroport_arrivee.fuseau) # On renleve l'information de timezeone vol_deb = vol_deb.replace(tzinfo=None) vol_fin = vol_fin.replace(tzinfo=None) # Creation de l'objet vol cle = "{}{}{}".format(self.compagnie.id_code_iata, self.numero, vol_deb) if cle not in Vol.cle_index: vol = Vol(self, vol_deb, vol_fin, self.duree, None, self.config_avion.nb_places_premiere, self.config_avion.nb_places_business, self.config_avion.nb_places_eco_plus, self.config_avion.nb_places_eco, EnumStatutVol(1)) self.vols.append(vol) print(vol) else: print("Ce vol existe déjà") return
def saisie_compagnie(compagnies): """ Methode qui permet de choisir une compagnie par ses différents codes :param compagnies: liste des compagnies :return: la compagnie choisie """ compagnie = None code = ihm.demander( "Tapez le code IATA (2 caractères) ou ICAO (3 caractères) :") results = [x for x in compagnies if x.id_code_iata == code or x.code_icao == code] if len(results) == 0: ihm.afficher("Désolé, nous n'avons pas trouvé votre compagnie !") else: compagnie = results[0] if compagnie is not None: ihm.afficher("Vous avez choisi la compagnie {}".format(compagnie)) return compagnie
def ajouter_vols_toutes_routes(self): """ Ajoute des vols entre deux dates donnees pour toutes les routes qui ont des horaires :return: """ debut = saisie_date("date de début", datetime.today()) nb_jours = 0 while True: try: nb_jours = int(ihm.demander("Saisissez un nombre de jours :")) except ValueError: ihm.afficher("Ce nombre n'est pas valide !") else: break for route in self._routes: ihm.afficher(route) for horaire in route.horaires: ihm.afficher(horaire) horaire.creer_vols(debut=debut, nb_jours=nb_jours) return
def saisie_aeroport(message, aeroports): """ Methode qui permet de saisir un aeroport :param message: :param aeroports: :return: """ aero = None while aero is None: code = ihm.demander( "Saisissez l'{} (code IATA ou ICAO ou ville) :".format(message)) results = [x for x in aeroports if x.id_code_iata == code or x.code_icao == code or x.municipalite.lower().startswith(code)] if len(results) == 0: ihm.afficher("Désolé, nous n'avons pas trouvé votre aéroport !") elif len(results) > 1: aero = ihm.choisir_paginer(results, "Précisez votre choix :") else: aero = results[0] ihm.afficher("Vous avez choisi : {}".format(aero)) return aero
def creer_horaire(self, compagnies): """ Methode pour creer un horaire pour la route :return: """ new_hor = None # Saisir numero de vol num_vol = ihm.demander("Saisissez un numéro de vol (1 à 4 chiffres) :") # Si c'est un codeshare, choix_codeshare = ihm.choisir( ['Oui', 'Non'], "Est-ce que cet horaire est le codeshare de l'horaire " "d'une autre compagnie ?") if choix_codeshare == 'Oui': # alors saisir compagnie compagnie = saisie_compagnie(compagnies) cle_route = "{}{}{}".format(compagnie.id_code_iata, self._aeroport_depart.id_code_iata, self._aeroport_arrivee.id_code_iata) route = Route.cle_index[cle_route] # et choisir horaire hor_tri = route.horaires if len(hor_tri) == 0: ihm.afficher("Il n'y a pas d'horaire disponible !") return # On trie les routes par nombre d'horaires hor_tri.sort(key=lambda s: s.numero) hor = ihm.choisir_paginer(hor_tri, "Choisissez l'horaire :") ihm.afficher("Vous avez choisi l'horaire {}".format(hor)) # Creation du nouvel horaire new_hor = Horaire(self, num_vol, None, None, None, None, hor, None) # Si ce n'est pas un codeshare else: # Saisir heure de depart str_h_dep = ihm.demander("Saisissez l'heure de départ (HH:MM) :") h_dep = datetime.strptime(str_h_dep, "%H:%M").time() # Saisir heure d'arrivee str_h_arr = ihm.demander("Saisissez l'heure d'arrivée (HH:MM) :") h_arr = datetime.strptime(str_h_arr, "%H:%M").time() # Saisir duree str_dur = ihm.demander("Saisissez la durée (HHhMM, ex : 0h55) :") t = datetime.strptime(str_dur, "%Hh%M") dur = timedelta(hours=t.hour, minutes=t.minute) # Saisir la periodicite : TODO period = '' configs = self.compagnie.configs configs_tri = [ x for x in configs if x.type_avion.distance_franchissable_km > self._distance / 1000 ] configs_tri.sort(key=lambda s: s.nom) if len(configs_tri) == 0: ihm.afficher("Il n'y a pas de configuration disponible !") return # Choisir la config conf = ihm.choisir_paginer(self.compagnie.configs, "Choisissez une configuration d'avion") # Creation du nouvel horaire new_hor = Horaire(self, num_vol, h_dep, h_arr, dur, period, None, conf) # Confirmer ou pas choix = ihm.choisir( ['Oui', 'Non'], "Confirmez-vous la création de l'horaire {} ?".format(new_hor)) if choix == 'Oui': self._horaires.append(new_hor) if new_hor.horaire_operateur is not None: new_hor.horaire_operateur.horaires_codeshare.append(new_hor) ihm.afficher("L'horaire a été créé") else: ihm.afficher("L'horaire n'a pas été créé") return
def faire_reservation(self, compagnies, aeroports): """ Methode qui consiste a faire une reservation (saisir_critere, afficher_vols, choisir_vols, saisir_passager, payer..) :param compagnies: listes de compagnies :param aeroports: listes des aeroports :return: None """ # Saisie des criteres criteres = self.saisie_criteres(aeroports) aer_dep, aer_arr, date_dep, nb_passagers, classe, escales_max = criteres # Recherche des routes combinaisons_total = [] for compagnie in compagnies: combinaisons = compagnie.chercher_routes_escales( aer_dep, aer_arr, escales_max) if combinaisons: combinaisons_total.extend(combinaisons) if len(combinaisons_total) == 0: ihm.afficher("Il n'y a pas de routes possibles entre ces destinations") return # Affiche les prix, distances self.affiche_prix_distance(combinaisons_total, classe) # On garde seulement les combinaisons avec horaires en base combinaisons_avec_horaires = [] for combi in combinaisons_total: combi_ok = True for route in combi: if len(route.horaires) == 0: combi_ok = False if combi_ok: combinaisons_avec_horaires.append(combi) if len(combinaisons_total) == 0: ihm.afficher("Il n'y a pas d'horaires disponibles pour ces destinations") return # On recupere les vols pour chaque combinaison combi_vols = self.recupere_vols( combinaisons_avec_horaires, date_dep, nb_passagers, classe) # On filtre les vols pour qu'ils s'enchainent bien vols_ok = self.arrange_vols(combi_vols, date_dep) if len(vols_ok) == 0: ihm.afficher("Il n'y a pas de vols disponibles pour ces destinations") return ihm.afficher("Parmi les routes, {} possédaient des places a la date demandée" .format(len(vols_ok))) combi_test = [] for combi in vols_ok: combi_new = [] for route, vols in combi: combi_new.append(route) combi_test.append(combi_new) choix_combi = self.affiche_prix_distance(combi_test, classe, choix=True) combi = vols_ok[choix_combi] combi_final = [] for route, vols in combi: ihm.afficher("Vols disponibles pour la route {} :".format(route)) vol = ihm.choisir_paginer(vols, "Choisissez un vol :") combi_final.append(vol) id_resa = 0 if Reservation.liste_ids: id_resa = Reservation.liste_ids[-1] id_resa += 1 new_resa = Reservation(id_resa, self, 0, datetime.now(), True) for i in range(nb_passagers): nom = ihm.demander("Saisissez le nom du passager :") prenom = ihm.demander("Saisssez le prénom du passager :") passeport = ihm.demander("Saisissez le numéro de passeport :") date_naissance = None while True: try: date_naissance = ihm.demander( "Saisissez la date de naissance (AAAA-MM-JJ) :") date_naissance = datetime.strptime(date_naissance, '%Y-%m-%d') except ValueError: ihm.afficher("Ceci n'est pas une date valide.") pass else: date_naissance = date_naissance.date() break id_billet = 0 if Billet.liste_ids: id_billet = Billet.liste_ids[-1] id_billet += 1 billet = Billet(id_billet, new_resa, nom, prenom, passeport, date_naissance, []) for vol in combi_final: ihm.afficher("Choisissez une place pour ce vol (les places libres sont représentées par un O) :") vol.afficher_places() place = ihm.demander("Saisissez le numéro de la place (ex : 35A) :") vol.reserver_place(int(place[:-1]),place[-1]) id_segment = 0 if Segment.liste_ids: id_segment = Segment.liste_ids[-1] id_segment += 1 seg = Segment(id_segment, billet, vol, vol.horaire, place, '', classe) billet.segments.append(seg) vol.segments.append(seg) new_resa.billets.append(billet) ihm.afficher("La réservation a été effectuée !") ihm.afficher(new_resa) print(*new_resa.billets) self.reservations.append(new_resa) return