Пример #1
0
 def __init__(self, db_name):
     self.manager = Manager(db_name)
     self.hall = Hall()
     self.reservation_info = {}
Пример #2
0
class InteractiveSystem:

    def __init__(self, db_name):
        self.manager = Manager(db_name)
        self.hall = Hall()
        self.reservation_info = {}

    def _nonum_validizer(self, inp):
        if re.findall('\d+', inp) or inp == '':
            return False
        return True

    def _noletters_validizer(self, inp):
        if re.findall('[a-zA-Z]', inp) or inp == '':
            return False
        return True

    def register_name_tickets(self):
        name = input('Enter name: ')
        while not self._nonum_validizer(name):
            print('Invalid name input')
            name = input('Enter name: ')

        tickets = input('Enter number ot tickets: ')
        while not self._noletters_validizer(tickets):
            print('Invalid ticket input')
            tickets = input('Enter number of tickets')

        self.reservation_info['username'] = name
        self.reservation_info['tickets'] = int(tickets)

    def show_movies(self):
        movie_info = '[{id}] - {name} ({rating})'
        movies = [movie_info.format(**movie) for movie in self.manager.show_movies()]
        movies.insert(0, 'Current movies:')
        return '\n'.join(movies)

    def prompt_for_movie_choice(self):
        ids = [movie['id'] for movie in self.manager.show_movies()]
        choice = input('Choose a movie: ')
        while not self._noletters_validizer(choice) or int(choice) not in ids:
            print('Invalid input!')
            choice = input('Choose a movie: ')
        self.reservation_info['movie_id'] = choice


    def show_movie_projections(self, movie_id, date=None, spots=False):
        movie_id = int(movie_id)
        if self.manager.check_id_validity('PROJECTIONS', movie_id):
            movie_name = self.manager.select_moviename_by_id(movie_id)
            self.reservation_info['movie_name'] = movie_name
            projections = self.manager.show_movie_projections(movie_id, date)
            output = []
            if date:
                message = '\nProjections for movie {} on date {}'
                projection_info = '[{id}] - {time} ({type})'
                output.append(message.format(movie_name, date))

                for proj in projections:
                    output.append(projection_info.format(**proj))
            else:
                message = '\nProjections for movie {}'
                output.append(message.format(movie_name))
                if spots:
                    projection_info = '[{id}] - {date} {time} ({type}) - {sp} spots available'
                    for proj in projections:
                        proj_spots = self.manager.show_number_of_seats(proj['id'])
                        proj.update(sp=proj_spots)
                        output.append(projection_info.format(**proj))
                else:
                    projection_info = '[{id}] - {date} {time} ({type})'
                    for proj in projections:
                        output.append(projection_info.format(**proj))

        return '\n'.join(output)

    def prompt_for_proj_choice(self, movie_id):
        projs = self.manager.show_movie_projections(movie_id)
        projections = [x['id'] for x in projs]
        choice = input('\nChoose a projection: ')
        while not self._noletters_validizer(choice) or int(choice) not in projections:
            print('Invalid input!')
            choice = input('\nChoose projection ID: ')
        self.reservation_info['projection_id'] = choice
        self.reservation_info['projection_details'] = {}
        for proj in projs:
            if proj['id'] == int(choice):
                self.reservation_info.update(proj)

    def insufficient_spots_for_tickets(self, proj_id):
        proj_spots = self.manager.show_number_of_seats(proj_id)
        if int(proj_spots) < self.reservation_info['tickets']:
            return False
        return True

    def show_reserved_seats(self, proj_id):
        reserved_seats = self.manager.get_reserved_seats_for_projection(proj_id)
        self.hall.update_hall_map(reserved_seats)
        return self.hall

    def process_tickets(self):
        self.reservation_info['seats'] = []
        for t in range(self.reservation_info['tickets']):
            seats = input('\nChoose seat {} in the form (row, col): '.format(t + 1))
            seats = re.findall('\d+', seats)
            seats = [int(x) for x in seats]
            while not self.hall.check_seat(*seats):
                print('Invalid row/col or seat already taken!')
                seats = input('{}. Choose seats (row, col): '.format(t))
                seats = re.findall('\d+', seats)
            self.reservation_info['seats'].append(seats)

    def show_reservation_info(self):
        info = []
        info.append('\nThis is your resevation:')
        info.append('Movie: {}'.format(self.reservation_info['movie_name']))
        info.append('Date and Time: {} {} {}'.format(self.reservation_info['date'], self.reservation_info['time'], self.reservation_info['type']))
        seats = ''
        for seat in self.reservation_info['seats']:
            seats += '{}, '.format(seat)
        seats.strip(',')
        info.append('Seats: {}'.format(seats))
        return '\n'.join(info)

    def finalize(self):
        prompt = input('Enter "finalize" in order to complete resevation: ')
        if prompt == 'finalize':
            name = self.reservation_info['username']
            projection_id = self.reservation_info['projection_id']
            for i in self.reservation_info['seats']:
                self.manager.make_reservation(name, projection_id, i[0], i[1])
            print('Reservation complete! Enjoy!')
        else:
            print('Reservation not successful...')
            second_chance = input('Try again? Y/N')
            if second_chance == 'Y':
                self.finalize()

    def give_up_reservation_prompt(self, func):
        command = input('\nType "cancel" if you want to give up the reservation: ')
        if command == 'cancel':
            func()

    def exit(self):
        print('Thanks for visiting us!')
        sys.exit(1)