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)