def refund_booking(bid): # clean up # delete all tickets, reset showtime incrementer booking = Booking() if not booking.fetch(bid): return redirect(url_for('IndexController.index')) total = booking.get_total_price() movie = Movie() movie.fetch(booking.get_movie_id()) movie_title = movie.get_title() tickets = booking.get_tickets() ticket_count = len(tickets) # delete individual ticket objects ticket_obj = Ticket() for ticket in tickets: ticket_obj.delete(ticket['ticket_id']) # delete the actual booking object showtime = booking.get_showtime_id() booking.delete(bid) # reset showtime seats showtime_obj = Showtime() showtime_obj.fetch(showtime) showtime_obj.increment_available_seats(ticket_count) time = showtime_obj.get_time().strftime('%I:%M %p : %B %d, %Y') showtime_obj.save() # send an email! customer = create_user('customer') customer.fetch(g.user['username']) customer.send_refund_email(movie_title, time, format_price(total))
def create_showtime(): movie = Movie() movies = movie.get_all_movies() showroom = Showroom() showrooms = showroom.get_all_showrooms() if request.method == 'POST': date = request.form['date'] time = request.form['time'] movie_id = request.form['movie_id'] showroom_id = request.form['showroom_id'] # validate all data, everything must be correct error = None movie = Movie() validate_movie = movie.fetch(movie_id) # convert date and time into a datetime object dtime = create_datetime(date, time) if dtime is None: error = "Time is invalid" elif not validate_showtime_date(dtime): error = "Time is in the past" elif not validate_movie: error = "The selected movie is invalid" elif not validate_showroom_availability(showroom_id, 0, dtime, int(movie.get_duration())): error = "The showroom is unavailable at that time" if error is None: # if error is None, create a showtime new_showtime = Showtime() showroom = Showroom() showroom.fetch(showroom_id) movie.set_status('active') movie.save() new_showtime.create(showroom_id=showroom_id, time=dtime, movie_id=movie_id, available_seats=showroom.get_num_seats()) # then return to add showtime return redirect(url_for('AdminShowtimeController.manage_showtime')) flash(error) return render_template('make_showtime.html', movies=movies, showrooms=showrooms)
def send_confirmation_email(order_id, total): customer = get_current_customer() showtime_id = session['showtime'] showtime = Showtime() showtime.fetch(showtime_id) movie = get_movie_by_showtime(showtime_id) time = showtime.get_time().strftime("%B %d, %Y at %I:%M %p") customer.send_booking_email(movie.get_title(), time, order_id, total, generate_tickets_email())
def reset_available_seats(): if not session.get('showtime'): print("Error resetting available seats") if not session.get('ticket_ids') or not session.get('showtime'): return showtime = Showtime() showtime.fetch(session['showtime']) reset_len = len(session['ticket_ids']) avail = showtime.get_available_seats() new_avail = avail + reset_len showtime.set_available_seats(new_avail) showtime.save()
def manage_showtime(): showtime = Showtime() if request.method == 'POST': delete_showtime_id = request.form.get('delete_showtime_id') edit_showtime_id = request.form.get('edit_showtime_id') if delete_showtime_id is not None and showtime.fetch( delete_showtime_id): # logic for cancelling tickets will go here? if not safe_delete(showtime): flash("Cannot delete showtime, it has associated bookings") elif edit_showtime_id is not None and showtime.fetch(edit_showtime_id): return redirect( url_for('AdminShowtimeController.edit_showtime', sid=edit_showtime_id)) # get a list of all showtimes showtimes = showtime.get_all_showtimes() new_times = [] for time in showtimes: time = dict(time) movie = Movie() movie.fetch(time['movie_id']) showroom = Showroom() showroom.fetch(time['showroom_id']) time['time'] = create_datetime_from_sql(time['time']) time['movie_title'] = movie.get_title() time['duration'] = movie.get_duration() time['showroom_name'] = showroom.get_showroom_name() new_times.append(time) # show newest times first new_times = sorted(new_times, key=lambda k: k['time']) return render_template('manage_showtime.html', showtimes=new_times)
def payment_confirmation(bid): confirm = False if bid[-1] == 'c': bid = bid[0:-1] confirm = True fees = [] booking = Booking() if not booking.fetch(bid): return redirect(url_for('IndexController.index')) movie = Movie() movie = movie.obj_as_dict(booking.get_movie_id()) showtime = Showtime() showtime.fetch(booking.get_showtime_id()) showroom = Showroom() showroom.fetch(showtime.get_showroom_id()) tkts = booking.get_tickets() tickets = [] for t in tkts: t = dict(t) t['seat_number'] = format_seat(t['seat_number']) tickets.append(t) booking = dict(booking.obj_as_dict(bid)) booking['order_date'] = create_datetime_from_sql(booking['order_date']) booking['total_price'] = format_price(booking['total_price']) return render_template('confirmation.html', tickets=tickets, fees=fees, movie=movie, showtime=showtime.get_time(), booking=booking, confirm=confirm, showroom=showroom.get_showroom_name())
def process_bookings(bookings): refund_info = {} refunds = [] for booking in bookings: refund_info['order_no'] = booking['order_id'] refund_info['total'] = format_price(booking['total_price']) refund_info['bid'] = booking['booking_id'] # get tickets booking_obj = Booking() booking_obj.fetch(booking['booking_id']) tickets = booking_obj.get_tickets() refund_info['tickets'] = process_tickets(tickets) movie = Movie() movie.fetch(booking['movie_id']) refund_info['movie_title'] = movie.get_title() showtime = Showtime() print(showtime.fetch(booking['showtime_id'])) print(booking['showtime_id']) refund_info['date'] = showtime.get_time() print(showtime.get_time()) now = datetime.datetime.now() hour = datetime.timedelta(hours=1) if now + hour > showtime.get_time(): refund_info['is_refundable'] = False else: refund_info['is_refundable'] = True refunds.append(dict(refund_info)) # sort here refunds = sorted(refunds, key=lambda k: k['date'], reverse=True) return refunds
def edit_showtime(sid): showtime_id = sid showtime = Showtime() if not showtime.fetch(showtime_id): print("Error fetching showtime??") movie = Movie() movies = movie.get_all_movies() movie.fetch(showtime.get_movie_id()) showroom = Showroom() showrooms = showroom.get_all_showrooms() showroom.fetch(showtime.get_showroom_id()) if request.method == 'POST': date = request.form.get('date') time = request.form.get('time') available_seats = request.form.get('available_seats') movie_id = request.form.get('movie_id') showroom_id = request.form.get('showroom_id') print(date) print(time) print(available_seats) print(movie_id) print(showroom_id) error = None dtime = create_datetime(date, time) if not validate_showtime_date(dtime): error = "The selected showroom is unavailable at that time" elif not validate_showroom_availability(showroom.get_id(), showtime_id, dtime, int(movie.get_duration())): error = "The selected showroom is unavailable at that time" else: showtime.set_time(dtime) if movie_id is not None and not validate_movie(movie_id): error = "There was an error processing the movie" elif movie_id is not None: showtime.set_movie_id(movie_id) if showroom_id is not None and not validate_showroom(showroom_id): error = "There was an error processing the showroom" elif showroom_id is not None: showtime.set_showroom_id(showroom_id) showtime.save() if error is not None: flash(error) else: return redirect(url_for('AdminShowtimeController.manage_showtime')) info = showtime.obj_as_dict(showtime_id) print("show_dtime") print(info['time']) show_dtime = create_datetime_from_sql(info['time']) return render_template('edit_showtime.html', showtime=info, movie_title=movie.get_title(), showroom_name=showroom.get_showroom_name(), show_dtime=show_dtime, movies=movies, showrooms=showrooms)
def checkout(): if (not session.get('showtime') or not session.get('tickets') or not g.user.get('username')): return redirect(url_for('IndexController.index')) if request.method == 'POST': delete_id = request.form.get('delete_ticket') if request.form.get('coupon'): promo = Promo() session['promo'], error = apply_promo(promo) if error is not None: flash(error) elif delete_id: if not delete_ticket(delete_id): return redirect(url_for('BookingController.cancel_booking')) elif request.form.get('add_payment'): session['checkout'] = True return redirect(url_for('AccountController.make_payment')) elif request.form.get('checkout'): if request.form.get('card_id'): bid = create_booking_objects() clear_booking_info() return redirect( url_for('BookingController.payment_confirmation', bid=bid)) else: flash("Please choose a payment card to proceed with checkout") elif request.form.get('cancel'): clear_booking_info() return redirect(url_for('IndexController.index')) customer = create_user('customer') customer.fetch(g.user['username']) cards = customer.get_all_cards() showtime = Showtime() showtime.fetch(session['showtime']) movie = Movie() movie.fetch(showtime.get_movie_id()) tickets, subtotal = clean_tickets(session['tickets']) # Returns a 2D array of tickets # each list is a different type all_tickets = get_ticket_type_lists(tickets) fees, total = calculate_fees_and_total(subtotal) session['total'] = total total = format_price(total) subtotal = format_price(subtotal) return render_template('checkout.html', showtime=showtime.get_time(), movie=movie.obj_as_dict(movie.get_id()), tickets=all_tickets, subtotal=subtotal, total=total, fees=fees, cards=cards)
def delete_ticket(delete_id): delete_id = int(delete_id) tickets = session['tickets'] del session['tickets'] ticket = Ticket() showtime = Showtime() showtime.fetch(session['showtime']) avail = showtime.get_available_seats() if len(tickets) == 1: ticket.delete(session['ticket_ids'][delete_id]) showtime.set_available_seats(avail + 1) showtime.save() clear_booking_info() return False else: del tickets[delete_id] ticket.delete(session['ticket_ids'][delete_id]) del session['ticket_ids'][delete_id] showtime.set_available_seats(avail + 1) showtime.save() session['tickets'] = tickets return True
def get_movie_by_showtime(sid): movie = Movie() showtime = Showtime() showtime.fetch(sid) movie.fetch(showtime.get_movie_id()) return movie
def select_seat(): if not session.get('showtime') or not g.user.get('username'): return redirect(url_for('IndexController.index')) # INFO we need: showtime_id and customer showtime = Showtime() showtime.fetch(session['showtime']) showroom = Showroom() showroom.fetch(showtime.get_showroom_id()) customer = create_user('customer') customer.fetch(g.user['username']) if request.method == 'POST': print("Session.get") ticket_no = 0 example = [] capacity = showroom.get_num_seats() for i in range(0, capacity): if request.form.get(str(i)): example.append((i, request.form[str(i)])) num_avail = showtime.get_available_seats() if session.get('tickets'): num_avail = num_avail + len(session['tickets']) showtime.set_available_seats(num_avail) clear_ticket_ids() if still_available(example, showtime.get_id()): session['tickets'] = example reserve_tickets(showtime) return redirect(url_for('CheckoutController.checkout')) else: flash("Sorry, those seats are no longer available") tickets = showtime.get_all_tickets() pre_tickets = None if session.get('tickets'): pre_tickets = session['tickets'] for p in pre_tickets: print(p) # probably need to pull all tickets # for this showtime, and get a list of taken # seats to pass to zach available = list(range(showroom.get_num_seats())) if len(tickets) > 0: for ticket in tickets: seat_no = int(ticket['seat_number']) available[seat_no] = -1 avail_dict = {'capacity': showroom.get_num_seats(), 'row': 8, 'seats': available } # ZACH: # from this page, we'll get the seats and their ages # we need to get an array of tuples like # [(seatNo, age),] return render_template("seat_selection.html", tickets=avail_dict, pre_tickets=pre_tickets)