def transfer_start(): if get_user_currency( ) == 'EUR' and not app.config.get('BANK_TRANSFER_EURO'): return redirect(url_for('pay_choose')) payment = add_payment_and_tickets(BankPayment) if not payment: logging.warn('Unable to add payment and tickets to database') flash( 'Your session information has been lost. Please try ordering again.' ) return redirect(url_for('tickets')) logger.info("Created bank payment %s (%s)", payment.id, payment.bankref) payment.state = "inprogress" db.session.commit() msg = Message("Your EMF ticket purchase", sender=app.config['TICKETS_EMAIL'], recipients=[current_user.email]) msg.body = render_template("tickets-purchased-email-banktransfer.txt", user=current_user, payment=payment) mail.send(msg) return redirect(url_for('transfer_waiting', payment_id=payment.id))
def add_payment_and_tickets(paymenttype): """ Insert payment and tickets from session data into DB """ infodata = session.get('ticketinfo') basket, total = get_basket() currency = get_user_currency() if not (basket and total): return None payment = paymenttype(currency, total) payment.amount += paymenttype.premium(currency, total) current_user.payments.append(payment) app.logger.info('Creating tickets for basket %s', basket) app.logger.info('Payment: %s for %s %s (was %s)', paymenttype.name, payment.amount, currency, total) app.logger.info('Ticket info: %s', infodata) if infodata: infolists = sum([infodata[i] for i in ticket_forms], []) for info in infolists: ticket_id = int(info.pop('ticket_id')) ticket = basket[ticket_id] for k, v in info.items(): attrib = TicketAttrib(k, v) ticket.attribs.append(attrib) for ticket in basket: name = get_form_name(ticket.type) if name and not ticket.attribs: app.logger.error('Ticket %s has no attribs', ticket) return None current_user.tickets.append(ticket) ticket.payment = payment if currency == 'GBP': ticket.expires = datetime.utcnow() + timedelta( days=app.config.get('EXPIRY_DAYS_TRANSFER')) elif currency == 'EUR': ticket.expires = datetime.utcnow() + timedelta( days=app.config.get('EXPIRY_DAYS_TRANSFER_EURO')) db.session.commit() session.pop('basket', None) session.pop('ticketinfo', None) return payment
def add_payment_and_tickets(paymenttype): """ Insert payment and tickets from session data into DB """ infodata = session.get('ticketinfo') basket, total = get_basket() currency = get_user_currency() if not (basket and total): return None payment = paymenttype(currency, total) payment.amount += paymenttype.premium(currency, total) current_user.payments.append(payment) app.logger.info('Creating tickets for basket %s', basket) app.logger.info('Payment: %s for %s %s (was %s)', paymenttype.name, payment.amount, currency, total) app.logger.info('Ticket info: %s', infodata) if infodata: infolists = sum([infodata[i] for i in ticket_forms], []) for info in infolists: ticket_id = int(info.pop('ticket_id')) ticket = basket[ticket_id] for k, v in info.items(): attrib = TicketAttrib(k, v) ticket.attribs.append(attrib) for ticket in basket: name = get_form_name(ticket.type) if name and not ticket.attribs: app.logger.error('Ticket %s has no attribs', ticket) return None current_user.tickets.append(ticket) ticket.payment = payment if currency == 'GBP': ticket.expires = datetime.utcnow() + timedelta(days=app.config.get('EXPIRY_DAYS_TRANSFER')) elif currency == 'EUR': ticket.expires = datetime.utcnow() + timedelta(days=app.config.get('EXPIRY_DAYS_TRANSFER_EURO')) db.session.commit() session.pop('basket', None) session.pop('ticketinfo', None) return payment
def transfer_start(): if get_user_currency() == 'EUR' and not app.config.get('BANK_TRANSFER_EURO'): return redirect(url_for('pay_choose')) payment = add_payment_and_tickets(BankPayment) if not payment: logging.warn('Unable to add payment and tickets to database') flash('Your session information has been lost. Please try ordering again.') return redirect(url_for('tickets')) logger.info("Created bank payment %s (%s)", payment.id, payment.bankref) payment.state = "inprogress" db.session.commit() msg = Message("Your EMF ticket purchase", sender=app.config['TICKETS_EMAIL'], recipients=[current_user.email]) msg.body = render_template("tickets-purchased-email-banktransfer.txt", user=current_user, payment=payment) mail.send(msg) return redirect(url_for('transfer_waiting', payment_id=payment.id))
def tickets_choose(): if TICKET_CUTOFF: return render_template("tickets-cutoff.html") form = TicketAmountsForm() tts = TicketType.query.order_by(TicketType.order).all() token = session.get('ticket_token') limits = dict((tt.code, tt.user_limit(current_user, token)) for tt in tts) available_token_tts = [limits[code] > 0 for code in TicketType.token_only] if any(available_token_tts): # If the user can select token tickets, hide full tickets limits['full'] = 0 if request.method != 'POST': # Empty form - populate ticket types for tt in tts: form.types.append_entry() form.types[-1].code.data = tt.code if tt.code in TicketType.token_only or tt.code == 'full': # Default to one full ticket/token ticket if limits[tt.code] > 0: form.types[-1].amount.data = 1 tts = dict((tt.code, tt) for tt in tts) for f in form.types: f._type = tts[f.code.data] values = range(limits[f.code.data] + 1) f.amount.values = values f._any = any(values) if form.validate_on_submit(): if form.buy.data: set_user_currency(form.currency_code.data) basket = [] for f in form.types: if f.amount.data: tt = f._type app.logger.info('Adding %s %s tickets to basket', f.amount.data, tt.name) basket += [tt.code] * f.amount.data if basket: session['basket'] = basket if current_user.is_authenticated(): return redirect(url_for('tickets_info')) else: return redirect( url_for('signup', next=url_for('tickets_info'))) if request.method == 'POST' and form.set_currency.data: if form.set_currency.validate(form): app.logger.info("Updating currency to %s only", form.set_currency.data) set_user_currency(form.set_currency.data) for field in form: field.errors = [] form.currency_code.data = get_user_currency() return render_template("tickets-choose.html", form=form)
def tickets_choose(): if TICKET_CUTOFF: return render_template("tickets-cutoff.html") form = TicketAmountsForm() tts = TicketType.query.order_by(TicketType.order).all() token = session.get('ticket_token') limits = dict((tt.code, tt.user_limit(current_user, token)) for tt in tts) available_token_tts = [limits[code] > 0 for code in TicketType.token_only] if any(available_token_tts): # If the user can select token tickets, hide full tickets limits['full'] = 0 if request.method != 'POST': # Empty form - populate ticket types for tt in tts: form.types.append_entry() form.types[-1].code.data = tt.code if tt.code in TicketType.token_only or tt.code == 'full': # Default to one full ticket/token ticket if limits[tt.code] > 0: form.types[-1].amount.data = 1 tts = dict((tt.code, tt) for tt in tts) for f in form.types: f._type = tts[f.code.data] values = range(limits[f.code.data] + 1) f.amount.values = values f._any = any(values) if form.validate_on_submit(): if form.buy.data: set_user_currency(form.currency_code.data) basket = [] for f in form.types: if f.amount.data: tt = f._type app.logger.info('Adding %s %s tickets to basket', f.amount.data, tt.name) basket += [tt.code] * f.amount.data if basket: session['basket'] = basket if current_user.is_authenticated(): return redirect(url_for('tickets_info')) else: return redirect(url_for('signup', next=url_for('tickets_info'))) if request.method == 'POST' and form.set_currency.data: if form.set_currency.validate(form): app.logger.info("Updating currency to %s only", form.set_currency.data) set_user_currency(form.set_currency.data) for field in form: field.errors = [] form.currency_code.data = get_user_currency() return render_template("tickets-choose.html", form=form)