Ejemplo n.º 1
0
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))
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)