Example #1
0
def bill_payment_settings():
    # Determining if user has already submitted a form
    payment_entry = list(models.PaymentMethod.select(models.PaymentMethod, models.User).join(models.User).where(models.User.login_name == flask_login.current_user.login_name))
    payment_form = forms.bill_forms.PaymentForm() if payment_entry else None

    if flask.request.method == 'POST':
        method = flask.request.form.get('_method', '').upper()
        if method == 'PUT':
            models.PaymentMethod.get_or_create(user=flask_login.current_user.table_id)
            _next = flask.request.form['next']
            if _next:
                return common.redirect_back('/bills/settings')
        else:
            # TODO find a way to handle multiple paymentMethods
            if payment_form.pay_online.data:
                if (app.config.get('VENMO_CLIENT_ID', None) is None) or (app.config.get('VENMO_CLIENT_SECRET', None) is None):
                    flask.flash('The site is not configured to user Venmo. Contact the site administrator', 'warning')
                    logger.critical('No VENMO_CLIENT_ID or VENMO_CLIENT_SECRET set in the config')
                else:
                    state = random.randint(0, 100000)
                    payment_entry[0].token = state
                    payment_entry[0].save()
                    logger.debug('Redirecting user {} id {} to venmo to authenticate, state is {}'.format(flask_login.current_user.name, flask_login.current_user.table_id, state))
                    return flask.redirect('https://api.venmo.com/v1/oauth/authorize?client_id={}&scope={}&response_type=code&state={}'.format(app.config.get('VENMO_CLIENT_ID', None), 'make_payments%20access_profile', state))
            else:
                payment_entry[0].pay_online = payment_form.pay_online.data
                payment_entry[0].save()

        _next = flask.request.form['next']
        if _next:
            return common.redirect_back('/bills/settings')
    else:
        if payment_form:
            payment_form.pay_online.data = payment_entry[0].pay_online
    return flask.render_template('/bills/settings.html', payment_entry=payment_entry, payment_form=payment_form)